ajoq 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs +5 -2
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +2 -0
- package/build/index.js +5 -2
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +7 -2
package/build/index.cjs
CHANGED
|
@@ -30,8 +30,10 @@ const pureFilters = {
|
|
|
30
30
|
$lt: (valuePath, value)=>`(${valuePath} < ${value})`,
|
|
31
31
|
$lte: (valuePath, value)=>`(${valuePath} <= ${value})`,
|
|
32
32
|
$exists: (valuePath, value)=>`((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,
|
|
33
|
-
$match: (valuePath, value)=>`${value}
|
|
34
|
-
$nmatch: (valuePath, value)=>`!${value}
|
|
33
|
+
$match: (valuePath, value)=>`${value}?.test('' + ${valuePath})`,
|
|
34
|
+
$nmatch: (valuePath, value)=>`!${value}?.test('' + ${valuePath})`,
|
|
35
|
+
$incl: (valuePath, value)=>`${valuePath}?.includes(${value})`,
|
|
36
|
+
$nincl: (valuePath, value)=>`!${valuePath}?.includes(${value})`,
|
|
35
37
|
$bits: (valuePath, value)=>`((${valuePath} & ${value}) === ${value})`,
|
|
36
38
|
$nbits: (valuePath, value)=>`((${valuePath} & ${value}) !== ${value})`,
|
|
37
39
|
$type: (valuePath, value)=>`(typeof ${valuePath} === ${value})`,
|
|
@@ -146,6 +148,7 @@ const createFilter = (filter)=>{
|
|
|
146
148
|
const context = new Context(scope);
|
|
147
149
|
const code = filterCodeGen(filter, 'data', context);
|
|
148
150
|
const filterFn = new Function('data', 'scope', `${context}\nreturn ${code};`);
|
|
151
|
+
console.log(filterFn.toString());
|
|
149
152
|
return (data)=>filterFn(data, scope);
|
|
150
153
|
};
|
|
151
154
|
const SORT_MAP = {
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type RegExpOrString<T> = T extends string ? RegExp | T : T;\nexport type ItemType<T> = T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\nexport type FilterCondition<T> = T | ItemType<T> | PureFilterOperators<T> | PureFilterOperators<ItemType<T>> | LogicOperators<FilterCondition<T>>;\nexport type QueryStatefulCondition<T> =\n | T\n | ItemType<T>\n | StatefulFilterOperators<T>\n | StatefulFilterOperators<ItemType<T>>\n | LogicOperators<FilterCondition<T>>;\n\nexport type Filter<T> = {\n [P in keyof T]?: FilterCondition<T[P]>;\n} & LogicOperators<T>;\n\nexport interface LogicOperators<T> {\n $and?: Filter<T>[];\n $or?: Filter<T>[];\n $nor?: Filter<T>[];\n $not?: Filter<T>;\n}\n\nexport interface ConditionFn {\n (valuePath: string, value: any, context: Context): string;\n}\n\nexport type OperationKeys = keyof LogicOperators<unknown>;\n\nexport interface PureFilterOperators<ValueType> {\n $eq?: ValueType;\n $ne?: ValueType;\n $gt?: ValueType;\n $gte?: ValueType;\n $lt?: ValueType;\n $lte?: ValueType;\n\n $exists?: boolean;\n $match?: RegExp | string;\n $nmatch?: RegExp | string;\n $bits?: number;\n $nbits?: number;\n $type: string;\n $ntype: string;\n}\n\nexport type PureFilterOperatorsNames = keyof PureFilterOperators<unknown>;\n\nconst pureFilters: Record<PureFilterOperatorsNames, ConditionFn> = {\n $eq: (valuePath: string, value: unknown) => `(${valuePath} === ${value})`,\n $ne: (valuePath: string, value: unknown) => `(${valuePath} !== ${value})`,\n $gt: (valuePath: string, value: unknown) => `(${valuePath} > ${value})`,\n $gte: (valuePath: string, value: unknown) => `(${valuePath} >= ${value})`,\n $lt: (valuePath: string, value: unknown) => `(${valuePath} < ${value})`,\n $lte: (valuePath: string, value: unknown) => `(${valuePath} <= ${value})`,\n $exists: (valuePath: string, value: boolean) => `((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,\n $match: (valuePath: string, value: RegExp) => `${value}.test('' + ${valuePath})`,\n $nmatch: (valuePath: string, value: RegExp) => `!${value}.test('' + ${valuePath})`,\n $bits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) === ${value})`,\n $nbits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) !== ${value})`,\n $type: (valuePath: string, value: unknown) => `(typeof ${valuePath} === ${value})`,\n $ntype: (valuePath: string, value: unknown) => `(typeof ${valuePath} !== ${value})`,\n};\n\nexport interface EffectFilterOperators<ValueType> {\n $in?: ReadonlyArray<ValueType>;\n $nin?: ReadonlyArray<ValueType>;\n $sub?: ReadonlyArray<ValueType>;\n $nsub?: ReadonlyArray<ValueType>;\n $sup?: ReadonlyArray<ValueType>;\n $nsup?: ReadonlyArray<ValueType>;\n $con?: ValueType;\n $ncon?: ValueType;\n}\n\nexport type EffectFilterOperatorsNames = keyof EffectFilterOperators<unknown>;\n\nexport interface StatefulFilterOperators<ValueType> extends PureFilterOperators<ValueType> {\n $unique?: boolean;\n}\n\nexport const stringify = (value: unknown) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (value instanceof RegExp) {\n return `/${value.source}/${value.flags}`;\n }\n return JSON.stringify(value);\n};\n\nconst effectFilters: Record<EffectFilterOperatorsNames, ConditionFn> = {\n $in: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${scope}?.has(${valuePath})`;\n },\n $nin: (valuePath: string, value: unknown[], context: Context) => `!${effectFilters.$in(valuePath, value, context)}`,\n $sub: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${valuePath}.every((value) => ${scope}?.has(value))`;\n },\n $nsub: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sub(valuePath, value, context)}`,\n $sup: (valuePath: string, value: unknown, context: Context) => {\n const scope = context.scope(value);\n const name = context.register(`new Set(${valuePath})`);\n return `${scope}?.every((value) => ${name}.has(value))`;\n },\n $nsup: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sup(valuePath, value, context)}`,\n $con: (valuePath: string, value: unknown) => `new Set(${valuePath}).has(${stringify(value)})`,\n $ncon: (valuePath: string, value: unknown) => `!new Set(${valuePath}).has(${stringify(value)})`,\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => `(${value.join(' && ')})`,\n $or: (value: unknown[]) => `(${value.join(' || ')})`,\n $nor: (value: unknown[]) => `!(${value.join(' || ')})`,\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nclass Context {\n private counter = 0;\n private values: string[] = [];\n private cacheMap = new Map<string, string>();\n\n constructor(private scopeMap: Map<string, unknown>) {}\n\n scope<T>(value: T): string {\n const name = `s$$${this.counter++}`;\n this.scopeMap.set(name, value);\n return `scope.get('${name}')`;\n }\n\n register(code: string) {\n if (!this.cacheMap.has(code)) {\n const name = `v$$${this.counter++}`;\n this.values.push(`const ${name} = ${code};`);\n this.cacheMap.set(code, name);\n }\n return this.cacheMap.get(code)!;\n }\n\n toString() {\n return this.values.join('\\n');\n }\n}\n\nconst filterCodeGen = <T extends object>(query: Filter<T> | undefined, valuePath: string, context: Context): string => {\n if (typeof query === 'object' && query !== null) {\n const condition = Object.entries(query).map(([key, value]) => {\n if (key in pureFilters) {\n return pureFilters[key as PureFilterOperatorsNames](valuePath, stringify(value), context);\n }\n if (key in effectFilters) {\n return effectFilters[key as EffectFilterOperatorsNames](valuePath, value, context);\n }\n if (key in operations) {\n const values = Array.isArray(value) ? value : [value];\n return operations[key as OperationKeys](values.map((v) => filterCodeGen(v, valuePath, context)));\n }\n const valueSubPath = `${valuePath}?.[${stringify(key)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value), context);\n });\n if (condition.length > 0) {\n return `${condition.join(' && ')}`;\n }\n }\n return `${!!query}`;\n};\n\nconst PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol']);\n\nexport type Primitive = string | number | boolean | bigint | symbol;\nexport const isPrimitive = (value: unknown): value is Primitive => PRIMITIVES.has(typeof value);\n\nexport const createFilter = <T extends object | number | string | boolean | bigint | symbol>(\n filter: Filter<T> | number | string | boolean | bigint | symbol,\n): ((data: T) => boolean) => {\n if (isPrimitive(filter)) {\n return (data: T) => data === filter;\n }\n const scope = new Map<string, unknown>();\n const context = new Context(scope);\n const code = filterCodeGen(filter as object, 'data', context);\n const filterFn = new Function('data', 'scope', `${context}\\nreturn ${code};`);\n return (data: T) => filterFn(data, scope);\n};\n\nexport type SortType<T> = T extends number\n ? 1 | -1\n : T extends string\n ? 'asc' | 'desc'\n : T extends unknown[]\n ? { length?: 1 | -1 } & { [Index: number]: SortType<T[number]> }\n : boolean;\n\nexport type Sort<T> = T extends object\n ? {\n [K in keyof T]?: SortType<T[K]> | boolean;\n }\n : SortType<T> | boolean;\n\ntype SortDirection = 'asc' | 'desc' | 1 | -1 | true | false;\nconst SORT_MAP: Record<`${SortDirection}`, 1 | -1> = {\n asc: 1,\n desc: -1,\n 1: 1,\n '-1': -1,\n true: 1,\n false: -1,\n};\n\nconst sortCodeGen = <T>(sort: Sort<T>, valuePathA: string, valuePathB: string): string => {\n if (typeof sort === 'object' && sort !== null) {\n const condition = Object.entries(sort).map(([key, value]) => {\n const valueSubPathA = `${valuePathA}?.[${JSON.stringify(key)}]`;\n const valueSubPathB = `${valuePathB}?.[${JSON.stringify(key)}]`;\n return sortCodeGen(value, valueSubPathA, valueSubPathB);\n });\n if (condition.length > 0) {\n return condition.join(' || ');\n }\n }\n if (typeof sort === 'string' && (sort === 'asc' || sort === 'desc')) {\n return `(${valuePathA}?.localeCompare(${valuePathB}) * ${SORT_MAP[sort as `${SortDirection}`]})`;\n }\n if (typeof sort === 'number' && (sort === 1 || sort === -1)) {\n return `((${valuePathA} - ${valuePathB}) * ${SORT_MAP[`${sort}` as `${SortDirection}`]})`;\n }\n if (typeof sort === 'boolean') {\n return `(${valuePathA} > ${valuePathB} === ${sort} ? 1 : (${valuePathA} < ${valuePathB} === ${sort} ? -1 : 0)) `;\n }\n return `0`;\n};\n\nexport const createSort = <T>(sort?: Sort<T>): ((a: T, b: T) => number) => {\n if (!sort) {\n return () => 0;\n }\n const code = sortCodeGen(sort, 'a', 'b');\n const sortFn = new Function('a', 'b', `return ${code};`);\n return sortFn as (a: T, b: T) => number;\n};\n"],"names":["createFilter","createSort","isPrimitive","stringify","pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$bits","$nbits","$type","$ntype","undefined","RegExp","source","flags","JSON","effectFilters","$in","context","scope","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","$ncon","operations","$and","join","$or","$nor","$not","Context","counter","values","cacheMap","constructor","scopeMap","Map","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","length","PRIMITIVES","filter","data","filterFn","Function","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","sortFn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type RegExpOrString<T> = T extends string ? RegExp | T : T;\nexport type ItemType<T> = T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\nexport type FilterCondition<T> = T | ItemType<T> | PureFilterOperators<T> | PureFilterOperators<ItemType<T>> | LogicOperators<FilterCondition<T>>;\nexport type QueryStatefulCondition<T> =\n | T\n | ItemType<T>\n | StatefulFilterOperators<T>\n | StatefulFilterOperators<ItemType<T>>\n | LogicOperators<FilterCondition<T>>;\n\nexport type Filter<T> = {\n [P in keyof T]?: FilterCondition<T[P]>;\n} & LogicOperators<T>;\n\nexport interface LogicOperators<T> {\n $and?: Filter<T>[];\n $or?: Filter<T>[];\n $nor?: Filter<T>[];\n $not?: Filter<T>;\n}\n\nexport interface ConditionFn {\n (valuePath: string, value: any, context: Context): string;\n}\n\nexport type OperationKeys = keyof LogicOperators<unknown>;\n\nexport interface PureFilterOperators<ValueType> {\n $eq?: ValueType;\n $ne?: ValueType;\n $gt?: ValueType;\n $gte?: ValueType;\n $lt?: ValueType;\n $lte?: ValueType;\n\n $exists?: boolean;\n $match?: RegExp | string;\n $nmatch?: RegExp | string;\n $incl: string;\n $nincl: string;\n $bits?: number;\n $nbits?: number;\n $type: string;\n $ntype: string;\n}\n\nexport type PureFilterOperatorsNames = keyof PureFilterOperators<unknown>;\n\nconst pureFilters: Record<PureFilterOperatorsNames, ConditionFn> = {\n $eq: (valuePath: string, value: unknown) => `(${valuePath} === ${value})`,\n $ne: (valuePath: string, value: unknown) => `(${valuePath} !== ${value})`,\n $gt: (valuePath: string, value: unknown) => `(${valuePath} > ${value})`,\n $gte: (valuePath: string, value: unknown) => `(${valuePath} >= ${value})`,\n $lt: (valuePath: string, value: unknown) => `(${valuePath} < ${value})`,\n $lte: (valuePath: string, value: unknown) => `(${valuePath} <= ${value})`,\n $exists: (valuePath: string, value: boolean) => `((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,\n $match: (valuePath: string, value: RegExp) => `${value}?.test('' + ${valuePath})`,\n $nmatch: (valuePath: string, value: RegExp) => `!${value}?.test('' + ${valuePath})`,\n $incl: (valuePath: string, value: string) => `${valuePath}?.includes(${value})`,\n $nincl: (valuePath: string, value: string) => `!${valuePath}?.includes(${value})`,\n $bits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) === ${value})`,\n $nbits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) !== ${value})`,\n $type: (valuePath: string, value: unknown) => `(typeof ${valuePath} === ${value})`,\n $ntype: (valuePath: string, value: unknown) => `(typeof ${valuePath} !== ${value})`,\n};\n\nexport interface EffectFilterOperators<ValueType> {\n $in?: ReadonlyArray<ValueType>;\n $nin?: ReadonlyArray<ValueType>;\n $sub?: ReadonlyArray<ValueType>;\n $nsub?: ReadonlyArray<ValueType>;\n $sup?: ReadonlyArray<ValueType>;\n $nsup?: ReadonlyArray<ValueType>;\n $con?: ValueType;\n $ncon?: ValueType;\n}\n\nexport type EffectFilterOperatorsNames = keyof EffectFilterOperators<unknown>;\n\nexport interface StatefulFilterOperators<ValueType> extends PureFilterOperators<ValueType> {\n $unique?: boolean;\n}\n\nexport const stringify = (value: unknown) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (value instanceof RegExp) {\n return `/${value.source}/${value.flags}`;\n }\n return JSON.stringify(value);\n};\n\nconst effectFilters: Record<EffectFilterOperatorsNames, ConditionFn> = {\n $in: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${scope}?.has(${valuePath})`;\n },\n $nin: (valuePath: string, value: unknown[], context: Context) => `!${effectFilters.$in(valuePath, value, context)}`,\n $sub: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${valuePath}.every((value) => ${scope}?.has(value))`;\n },\n $nsub: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sub(valuePath, value, context)}`,\n $sup: (valuePath: string, value: unknown, context: Context) => {\n const scope = context.scope(value);\n const name = context.register(`new Set(${valuePath})`);\n return `${scope}?.every((value) => ${name}.has(value))`;\n },\n $nsup: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sup(valuePath, value, context)}`,\n $con: (valuePath: string, value: unknown) => `new Set(${valuePath}).has(${stringify(value)})`,\n $ncon: (valuePath: string, value: unknown) => `!new Set(${valuePath}).has(${stringify(value)})`,\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => `(${value.join(' && ')})`,\n $or: (value: unknown[]) => `(${value.join(' || ')})`,\n $nor: (value: unknown[]) => `!(${value.join(' || ')})`,\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nclass Context {\n private counter = 0;\n private values: string[] = [];\n private cacheMap = new Map<string, string>();\n\n constructor(private scopeMap: Map<string, unknown>) {}\n\n scope<T>(value: T): string {\n const name = `s$$${this.counter++}`;\n this.scopeMap.set(name, value);\n return `scope.get('${name}')`;\n }\n\n register(code: string) {\n if (!this.cacheMap.has(code)) {\n const name = `v$$${this.counter++}`;\n this.values.push(`const ${name} = ${code};`);\n this.cacheMap.set(code, name);\n }\n return this.cacheMap.get(code)!;\n }\n\n toString() {\n return this.values.join('\\n');\n }\n}\n\nconst filterCodeGen = <T extends object>(query: Filter<T> | undefined, valuePath: string, context: Context): string => {\n if (typeof query === 'object' && query !== null) {\n const condition = Object.entries(query).map(([key, value]) => {\n if (key in pureFilters) {\n return pureFilters[key as PureFilterOperatorsNames](valuePath, stringify(value), context);\n }\n if (key in effectFilters) {\n return effectFilters[key as EffectFilterOperatorsNames](valuePath, value, context);\n }\n if (key in operations) {\n const values = Array.isArray(value) ? value : [value];\n return operations[key as OperationKeys](values.map((v) => filterCodeGen(v, valuePath, context)));\n }\n const valueSubPath = `${valuePath}?.[${stringify(key)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value), context);\n });\n if (condition.length > 0) {\n return `${condition.join(' && ')}`;\n }\n }\n return `${!!query}`;\n};\n\nconst PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol']);\n\nexport type Primitive = string | number | boolean | bigint | symbol;\nexport const isPrimitive = (value: unknown): value is Primitive => PRIMITIVES.has(typeof value);\n\nexport const createFilter = <T extends object | number | string | boolean | bigint | symbol>(\n filter: Filter<T> | number | string | boolean | bigint | symbol,\n): ((data: T) => boolean) => {\n if (isPrimitive(filter)) {\n return (data: T) => data === filter;\n }\n const scope = new Map<string, unknown>();\n const context = new Context(scope);\n const code = filterCodeGen(filter as object, 'data', context);\n const filterFn = new Function('data', 'scope', `${context}\\nreturn ${code};`);\n console.log(filterFn.toString());\n return (data: T) => filterFn(data, scope);\n};\n\nexport type SortType<T> = T extends number\n ? 1 | -1\n : T extends string\n ? 'asc' | 'desc'\n : T extends unknown[]\n ? { length?: 1 | -1 } & { [Index: number]: SortType<T[number]> }\n : boolean;\n\nexport type Sort<T> = T extends object\n ? {\n [K in keyof T]?: SortType<T[K]> | boolean;\n }\n : SortType<T> | boolean;\n\ntype SortDirection = 'asc' | 'desc' | 1 | -1 | true | false;\nconst SORT_MAP: Record<`${SortDirection}`, 1 | -1> = {\n asc: 1,\n desc: -1,\n 1: 1,\n '-1': -1,\n true: 1,\n false: -1,\n};\n\nconst sortCodeGen = <T>(sort: Sort<T>, valuePathA: string, valuePathB: string): string => {\n if (typeof sort === 'object' && sort !== null) {\n const condition = Object.entries(sort).map(([key, value]) => {\n const valueSubPathA = `${valuePathA}?.[${JSON.stringify(key)}]`;\n const valueSubPathB = `${valuePathB}?.[${JSON.stringify(key)}]`;\n return sortCodeGen(value, valueSubPathA, valueSubPathB);\n });\n if (condition.length > 0) {\n return condition.join(' || ');\n }\n }\n if (typeof sort === 'string' && (sort === 'asc' || sort === 'desc')) {\n return `(${valuePathA}?.localeCompare(${valuePathB}) * ${SORT_MAP[sort as `${SortDirection}`]})`;\n }\n if (typeof sort === 'number' && (sort === 1 || sort === -1)) {\n return `((${valuePathA} - ${valuePathB}) * ${SORT_MAP[`${sort}` as `${SortDirection}`]})`;\n }\n if (typeof sort === 'boolean') {\n return `(${valuePathA} > ${valuePathB} === ${sort} ? 1 : (${valuePathA} < ${valuePathB} === ${sort} ? -1 : 0)) `;\n }\n return `0`;\n};\n\nexport const createSort = <T>(sort?: Sort<T>): ((a: T, b: T) => number) => {\n if (!sort) {\n return () => 0;\n }\n const code = sortCodeGen(sort, 'a', 'b');\n const sortFn = new Function('a', 'b', `return ${code};`);\n return sortFn as (a: T, b: T) => number;\n};\n"],"names":["createFilter","createSort","isPrimitive","stringify","pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$incl","$nincl","$bits","$nbits","$type","$ntype","undefined","RegExp","source","flags","JSON","effectFilters","$in","context","scope","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","$ncon","operations","$and","join","$or","$nor","$not","Context","counter","values","cacheMap","constructor","scopeMap","Map","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","length","PRIMITIVES","filter","data","filterFn","Function","console","log","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","sortFn"],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
package/build/index.js
CHANGED
|
@@ -6,8 +6,10 @@ const pureFilters = {
|
|
|
6
6
|
$lt: (valuePath, value)=>`(${valuePath} < ${value})`,
|
|
7
7
|
$lte: (valuePath, value)=>`(${valuePath} <= ${value})`,
|
|
8
8
|
$exists: (valuePath, value)=>`((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,
|
|
9
|
-
$match: (valuePath, value)=>`${value}
|
|
10
|
-
$nmatch: (valuePath, value)=>`!${value}
|
|
9
|
+
$match: (valuePath, value)=>`${value}?.test('' + ${valuePath})`,
|
|
10
|
+
$nmatch: (valuePath, value)=>`!${value}?.test('' + ${valuePath})`,
|
|
11
|
+
$incl: (valuePath, value)=>`${valuePath}?.includes(${value})`,
|
|
12
|
+
$nincl: (valuePath, value)=>`!${valuePath}?.includes(${value})`,
|
|
11
13
|
$bits: (valuePath, value)=>`((${valuePath} & ${value}) === ${value})`,
|
|
12
14
|
$nbits: (valuePath, value)=>`((${valuePath} & ${value}) !== ${value})`,
|
|
13
15
|
$type: (valuePath, value)=>`(typeof ${valuePath} === ${value})`,
|
|
@@ -122,6 +124,7 @@ export const createFilter = (filter)=>{
|
|
|
122
124
|
const context = new Context(scope);
|
|
123
125
|
const code = filterCodeGen(filter, 'data', context);
|
|
124
126
|
const filterFn = new Function('data', 'scope', `${context}\nreturn ${code};`);
|
|
127
|
+
console.log(filterFn.toString());
|
|
125
128
|
return (data)=>filterFn(data, scope);
|
|
126
129
|
};
|
|
127
130
|
const SORT_MAP = {
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type RegExpOrString<T> = T extends string ? RegExp | T : T;\nexport type ItemType<T> = T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\nexport type FilterCondition<T> = T | ItemType<T> | PureFilterOperators<T> | PureFilterOperators<ItemType<T>> | LogicOperators<FilterCondition<T>>;\nexport type QueryStatefulCondition<T> =\n | T\n | ItemType<T>\n | StatefulFilterOperators<T>\n | StatefulFilterOperators<ItemType<T>>\n | LogicOperators<FilterCondition<T>>;\n\nexport type Filter<T> = {\n [P in keyof T]?: FilterCondition<T[P]>;\n} & LogicOperators<T>;\n\nexport interface LogicOperators<T> {\n $and?: Filter<T>[];\n $or?: Filter<T>[];\n $nor?: Filter<T>[];\n $not?: Filter<T>;\n}\n\nexport interface ConditionFn {\n (valuePath: string, value: any, context: Context): string;\n}\n\nexport type OperationKeys = keyof LogicOperators<unknown>;\n\nexport interface PureFilterOperators<ValueType> {\n $eq?: ValueType;\n $ne?: ValueType;\n $gt?: ValueType;\n $gte?: ValueType;\n $lt?: ValueType;\n $lte?: ValueType;\n\n $exists?: boolean;\n $match?: RegExp | string;\n $nmatch?: RegExp | string;\n $bits?: number;\n $nbits?: number;\n $type: string;\n $ntype: string;\n}\n\nexport type PureFilterOperatorsNames = keyof PureFilterOperators<unknown>;\n\nconst pureFilters: Record<PureFilterOperatorsNames, ConditionFn> = {\n $eq: (valuePath: string, value: unknown) => `(${valuePath} === ${value})`,\n $ne: (valuePath: string, value: unknown) => `(${valuePath} !== ${value})`,\n $gt: (valuePath: string, value: unknown) => `(${valuePath} > ${value})`,\n $gte: (valuePath: string, value: unknown) => `(${valuePath} >= ${value})`,\n $lt: (valuePath: string, value: unknown) => `(${valuePath} < ${value})`,\n $lte: (valuePath: string, value: unknown) => `(${valuePath} <= ${value})`,\n $exists: (valuePath: string, value: boolean) => `((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,\n $match: (valuePath: string, value: RegExp) => `${value}.test('' + ${valuePath})`,\n $nmatch: (valuePath: string, value: RegExp) => `!${value}.test('' + ${valuePath})`,\n $bits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) === ${value})`,\n $nbits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) !== ${value})`,\n $type: (valuePath: string, value: unknown) => `(typeof ${valuePath} === ${value})`,\n $ntype: (valuePath: string, value: unknown) => `(typeof ${valuePath} !== ${value})`,\n};\n\nexport interface EffectFilterOperators<ValueType> {\n $in?: ReadonlyArray<ValueType>;\n $nin?: ReadonlyArray<ValueType>;\n $sub?: ReadonlyArray<ValueType>;\n $nsub?: ReadonlyArray<ValueType>;\n $sup?: ReadonlyArray<ValueType>;\n $nsup?: ReadonlyArray<ValueType>;\n $con?: ValueType;\n $ncon?: ValueType;\n}\n\nexport type EffectFilterOperatorsNames = keyof EffectFilterOperators<unknown>;\n\nexport interface StatefulFilterOperators<ValueType> extends PureFilterOperators<ValueType> {\n $unique?: boolean;\n}\n\nexport const stringify = (value: unknown) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (value instanceof RegExp) {\n return `/${value.source}/${value.flags}`;\n }\n return JSON.stringify(value);\n};\n\nconst effectFilters: Record<EffectFilterOperatorsNames, ConditionFn> = {\n $in: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${scope}?.has(${valuePath})`;\n },\n $nin: (valuePath: string, value: unknown[], context: Context) => `!${effectFilters.$in(valuePath, value, context)}`,\n $sub: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${valuePath}.every((value) => ${scope}?.has(value))`;\n },\n $nsub: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sub(valuePath, value, context)}`,\n $sup: (valuePath: string, value: unknown, context: Context) => {\n const scope = context.scope(value);\n const name = context.register(`new Set(${valuePath})`);\n return `${scope}?.every((value) => ${name}.has(value))`;\n },\n $nsup: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sup(valuePath, value, context)}`,\n $con: (valuePath: string, value: unknown) => `new Set(${valuePath}).has(${stringify(value)})`,\n $ncon: (valuePath: string, value: unknown) => `!new Set(${valuePath}).has(${stringify(value)})`,\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => `(${value.join(' && ')})`,\n $or: (value: unknown[]) => `(${value.join(' || ')})`,\n $nor: (value: unknown[]) => `!(${value.join(' || ')})`,\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nclass Context {\n private counter = 0;\n private values: string[] = [];\n private cacheMap = new Map<string, string>();\n\n constructor(private scopeMap: Map<string, unknown>) {}\n\n scope<T>(value: T): string {\n const name = `s$$${this.counter++}`;\n this.scopeMap.set(name, value);\n return `scope.get('${name}')`;\n }\n\n register(code: string) {\n if (!this.cacheMap.has(code)) {\n const name = `v$$${this.counter++}`;\n this.values.push(`const ${name} = ${code};`);\n this.cacheMap.set(code, name);\n }\n return this.cacheMap.get(code)!;\n }\n\n toString() {\n return this.values.join('\\n');\n }\n}\n\nconst filterCodeGen = <T extends object>(query: Filter<T> | undefined, valuePath: string, context: Context): string => {\n if (typeof query === 'object' && query !== null) {\n const condition = Object.entries(query).map(([key, value]) => {\n if (key in pureFilters) {\n return pureFilters[key as PureFilterOperatorsNames](valuePath, stringify(value), context);\n }\n if (key in effectFilters) {\n return effectFilters[key as EffectFilterOperatorsNames](valuePath, value, context);\n }\n if (key in operations) {\n const values = Array.isArray(value) ? value : [value];\n return operations[key as OperationKeys](values.map((v) => filterCodeGen(v, valuePath, context)));\n }\n const valueSubPath = `${valuePath}?.[${stringify(key)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value), context);\n });\n if (condition.length > 0) {\n return `${condition.join(' && ')}`;\n }\n }\n return `${!!query}`;\n};\n\nconst PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol']);\n\nexport type Primitive = string | number | boolean | bigint | symbol;\nexport const isPrimitive = (value: unknown): value is Primitive => PRIMITIVES.has(typeof value);\n\nexport const createFilter = <T extends object | number | string | boolean | bigint | symbol>(\n filter: Filter<T> | number | string | boolean | bigint | symbol,\n): ((data: T) => boolean) => {\n if (isPrimitive(filter)) {\n return (data: T) => data === filter;\n }\n const scope = new Map<string, unknown>();\n const context = new Context(scope);\n const code = filterCodeGen(filter as object, 'data', context);\n const filterFn = new Function('data', 'scope', `${context}\\nreturn ${code};`);\n return (data: T) => filterFn(data, scope);\n};\n\nexport type SortType<T> = T extends number\n ? 1 | -1\n : T extends string\n ? 'asc' | 'desc'\n : T extends unknown[]\n ? { length?: 1 | -1 } & { [Index: number]: SortType<T[number]> }\n : boolean;\n\nexport type Sort<T> = T extends object\n ? {\n [K in keyof T]?: SortType<T[K]> | boolean;\n }\n : SortType<T> | boolean;\n\ntype SortDirection = 'asc' | 'desc' | 1 | -1 | true | false;\nconst SORT_MAP: Record<`${SortDirection}`, 1 | -1> = {\n asc: 1,\n desc: -1,\n 1: 1,\n '-1': -1,\n true: 1,\n false: -1,\n};\n\nconst sortCodeGen = <T>(sort: Sort<T>, valuePathA: string, valuePathB: string): string => {\n if (typeof sort === 'object' && sort !== null) {\n const condition = Object.entries(sort).map(([key, value]) => {\n const valueSubPathA = `${valuePathA}?.[${JSON.stringify(key)}]`;\n const valueSubPathB = `${valuePathB}?.[${JSON.stringify(key)}]`;\n return sortCodeGen(value, valueSubPathA, valueSubPathB);\n });\n if (condition.length > 0) {\n return condition.join(' || ');\n }\n }\n if (typeof sort === 'string' && (sort === 'asc' || sort === 'desc')) {\n return `(${valuePathA}?.localeCompare(${valuePathB}) * ${SORT_MAP[sort as `${SortDirection}`]})`;\n }\n if (typeof sort === 'number' && (sort === 1 || sort === -1)) {\n return `((${valuePathA} - ${valuePathB}) * ${SORT_MAP[`${sort}` as `${SortDirection}`]})`;\n }\n if (typeof sort === 'boolean') {\n return `(${valuePathA} > ${valuePathB} === ${sort} ? 1 : (${valuePathA} < ${valuePathB} === ${sort} ? -1 : 0)) `;\n }\n return `0`;\n};\n\nexport const createSort = <T>(sort?: Sort<T>): ((a: T, b: T) => number) => {\n if (!sort) {\n return () => 0;\n }\n const code = sortCodeGen(sort, 'a', 'b');\n const sortFn = new Function('a', 'b', `return ${code};`);\n return sortFn as (a: T, b: T) => number;\n};\n"],"names":["pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$bits","$nbits","$type","$ntype","stringify","undefined","RegExp","source","flags","JSON","effectFilters","$in","context","scope","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","$ncon","operations","$and","join","$or","$nor","$not","Context","counter","values","cacheMap","constructor","scopeMap","Map","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","length","PRIMITIVES","isPrimitive","createFilter","filter","data","filterFn","Function","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","createSort","sortFn"],"mappings":"AA8CA,MAAMA,cAA6D;IACjEC,KAAK,CAACC,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,KAAK,EAAEC,MAAM,CAAC,CAAC;IACzEC,KAAK,CAACF,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,KAAK,EAAEC,MAAM,CAAC,CAAC;IACzEE,KAAK,CAACH,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,GAAG,EAAEC,MAAM,CAAC,CAAC;IACvEG,MAAM,CAACJ,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,IAAI,EAAEC,MAAM,CAAC,CAAC;IACzEI,KAAK,CAACL,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,GAAG,EAAEC,MAAM,CAAC,CAAC;IACvEK,MAAM,CAACN,WAAmBC,QAAmB,CAAC,CAAC,EAAED,UAAU,IAAI,EAAEC,MAAM,CAAC,CAAC;IACzEM,SAAS,CAACP,WAAmBC,QAAmB,CAAC,EAAE,EAAED,UAAU,kBAAkB,EAAEA,UAAU,eAAe,EAAEC,MAAM,CAAC,CAAC;IACtHO,QAAQ,CAACR,WAAmBC,QAAkB,GAAGA,MAAM,WAAW,EAAED,UAAU,CAAC,CAAC;IAChFS,SAAS,CAACT,WAAmBC,QAAkB,CAAC,CAAC,EAAEA,MAAM,WAAW,EAAED,UAAU,CAAC,CAAC;IAClFU,OAAO,CAACV,WAAmBC,QAAmB,CAAC,EAAE,EAAED,UAAU,GAAG,EAAEC,MAAM,MAAM,EAAEA,MAAM,CAAC,CAAC;IACxFU,QAAQ,CAACX,WAAmBC,QAAmB,CAAC,EAAE,EAAED,UAAU,GAAG,EAAEC,MAAM,MAAM,EAAEA,MAAM,CAAC,CAAC;IACzFW,OAAO,CAACZ,WAAmBC,QAAmB,CAAC,QAAQ,EAAED,UAAU,KAAK,EAAEC,MAAM,CAAC,CAAC;IAClFY,QAAQ,CAACb,WAAmBC,QAAmB,CAAC,QAAQ,EAAED,UAAU,KAAK,EAAEC,MAAM,CAAC,CAAC;AACrF;AAmBA,OAAO,MAAMa,YAAY,CAACb;IACxB,IAAIA,UAAUc,WAAW;QACvB,OAAO;IACT;IACA,IAAId,iBAAiBe,QAAQ;QAC3B,OAAO,CAAC,CAAC,EAAEf,MAAMgB,MAAM,CAAC,CAAC,EAAEhB,MAAMiB,KAAK,EAAE;IAC1C;IACA,OAAOC,KAAKL,SAAS,CAACb;AACxB,EAAE;AAEF,MAAMmB,gBAAiE;IACrEC,KAAK,CAACrB,WAAmBC,OAAkBqB;QACzC,MAAMC,QAAQD,QAAQC,KAAK,CAAC,IAAIC,IAAIvB;QACpC,OAAO,GAAGsB,MAAM,MAAM,EAAEvB,UAAU,CAAC,CAAC;IACtC;IACAyB,MAAM,CAACzB,WAAmBC,OAAkBqB,UAAqB,CAAC,CAAC,EAAEF,cAAcC,GAAG,CAACrB,WAAWC,OAAOqB,UAAU;IACnHI,MAAM,CAAC1B,WAAmBC,OAAkBqB;QAC1C,MAAMC,QAAQD,QAAQC,KAAK,CAAC,IAAIC,IAAIvB;QACpC,OAAO,GAAGD,UAAU,kBAAkB,EAAEuB,MAAM,aAAa,CAAC;IAC9D;IACAI,OAAO,CAAC3B,WAAmBC,OAAgBqB,UAAqB,CAAC,CAAC,EAAEF,cAAcM,IAAI,CAAC1B,WAAWC,OAAOqB,UAAU;IACnHM,MAAM,CAAC5B,WAAmBC,OAAgBqB;QACxC,MAAMC,QAAQD,QAAQC,KAAK,CAACtB;QAC5B,MAAM4B,OAAOP,QAAQQ,QAAQ,CAAC,CAAC,QAAQ,EAAE9B,UAAU,CAAC,CAAC;QACrD,OAAO,GAAGuB,MAAM,mBAAmB,EAAEM,KAAK,YAAY,CAAC;IACzD;IACAE,OAAO,CAAC/B,WAAmBC,OAAgBqB,UAAqB,CAAC,CAAC,EAAEF,cAAcQ,IAAI,CAAC5B,WAAWC,OAAOqB,UAAU;IACnHU,MAAM,CAAChC,WAAmBC,QAAmB,CAAC,QAAQ,EAAED,UAAU,MAAM,EAAEc,UAAUb,OAAO,CAAC,CAAC;IAC7FgC,OAAO,CAACjC,WAAmBC,QAAmB,CAAC,SAAS,EAAED,UAAU,MAAM,EAAEc,UAAUb,OAAO,CAAC,CAAC;AACjG;AAEA,MAAMiC,aAAyD;IAC7DC,MAAM,CAAClC,QAAqB,CAAC,CAAC,EAAEA,MAAMmC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrDC,KAAK,CAACpC,QAAqB,CAAC,CAAC,EAAEA,MAAMmC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpDE,MAAM,CAACrC,QAAqB,CAAC,EAAE,EAAEA,MAAMmC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtDG,MAAM,CAACtC,QAAqB,CAAC,EAAE,EAAEA,MAAM,CAAC,CAAC;AAC3C;AAEA,MAAMuC;;IACIC,QAAY;IACZC,OAAsB;IACtBC,SAAqC;IAE7CC,YAAY,AAAQC,QAA8B,CAAE;aAAhCA,WAAAA;aAJZJ,UAAU;aACVC,SAAmB,EAAE;aACrBC,WAAW,IAAIG;IAE8B;IAErDvB,MAAStB,KAAQ,EAAU;QACzB,MAAM4B,OAAO,CAAC,GAAG,EAAE,IAAI,CAACY,OAAO,IAAI;QACnC,IAAI,CAACI,QAAQ,CAACE,GAAG,CAAClB,MAAM5B;QACxB,OAAO,CAAC,WAAW,EAAE4B,KAAK,EAAE,CAAC;IAC/B;IAEAC,SAASkB,IAAY,EAAE;QACrB,IAAI,CAAC,IAAI,CAACL,QAAQ,CAACM,GAAG,CAACD,OAAO;YAC5B,MAAMnB,OAAO,CAAC,GAAG,EAAE,IAAI,CAACY,OAAO,IAAI;YACnC,IAAI,CAACC,MAAM,CAACQ,IAAI,CAAC,CAAC,MAAM,EAAErB,KAAK,GAAG,EAAEmB,KAAK,CAAC,CAAC;YAC3C,IAAI,CAACL,QAAQ,CAACI,GAAG,CAACC,MAAMnB;QAC1B;QACA,OAAO,IAAI,CAACc,QAAQ,CAACQ,GAAG,CAACH;IAC3B;IAEAI,WAAW;QACT,OAAO,IAAI,CAACV,MAAM,CAACN,IAAI,CAAC;IAC1B;AACF;AAEA,MAAMiB,gBAAgB,CAAmBC,OAA8BtD,WAAmBsB;IACxF,IAAI,OAAOgC,UAAU,YAAYA,UAAU,MAAM;QAC/C,MAAMC,YAAYC,OAAOC,OAAO,CAACH,OAAOI,GAAG,CAAC,CAAC,CAACC,KAAK1D,MAAM;YACvD,IAAI0D,OAAO7D,aAAa;gBACtB,OAAOA,WAAW,CAAC6D,IAAgC,CAAC3D,WAAWc,UAAUb,QAAQqB;YACnF;YACA,IAAIqC,OAAOvC,eAAe;gBACxB,OAAOA,aAAa,CAACuC,IAAkC,CAAC3D,WAAWC,OAAOqB;YAC5E;YACA,IAAIqC,OAAOzB,YAAY;gBACrB,MAAMQ,SAASkB,MAAMC,OAAO,CAAC5D,SAASA,QAAQ;oBAACA;iBAAM;gBACrD,OAAOiC,UAAU,CAACyB,IAAqB,CAACjB,OAAOgB,GAAG,CAAC,CAACI,IAAMT,cAAcS,GAAG9D,WAAWsB;YACxF;YACA,MAAMyC,eAAe,GAAG/D,UAAU,GAAG,EAAEc,UAAU6C,KAAK,CAAC,CAAC;YACxD,IAAI1D,iBAAiBe,QAAQ;gBAC3B,OAAOlB,YAAYU,MAAM,CAACuD,cAAcjD,UAAUb,QAAQqB;YAC5D;YACA,IAAI,OAAOrB,UAAU,YAAYA,UAAU,MAAM;gBAC/C,OAAOoD,cAAcpD,OAAO8D,cAAczC;YAC5C;YACA,OAAOxB,YAAYC,GAAG,CAACgE,cAAcjD,UAAUb,QAAQqB;QACzD;QACA,IAAIiC,UAAUS,MAAM,GAAG,GAAG;YACxB,OAAO,GAAGT,UAAUnB,IAAI,CAAC,SAAS;QACpC;IACF;IACA,OAAO,GAAG,CAAC,CAACkB,OAAO;AACrB;AAEA,MAAMW,aAAa,IAAIzC,IAAI;IAAC;IAAU;IAAU;IAAW;IAAU;CAAS;AAG9E,OAAO,MAAM0C,cAAc,CAACjE,QAAuCgE,WAAWhB,GAAG,CAAC,OAAOhD,OAAO;AAEhG,OAAO,MAAMkE,eAAe,CAC1BC;IAEA,IAAIF,YAAYE,SAAS;QACvB,OAAO,CAACC,OAAYA,SAASD;IAC/B;IACA,MAAM7C,QAAQ,IAAIuB;IAClB,MAAMxB,UAAU,IAAIkB,QAAQjB;IAC5B,MAAMyB,OAAOK,cAAce,QAAkB,QAAQ9C;IACrD,MAAMgD,WAAW,IAAIC,SAAS,QAAQ,SAAS,GAAGjD,QAAQ,SAAS,EAAE0B,KAAK,CAAC,CAAC;IAC5E,OAAO,CAACqB,OAAYC,SAASD,MAAM9C;AACrC,EAAE;AAiBF,MAAMiD,WAA+C;IACnDC,KAAK;IACLC,MAAM,CAAC;IACP,GAAG;IACH,MAAM,CAAC;IACPC,MAAM;IACNC,OAAO,CAAC;AACV;AAEA,MAAMC,cAAc,CAAIC,MAAeC,YAAoBC;IACzD,IAAI,OAAOF,SAAS,YAAYA,SAAS,MAAM;QAC7C,MAAMvB,YAAYC,OAAOC,OAAO,CAACqB,MAAMpB,GAAG,CAAC,CAAC,CAACC,KAAK1D,MAAM;YACtD,MAAMgF,gBAAgB,GAAGF,WAAW,GAAG,EAAE5D,KAAKL,SAAS,CAAC6C,KAAK,CAAC,CAAC;YAC/D,MAAMuB,gBAAgB,GAAGF,WAAW,GAAG,EAAE7D,KAAKL,SAAS,CAAC6C,KAAK,CAAC,CAAC;YAC/D,OAAOkB,YAAY5E,OAAOgF,eAAeC;QAC3C;QACA,IAAI3B,UAAUS,MAAM,GAAG,GAAG;YACxB,OAAOT,UAAUnB,IAAI,CAAC;QACxB;IACF;IACA,IAAI,OAAO0C,SAAS,YAAaA,CAAAA,SAAS,SAASA,SAAS,MAAK,GAAI;QACnE,OAAO,CAAC,CAAC,EAAEC,WAAW,gBAAgB,EAAEC,WAAW,IAAI,EAAER,QAAQ,CAACM,KAA2B,CAAC,CAAC,CAAC;IAClG;IACA,IAAI,OAAOA,SAAS,YAAaA,CAAAA,SAAS,KAAKA,SAAS,CAAC,CAAA,GAAI;QAC3D,OAAO,CAAC,EAAE,EAAEC,WAAW,GAAG,EAAEC,WAAW,IAAI,EAAER,QAAQ,CAAC,GAAGM,MAAM,CAAuB,CAAC,CAAC,CAAC;IAC3F;IACA,IAAI,OAAOA,SAAS,WAAW;QAC7B,OAAO,CAAC,CAAC,EAAEC,WAAW,GAAG,EAAEC,WAAW,KAAK,EAAEF,KAAK,QAAQ,EAAEC,WAAW,GAAG,EAAEC,WAAW,KAAK,EAAEF,KAAK,YAAY,CAAC;IAClH;IACA,OAAO,CAAC,CAAC,CAAC;AACZ;AAEA,OAAO,MAAMK,aAAa,CAAIL;IAC5B,IAAI,CAACA,MAAM;QACT,OAAO,IAAM;IACf;IACA,MAAM9B,OAAO6B,YAAYC,MAAM,KAAK;IACpC,MAAMM,SAAS,IAAIb,SAAS,KAAK,KAAK,CAAC,OAAO,EAAEvB,KAAK,CAAC,CAAC;IACvD,OAAOoC;AACT,EAAE"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type RegExpOrString<T> = T extends string ? RegExp | T : T;\nexport type ItemType<T> = T extends ReadonlyArray<infer U> ? T | RegExpOrString<U> : RegExpOrString<T>;\nexport type FilterCondition<T> = T | ItemType<T> | PureFilterOperators<T> | PureFilterOperators<ItemType<T>> | LogicOperators<FilterCondition<T>>;\nexport type QueryStatefulCondition<T> =\n | T\n | ItemType<T>\n | StatefulFilterOperators<T>\n | StatefulFilterOperators<ItemType<T>>\n | LogicOperators<FilterCondition<T>>;\n\nexport type Filter<T> = {\n [P in keyof T]?: FilterCondition<T[P]>;\n} & LogicOperators<T>;\n\nexport interface LogicOperators<T> {\n $and?: Filter<T>[];\n $or?: Filter<T>[];\n $nor?: Filter<T>[];\n $not?: Filter<T>;\n}\n\nexport interface ConditionFn {\n (valuePath: string, value: any, context: Context): string;\n}\n\nexport type OperationKeys = keyof LogicOperators<unknown>;\n\nexport interface PureFilterOperators<ValueType> {\n $eq?: ValueType;\n $ne?: ValueType;\n $gt?: ValueType;\n $gte?: ValueType;\n $lt?: ValueType;\n $lte?: ValueType;\n\n $exists?: boolean;\n $match?: RegExp | string;\n $nmatch?: RegExp | string;\n $incl: string;\n $nincl: string;\n $bits?: number;\n $nbits?: number;\n $type: string;\n $ntype: string;\n}\n\nexport type PureFilterOperatorsNames = keyof PureFilterOperators<unknown>;\n\nconst pureFilters: Record<PureFilterOperatorsNames, ConditionFn> = {\n $eq: (valuePath: string, value: unknown) => `(${valuePath} === ${value})`,\n $ne: (valuePath: string, value: unknown) => `(${valuePath} !== ${value})`,\n $gt: (valuePath: string, value: unknown) => `(${valuePath} > ${value})`,\n $gte: (valuePath: string, value: unknown) => `(${valuePath} >= ${value})`,\n $lt: (valuePath: string, value: unknown) => `(${valuePath} < ${value})`,\n $lte: (valuePath: string, value: unknown) => `(${valuePath} <= ${value})`,\n $exists: (valuePath: string, value: boolean) => `((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,\n $match: (valuePath: string, value: RegExp) => `${value}?.test('' + ${valuePath})`,\n $nmatch: (valuePath: string, value: RegExp) => `!${value}?.test('' + ${valuePath})`,\n $incl: (valuePath: string, value: string) => `${valuePath}?.includes(${value})`,\n $nincl: (valuePath: string, value: string) => `!${valuePath}?.includes(${value})`,\n $bits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) === ${value})`,\n $nbits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) !== ${value})`,\n $type: (valuePath: string, value: unknown) => `(typeof ${valuePath} === ${value})`,\n $ntype: (valuePath: string, value: unknown) => `(typeof ${valuePath} !== ${value})`,\n};\n\nexport interface EffectFilterOperators<ValueType> {\n $in?: ReadonlyArray<ValueType>;\n $nin?: ReadonlyArray<ValueType>;\n $sub?: ReadonlyArray<ValueType>;\n $nsub?: ReadonlyArray<ValueType>;\n $sup?: ReadonlyArray<ValueType>;\n $nsup?: ReadonlyArray<ValueType>;\n $con?: ValueType;\n $ncon?: ValueType;\n}\n\nexport type EffectFilterOperatorsNames = keyof EffectFilterOperators<unknown>;\n\nexport interface StatefulFilterOperators<ValueType> extends PureFilterOperators<ValueType> {\n $unique?: boolean;\n}\n\nexport const stringify = (value: unknown) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (value instanceof RegExp) {\n return `/${value.source}/${value.flags}`;\n }\n return JSON.stringify(value);\n};\n\nconst effectFilters: Record<EffectFilterOperatorsNames, ConditionFn> = {\n $in: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${scope}?.has(${valuePath})`;\n },\n $nin: (valuePath: string, value: unknown[], context: Context) => `!${effectFilters.$in(valuePath, value, context)}`,\n $sub: (valuePath: string, value: unknown[], context: Context) => {\n const scope = context.scope(new Set(value));\n return `${valuePath}.every((value) => ${scope}?.has(value))`;\n },\n $nsub: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sub(valuePath, value, context)}`,\n $sup: (valuePath: string, value: unknown, context: Context) => {\n const scope = context.scope(value);\n const name = context.register(`new Set(${valuePath})`);\n return `${scope}?.every((value) => ${name}.has(value))`;\n },\n $nsup: (valuePath: string, value: unknown, context: Context) => `!${effectFilters.$sup(valuePath, value, context)}`,\n $con: (valuePath: string, value: unknown) => `new Set(${valuePath}).has(${stringify(value)})`,\n $ncon: (valuePath: string, value: unknown) => `!new Set(${valuePath}).has(${stringify(value)})`,\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => `(${value.join(' && ')})`,\n $or: (value: unknown[]) => `(${value.join(' || ')})`,\n $nor: (value: unknown[]) => `!(${value.join(' || ')})`,\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nclass Context {\n private counter = 0;\n private values: string[] = [];\n private cacheMap = new Map<string, string>();\n\n constructor(private scopeMap: Map<string, unknown>) {}\n\n scope<T>(value: T): string {\n const name = `s$$${this.counter++}`;\n this.scopeMap.set(name, value);\n return `scope.get('${name}')`;\n }\n\n register(code: string) {\n if (!this.cacheMap.has(code)) {\n const name = `v$$${this.counter++}`;\n this.values.push(`const ${name} = ${code};`);\n this.cacheMap.set(code, name);\n }\n return this.cacheMap.get(code)!;\n }\n\n toString() {\n return this.values.join('\\n');\n }\n}\n\nconst filterCodeGen = <T extends object>(query: Filter<T> | undefined, valuePath: string, context: Context): string => {\n if (typeof query === 'object' && query !== null) {\n const condition = Object.entries(query).map(([key, value]) => {\n if (key in pureFilters) {\n return pureFilters[key as PureFilterOperatorsNames](valuePath, stringify(value), context);\n }\n if (key in effectFilters) {\n return effectFilters[key as EffectFilterOperatorsNames](valuePath, value, context);\n }\n if (key in operations) {\n const values = Array.isArray(value) ? value : [value];\n return operations[key as OperationKeys](values.map((v) => filterCodeGen(v, valuePath, context)));\n }\n const valueSubPath = `${valuePath}?.[${stringify(key)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value), context);\n });\n if (condition.length > 0) {\n return `${condition.join(' && ')}`;\n }\n }\n return `${!!query}`;\n};\n\nconst PRIMITIVES = new Set(['string', 'number', 'boolean', 'bigint', 'symbol']);\n\nexport type Primitive = string | number | boolean | bigint | symbol;\nexport const isPrimitive = (value: unknown): value is Primitive => PRIMITIVES.has(typeof value);\n\nexport const createFilter = <T extends object | number | string | boolean | bigint | symbol>(\n filter: Filter<T> | number | string | boolean | bigint | symbol,\n): ((data: T) => boolean) => {\n if (isPrimitive(filter)) {\n return (data: T) => data === filter;\n }\n const scope = new Map<string, unknown>();\n const context = new Context(scope);\n const code = filterCodeGen(filter as object, 'data', context);\n const filterFn = new Function('data', 'scope', `${context}\\nreturn ${code};`);\n console.log(filterFn.toString());\n return (data: T) => filterFn(data, scope);\n};\n\nexport type SortType<T> = T extends number\n ? 1 | -1\n : T extends string\n ? 'asc' | 'desc'\n : T extends unknown[]\n ? { length?: 1 | -1 } & { [Index: number]: SortType<T[number]> }\n : boolean;\n\nexport type Sort<T> = T extends object\n ? {\n [K in keyof T]?: SortType<T[K]> | boolean;\n }\n : SortType<T> | boolean;\n\ntype SortDirection = 'asc' | 'desc' | 1 | -1 | true | false;\nconst SORT_MAP: Record<`${SortDirection}`, 1 | -1> = {\n asc: 1,\n desc: -1,\n 1: 1,\n '-1': -1,\n true: 1,\n false: -1,\n};\n\nconst sortCodeGen = <T>(sort: Sort<T>, valuePathA: string, valuePathB: string): string => {\n if (typeof sort === 'object' && sort !== null) {\n const condition = Object.entries(sort).map(([key, value]) => {\n const valueSubPathA = `${valuePathA}?.[${JSON.stringify(key)}]`;\n const valueSubPathB = `${valuePathB}?.[${JSON.stringify(key)}]`;\n return sortCodeGen(value, valueSubPathA, valueSubPathB);\n });\n if (condition.length > 0) {\n return condition.join(' || ');\n }\n }\n if (typeof sort === 'string' && (sort === 'asc' || sort === 'desc')) {\n return `(${valuePathA}?.localeCompare(${valuePathB}) * ${SORT_MAP[sort as `${SortDirection}`]})`;\n }\n if (typeof sort === 'number' && (sort === 1 || sort === -1)) {\n return `((${valuePathA} - ${valuePathB}) * ${SORT_MAP[`${sort}` as `${SortDirection}`]})`;\n }\n if (typeof sort === 'boolean') {\n return `(${valuePathA} > ${valuePathB} === ${sort} ? 1 : (${valuePathA} < ${valuePathB} === ${sort} ? -1 : 0)) `;\n }\n return `0`;\n};\n\nexport const createSort = <T>(sort?: Sort<T>): ((a: T, b: T) => number) => {\n if (!sort) {\n return () => 0;\n }\n const code = sortCodeGen(sort, 'a', 'b');\n const sortFn = new Function('a', 'b', `return ${code};`);\n return sortFn as (a: T, b: T) => number;\n};\n"],"names":["pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$incl","$nincl","$bits","$nbits","$type","$ntype","stringify","undefined","RegExp","source","flags","JSON","effectFilters","$in","context","scope","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","$ncon","operations","$and","join","$or","$nor","$not","Context","counter","values","cacheMap","constructor","scopeMap","Map","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","length","PRIMITIVES","isPrimitive","createFilter","filter","data","filterFn","Function","console","log","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","createSort","sortFn"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -36,6 +36,8 @@ export interface PureFilterOperators<ValueType> {
|
|
|
36
36
|
$exists?: boolean;
|
|
37
37
|
$match?: RegExp | string;
|
|
38
38
|
$nmatch?: RegExp | string;
|
|
39
|
+
$incl: string;
|
|
40
|
+
$nincl: string;
|
|
39
41
|
$bits?: number;
|
|
40
42
|
$nbits?: number;
|
|
41
43
|
$type: string;
|
|
@@ -52,8 +54,10 @@ const pureFilters: Record<PureFilterOperatorsNames, ConditionFn> = {
|
|
|
52
54
|
$lt: (valuePath: string, value: unknown) => `(${valuePath} < ${value})`,
|
|
53
55
|
$lte: (valuePath: string, value: unknown) => `(${valuePath} <= ${value})`,
|
|
54
56
|
$exists: (valuePath: string, value: boolean) => `((${valuePath} !== undefined && ${valuePath} !== null) === ${value})`,
|
|
55
|
-
$match: (valuePath: string, value: RegExp) => `${value}
|
|
56
|
-
$nmatch: (valuePath: string, value: RegExp) => `!${value}
|
|
57
|
+
$match: (valuePath: string, value: RegExp) => `${value}?.test('' + ${valuePath})`,
|
|
58
|
+
$nmatch: (valuePath: string, value: RegExp) => `!${value}?.test('' + ${valuePath})`,
|
|
59
|
+
$incl: (valuePath: string, value: string) => `${valuePath}?.includes(${value})`,
|
|
60
|
+
$nincl: (valuePath: string, value: string) => `!${valuePath}?.includes(${value})`,
|
|
57
61
|
$bits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) === ${value})`,
|
|
58
62
|
$nbits: (valuePath: string, value: unknown) => `((${valuePath} & ${value}) !== ${value})`,
|
|
59
63
|
$type: (valuePath: string, value: unknown) => `(typeof ${valuePath} === ${value})`,
|
|
@@ -186,6 +190,7 @@ export const createFilter = <T extends object | number | string | boolean | bigi
|
|
|
186
190
|
const context = new Context(scope);
|
|
187
191
|
const code = filterCodeGen(filter as object, 'data', context);
|
|
188
192
|
const filterFn = new Function('data', 'scope', `${context}\nreturn ${code};`);
|
|
193
|
+
console.log(filterFn.toString());
|
|
189
194
|
return (data: T) => filterFn(data, scope);
|
|
190
195
|
};
|
|
191
196
|
|