ajoq 0.1.71 → 0.1.72
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 +3 -3
- package/build/index.cjs.map +1 -1
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -3
package/build/index.cjs
CHANGED
|
@@ -79,9 +79,9 @@ const effectFilters = {
|
|
|
79
79
|
}
|
|
80
80
|
};
|
|
81
81
|
const operations = {
|
|
82
|
-
$and: (value)
|
|
83
|
-
$or: (value)
|
|
84
|
-
$nor: (value)
|
|
82
|
+
$and: (value)=>value.length ? `(${value.join(' && ')})` : 'true',
|
|
83
|
+
$or: (value)=>value.length ? `(${value.join(' || ')})` : 'false',
|
|
84
|
+
$nor: (value)=>value.length ? `!(${value.join(' || ')})` : 'true',
|
|
85
85
|
$not: (value)=>`!(${value})`
|
|
86
86
|
};
|
|
87
87
|
class Context {
|
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 $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, context: Context) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (!isPrimitive(value) || typeof value === 'bigint') {\n const scope = context.scope(value);\n return scope;\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, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `${setVar}.has(${stringify(value, context)})`;\n },\n $ncon: (valuePath: string, value: unknown, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `!${setVar}.has(${stringify(value, context)})`;\n },\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\nexport class 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), 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, context)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value, context), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value, context), 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":["Context","createFilter","createSort","isPrimitive","stringify","pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$incl","$nincl","$bits","$nbits","$type","$ntype","context","undefined","scope","JSON","effectFilters","$in","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","setVar","$ncon","operations","$and","join","$or","$nor","$not","counter","values","cacheMap","Map","scopeMap","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","RegExp","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, context: Context) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (!isPrimitive(value) || typeof value === 'bigint') {\n const scope = context.scope(value);\n return scope;\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, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `${setVar}.has(${stringify(value, context)})`;\n },\n $ncon: (valuePath: string, value: unknown, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `!${setVar}.has(${stringify(value, context)})`;\n },\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => (value.length ? `(${value.join(' && ')})` : 'true'),\n $or: (value: unknown[]) => (value.length ? `(${value.join(' || ')})` : 'false'),\n $nor: (value: unknown[]) => (value.length ? `!(${value.join(' || ')})` : 'true'),\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nexport class 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), 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, context)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value, context), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value, context), 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":["Context","createFilter","createSort","isPrimitive","stringify","pureFilters","$eq","valuePath","value","$ne","$gt","$gte","$lt","$lte","$exists","$match","$nmatch","$incl","$nincl","$bits","$nbits","$type","$ntype","context","undefined","scope","JSON","effectFilters","$in","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","setVar","$ncon","operations","$and","length","join","$or","$nor","$not","counter","values","cacheMap","Map","scopeMap","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","RegExp","PRIMITIVES","filter","data","filterFn","Function","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","sortFn"],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -52,9 +52,9 @@ const effectFilters = {
|
|
|
52
52
|
}
|
|
53
53
|
};
|
|
54
54
|
const operations = {
|
|
55
|
-
$and: (value)
|
|
56
|
-
$or: (value)
|
|
57
|
-
$nor: (value)
|
|
55
|
+
$and: (value)=>value.length ? `(${value.join(' && ')})` : 'true',
|
|
56
|
+
$or: (value)=>value.length ? `(${value.join(' || ')})` : 'false',
|
|
57
|
+
$nor: (value)=>value.length ? `!(${value.join(' || ')})` : 'true',
|
|
58
58
|
$not: (value)=>`!(${value})`
|
|
59
59
|
};
|
|
60
60
|
export class Context {
|
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 $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, context: Context) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (!isPrimitive(value) || typeof value === 'bigint') {\n const scope = context.scope(value);\n return scope;\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, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `${setVar}.has(${stringify(value, context)})`;\n },\n $ncon: (valuePath: string, value: unknown, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `!${setVar}.has(${stringify(value, context)})`;\n },\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\nexport class 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), 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, context)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value, context), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value, context), 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","$incl","$nincl","$bits","$nbits","$type","$ntype","stringify","context","undefined","isPrimitive","scope","JSON","effectFilters","$in","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","setVar","$ncon","operations","$and","join","$or","$nor","$not","Context","counter","values","cacheMap","Map","scopeMap","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","RegExp","length","PRIMITIVES","createFilter","filter","data","filterFn","Function","SORT_MAP","asc","desc","true","false","sortCodeGen","sort","valuePathA","valuePathB","valueSubPathA","valueSubPathB","createSort","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, context: Context) => {\n if (value === undefined) {\n return 'undefined';\n }\n if (!isPrimitive(value) || typeof value === 'bigint') {\n const scope = context.scope(value);\n return scope;\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, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `${setVar}.has(${stringify(value, context)})`;\n },\n $ncon: (valuePath: string, value: unknown, context: Context) => {\n const setVar = context.register(`new Set(${valuePath})`);\n return `!${setVar}.has(${stringify(value, context)})`;\n },\n};\n\nconst operations: Record<keyof LogicOperators<unknown>, any> = {\n $and: (value: unknown[]) => (value.length ? `(${value.join(' && ')})` : 'true'),\n $or: (value: unknown[]) => (value.length ? `(${value.join(' || ')})` : 'false'),\n $nor: (value: unknown[]) => (value.length ? `!(${value.join(' || ')})` : 'true'),\n $not: (value: unknown[]) => `!(${value})`,\n};\n\nexport class 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), 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, context)}]`;\n if (value instanceof RegExp) {\n return pureFilters.$match(valueSubPath, stringify(value, context), context);\n }\n if (typeof value === 'object' && value !== null) {\n return filterCodeGen(value, valueSubPath, context);\n }\n return pureFilters.$eq(valueSubPath, stringify(value, context), 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","$incl","$nincl","$bits","$nbits","$type","$ntype","stringify","context","undefined","isPrimitive","scope","JSON","effectFilters","$in","Set","$nin","$sub","$nsub","$sup","name","register","$nsup","$con","setVar","$ncon","operations","$and","length","join","$or","$nor","$not","Context","counter","values","cacheMap","Map","scopeMap","set","code","has","push","get","toString","filterCodeGen","query","condition","Object","entries","map","key","Array","isArray","v","valueSubPath","RegExp","PRIMITIVES","createFilter","filter","data","filterFn","Function","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
|
@@ -120,9 +120,9 @@ const effectFilters: Record<EffectFilterOperatorsNames, ConditionFn> = {
|
|
|
120
120
|
};
|
|
121
121
|
|
|
122
122
|
const operations: Record<keyof LogicOperators<unknown>, any> = {
|
|
123
|
-
$and: (value: unknown[]) => `(${value.join(' && ')})
|
|
124
|
-
$or: (value: unknown[]) => `(${value.join(' || ')})
|
|
125
|
-
$nor: (value: unknown[]) => `!(${value.join(' || ')})
|
|
123
|
+
$and: (value: unknown[]) => (value.length ? `(${value.join(' && ')})` : 'true'),
|
|
124
|
+
$or: (value: unknown[]) => (value.length ? `(${value.join(' || ')})` : 'false'),
|
|
125
|
+
$nor: (value: unknown[]) => (value.length ? `!(${value.join(' || ')})` : 'true'),
|
|
126
126
|
$not: (value: unknown[]) => `!(${value})`,
|
|
127
127
|
};
|
|
128
128
|
|