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 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}.test('' + ${valuePath})`,
34
- $nmatch: (valuePath, value)=>`!${value}.test('' + ${valuePath})`,
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 = {
@@ -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
@@ -25,6 +25,8 @@ export interface PureFilterOperators<ValueType> {
25
25
  $exists?: boolean;
26
26
  $match?: RegExp | string;
27
27
  $nmatch?: RegExp | string;
28
+ $incl: string;
29
+ $nincl: string;
28
30
  $bits?: number;
29
31
  $nbits?: number;
30
32
  $type: string;
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}.test('' + ${valuePath})`,
10
- $nmatch: (valuePath, value)=>`!${value}.test('' + ${valuePath})`,
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 = {
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ajoq",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "types": "build/index.d.ts",
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}.test('' + ${valuePath})`,
56
- $nmatch: (valuePath: string, value: RegExp) => `!${value}.test('' + ${valuePath})`,
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