mirror of
https://github.com/tenrok/BBob.git
synced 2026-06-14 18:42:24 +03:00
feat: typescript support (#185)
* feat: initial typescript support * feat: typescript support * feat(plugin-helper): move files to typescript * chore: update lock files * feat: preset types * fix: build * fix: benchmark * fix: remove pnpm cache * fix: bench action * fix: pnpm recursive install * fix: nx cache * fix: lock file * fix: workflows * fix: lerna support in pnpm * fix: pnpm workspace * fix: remove unused files * fix: pnpm lock file * fix: update lerna for support pnpm * fix: lerna bootstrap * fix: rollup build * fix: update nx * fix: build * fix: add nx dep target * fix: remove nx cache * fix: workflow run on push only for master * fix: test workflow run on push only for master * fix: remove parallel for gen types * fix: benchmark * fix: benchmark imports * fix: pnpm * fix: types errors and pnpm * fix: types * fix: types * refactor: parser * fix(parser): tests * fix: preset tests * fix: react types * fix: react type declarations * fix: pnpm lock file * fix: react preset types * fix: lock file * fix: vue2 types * feat: dev container support * fix: types * fix: types * refactor: rewrite pkg-task, add nx gen-types deps, fix react/render.ts * refactor: types * fix: types * fix: rename gen-types to types * fix: nx build order * fix: nx reset * fix: define nx deps explicit * fix: build * fix: nx * fix: nx order build * fix: nx deps * fix: bbob cli tests * fix: tests * fix: cli tests and import * fix: test cover * fix: cli cover
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
/* eslint-disable no-plusplus */
|
||||
const isObj = (value: unknown): value is Record<string, unknown> => (typeof value === 'object' && value !== null);
|
||||
const isBool = (value: unknown): value is boolean => (typeof value === 'boolean');
|
||||
|
||||
export type IterateCallback<Content> = (node: Content) => Content
|
||||
|
||||
export function iterate<Content, Iterable = ArrayLike<Content> | Content>(t: Iterable, cb: IterateCallback<Content>): Iterable {
|
||||
const tree = t;
|
||||
|
||||
if (Array.isArray(tree)) {
|
||||
for (let idx = 0; idx < tree.length; idx++) {
|
||||
tree[idx] = iterate(cb(tree[idx]), cb);
|
||||
}
|
||||
} else if (isObj(tree) && 'content' in tree) {
|
||||
iterate(tree.content, cb);
|
||||
}
|
||||
|
||||
return tree;
|
||||
}
|
||||
|
||||
export function same(expected: unknown, actual: unknown): boolean {
|
||||
if (typeof expected !== typeof actual) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isObj(expected) || expected === null) {
|
||||
return expected === actual;
|
||||
}
|
||||
|
||||
if (Array.isArray(expected)) {
|
||||
return expected.every((exp) => [].some.call(actual, (act) => same(exp, act)));
|
||||
}
|
||||
|
||||
if (isObj(expected) && isObj(actual)) {
|
||||
return Object.keys(expected).every((key) => {
|
||||
const ao = actual[key];
|
||||
const eo = expected[key];
|
||||
|
||||
if (isObj(eo) && isObj(ao)) {
|
||||
return same(eo, ao);
|
||||
}
|
||||
|
||||
if (isBool(eo)) {
|
||||
return eo !== (ao === null);
|
||||
}
|
||||
|
||||
return ao === eo;
|
||||
});
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
export function match<Content, Iterable = ArrayLike<Content>>(
|
||||
t: Iterable,
|
||||
expression: Content | ArrayLike<Content>,
|
||||
cb: IterateCallback<Content>
|
||||
) {
|
||||
if (Array.isArray(expression)) {
|
||||
return iterate<Content, Iterable>(t, (node) => {
|
||||
for (let idx = 0; idx < expression.length; idx++) {
|
||||
if (same(expression[idx], node)) {
|
||||
return cb(node);
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
})
|
||||
}
|
||||
|
||||
return iterate<Content, Iterable>(t, (node) => (same(expression, node) ? cb(node) : node));
|
||||
}
|
||||
Reference in New Issue
Block a user