@hf-chimera/store 0.0.15 → 0.2.0

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.
Files changed (64) hide show
  1. package/README.md +171 -360
  2. package/dist/defaults-CDnbUToo.cjs +175 -0
  3. package/dist/defaults-CDnbUToo.cjs.map +1 -0
  4. package/dist/defaults-DkrKTPXY.mjs +91 -0
  5. package/dist/defaults-DkrKTPXY.mjs.map +1 -0
  6. package/dist/defaults.cjs +3 -14
  7. package/dist/defaults.d.cts +16 -42
  8. package/dist/defaults.d.cts.map +1 -1
  9. package/dist/defaults.d.mts +33 -0
  10. package/dist/defaults.d.mts.map +1 -0
  11. package/dist/defaults.mjs +3 -0
  12. package/dist/index.cjs +1709 -23
  13. package/dist/index.cjs.map +1 -0
  14. package/dist/index.d.cts +634 -2
  15. package/dist/index.d.cts.map +1 -0
  16. package/dist/index.d.mts +634 -0
  17. package/dist/index.d.mts.map +1 -0
  18. package/dist/{src-C74sq0jQ.js → index.mjs} +252 -246
  19. package/dist/index.mjs.map +1 -0
  20. package/dist/types-CNGIuRUw.d.mts +117 -0
  21. package/dist/types-CNGIuRUw.d.mts.map +1 -0
  22. package/dist/types-CuI5yXiY.d.cts +117 -0
  23. package/dist/types-CuI5yXiY.d.cts.map +1 -0
  24. package/package.json +10 -42
  25. package/.changeset/README.md +0 -8
  26. package/CHANGELOG.md +0 -92
  27. package/dist/adapters/react.cjs +0 -122
  28. package/dist/adapters/react.cjs.map +0 -1
  29. package/dist/adapters/react.d.cts +0 -39
  30. package/dist/adapters/react.d.cts.map +0 -1
  31. package/dist/adapters/react.d.ts +0 -39
  32. package/dist/adapters/react.d.ts.map +0 -1
  33. package/dist/adapters/react.js +0 -92
  34. package/dist/adapters/react.js.map +0 -1
  35. package/dist/defaults-Bg1kIemd.cjs +0 -372
  36. package/dist/defaults-Bg1kIemd.cjs.map +0 -1
  37. package/dist/defaults-CLUQg2zK.js +0 -210
  38. package/dist/defaults-CLUQg2zK.js.map +0 -1
  39. package/dist/defaults.cjs.map +0 -1
  40. package/dist/defaults.d.ts +0 -59
  41. package/dist/defaults.d.ts.map +0 -1
  42. package/dist/defaults.js +0 -13
  43. package/dist/defaults.js.map +0 -1
  44. package/dist/index-B6sY7hiW.d.ts +0 -22
  45. package/dist/index-B6sY7hiW.d.ts.map +0 -1
  46. package/dist/index-CTTQ1Hr3.d.ts +0 -821
  47. package/dist/index-CTTQ1Hr3.d.ts.map +0 -1
  48. package/dist/index-CiER0sxG.d.cts +0 -22
  49. package/dist/index-CiER0sxG.d.cts.map +0 -1
  50. package/dist/index-CkaYmEhA.d.cts +0 -821
  51. package/dist/index-CkaYmEhA.d.cts.map +0 -1
  52. package/dist/index.d.ts +0 -2
  53. package/dist/index.js +0 -4
  54. package/dist/qb-PXzZgo2H.cjs +0 -50
  55. package/dist/qb-PXzZgo2H.cjs.map +0 -1
  56. package/dist/qb-pchs-vdM.js +0 -45
  57. package/dist/qb-pchs-vdM.js.map +0 -1
  58. package/dist/qb.cjs +0 -5
  59. package/dist/qb.d.cts +0 -3
  60. package/dist/qb.d.ts +0 -3
  61. package/dist/qb.js +0 -5
  62. package/dist/src-C74sq0jQ.js.map +0 -1
  63. package/dist/src-TJG6k3Nr.cjs +0 -1771
  64. package/dist/src-TJG6k3Nr.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["keys","length","clone","Events","#clearEvent","#addListener","#entityConfig","#debugConfig","#idGetter","#params","#order","#filter","#items","#readyItems","#emit","#setItems","#promise","#deleteAtIndex","#getById","#replaceItem","#deleteItem","#addItem","#setOne","#apply","#state","#lastError","#setNewItems","#validate","#setError","#prepareRequestParams","#setPromise","#watchPromise","#deleteById","#setNewOne","#params","#entityConfig","#debugConfig","#idGetter","#promise","#item","#state","#readyItem","#mutable","#setMutable","#emit","#resetMutable","#setItem","#lastError","#setNewItem","#setError","#prepareRequestParams","#setPromise","#watchPromise","#deleteItem","#mutableItem","#updateItem","#requestDelete","#map","#registry","#cleanupScheduled","#cleanup","#emit","#scheduleCleanup","#entityConfig","#filterConfig","#orderConfig","#debugConfig","#idGetter","#itemsMap","#collectionQueryMap","#itemQueryMap","#emit","#registerUpdate","#registerDelete","#propagateUpdateOne","#propagateDeleteOne","#itemUpdateHandler","#itemDeleteHandler","#propagateUpdateMany","#getCollectionKey","#collectionUpdateHandler","#collectionCreateHandler","#collectionItemUpdated","#collectionItemDeleted","#propagateDeleteMany","#prepareItemQuery","#simplifyCollectionParams","#prepareCollectionQuery","#getParentQuery"],"sources":["../../../src/shared/shared.ts","../../../src/filter/constants.ts","../../../src/filter/errors.ts","../../../src/filter/filter.ts","../../../src/order/types.ts","../../../src/order/order.ts","../../../src/shared/ChimeraEventEmitter/ChimeraEventEmitter.ts","../../../src/query/types.ts","../../../src/query/constants.ts","../../../src/query/errors.ts","../../../src/query/ChimeraCollectionQuery.ts","../../../src/query/ChimeraItemQuery.ts","../../../src/shared/ChimeraWeakValueMap/ChimeraWeakValueMap.ts","../../../src/entity-store/ChimeraEntityStore.ts"],"sourcesContent":["import type {\n\tAnyObject,\n\tChimeraCancellablePromise,\n\tChimeraEntityGetter,\n\tChimeraPropertyGetter,\n\tConstructable,\n} from \"./types.ts\";\n\nexport const deepObjectAssign = <T>(dst: AnyObject, srcObj: AnyObject, visited = new WeakSet()): T => {\n\tfor (const { 0: key, 1: srcVal } of Object.entries(srcObj)) {\n\t\tif (srcVal === null || typeof srcVal !== \"object\" || Array.isArray(srcVal)) {\n\t\t\tdst[key] = srcVal;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for circular references\n\t\tif (visited.has(srcVal)) {\n\t\t\tdst[key] = srcVal;\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisited.add(srcVal);\n\t\tconst destVal = dst[key];\n\t\tdst[key] = destVal === null || typeof destVal !== \"object\" || Array.isArray(destVal) ? {} : destVal;\n\t\tdeepObjectAssign(dst[key], srcVal, visited);\n\t\tvisited.delete(srcVal);\n\t}\n\n\treturn dst as T;\n};\n\nexport const deepObjectFreeze = <T>(obj: T, frozenObjects = new WeakSet()): T => {\n\tif (obj === null || typeof obj !== \"object\" || Object.isFrozen(obj) || frozenObjects.has(obj)) return obj;\n\n\tfrozenObjects.add(obj);\n\tfor (const value of Object.values(obj))\n\t\tif (value && typeof value === \"object\") deepObjectFreeze(value, frozenObjects);\n\treturn Object.freeze(obj);\n};\n\nconst TypedArray = Object.getPrototypeOf(Int8Array);\n\nexport const deepObjectClone = <T>(value: T, refs?: Map<any, any>): T => {\n\tif (value === null) return null as T;\n\tif (value === undefined) return undefined as T;\n\tif (typeof value !== \"object\") return value;\n\n\tif (refs) {\n\t\tconst ref = refs.get(value);\n\t\tif (ref !== undefined) return ref;\n\t}\n\n\tif (value.constructor === Object) {\n\t\tconst keys = Object.keys(value).concat(Object.getOwnPropertySymbols(value) as unknown as string[]);\n\t\tconst length = keys.length;\n\t\tconst clone = {} as T;\n\t\trefs ??= new Map();\n\t\trefs.set(value, clone);\n\t\tfor (let i = 0; i < length; i++) clone[keys[i] as keyof T] = deepObjectClone(value[keys[i] as keyof T], refs);\n\t\treturn clone;\n\t}\n\tif (Array.isArray(value)) {\n\t\tconst length = value.length;\n\t\tconst clone = new Array(length) as T;\n\t\trefs ??= new Map();\n\t\trefs.set(value, clone);\n\t\tfor (let i = 0; i < length; i++) clone[i as keyof T] = deepObjectClone(value[i], refs);\n\t\treturn clone;\n\t}\n\tif (value instanceof Date) return new (value.constructor as Constructable)(value.valueOf());\n\tif (value instanceof RegExp) return value.constructor as Constructable as T;\n\tif (value instanceof Map) {\n\t\tconst clone = new (value.constructor as Constructable)();\n\t\trefs ??= new Map();\n\t\trefs.set(value, clone);\n\t\tfor (const entry of value.entries()) clone.set(entry[0], deepObjectClone(entry[1], refs));\n\t\treturn clone;\n\t}\n\tif (value instanceof Set) {\n\t\tconst clone = new (value.constructor as Constructable)();\n\t\trefs ??= new Map();\n\t\trefs.set(value, clone);\n\t\tfor (const entry of value.values()) clone.add(deepObjectClone(entry, refs));\n\t\treturn clone;\n\t}\n\tif (value instanceof Error) {\n\t\tconst clone = new (value.constructor as Constructable)(value.message);\n\t\tconst keys = Object.keys(value).concat(Object.getOwnPropertySymbols(value) as unknown as string[]);\n\t\tconst length = keys.length;\n\t\trefs ??= new Map();\n\t\trefs.set(value, clone);\n\t\tfor (let i = 0; i < length; i++) clone[keys[i] as keyof T] = deepObjectClone(value[keys[i] as keyof T], refs);\n\t\treturn clone;\n\t}\n\tif (value instanceof ArrayBuffer) return value.slice() as T;\n\tif (value instanceof TypedArray) return (value as unknown as Int8Array).slice() as T;\n\tif (value instanceof DataView) return new DataView(value.buffer.slice()) as T;\n\tif (value instanceof WeakMap) return value;\n\tif (value instanceof WeakSet) return value;\n\n\tconst clone = Object.create(value.constructor.prototype) as T;\n\tconst keys = Object.keys(value).concat(Object.getOwnPropertySymbols(value) as unknown as string[]);\n\tconst length = keys.length;\n\trefs ??= new Map();\n\trefs.set(value, clone);\n\tfor (let i = 0; i < length; i++) clone[keys[i] as keyof T] = deepObjectClone(value[keys[i] as keyof T], refs);\n\treturn clone;\n};\n\nexport const compilePropertyGetter = <Entity>({ get }: ChimeraPropertyGetter<Entity>): ChimeraEntityGetter<Entity> =>\n\ttypeof get === \"function\" ? get : (e: Entity) => e[get];\n\nexport const simplifyPropertyGetter = <Entity>({ key }: ChimeraPropertyGetter<Entity>): string => key;\n\nexport const makeCancellablePromise = <Result>(\n\tpromise: Promise<Result> | ChimeraCancellablePromise<Result>,\n\tcontroller = new AbortController(),\n): ChimeraCancellablePromise<Result> => {\n\tconst signal = controller.signal;\n\n\tconst newPromise = promise.then(\n\t\t(v) => (signal.aborted ? new Promise(() => null) : v),\n\t\t(err) => {\n\t\t\treturn signal.aborted ? new Promise(() => null) : Promise.reject(err);\n\t\t},\n\t) as ChimeraCancellablePromise<Result>;\n\n\tnewPromise.cancel = () => controller.abort();\n\tnewPromise.cancelled = (cb) => (signal.aborted ? queueMicrotask(cb) : signal.addEventListener(\"abort\", cb));\n\n\tif (\"cancelled\" in promise) {\n\t\tpromise.cancelled(() => newPromise.cancel());\n\t\tcontroller.signal.addEventListener(\"abort\", () => promise.cancel());\n\t}\n\treturn newPromise;\n};\n","export const ChimeraOperatorSymbol = Symbol(\"ChimeraOperatorSymbol\");\nexport const ChimeraConjunctionSymbol = Symbol(\"ChimeraConjunctionSymbol\");\n","import { ChimeraError } from \"../shared/errors.ts\";\n\nexport class ChimeraFilterError extends ChimeraError {}\n\nexport class ChimeraFilterOperatorError extends ChimeraFilterError {\n\tconstructor(operator: string, message: string) {\n\t\tsuper(`Operator \"${operator}\" ${message}`);\n\t}\n}\n\nexport class ChimeraFilterOperatorNotFoundError extends ChimeraFilterOperatorError {\n\tconstructor(operator: string) {\n\t\tsuper(operator, \"not found\");\n\t}\n}\n","import { ChimeraInternalError } from \"../shared/errors.ts\";\nimport { compilePropertyGetter, simplifyPropertyGetter } from \"../shared/shared.ts\";\nimport type { ChimeraPropertyGetter, KeysOfType } from \"../shared/types.ts\";\nimport { ChimeraConjunctionSymbol, ChimeraOperatorSymbol } from \"./constants.ts\";\nimport { ChimeraFilterOperatorNotFoundError } from \"./errors.ts\";\nimport type {\n\tChimeraConjunctionDescriptor,\n\tChimeraConjunctionOperationDescriptor,\n\tChimeraConjunctionType,\n\tChimeraFilterChecker,\n\tChimeraFilterConfig,\n\tChimeraFilterDescriptor,\n\tChimeraFilterOperatorDescriptor,\n\tChimeraKeyFromOperatorGetter,\n\tChimeraOperatorMap,\n\tChimeraSimplifiedConjunctionOperation,\n\tChimeraSimplifiedFilter,\n\tChimeraSimplifiedOperator,\n\tConjunctionMap,\n\tSimplifiedConjunction,\n} from \"./types.ts\";\n\nconst filterConjunctions = {\n\tand: (operations) => operations.every((op) => op()),\n\tnot: (operations) => !operations.every((op) => op()),\n\tor: (operations) => operations.some((op) => op()),\n} satisfies ConjunctionMap;\n\nconst compileOperator = <OperatorsMap extends ChimeraOperatorMap, Entity>(\n\tconfig: ChimeraFilterConfig<OperatorsMap>,\n\t{ op, value, test }: ChimeraFilterOperatorDescriptor<OperatorsMap, Entity>,\n): ChimeraFilterChecker<Entity> => {\n\tconst operatorFunc = config.operators[op];\n\tif (!operatorFunc) throw new ChimeraFilterOperatorNotFoundError(op);\n\tconst getter = compilePropertyGetter(value);\n\treturn (entity) => operatorFunc(getter(entity), test);\n};\n\nexport const compileConjunction = <OperatorsMap extends ChimeraOperatorMap, Entity>(\n\tconfig: ChimeraFilterConfig<OperatorsMap>,\n\t{ kind, operations }: ChimeraConjunctionDescriptor<OperatorsMap, Entity>,\n): ChimeraFilterChecker<Entity> => {\n\tconst conjunction = filterConjunctions[kind];\n\n\tconst compiledOperations = operations\n\t\t.map((operation) => {\n\t\t\tswitch (operation.type) {\n\t\t\t\tcase ChimeraOperatorSymbol:\n\t\t\t\t\treturn compileOperator(config, operation);\n\t\t\t\tcase ChimeraConjunctionSymbol:\n\t\t\t\t\treturn compileConjunction(config, operation);\n\t\t\t\tdefault:\n\t\t\t\t\t// @ts-expect-error: `operation.type` should always be type `never` here\n\t\t\t\t\tthrow new ChimeraInternalError(`Invalid filter operation ${operation.type}`);\n\t\t\t}\n\t\t})\n\t\t.filter(Boolean);\n\n\treturn (entity) => conjunction(compiledOperations.map((op) => () => op(entity)));\n};\n\nexport const simplifyOperator = <OperatorsMap extends ChimeraOperatorMap, Entity>({\n\top,\n\tvalue,\n\ttest,\n}: ChimeraFilterOperatorDescriptor<OperatorsMap, Entity>): ChimeraSimplifiedOperator<OperatorsMap> => ({\n\tkey: simplifyPropertyGetter(value),\n\top,\n\ttest,\n\ttype: ChimeraOperatorSymbol,\n});\n\nconst compareSimplifiedOperator = <OperatorsMap extends ChimeraOperatorMap>(\n\ta: ChimeraSimplifiedOperator<OperatorsMap>,\n\tb: ChimeraSimplifiedOperator<OperatorsMap>,\n): number =>\n\ta.key.localeCompare(b.key) ||\n\ta.op.localeCompare(b.op) ||\n\tJSON.stringify(a.test).localeCompare(JSON.stringify(b.test));\n\nconst compareSimplifiedOperation = <OperatorsMap extends ChimeraOperatorMap>(\n\ta: ChimeraSimplifiedOperator<OperatorsMap> | SimplifiedConjunction<OperatorsMap>,\n\tb: ChimeraSimplifiedOperator<OperatorsMap> | SimplifiedConjunction<OperatorsMap>,\n): number => {\n\tif (a.type !== b.type) return a.type === ChimeraOperatorSymbol ? -1 : 1;\n\tif (a.type === ChimeraOperatorSymbol && b.type === ChimeraOperatorSymbol) return compareSimplifiedOperator(a, b);\n\tif (a.type === ChimeraConjunctionSymbol && b.type === ChimeraConjunctionSymbol)\n\t\treturn compareSimplifiedConjunction(a, b);\n\treturn 0;\n};\n\nconst compareSimplifiedConjunction = <OperatorsMap extends ChimeraOperatorMap>(\n\ta: SimplifiedConjunction<OperatorsMap>,\n\tb: SimplifiedConjunction<OperatorsMap>,\n): number => {\n\tconst kindCompare = a.kind.localeCompare(b.kind);\n\tif (kindCompare !== 0) return kindCompare;\n\n\tconst aOps = a.operations;\n\tconst bOps = b.operations;\n\tconst minLength = Math.min(aOps.length, bOps.length);\n\n\tfor (let i = 0; i < minLength; i++) {\n\t\tconst aOp = aOps[i];\n\t\tconst bOp = bOps[i];\n\t\tif (aOp && bOp) {\n\t\t\tconst compare = compareSimplifiedOperation(aOp, bOp);\n\t\t\tif (compare !== 0) return compare;\n\t\t}\n\t}\n\n\treturn aOps.length - bOps.length;\n};\n\nexport const simplifyConjunction = <OperatorsMap extends ChimeraOperatorMap, Entity>({\n\tkind,\n\toperations,\n}: ChimeraConjunctionDescriptor<OperatorsMap, Entity>): SimplifiedConjunction<OperatorsMap> => {\n\treturn {\n\t\tkind,\n\t\toperations: operations\n\t\t\t.map((op) => {\n\t\t\t\tswitch (op.type) {\n\t\t\t\t\tcase ChimeraOperatorSymbol:\n\t\t\t\t\t\treturn simplifyOperator(op);\n\t\t\t\t\tcase ChimeraConjunctionSymbol:\n\t\t\t\t\t\treturn simplifyConjunction(op);\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// @ts-expect-error: `op.type` should always be type `never` here\n\t\t\t\t\t\tthrow new ChimeraInternalError(`Invalid filter operation ${op.type}`);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter(Boolean)\n\t\t\t.sort((a, b) => compareSimplifiedOperation(a, b)),\n\t\ttype: ChimeraConjunctionSymbol,\n\t};\n};\n\nexport const chimeraCreateOperator = <\n\tEntity,\n\tOperatorsMap extends ChimeraOperatorMap,\n\tOp extends keyof OperatorsMap & string,\n>(\n\top: Op,\n\tvalue:\n\t\t| ChimeraPropertyGetter<Entity, Parameters<OperatorsMap[Op]>[0]>\n\t\t| (KeysOfType<Entity, Parameters<OperatorsMap[Op]>[0]> & string),\n\ttest: Parameters<OperatorsMap[Op]>[1],\n): ChimeraFilterOperatorDescriptor<OperatorsMap, Entity, Op> => ({\n\top,\n\ttest,\n\ttype: ChimeraOperatorSymbol,\n\tvalue: (typeof value === \"string\"\n\t\t? {\n\t\t\t\tget: value,\n\t\t\t\tkey: value,\n\t\t\t}\n\t\t: value) as ChimeraPropertyGetter<Entity, Parameters<OperatorsMap[Op]>[0]>,\n});\n\nexport const chimeraCreateConjunction = <\n\tEntity,\n\tOperatorsMap extends ChimeraOperatorMap,\n\tConj extends Exclude<ChimeraConjunctionType, \"not\"> = Exclude<ChimeraConjunctionType, \"not\">,\n>(\n\tkind: Conj,\n\toperations: ChimeraConjunctionOperationDescriptor<OperatorsMap, Entity>[],\n): ChimeraConjunctionDescriptor<OperatorsMap, Entity, Conj> => ({\n\tkind,\n\toperations,\n\ttype: ChimeraConjunctionSymbol,\n});\n\nexport const chimeraCreateNot = <Entity, OperatorsMap extends ChimeraOperatorMap>(\n\toperation: ChimeraConjunctionOperationDescriptor<OperatorsMap, Entity>,\n): ChimeraConjunctionDescriptor<OperatorsMap, Entity, \"not\"> => ({\n\tkind: \"not\",\n\toperations: [operation],\n\ttype: ChimeraConjunctionSymbol,\n});\n\nexport function chimeraIsConjunction(\n\titem: ChimeraConjunctionOperationDescriptor<ChimeraOperatorMap, any>,\n): item is ChimeraConjunctionDescriptor<ChimeraOperatorMap, any>;\nexport function chimeraIsConjunction(\n\titem: ChimeraSimplifiedConjunctionOperation<ChimeraOperatorMap>,\n): item is SimplifiedConjunction<ChimeraOperatorMap>;\nexport function chimeraIsConjunction(\n\titem:\n\t\t| ChimeraConjunctionOperationDescriptor<ChimeraOperatorMap, any>\n\t\t| ChimeraSimplifiedConjunctionOperation<ChimeraOperatorMap>,\n): item is ChimeraConjunctionDescriptor<ChimeraOperatorMap, any> | SimplifiedConjunction<ChimeraOperatorMap> {\n\treturn item.type === ChimeraConjunctionSymbol;\n}\n\nexport function chimeraIsOperator(\n\titem: ChimeraConjunctionOperationDescriptor<ChimeraOperatorMap, any>,\n): item is ChimeraFilterOperatorDescriptor<ChimeraOperatorMap, any>;\nexport function chimeraIsOperator(\n\titem: ChimeraSimplifiedConjunctionOperation<ChimeraOperatorMap>,\n): item is ChimeraSimplifiedOperator<ChimeraOperatorMap>;\nexport function chimeraIsOperator(\n\titem:\n\t\t| ChimeraConjunctionOperationDescriptor<ChimeraOperatorMap, any>\n\t\t| ChimeraSimplifiedConjunctionOperation<ChimeraOperatorMap>,\n): item is ChimeraFilterOperatorDescriptor<ChimeraOperatorMap, any> | ChimeraSimplifiedOperator<ChimeraOperatorMap> {\n\treturn item.type === ChimeraOperatorSymbol;\n}\n\nexport const compileFilter = <Entity, OperatorsMap extends ChimeraOperatorMap>(\n\tconfig: ChimeraFilterConfig<OperatorsMap>,\n\tdescriptor?: ChimeraFilterDescriptor<OperatorsMap, Entity> | null,\n): ChimeraFilterChecker<Entity> => (descriptor ? compileConjunction(config, descriptor) : () => true);\n\nexport const simplifyFilter = <Entity, OperatorsMap extends ChimeraOperatorMap>(\n\tdescriptor?: ChimeraFilterDescriptor<OperatorsMap, Entity> | null,\n): ChimeraSimplifiedFilter<OperatorsMap> => (descriptor ? simplifyConjunction(descriptor) : null);\n\nconst isOperationSubset = <OperatorsMap extends ChimeraOperatorMap>(\n\tcandidateOp: ChimeraSimplifiedOperator<OperatorsMap> | SimplifiedConjunction<OperatorsMap>,\n\ttargetOp: ChimeraSimplifiedOperator<OperatorsMap> | SimplifiedConjunction<OperatorsMap>,\n\tgetOperatorKey: ChimeraKeyFromOperatorGetter,\n): boolean => {\n\tif (candidateOp.type !== targetOp.type) return false;\n\n\tif (candidateOp.type === ChimeraOperatorSymbol && targetOp.type === ChimeraOperatorSymbol) {\n\t\t// For operators: must have the same key, op, and stringified value\n\t\treturn (\n\t\t\tcandidateOp.key === targetOp.key &&\n\t\t\tcandidateOp.op === targetOp.op &&\n\t\t\tgetOperatorKey(candidateOp) === getOperatorKey(targetOp)\n\t\t);\n\t}\n\n\tif (candidateOp.type === ChimeraConjunctionSymbol && targetOp.type === ChimeraConjunctionSymbol) {\n\t\t// For conjunctions: recursively check subset relationship\n\t\treturn isConjunctionSubset(candidateOp, targetOp, getOperatorKey);\n\t}\n\n\treturn false;\n};\n\nconst isConjunctionSubset = <OperatorsMap extends ChimeraOperatorMap>(\n\tcandidate: SimplifiedConjunction<OperatorsMap>,\n\ttarget: SimplifiedConjunction<OperatorsMap>,\n\tgetOperatorKey: ChimeraKeyFromOperatorGetter,\n): boolean => {\n\tif (candidate.kind !== target.kind) return false;\n\n\tswitch (candidate.kind) {\n\t\tcase \"and\":\n\t\tcase \"not\":\n\t\t\treturn candidate.operations.every((candidateOp) =>\n\t\t\t\ttarget.operations.some((targetOp) => isOperationSubset(candidateOp, targetOp, getOperatorKey)),\n\t\t\t);\n\t\tcase \"or\":\n\t\t\treturn target.operations.every((targetOp) =>\n\t\t\t\tcandidate.operations.some((candidateOp) => isOperationSubset(candidateOp, targetOp, getOperatorKey)),\n\t\t\t);\n\t}\n};\n\nexport const isFilterSubset = <OperatorsMap extends ChimeraOperatorMap>(\n\tcandidate: ChimeraSimplifiedFilter<OperatorsMap>,\n\ttarget: ChimeraSimplifiedFilter<OperatorsMap>,\n\tgetOperatorKey: ChimeraKeyFromOperatorGetter,\n): boolean => {\n\t// If a candidate is null, it's always a subset (matches everything)\n\tif (candidate === null) return true;\n\t// If the target is null but a candidate is not, a candidate is never a subset\n\tif (target === null) return false;\n\n\treturn isConjunctionSubset(candidate, target, getOperatorKey);\n};\n","import type { ChimeraEntityGetter, ChimeraPropertyGetter } from \"../shared/types.ts\";\n\nexport enum ChimeraOrderNulls {\n\tFirst = \"first\",\n\tLast = \"last\",\n}\n\nexport type ChimeraOrderDescriptor<Entity> = {\n\tkey: ChimeraPropertyGetter<Entity>;\n\tdesc: boolean;\n\tnulls: ChimeraOrderNulls;\n};\n\nexport type ChimeraOrderPriority<Entity> = ChimeraOrderDescriptor<Entity>[];\n\nexport type ChimeraOrderByComparator<Entity> = (a: Entity, b: Entity) => number;\n\nexport type ChimeraPrimitiveComparator = (a: unknown, b: unknown) => number;\n\nexport type CompiledOrderDescriptor<Entity> = {\n\tget: ChimeraEntityGetter<Entity>;\n\tdesc: boolean;\n\tnulls: ChimeraOrderNulls;\n};\n\nexport type ChimeraSimplifiedOrderDescriptor<Keys extends string = string> = {\n\tfield: Keys | string;\n\tdesc: boolean;\n\tnulls: ChimeraOrderNulls;\n};\n\nexport type ChimeraKeyFromOrderGetter = (order: ChimeraSimplifiedOrderDescriptor[] | null) => string;\n\nexport type ChimeraOrderConfig = {\n\tprimitiveComparator?: ChimeraPrimitiveComparator;\n\tgetKey?: ChimeraKeyFromOrderGetter;\n};\n","import { compilePropertyGetter } from \"../shared/shared.ts\";\nimport type { ChimeraPropertyGetter } from \"../shared/types.ts\";\nimport type {\n\tChimeraOrderByComparator,\n\tChimeraOrderDescriptor,\n\tChimeraOrderPriority,\n\tChimeraPrimitiveComparator,\n\tChimeraSimplifiedOrderDescriptor,\n\tCompiledOrderDescriptor,\n} from \"./types.ts\";\nimport { ChimeraOrderNulls } from \"./types.ts\";\n\nexport const compileOrderDescriptor = <Entity>({\n\tkey,\n\tdesc,\n\tnulls,\n}: ChimeraOrderDescriptor<Entity>): CompiledOrderDescriptor<Entity> => ({\n\tdesc,\n\tget: compilePropertyGetter(key),\n\tnulls,\n});\n\nexport const chimeraCreateOrderBy = <Entity>(\n\tkey: ChimeraPropertyGetter<Entity> | (keyof Entity & string),\n\tdesc = false,\n\tnulls: ChimeraOrderNulls = ChimeraOrderNulls.Last,\n): ChimeraOrderDescriptor<Entity> => ({\n\tdesc,\n\tkey: (typeof key === \"string\" ? { get: key, key } : key) as ChimeraPropertyGetter<Entity>,\n\tnulls,\n});\n\nconst nullsComparator = (a: unknown, b: unknown, nulls: ChimeraOrderNulls): number => {\n\t// biome-ignore lint/suspicious/noDoubleEquals: At least one of the operands should be null or undefined. If one of them is null and the other is undefined, we should get true.\n\treturn a == b ? 0 : (a == null ? -1 : 1) * (nulls === ChimeraOrderNulls.First ? 1 : -1);\n};\n\nexport const buildComparator = <Entity>(\n\tcomparator: ChimeraPrimitiveComparator,\n\torderBy?: ChimeraOrderPriority<Entity> | null,\n): ChimeraOrderByComparator<Entity> => {\n\tif (!orderBy) return () => 0;\n\n\tconst compiledPriority = orderBy.map((ob) => compileOrderDescriptor(ob));\n\treturn (a: Entity, b: Entity) => {\n\t\tlet result = 0;\n\t\tfor (const descriptor of compiledPriority) {\n\t\t\tconst vA = descriptor.get(a);\n\t\t\tconst vB = descriptor.get(b);\n\t\t\tif (vA == null || vB == null) {\n\t\t\t\tresult = nullsComparator(vA, vB, descriptor.nulls);\n\t\t\t\tif (result) break;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresult = comparator(descriptor.get(a), descriptor.get(b));\n\t\t\tdescriptor.desc && (result *= -1);\n\t\t\tif (result) break;\n\t\t}\n\t\treturn result;\n\t};\n};\n\nexport const simplifyOrderBy = <Entity>(\n\torderBy?: ChimeraOrderPriority<Entity> | null,\n): ChimeraSimplifiedOrderDescriptor<keyof Entity & string>[] | null =>\n\torderBy ? orderBy.map((ob) => ({ desc: ob.desc, field: ob.key.key, nulls: ob.nulls })) : null;\n","type ValidEventTypes = string | object;\n\nexport type EventNames<T extends ValidEventTypes> = T extends string ? T : keyof T;\n\ntype ArgumentMap<T extends object> = {\n\t[K in keyof T]: T[K] extends (...args: any[]) => void ? Parameters<T[K]>[0] : T[K] extends any[] ? T[K][0] : T[K];\n};\n\ntype EventListener<T extends ValidEventTypes, K extends EventNames<T>> = T extends string\n\t? (arg: any) => void\n\t: (arg: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]) => void;\n\nexport type EventArgs<T extends ValidEventTypes, K extends EventNames<T>> = Parameters<EventListener<T, K>>[0];\n\ntype EventRecord<TTEventTypes extends ValidEventTypes, TEventNames extends EventNames<TTEventTypes>> = {\n\tfn: EventListener<TTEventTypes, TEventNames>;\n\tonce: boolean;\n};\n\ntype EventRecordMap<T extends ValidEventTypes> = {\n\t[K in EventNames<T>]?: EventRecord<T, K> | EventRecord<T, K>[];\n};\n\nvar Events = function Events() {} as unknown as { new (): EventRecordMap<any> };\nEvents.prototype = Object.create(null);\n\nexport class ChimeraEventEmitter<TEventTypes extends ValidEventTypes = string> {\n\t_events: EventRecordMap<TEventTypes>;\n\t_eventsCount;\n\n\tconstructor() {\n\t\tthis._events = new Events();\n\t\tthis._eventsCount = 0;\n\t}\n\n\t#addListener<T extends EventNames<TEventTypes>>(event: T, fn: EventListener<TEventTypes, T>, once: boolean): this {\n\t\tvar listener = { fn, once };\n\n\t\tif (!this._events[event]) {\n\t\t\tthis._events[event] = listener;\n\t\t\tthis._eventsCount++;\n\t\t} else if (!(this._events[event] as EventRecord<TEventTypes, T>).fn)\n\t\t\t(this._events[event] as EventRecord<TEventTypes, T>[]).push(listener);\n\t\telse this._events[event] = [this._events[event] as EventRecord<TEventTypes, T>, listener];\n\n\t\treturn this;\n\t}\n\n\t#clearEvent<T extends EventNames<TEventTypes>>(event: T) {\n\t\tif (--this._eventsCount === 0) this._events = new Events();\n\t\telse delete this._events[event];\n\t}\n\n\teventNames(): EventNames<TEventTypes>[] {\n\t\treturn Object.keys(this._events) as EventNames<TEventTypes>[];\n\t}\n\n\tlisteners<T extends EventNames<TEventTypes>>(event: T): EventListener<TEventTypes, T>[] {\n\t\tvar handlers = this._events[event];\n\n\t\tif (!handlers) return [];\n\t\tif ((handlers as EventRecord<TEventTypes, T>).fn) return [(handlers as EventRecord<TEventTypes, T>).fn];\n\n\t\tfor (var i = 0, l = (handlers as EventRecord<TEventTypes, T>[]).length, ee = new Array(l); i < l; i++) {\n\t\t\tee[i] = (handlers as [EventRecord<TEventTypes, T>])[i as 0].fn;\n\t\t}\n\n\t\treturn ee;\n\t}\n\n\tlistenerCount(event: EventNames<TEventTypes>): number {\n\t\tvar listeners = this._events[event];\n\n\t\tif (!listeners) return 0;\n\t\tif ((listeners as EventRecord<TEventTypes, EventNames<TEventTypes>>).fn) return 1;\n\t\treturn (listeners as []).length;\n\t}\n\n\tremoveListener<T extends EventNames<TEventTypes>>(\n\t\tevent: T,\n\t\tfn?: EventListener<TEventTypes, T>,\n\t\tonce?: boolean,\n\t): this {\n\t\tif (!this._events[event]) return this;\n\t\tif (!fn) {\n\t\t\tthis.#clearEvent(event);\n\t\t\treturn this;\n\t\t}\n\n\t\tvar listeners = this._events[event];\n\n\t\tif ((listeners as EventRecord<TEventTypes, T>).fn) {\n\t\t\tif (\n\t\t\t\t(listeners as EventRecord<TEventTypes, T>).fn === fn &&\n\t\t\t\t(!once || (listeners as EventRecord<TEventTypes, T>).once)\n\t\t\t) {\n\t\t\t\tthis.#clearEvent(event);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (var i = 0, events = [], length = (listeners as EventRecord<TEventTypes, T>[]).length; i < length; i++) {\n\t\t\t\tif (\n\t\t\t\t\t(listeners as [EventRecord<TEventTypes, T>])[i as 0].fn !== fn ||\n\t\t\t\t\t(once && !(listeners as [EventRecord<TEventTypes, T>])[i as 0].once)\n\t\t\t\t) {\n\t\t\t\t\tevents.push((listeners as [EventRecord<TEventTypes, T>])[i as 0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//\n\t\t\t// Reset the array or remove it completely if we have no more listeners.\n\t\t\t//\n\t\t\tif (events.length) this._events[event] = events.length === 1 ? events[0] : events;\n\t\t\telse this.#clearEvent(event);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\temit<T extends EventNames<TEventTypes>>(event: T, arg?: EventArgs<TEventTypes, T>): boolean {\n\t\tif (!this._events[event]) return false;\n\n\t\tvar listeners = this._events[event];\n\n\t\tif ((listeners as EventRecord<TEventTypes, T>).fn) {\n\t\t\tif ((listeners as EventRecord<TEventTypes, T>).once)\n\t\t\t\tthis.removeListener(event, (listeners as EventRecord<TEventTypes, T>).fn, true);\n\t\t\t(listeners as EventRecord<any, any>).fn.call(this, arg);\n\t\t} else {\n\t\t\tfor (var i = 0, length = (listeners as []).length; i < length; i++) {\n\t\t\t\tif ((listeners as [EventRecord<TEventTypes, T>])[i as 0].once)\n\t\t\t\t\tthis.removeListener(event, (listeners as [EventRecord<TEventTypes, T>])[i as 0].fn, true);\n\t\t\t\t(listeners as [EventRecord<any, any>])[i as 0].fn.call(this, arg);\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ton<T extends EventNames<TEventTypes>>(event: T, fn: EventListener<TEventTypes, T>): this {\n\t\treturn this.#addListener(event, fn, false);\n\t}\n\n\tonce<T extends EventNames<TEventTypes>>(event: T, fn: EventListener<TEventTypes, T>): this {\n\t\treturn this.#addListener(event, fn, true);\n\t}\n\n\tremoveAllListeners(event?: EventNames<TEventTypes>): this {\n\t\tif (event) {\n\t\t\tif (this._events[event]) this.#clearEvent(event);\n\t\t} else {\n\t\t\tthis._events = new Events();\n\t\t\tthis._eventsCount = 0;\n\t\t}\n\n\t\treturn this;\n\t}\n\n\toff = this.removeListener;\n\taddListener = this.on;\n}\n\nexport type AnyChimeraEventEmitter = ChimeraEventEmitter<any>;\nexport type ChimeraEventEmitterEvents<TEventEmitter extends AnyChimeraEventEmitter> =\n\tTEventEmitter extends ChimeraEventEmitter<infer TEventTypes>\n\t\t? { [K in EventNames<TEventTypes>]: EventListener<TEventTypes, K> }\n\t\t: never;\nexport type ChimeraEventEmitterEventNames<TEventEmitter extends AnyChimeraEventEmitter> =\n\tkeyof ChimeraEventEmitterEvents<TEventEmitter>;\n","import type { ChimeraOperatorMap, ChimeraSimplifiedFilter } from \"../filter/types.ts\";\nimport type { ChimeraSimplifiedOrderDescriptor } from \"../order/types.ts\";\nimport type { ChimeraEntityId, DeepPartial } from \"../shared/types.ts\";\n\nexport enum ChimeraQueryFetchingState {\n\t/** Query just initialized. */\n\tInitialized = \"initialized\",\n\n\t/** Not used yet. */\n\tScheduled = \"scheduled\",\n\n\t/** Fetching in progress. */\n\tFetching = \"fetching\",\n\n\t/** Creating in progress */\n\tCreating = \"creating\",\n\n\t/** Updating in progress. */\n\tUpdating = \"updating\",\n\n\t/** Deleting in progress. */\n\tDeleting = \"deleting\",\n\n\t/** Fetch requested after reaching the Fetched, Errored, or Prefetched states. */\n\tRefetching = \"refetching\",\n\n\t/** Data retrieved from existing queries without initiating a fetch. */\n\tPrefetched = \"prefetched\",\n\n\t/** Fetch ended successfully; data is ready for use. */\n\tFetched = \"fetched\",\n\n\t/** Fetch ended with an error; no data is available. */\n\tErrored = \"errored\",\n\n\t/** Refetch ended with an error, but old data is still available. */\n\tReErrored = \"reErrored\",\n\n\t/**\n\t * Only for the item query, data is deleted, but the local value is still present,\n\t * no longer allows updates, but `refetch` still works (in case of strange errors, allows recovering state)\n\t */\n\tDeleted = \"deleted\",\n\n\t/** Only for the item query, data was actualized from an external event */\n\tActualized = \"actualized\",\n}\n\nexport interface ChimeraQueryFetchingStatable {\n\tget state(): ChimeraQueryFetchingState;\n\n\tget inProgress(): boolean;\n\n\tget ready(): boolean;\n}\n\n/**\n * Id getter types\n */\n\nexport type ChimeraIdGetterFunction<TEntityName extends string, TEntity> = (\n\tentity: TEntity,\n\tentityName: TEntityName,\n) => ChimeraEntityId;\n\nexport type ChimeraQueryEntityIdGetter<TEntityName extends string, TEntity> =\n\t| keyof TEntity\n\t| ChimeraIdGetterFunction<TEntityName, TEntity>;\n\n/**\n * Response types\n */\n\nexport type ChimeraQueryCollectionFetcherResponse<Entity, Meta = any> = {\n\tdata: Entity[];\n\tmeta?: Meta;\n};\n\nexport type ChimeraQueryItemFetcherResponse<Entity, Meta = any> = {\n\tdata: Entity;\n\tmeta?: Meta;\n};\n\nexport type ChimeraQueryDeletionResult<Success extends boolean = boolean> = {\n\tid: ChimeraEntityId;\n\tsuccess: Success;\n};\n\nexport type ChimeraQueryItemDeleteResponse<Meta = any> = {\n\tresult: ChimeraQueryDeletionResult;\n\tmeta?: Meta;\n};\n\nexport type ChimeraQueryBatchedDeleteResponse<Meta = any> = {\n\tresult: ChimeraQueryDeletionResult[];\n\tmeta?: Meta;\n};\n\n/**\n * Fetcher types\n */\n\nexport type ChimeraQueryEntityFetcherRequestParams = {\n\tsignal: AbortSignal;\n};\n\nexport type ChimeraQueryEntityCollectionFetcherParams<Entity, OperatorsMap extends ChimeraOperatorMap, Meta = any> = {\n\torder: ChimeraSimplifiedOrderDescriptor<keyof Entity & string>[] | null;\n\tfilter: ChimeraSimplifiedFilter<OperatorsMap, keyof Entity & string> | null;\n\tmeta: Meta;\n};\n\n// biome-ignore lint/correctness/noUnusedVariables: May be required later\nexport type ChimeraQueryEntityItemFetcherParams<Entity, Meta = any> = {\n\tid: ChimeraEntityId;\n\tmeta: Meta;\n};\n\nexport type ChimeraQueryEntityCollectionFetcher<\n\tTEntityName extends string,\n\tTEntity,\n\tTOperatorsMap extends ChimeraOperatorMap,\n\tTMeta = any,\n> = (\n\tparams: ChimeraQueryEntityCollectionFetcherParams<TEntity, TOperatorsMap, TMeta>,\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryCollectionFetcherResponse<TEntity>>;\n\nexport type ChimeraQueryEntityItemFetcher<TEntityName extends string, TEntity> = (\n\tparams: ChimeraQueryEntityItemFetcherParams<TEntity>,\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryItemFetcherResponse<TEntity>>;\n\n/**\n * Updater types\n */\n\nexport type ChimeraQueryEntityItemUpdater<TEntityName extends string, TEntity> = (\n\tupdatedEntity: TEntity,\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryItemFetcherResponse<TEntity>>;\n\nexport type ChimeraQueryEntityBatchedUpdater<TEntityName extends string, TEntity> = (\n\tupdatedEntities: TEntity[],\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryCollectionFetcherResponse<TEntity>>;\n\n/**\n * Deleter types\n */\n\nexport type ChimeraQueryEntityItemDeleter<TEntityName extends string = string> = (\n\tdeleteId: ChimeraEntityId,\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryItemDeleteResponse>;\n\nexport type ChimeraQueryEntityBatchedDeleter<TEntityName extends string = string> = (\n\tdeletedIds: ChimeraEntityId[],\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryBatchedDeleteResponse>;\n\n/**\n * Creator type\n */\n\nexport type ChimeraQueryEntityItemCreator<TEntityName extends string, TEntity> = (\n\titem: DeepPartial<TEntity>,\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryItemFetcherResponse<TEntity>>;\n\nexport type ChimeraQueryEntityBatchedCreator<TEntityName extends string, TEntity> = (\n\titems: DeepPartial<TEntity>[],\n\trequestParams: ChimeraQueryEntityFetcherRequestParams,\n\tentityName: TEntityName,\n) => Promise<ChimeraQueryCollectionFetcherResponse<TEntity>>;\n\n/**\n * Config types\n */\n\nexport type ChimeraQueryEntityConfig<\n\tTEntityName extends string,\n\tTEntity,\n\tTOperatorsMap extends ChimeraOperatorMap,\n\tTMeta = any,\n> = {\n\tname: TEntityName;\n\ttrustQuery?: boolean;\n\tupdateDebounceTimeout?: number;\n\n\tidGetter: ChimeraQueryEntityIdGetter<TEntityName, TEntity>;\n\n\tcollectionFetcher?: ChimeraQueryEntityCollectionFetcher<TEntityName, TEntity, TOperatorsMap, TMeta>;\n\titemFetcher?: ChimeraQueryEntityItemFetcher<TEntityName, TEntity>;\n\n\titemUpdater?: ChimeraQueryEntityItemUpdater<TEntityName, TEntity>;\n\tbatchedUpdater?: ChimeraQueryEntityBatchedUpdater<TEntityName, TEntity>;\n\n\titemDeleter?: ChimeraQueryEntityItemDeleter<TEntityName>;\n\tbatchedDeleter?: ChimeraQueryEntityBatchedDeleter<TEntityName>;\n\n\titemCreator?: ChimeraQueryEntityItemCreator<TEntityName, TEntity>;\n\tbatchedCreator?: ChimeraQueryEntityBatchedCreator<TEntityName, TEntity>;\n};\n\nexport type QueryEntityConfig<\n\tTEntityName extends string,\n\tTEntity,\n\tTOperatorsMap extends ChimeraOperatorMap,\n\tTMeta = any,\n> = Required<ChimeraQueryEntityConfig<TEntityName, TEntity, TOperatorsMap, TMeta>> & {\n\tidGetter: ChimeraIdGetterFunction<TEntityName, TEntity>;\n};\n","import { ChimeraQueryFetchingState } from \"./types.ts\";\n\nexport const ChimeraGetParamsSym = Symbol(\"ChimeraGetParamsSym\");\nexport const ChimeraSetOneSym = Symbol(\"ChimeraSetOneSym\");\nexport const ChimeraSetManySym = Symbol(\"ChimeraSetManySym\");\nexport const ChimeraDeleteOneSym = Symbol(\"ChimeraDeleteOneSym\");\nexport const ChimeraDeleteManySym = Symbol(\"ChimeraDeleteManySym\");\nexport const ChimeraUpdateMixedSym = Symbol(\"ChimeraUpdateMixedSym\");\n\nexport const IN_PROGRESS_STATES = [\n\tChimeraQueryFetchingState.Scheduled,\n\tChimeraQueryFetchingState.Creating,\n\tChimeraQueryFetchingState.Fetching,\n\tChimeraQueryFetchingState.Refetching,\n\tChimeraQueryFetchingState.Updating,\n\tChimeraQueryFetchingState.Deleting,\n];\n","import { ChimeraError } from \"../shared/errors.ts\";\nimport type { ChimeraEntityId } from \"../shared/types.ts\";\nimport type { ChimeraQueryFetchingState } from \"./types.ts\";\n\nconst formatDeepErrorMessage = (message: string, cause: unknown): string =>\n\t`${message}: ${cause instanceof Error ? `\\n ${cause.stack}` : cause}`;\n\nexport class ChimeraQueryError extends ChimeraError {\n\treadonly entityName: string;\n\n\tconstructor(entityName: string, message: string, options?: ErrorOptions) {\n\t\tsuper(message, options);\n\t\tthis.entityName = entityName;\n\t}\n}\n\nexport class ChimeraQueryIdMismatchError extends ChimeraQueryError {\n\treadonly old: ChimeraEntityId;\n\treadonly new: ChimeraEntityId;\n\n\tconstructor(entityName: string, oldId: ChimeraEntityId, newId: ChimeraEntityId) {\n\t\tsuper(\n\t\t\tentityName,\n\t\t\t`\nCan't update \"${entityName}\" item if the change updates it's [id] (changed from \"${oldId}\" to \"${newId}\").\nIf such an update should not be an error, update <idGetter> field in \"${entityName}\" entity config to make Chimera get the [id] value properly.\n\t\t`.trim(),\n\t\t);\n\t\tthis.old = oldId;\n\t\tthis.new = newId;\n\t}\n}\n\nexport class ChimeraQueryNotSpecifiedError extends ChimeraQueryError {\n\treadonly methodName: string;\n\n\tconstructor(entityName: string, methodName: string) {\n\t\tsuper(entityName, `<${methodName}> for entity \"${entityName}\" was not specified`);\n\t\tthis.methodName = methodName;\n\t}\n}\n\nexport class ChimeraQueryTrustError extends ChimeraQueryError {\n\tconstructor(entityName: string, description: string) {\n\t\tsuper(\n\t\t\tentityName,\n\t\t\t`\nDO NOT IGNORE THIS ERROR OR YOUR PROD MAY BREAK!\n\nLooks like your \"${entityName}\" query provider ${description}\n\nBy default Chimera tend to trust external query provider to avoid extra data processing.\nIf it is not your case, set field \"trustQuery\" to \"false\" in config defaults or for specific entity.\nThis error visible only if \"devMode\" is \"true\".\nIf you'll ignore it, your production may fail, because Chimera won't check the data correctness.\n`.trim(),\n\t\t);\n\t}\n}\n\nexport class ChimeraQueryTrustIdMismatchError extends ChimeraQueryTrustError {\n\treadonly old: ChimeraEntityId;\n\treadonly new: ChimeraEntityId;\n\n\tconstructor(entityName: string, oldId: ChimeraEntityId, newId: ChimeraEntityId) {\n\t\tsuper(\n\t\t\tentityName,\n\t\t\t`\nreturned an item with [id] that not matches with the [id] of item that was updated (changed from \"${oldId}\" to \"${newId}\"). \nIf it is not an error, update <idGetter> field in \"${entityName}\" entity config to make Chimera get the [id] value properly.\n`.trim(),\n\t\t);\n\t\tthis.old = oldId;\n\t\tthis.new = newId;\n\t}\n}\n\nexport class ChimeraQueryTrustFetchedCollectionError extends ChimeraQueryTrustError {\n\treadonly old: unknown[];\n\treadonly new: unknown[];\n\n\tconstructor(entityName: string, input: unknown[], output: unknown[]) {\n\t\tsuper(entityName, \"returned not properly sorted or ordered collection.\");\n\t\tthis.old = input;\n\t\tthis.new = output;\n\t}\n}\n\nexport class ChimeraQueryFetchingError extends ChimeraQueryError {\n\tconstructor(entityName: string, cause: unknown) {\n\t\tsuper(entityName, formatDeepErrorMessage(\"Something went wrong\", cause), { cause });\n\t}\n}\n\nexport class ChimeraQueryDeletingError extends ChimeraQueryError {\n\tconstructor(entityName: string, cause: unknown) {\n\t\tsuper(entityName, formatDeepErrorMessage(\"Something went wrong\", cause), { cause });\n\t}\n}\n\nexport class ChimeraQueryNotReadyError extends ChimeraQueryError {\n\tconstructor(entityName: string) {\n\t\tsuper(entityName, \"Unable to get unready value.\");\n\t}\n}\n\nexport class ChimeraQueryDeletedItemError extends ChimeraQueryError {\n\tconstructor(entityName: string, id: ChimeraEntityId) {\n\t\tsuper(entityName, `Unable to updated deleted item with [id] \"${id}.\"`);\n\t}\n}\n\nexport class ChimeraQueryUnsuccessfulDeletionError extends ChimeraQueryError {\n\tconstructor(entityName: string, id: ChimeraEntityId) {\n\t\tsuper(entityName, `Item with [id] \"${id}\" was not deleted.`);\n\t}\n}\n\nexport class ChimeraQueryAlreadyRunningError extends ChimeraQueryError {\n\tconstructor(entityName: string, status: ChimeraQueryFetchingState) {\n\t\tsuper(entityName, `Unable to operate query. Other process already running ${status}.`);\n\t}\n}\n\nexport class ChimeraQueryNotCreatedError extends ChimeraQueryError {\n\tconstructor(entityName: string) {\n\t\tsuper(entityName, \"Unable to operate not created item.\");\n\t}\n}\n","import type { ChimeraDebugConfig } from \"../debug\";\nimport type { ChimeraFilterChecker, ChimeraOperatorMap } from \"../filter/types.ts\";\nimport type { ChimeraOrderByComparator } from \"../order/types.ts\";\nimport type { EventArgs, EventNames } from \"../shared/ChimeraEventEmitter\";\nimport { ChimeraEventEmitter } from \"../shared/ChimeraEventEmitter\";\nimport { ChimeraInternalError } from \"../shared/errors.ts\";\nimport { deepObjectClone, deepObjectFreeze, makeCancellablePromise } from \"../shared/shared.ts\";\nimport type { ChimeraCancellablePromise, ChimeraEntityId, DeepPartial } from \"../shared/types.ts\";\nimport {\n\tChimeraDeleteManySym,\n\tChimeraDeleteOneSym,\n\tChimeraGetParamsSym,\n\tChimeraSetManySym,\n\tChimeraSetOneSym,\n\tChimeraUpdateMixedSym,\n\tIN_PROGRESS_STATES,\n} from \"./constants.ts\";\nimport {\n\tChimeraQueryAlreadyRunningError,\n\tChimeraQueryDeletingError,\n\ttype ChimeraQueryError,\n\tChimeraQueryFetchingError,\n\tChimeraQueryNotReadyError,\n\tChimeraQueryTrustFetchedCollectionError,\n\tChimeraQueryTrustIdMismatchError,\n\tChimeraQueryUnsuccessfulDeletionError,\n} from \"./errors.ts\";\nimport {\n\ttype ChimeraIdGetterFunction,\n\ttype ChimeraQueryBatchedDeleteResponse,\n\ttype ChimeraQueryCollectionFetcherResponse,\n\ttype ChimeraQueryEntityCollectionFetcherParams,\n\ttype ChimeraQueryFetchingStatable,\n\tChimeraQueryFetchingState,\n\ttype ChimeraQueryItemDeleteResponse,\n\ttype ChimeraQueryItemFetcherResponse,\n\ttype QueryEntityConfig,\n} from \"./types.ts\";\n\nexport type ChimeraCollectionQueryEventMap<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n> = {\n\t/** Once the query is initialized */\n\tinitialized: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap> };\n\n\t/** Once the query data is ready (will be followed by 'update') */\n\tready: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap> };\n\n\t/** Each time the query was updated */\n\tupdated: {\n\t\tinstance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>;\n\t\titems: TItem[];\n\t\toldItems: TItem[] | null;\n\t};\n\t/** Each time the query was an initiator of update */\n\tselfUpdated: {\n\t\tinstance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>;\n\t\titems: TItem[];\n\t\toldItems: TItem[] | null;\n\t};\n\n\t/** Each time item created */\n\tselfItemCreated: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; item: TItem };\n\n\t/** Each time item added */\n\titemAdded: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; item: TItem };\n\n\t/** Each time item updated */\n\titemUpdated: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; oldItem: TItem; newItem: TItem };\n\t/** Each time the query was an initiator of an item update */\n\tselfItemUpdated: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; item: TItem };\n\n\t/** Each time item deleted */\n\titemDeleted: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; item: TItem };\n\t/** Each time the query was an initiator of item deletion */\n\tselfItemDeleted: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; id: ChimeraEntityId };\n\n\t/** Each time the fetcher produces an error */\n\terror: { instance: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>; error: unknown };\n};\n\nexport class ChimeraCollectionQuery<\n\t\tTEntityName extends string,\n\t\tTItem extends object,\n\t\tTOperatorsMap extends ChimeraOperatorMap,\n\t>\n\textends ChimeraEventEmitter<ChimeraCollectionQueryEventMap<TEntityName, TItem, TOperatorsMap>>\n\timplements ChimeraQueryFetchingStatable\n{\n\t#state: ChimeraQueryFetchingState;\n\t#promise: ChimeraCancellablePromise | null;\n\t#lastError: unknown;\n\t#items: TItem[] | null;\n\treadonly #entityConfig: QueryEntityConfig<TEntityName, TItem, TOperatorsMap>;\n\treadonly #debugConfig: ChimeraDebugConfig;\n\treadonly #idGetter: ChimeraIdGetterFunction<TEntityName, TItem>;\n\treadonly #params: ChimeraQueryEntityCollectionFetcherParams<TItem, TOperatorsMap>;\n\treadonly #order: ChimeraOrderByComparator<TItem>;\n\treadonly #filter: ChimeraFilterChecker<TItem>;\n\n\t#emit<T extends EventNames<ChimeraCollectionQueryEventMap<TEntityName, TItem, TOperatorsMap>>>(\n\t\tevent: T,\n\t\targ: EventArgs<ChimeraCollectionQueryEventMap<TEntityName, TItem, TOperatorsMap>, T>,\n\t) {\n\t\tqueueMicrotask(() => super.emit(event, arg));\n\t}\n\n\toverride emit(): never {\n\t\tthrow new ChimeraInternalError(\"External events dispatching is not supported.\");\n\t}\n\n\t#prepareRequestParams() {\n\t\treturn {\n\t\t\tcontroller: new AbortController(),\n\t\t};\n\t}\n\n\t#readyItems(internalMessage?: string): TItem[] {\n\t\tif (this.#items) return this.#items;\n\t\tthrow internalMessage\n\t\t\t? new ChimeraInternalError(internalMessage)\n\t\t\t: new ChimeraQueryNotReadyError(this.#entityConfig.name);\n\t}\n\n\t#addItem(item: TItem) {\n\t\tconst items = this.#readyItems(\"Trying to update not ready collection\");\n\t\tconst foundIndex = items.findIndex((el) => this.#order(el, item) > 0);\n\t\titems.splice(foundIndex !== -1 ? foundIndex : items.length, 0, item);\n\t\tthis.#emit(\"itemAdded\", { instance: this, item });\n\t}\n\n\t#setItems(items: TItem[]) {\n\t\t!this.#items && this.#emit(\"ready\", { instance: this });\n\t\tconst oldItems = this.#items;\n\t\tthis.#items = items;\n\t\tthis.#emit(\"updated\", { instance: this, items, oldItems });\n\t}\n\n\t#setNewItems(items: TItem[]) {\n\t\titems.forEach((i) => void deepObjectFreeze(i));\n\t\tthis.#emit(\"selfUpdated\", { instance: this, items, oldItems: this.#items });\n\t\tthis.#setItems(items);\n\t}\n\n\t#setPromise<P extends ChimeraCancellablePromise>(promise: P): P {\n\t\tthis.#promise?.cancel();\n\t\tthis.#promise = promise;\n\t\treturn promise;\n\t}\n\n\t#deleteAtIndex(index: number) {\n\t\tif (index === -1) return;\n\t\tconst { 0: old } = this.#readyItems(\"Trying to update not ready collection\").splice(index, 1);\n\t\tthis.#emit(\"itemDeleted\", { instance: this, item: old as TItem });\n\t}\n\n\t#deleteItem(item: TItem) {\n\t\tthis.#deleteAtIndex(this.#readyItems(\"Trying to update not ready collection\").indexOf(item));\n\t}\n\n\t#deleteById(id: ChimeraEntityId) {\n\t\tconst name = this.#entityConfig.name;\n\t\tthis.#deleteAtIndex(\n\t\t\tthis.#readyItems(\"Trying to update not ready collection\").findIndex((item) => this.#idGetter(item, name) === id),\n\t\t);\n\t}\n\n\t#replaceItem(oldItem: TItem, newItem: TItem) {\n\t\tconst items = this.#readyItems(\"Trying to update not ready collection\");\n\t\tconst index = items.indexOf(oldItem);\n\t\tconst old = items[index];\n\t\titems[index] = newItem;\n\t\tthis.#emit(\"itemUpdated\", { instance: this, newItem: newItem, oldItem: old as TItem });\n\t}\n\n\t#getById(id: ChimeraEntityId) {\n\t\tconst name = this.#entityConfig.name;\n\t\treturn this.#readyItems(\"Trying to update not ready collection\").find((item) => this.#idGetter(item, name) === id);\n\t}\n\n\t#setOne(item: TItem) {\n\t\tconst existingItem = this.#getById(this.#idGetter(item, this.#entityConfig.name));\n\t\tconst nowMatches = this.#filter(item);\n\n\t\tif (!(nowMatches || existingItem)) return;\n\n\t\tif (existingItem) {\n\t\t\tif (this.#order(existingItem, item) === 0) {\n\t\t\t\tthis.#replaceItem(existingItem, item);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#deleteItem(existingItem);\n\t\t}\n\n\t\tnowMatches && this.#addItem(item);\n\t}\n\n\t#setNewOne(item: TItem) {\n\t\tdeepObjectFreeze(item);\n\t\tthis.#setOne(item);\n\t}\n\n\t#apply(input: TItem[]): TItem[] {\n\t\treturn input.filter((item: TItem) => this.#filter(item)).sort((a, b) => this.#order(a, b));\n\t}\n\n\t#validate(input: TItem[]): TItem[] {\n\t\tif (this.#entityConfig.trustQuery && !this.#debugConfig.devMode) return input;\n\n\t\tconst prepared = this.#apply(input);\n\t\tif (!this.#entityConfig.trustQuery) return prepared;\n\n\t\tif (this.#debugConfig.devMode) {\n\t\t\tfor (let i = 0; i < input.length; i++) {\n\t\t\t\tif (input[i] !== prepared[i]) {\n\t\t\t\t\tconsole.warn(new ChimeraQueryTrustFetchedCollectionError(this.#entityConfig.name, input, prepared));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn input;\n\t}\n\n\t#setError(error: unknown, source: ChimeraQueryError): never {\n\t\tthis.#state = this.#items ? ChimeraQueryFetchingState.ReErrored : ChimeraQueryFetchingState.Errored;\n\t\tthis.#lastError = error;\n\t\tthis.#emit(\"error\", { error, instance: this });\n\t\tthrow source;\n\t}\n\n\t#watchPromise(\n\t\tpromise: ChimeraCancellablePromise<ChimeraQueryCollectionFetcherResponse<TItem>>,\n\t\tcontroller: AbortController,\n\t): ChimeraCancellablePromise<ChimeraQueryCollectionFetcherResponse<TItem>> {\n\t\treturn makeCancellablePromise(\n\t\t\tpromise\n\t\t\t\t.then((response) => {\n\t\t\t\t\tthis.#setNewItems(this.#validate(response.data));\n\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.Fetched;\n\t\t\t\t\treturn response;\n\t\t\t\t})\n\t\t\t\t.catch((error) => this.#setError(error, new ChimeraQueryFetchingError(this.#entityConfig.name, error))),\n\t\t\tcontroller,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tconfig: QueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\t\tdebugConfig: ChimeraDebugConfig,\n\t\tparams: ChimeraQueryEntityCollectionFetcherParams<TItem, any>,\n\t\texistingItems: Iterable<TItem> | null,\n\t\torder: ChimeraOrderByComparator<TItem>,\n\t\tfilter: ChimeraFilterChecker<TItem>,\n\t\talreadyValid: boolean,\n\t) {\n\t\tsuper();\n\n\t\tthis.#entityConfig = config;\n\t\tthis.#debugConfig = debugConfig;\n\t\tthis.#params = params;\n\t\tthis.#promise = null;\n\t\tthis.#items = null;\n\t\tthis.#state = ChimeraQueryFetchingState.Initialized;\n\t\tthis.#idGetter = config.idGetter;\n\t\tthis.#filter = filter;\n\t\tthis.#order = order;\n\n\t\tif (existingItems) {\n\t\t\tconst input = Array.from(existingItems);\n\t\t\tthis.#setItems(alreadyValid ? this.#validate(input) : this.#apply(input));\n\t\t\tthis.#state = ChimeraQueryFetchingState.Prefetched;\n\t\t} else {\n\t\t\tthis.#state = ChimeraQueryFetchingState.Fetching;\n\t\t\tconst { controller } = this.#prepareRequestParams();\n\t\t\tthis.#setPromise(\n\t\t\t\tthis.#watchPromise(\n\t\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\t\tconfig.collectionFetcher(params, { signal: controller.signal }, this.#entityConfig.name),\n\t\t\t\t\t\tcontroller,\n\t\t\t\t\t),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tthis.#emit(\"initialized\", { instance: this });\n\t}\n\n\tget name() {\n\t\treturn this.#entityConfig.name;\n\t}\n\n\tget [ChimeraGetParamsSym](): ChimeraQueryEntityCollectionFetcherParams<TItem, TOperatorsMap> {\n\t\treturn this.#params;\n\t}\n\n\t[ChimeraSetOneSym](item: TItem) {\n\t\tthis.#items && this.#setOne(item);\n\t}\n\n\t[ChimeraDeleteOneSym](id: ChimeraEntityId) {\n\t\tthis.#items && this.#deleteById(id);\n\t}\n\n\t[ChimeraSetManySym](items: Iterable<TItem>) {\n\t\tif (this.#items) for (const item of items) this.#setOne(item);\n\t}\n\n\t[ChimeraDeleteManySym](ids: Iterable<ChimeraEntityId>) {\n\t\tif (this.#items) for (const id of ids) this.#deleteById(id);\n\t}\n\n\t[ChimeraUpdateMixedSym](toAdd: Iterable<TItem>, toDelete: Iterable<ChimeraEntityId>) {\n\t\tif (this.#items) {\n\t\t\tfor (const id of toDelete) this.#deleteById(id);\n\t\t\tfor (const item of toAdd) this.#setOne(item);\n\t\t}\n\t}\n\n\tget state(): ChimeraQueryFetchingState {\n\t\treturn this.#state;\n\t}\n\n\tget inProgress(): boolean {\n\t\treturn IN_PROGRESS_STATES.includes(this.#state);\n\t}\n\n\tget ready(): boolean {\n\t\treturn this.#items !== null;\n\t}\n\n\tget lastError(): unknown {\n\t\treturn this.#lastError;\n\t}\n\n\t/**\n\t * Wait for the current progress process to complete (both success or error)\n\t */\n\tget progress(): Promise<void> {\n\t\treturn new Promise((res) => {\n\t\t\tconst resolve = () => queueMicrotask(() => res());\n\t\t\tif (this.#promise) {\n\t\t\t\tthis.#promise.then(resolve, resolve);\n\t\t\t\tthis.#promise.cancelled(() => this.progress.then(resolve, resolve));\n\t\t\t} else resolve();\n\t\t});\n\t}\n\n\t/**\n\t * Wait for the current progress process to complete, throw an error if it fails\n\t */\n\tget result(): Promise<void> {\n\t\treturn new Promise((res, rej) => {\n\t\t\tconst resolve = () => queueMicrotask(() => res());\n\t\t\tif (this.#promise) {\n\t\t\t\tthis.#promise.then(resolve, rej);\n\t\t\t\tthis.#promise.cancelled(() => (this.#promise ? this.result.then(res, rej) : rej(\"cancelled\")));\n\t\t\t} else resolve();\n\t\t});\n\t}\n\n\t/** Return an item if it is ready, throw error otherwise */\n\tgetById(id: ChimeraEntityId): TItem | undefined {\n\t\tconst name = this.#entityConfig.name;\n\t\treturn this.#readyItems().find((item) => this.#idGetter(item, name) === id);\n\t}\n\n\t/** Return mutable ref to item by idx if it is ready, throw error otherwise */\n\tmutableAt(idx: number): TItem | undefined {\n\t\treturn deepObjectClone(this.#readyItems().at(idx));\n\t}\n\n\t/** Return mutable ref to item by [id] if it is ready, throw error otherwise */\n\tmutableGetById(id: ChimeraEntityId): TItem | undefined {\n\t\tconst name = this.#entityConfig.name;\n\t\treturn deepObjectClone(this.#readyItems().find((item) => this.#idGetter(item, name) === id));\n\t}\n\n\t/**\n\t * Trigger refetch, return existing refetch promise if already running\n\t * @param force If true cancels any running process and starts a new one\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\trefetch(force = false): Promise<ChimeraQueryCollectionFetcherResponse<TItem>> {\n\t\tif (\n\t\t\t!force &&\n\t\t\tthis.#promise &&\n\t\t\t[ChimeraQueryFetchingState.Fetching, ChimeraQueryFetchingState.Refetching].includes(this.#state)\n\t\t)\n\t\t\treturn this.#promise as Promise<ChimeraQueryCollectionFetcherResponse<TItem>>;\n\n\t\tif (!force && [ChimeraQueryFetchingState.Updating, ChimeraQueryFetchingState.Deleting].includes(this.#state))\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\tthis.#state = ChimeraQueryFetchingState.Refetching;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#setPromise(\n\t\t\tthis.#watchPromise(\n\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\tthis.#entityConfig.collectionFetcher(this.#params, { signal: controller.signal }, this.#entityConfig.name),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t\tcontroller,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Update item using updated copy\n\t * @param newItem new item to update\n\t */\n\tupdate(newItem: TItem): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig\n\t\t\t.itemUpdater(newItem, { signal: controller.signal }, this.#entityConfig.name)\n\t\t\t.then((response) => {\n\t\t\t\tconst { data } = response;\n\t\t\t\tthis.#items && this.#setNewOne(data);\n\t\t\t\tthis.#emit(\"selfItemUpdated\", { instance: this, item: data });\n\t\t\t\treturn response;\n\t\t\t});\n\t}\n\n\t/**\n\t * Update item using updated copy\n\t * @param newItems array of items to update\n\t */\n\tbatchedUpdate(newItems: Iterable<TItem>): Promise<ChimeraQueryCollectionFetcherResponse<TItem>> {\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig\n\t\t\t.batchedUpdater(Array.from(newItems), { signal: controller.signal }, this.#entityConfig.name)\n\t\t\t.then((response) => {\n\t\t\t\tconst ready = this.ready;\n\t\t\t\tresponse.data.forEach((item) => {\n\t\t\t\t\tready && this.#setNewOne(item);\n\t\t\t\t\tthis.#emit(\"selfItemUpdated\", { instance: this, item });\n\t\t\t\t});\n\t\t\t\treturn response;\n\t\t\t});\n\t}\n\n\t/**\n\t * Delete item using its [id]\n\t * @param id id of item to delete\n\t */\n\tdelete(id: ChimeraEntityId): Promise<ChimeraQueryItemDeleteResponse> {\n\t\tconst name = this.#entityConfig.name;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig.itemDeleter(id, { signal: controller.signal }, name).then(\n\t\t\t(response) => {\n\t\t\t\tconst {\n\t\t\t\t\tresult: { id: newId, success },\n\t\t\t\t} = response;\n\t\t\t\tif (!this.#items) {\n\t\t\t\t\tsuccess && this.#emit(\"selfItemDeleted\", { id: newId, instance: this });\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\n\t\t\t\tif (this.#entityConfig.trustQuery && !this.#debugConfig.devMode && success) {\n\t\t\t\t\tthis.#deleteById(newId);\n\t\t\t\t\tthis.#emit(\"selfItemDeleted\", { id: newId, instance: this });\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\n\t\t\t\tif (id !== newId) {\n\t\t\t\t\tthis.#debugConfig.devMode &&\n\t\t\t\t\t\tthis.#entityConfig.trustQuery &&\n\t\t\t\t\t\tconsole.warn(new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, id, newId));\n\n\t\t\t\t\tif (!this.#entityConfig.trustQuery) {\n\t\t\t\t\t\tsuccess && this.#emit(\"selfItemDeleted\", { id: newId, instance: this });\n\t\t\t\t\t\tthrow new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, id, newId);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (success) {\n\t\t\t\t\tthis.#deleteById(newId);\n\t\t\t\t\tthis.#emit(\"selfItemDeleted\", { id: newId, instance: this });\n\t\t\t\t\treturn response;\n\t\t\t\t}\n\t\t\t\tconst error = new ChimeraQueryUnsuccessfulDeletionError(this.#entityConfig.name, id);\n\t\t\t\tthis.#state = ChimeraQueryFetchingState.ReErrored;\n\t\t\t\tthis.#lastError = error;\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t\t(error) => this.#setError(error, new ChimeraQueryDeletingError(name, error)),\n\t\t);\n\t}\n\n\t/**\n\t * Delete a list of items by their [id]s\n\t * @param ids array of items to delete\n\t */\n\tbatchedDelete(ids: Iterable<ChimeraEntityId>): Promise<ChimeraQueryBatchedDeleteResponse> {\n\t\tconst name = this.#entityConfig.name;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig.batchedDeleter(Array.from(ids), { signal: controller.signal }, name).then(\n\t\t\t(response) => {\n\t\t\t\tthis.#items &&\n\t\t\t\t\tresponse.result.forEach(({ id: newId, success }) => {\n\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\tthis.#deleteById(newId);\n\t\t\t\t\t\t\tthis.#emit(\"selfItemDeleted\", { id: newId, instance: this });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst error = new ChimeraQueryUnsuccessfulDeletionError(this.#entityConfig.name, newId);\n\t\t\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.ReErrored;\n\t\t\t\t\t\t\tthis.#lastError = error;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\treturn response;\n\t\t\t},\n\t\t\t(error) => this.#setError(error, new ChimeraQueryDeletingError(name, error)),\n\t\t);\n\t}\n\n\t/**\n\t * Create new item using partial data\n\t * @param item partial item data to create new item\n\t */\n\tcreate(item: DeepPartial<TItem>): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tconst name = this.#entityConfig.name;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig.itemCreator(item, { signal: controller.signal }, name).then(\n\t\t\t(response) => {\n\t\t\t\tconst { data } = response;\n\t\t\t\tthis.#items && this.#setNewOne(data);\n\t\t\t\tthis.#emit(\"selfItemCreated\", { instance: this, item: data });\n\t\t\t\treturn response;\n\t\t\t},\n\t\t\t(error) => this.#setError(error, new ChimeraQueryFetchingError(name, error)),\n\t\t);\n\t}\n\n\t/**\n\t * Create multiple items using partial data\n\t * @param items array of partial item data to create new items\n\t */\n\tbatchedCreate(items: Iterable<DeepPartial<TItem>>): Promise<ChimeraQueryCollectionFetcherResponse<TItem>> {\n\t\tconst name = this.#entityConfig.name;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#entityConfig.batchedCreator(Array.from(items), { signal: controller.signal }, name).then(\n\t\t\t(response) => {\n\t\t\t\tthis.#items &&\n\t\t\t\t\tresponse.data.forEach((item) => {\n\t\t\t\t\t\tthis.#setNewOne(item);\n\t\t\t\t\t\tthis.#emit(\"selfItemCreated\", { instance: this, item });\n\t\t\t\t\t});\n\t\t\t\treturn response;\n\t\t\t},\n\t\t\t(error) => this.#setError(error, new ChimeraQueryFetchingError(name, error)),\n\t\t);\n\t}\n\n\t/**\n\t * Standard Array API without mutations\n\t */\n\n\tget length(): number {\n\t\treturn this.#readyItems().length;\n\t}\n\n\t[Symbol.iterator](): Iterator<TItem> {\n\t\treturn this.#readyItems()[Symbol.iterator]();\n\t}\n\n\tat(idx: number): TItem | undefined {\n\t\treturn this.#readyItems().at(idx);\n\t}\n\n\tentries(): ArrayIterator<[number, TItem]> {\n\t\treturn this.#readyItems().entries();\n\t}\n\n\tvalues(): ArrayIterator<TItem> {\n\t\treturn this.#readyItems().values();\n\t}\n\n\tkeys(): ArrayIterator<number> {\n\t\treturn this.#readyItems().keys();\n\t}\n\n\tevery<S extends TItem>(\n\t\tpredicate: (value: TItem, index: number, query: this) => value is S,\n\t): this is ChimeraCollectionQuery<TEntityName, S, TOperatorsMap>;\n\tevery(predicate: (value: TItem, index: number, query: this) => unknown): boolean;\n\tevery(predicate: (value: TItem, index: number, query: this) => unknown): boolean {\n\t\treturn this.#readyItems().every((item, idx) => predicate(item, idx, this));\n\t}\n\n\tsome(predicate: (value: TItem, index: number, query: this) => unknown): boolean {\n\t\treturn this.#readyItems().some((item, idx) => predicate(item, idx, this));\n\t}\n\n\tfilter<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S[];\n\tfilter(predicate: (value: TItem, index: number, query: this) => boolean): TItem[];\n\tfilter<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S[] {\n\t\treturn this.#readyItems().filter((item, idx) => predicate(item, idx, this));\n\t}\n\n\tfind<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S | undefined;\n\tfind(predicate: (value: TItem, index: number, query: this) => unknown): TItem | undefined;\n\tfind<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S | undefined {\n\t\treturn this.#readyItems().find((item, idx) => predicate(item, idx, this));\n\t}\n\n\tfindIndex<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): number;\n\tfindIndex(predicate: (value: TItem, index: number, query: this) => boolean): number;\n\tfindIndex<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): number {\n\t\treturn this.#readyItems().findIndex((item, idx) => predicate(item, idx, this));\n\t}\n\n\tfindLast<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S | undefined;\n\tfindLast(predicate: (value: TItem, index: number, query: this) => boolean): TItem | undefined;\n\tfindLast<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): S | undefined {\n\t\treturn this.#readyItems().findLast((item, idx) => predicate(item, idx, this));\n\t}\n\n\tfindLastIndex<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): number;\n\tfindLastIndex(predicate: (value: TItem, index: number, query: this) => boolean): number;\n\tfindLastIndex<S extends TItem>(predicate: (value: TItem, index: number, query: this) => value is S): number {\n\t\treturn this.#readyItems().findLastIndex((item, idx) => predicate(item, idx, this));\n\t}\n\n\tforEach(cb: (value: TItem, index: number, query: this) => void) {\n\t\tthis.#readyItems().forEach((item, idx) => void cb(item, idx, this));\n\t}\n\n\tincludes(item: TItem): boolean {\n\t\treturn this.#readyItems().includes(item);\n\t}\n\n\tindexOf(item: TItem): number {\n\t\treturn this.#readyItems().indexOf(item);\n\t}\n\n\tmap<U>(cb: (value: TItem, index: number, query: this) => U) {\n\t\treturn this.#readyItems().map((item, idx) => cb(item, idx, this));\n\t}\n\n\treduce<U>(cb: (previousValue: U, currentValue: TItem, currentIndex: number, query: this) => U, initialValue?: U) {\n\t\treturn this.#readyItems().reduce((prev, cur, idx) => cb(prev as U, cur, idx, this), initialValue);\n\t}\n\n\treduceRight<U>(\n\t\tcb: (previousValue: U, currentValue: TItem, currentIndex: number, query: this) => U,\n\t\tinitialValue?: U,\n\t) {\n\t\treturn this.#readyItems().reduceRight((prev, cur, idx) => cb(prev as U, cur, idx, this), initialValue);\n\t}\n\n\tslice(start?: number, end?: number): TItem[] {\n\t\treturn this.#readyItems().slice(start, end);\n\t}\n\n\ttoSorted(compareFn?: (a: TItem, b: TItem) => number): TItem[] {\n\t\treturn this.#readyItems().toSorted(compareFn);\n\t}\n\n\ttoSpliced(start: number, deleteCount: number, ...items: TItem[]): TItem[] {\n\t\treturn this.#readyItems().toSpliced(start, deleteCount, ...items);\n\t}\n\n\ttoJSON() {\n\t\treturn Array.from(this.#readyItems());\n\t}\n\n\toverride toString(): string {\n\t\treturn this.#readyItems().toString();\n\t}\n}\n\nexport type AnyChimeraCollectionQuery = ChimeraCollectionQuery<any, any, any>;\ntype ExtractedChimeraCollectionQuery<TCollectionQuery extends AnyChimeraCollectionQuery> =\n\tTCollectionQuery extends ChimeraCollectionQuery<infer TEntityName, infer TItem, infer TOperatorsMap>\n\t\t? { entityName: TEntityName; item: TItem; operatorsMap: TOperatorsMap }\n\t\t: never;\nexport type ChimeraCollectionQueryName<TCollectionQuery extends AnyChimeraCollectionQuery> =\n\tExtractedChimeraCollectionQuery<TCollectionQuery>[\"entityName\"];\nexport type ChimeraCollectionQueryEntity<TCollectionQuery extends AnyChimeraCollectionQuery> =\n\tExtractedChimeraCollectionQuery<TCollectionQuery>[\"item\"];\nexport type ChimeraCollectionQueryOperatorsMap<TCollectionQuery extends AnyChimeraCollectionQuery> =\n\tExtractedChimeraCollectionQuery<TCollectionQuery>[\"operatorsMap\"];\n","import type { ChimeraDebugConfig } from \"../debug\";\nimport type { ChimeraOperatorMap } from \"../filter\";\nimport type { EventArgs, EventNames } from \"../shared/ChimeraEventEmitter\";\nimport { ChimeraEventEmitter } from \"../shared/ChimeraEventEmitter\";\nimport { ChimeraInternalError } from \"../shared/errors.ts\";\nimport { deepObjectAssign, deepObjectClone, deepObjectFreeze, makeCancellablePromise } from \"../shared/shared.ts\";\nimport type { AnyObject, ChimeraCancellablePromise, ChimeraEntityId, DeepPartial } from \"../shared/types.ts\";\nimport { ChimeraDeleteOneSym, ChimeraGetParamsSym, ChimeraSetOneSym, IN_PROGRESS_STATES } from \"./constants.ts\";\nimport {\n\tChimeraQueryAlreadyRunningError,\n\tChimeraQueryDeletedItemError,\n\tChimeraQueryDeletingError,\n\ttype ChimeraQueryError,\n\tChimeraQueryFetchingError,\n\tChimeraQueryIdMismatchError,\n\tChimeraQueryNotCreatedError,\n\tChimeraQueryNotReadyError,\n\tChimeraQueryTrustIdMismatchError,\n\tChimeraQueryUnsuccessfulDeletionError,\n} from \"./errors.ts\";\nimport {\n\ttype ChimeraIdGetterFunction,\n\ttype ChimeraQueryEntityItemFetcherParams,\n\ttype ChimeraQueryFetchingStatable,\n\tChimeraQueryFetchingState,\n\ttype ChimeraQueryItemDeleteResponse,\n\ttype ChimeraQueryItemFetcherResponse,\n\ttype QueryEntityConfig,\n} from \"./types.ts\";\n\nexport type ChimeraItemQueryEventMap<TEntityName extends string, TItem extends object> = {\n\t/** Once the query is initialized */\n\tinitialized: [{ instance: ChimeraItemQuery<TEntityName, TItem> }];\n\n\t/** Once the query data was created */\n\tselfCreated: [{ instance: ChimeraItemQuery<TEntityName, TItem>; item: TItem }];\n\n\t/** Once the query data is ready (will be followed by 'update') */\n\tready: [{ instance: ChimeraItemQuery<TEntityName, TItem> }];\n\n\t/** Each time the query was updated */\n\tupdated: [{ instance: ChimeraItemQuery<TEntityName, TItem>; item: TItem; oldItem: TItem | null }];\n\t/** Each time the query was an initiator of update */\n\tselfUpdated: [{ instance: ChimeraItemQuery<TEntityName, TItem>; item: TItem; oldItem: TItem | null }];\n\n\t/** Once the query data was deleted */\n\tdeleted: [{ instance: ChimeraItemQuery<TEntityName, TItem>; id: ChimeraEntityId }];\n\t/** Once the query was an initiator of deletion */\n\tselfDeleted: [{ instance: ChimeraItemQuery<TEntityName, TItem>; id: ChimeraEntityId }];\n\n\t/** Each time the fetcher produces an error */\n\terror: [{ instance: ChimeraItemQuery<TEntityName, TItem>; error: unknown }];\n};\n\nexport class ChimeraItemQuery<TEntityName extends string, TItem extends object>\n\textends ChimeraEventEmitter<ChimeraItemQueryEventMap<TEntityName, TItem>>\n\timplements ChimeraQueryFetchingStatable\n{\n\t#item: TItem | null;\n\t#mutable: TItem | null;\n\t#state: ChimeraQueryFetchingState;\n\t#promise: ChimeraCancellablePromise | null;\n\t#lastError: unknown;\n\treadonly #params: ChimeraQueryEntityItemFetcherParams<TItem>;\n\treadonly #entityConfig: QueryEntityConfig<TEntityName, TItem, ChimeraOperatorMap>;\n\treadonly #debugConfig: ChimeraDebugConfig;\n\treadonly #idGetter: ChimeraIdGetterFunction<TEntityName, TItem>;\n\n\t#emit<T extends EventNames<ChimeraItemQueryEventMap<TEntityName, TItem>>>(\n\t\tevent: T,\n\t\targ: EventArgs<ChimeraItemQueryEventMap<TEntityName, TItem>, T>,\n\t) {\n\t\tqueueMicrotask(() => super.emit(event, arg));\n\t}\n\n\toverride emit(): never {\n\t\tthrow new ChimeraInternalError(\"External events dispatching is not supported.\");\n\t}\n\n\t#prepareRequestParams() {\n\t\treturn {\n\t\t\tcontroller: new AbortController(),\n\t\t};\n\t}\n\n\t#setPromise<P extends ChimeraCancellablePromise>(promise: P): P {\n\t\tthis.#promise?.cancel();\n\t\tthis.#promise = promise;\n\t\treturn promise;\n\t}\n\n\t#readyItem(internalMessage?: string): TItem {\n\t\tif (this.#item) return this.#item;\n\t\tthrow internalMessage\n\t\t\t? new ChimeraInternalError(internalMessage)\n\t\t\t: new ChimeraQueryNotReadyError(this.#entityConfig.name);\n\t}\n\n\t#mutableItem(internalMessage?: string): TItem {\n\t\tif (this.#state === ChimeraQueryFetchingState.Deleted) {\n\t\t\tthrow internalMessage\n\t\t\t\t? new ChimeraInternalError(internalMessage)\n\t\t\t\t: new ChimeraQueryDeletedItemError(this.#entityConfig.name, this.#params.id);\n\t\t}\n\t\treturn this.#readyItem(internalMessage);\n\t}\n\n\t#setMutable(item: TItem) {\n\t\tif (item != null) {\n\t\t\tif (this.#mutable) {\n\t\t\t\tdeepObjectAssign(this.#mutable as AnyObject, item as AnyObject);\n\t\t\t} else {\n\t\t\t\tthis.#mutable = deepObjectClone(item);\n\t\t\t}\n\t\t} else this.#mutable = item;\n\t}\n\n\t#resetMutable() {\n\t\tthis.#setMutable(\n\t\t\tthis.#readyItem(`Trying to reset mutable ref for empty item (${this.#entityConfig.name}[${this.#params.id}])`),\n\t\t);\n\t}\n\n\t#setItem(item: TItem) {\n\t\t!this.#item && this.#emit(\"ready\", { instance: this });\n\t\tconst oldItem = this.#item;\n\t\tthis.#item = item;\n\t\tthis.#resetMutable();\n\t\tthis.#emit(\"updated\", { instance: this, item, oldItem });\n\t}\n\n\t#setNewItem(item: TItem) {\n\t\tdeepObjectFreeze(item);\n\t\tconst oldItem = this.#item;\n\t\tthis.#setItem(item);\n\t\tthis.#emit(\"selfUpdated\", { instance: this, item, oldItem });\n\t}\n\n\t#deleteItem() {\n\t\tthis.#state = ChimeraQueryFetchingState.Deleted;\n\t\tthis.#emit(\"deleted\", { id: this.#params.id, instance: this });\n\t}\n\n\t#setError(error: unknown, source: ChimeraQueryError): never {\n\t\tthis.#state = this.#item ? ChimeraQueryFetchingState.ReErrored : ChimeraQueryFetchingState.Errored;\n\t\tthis.#lastError = error;\n\t\tthis.#emit(\"error\", { error, instance: this });\n\t\tthrow source;\n\t}\n\n\t#watchPromise(\n\t\tpromise: Promise<ChimeraQueryItemFetcherResponse<TItem>>,\n\t\tcontroller: AbortController,\n\t): ChimeraCancellablePromise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tconst name = this.#entityConfig.name;\n\n\t\treturn makeCancellablePromise(\n\t\t\tpromise\n\t\t\t\t.then(({ data }) => {\n\t\t\t\t\tif (this.#entityConfig.trustQuery && !this.#debugConfig.devMode) {\n\t\t\t\t\t\tthis.#setNewItem(data);\n\t\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.Fetched;\n\t\t\t\t\t\treturn { data };\n\t\t\t\t\t}\n\n\t\t\t\t\tconst localId = this.#params.id;\n\t\t\t\t\tconst newId = this.#idGetter(data, name);\n\n\t\t\t\t\tif (localId === newId || this.#state === ChimeraQueryFetchingState.Creating) {\n\t\t\t\t\t\tthis.#setNewItem(data);\n\t\t\t\t\t\tif (this.#state === ChimeraQueryFetchingState.Creating) {\n\t\t\t\t\t\t\tthis.#emit(\"selfCreated\", { instance: this, item: data });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.Fetched;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#debugConfig.devMode &&\n\t\t\t\t\t\t\tthis.#entityConfig.trustQuery &&\n\t\t\t\t\t\t\tconsole.warn(new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, localId, newId));\n\n\t\t\t\t\t\tif (!this.#entityConfig.trustQuery) {\n\t\t\t\t\t\t\tthrow new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, localId, newId);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.#setNewItem(data);\n\t\t\t\t\t\tthis.#params.id = newId;\n\t\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.Fetched;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn { data };\n\t\t\t\t})\n\t\t\t\t.catch((error) => this.#setError(error, new ChimeraQueryFetchingError(this.#entityConfig.name, error))),\n\t\t\tcontroller,\n\t\t);\n\t}\n\n\t#updateItem(newItem: TItem): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tconst name = this.#entityConfig.name;\n\n\t\tconst newId = this.#idGetter(newItem, name);\n\t\tconst oldId = this.#idGetter(\n\t\t\tthis.#readyItem(`Trying to update not ready item (${this.#entityConfig.name}[${this.#params.id}])`),\n\t\t\tname,\n\t\t);\n\t\tif (newId !== oldId && !this.#entityConfig.trustQuery) {\n\t\t\tthis.#resetMutable();\n\t\t\tthrow new ChimeraQueryIdMismatchError(this.#entityConfig.name, oldId, newId);\n\t\t}\n\n\t\tthis.#state = ChimeraQueryFetchingState.Updating;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#setPromise(\n\t\t\tthis.#watchPromise(\n\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\tthis.#entityConfig.itemUpdater(newItem, { signal: controller.signal }, name),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t\tcontroller,\n\t\t\t),\n\t\t);\n\t}\n\n\t#requestDelete(): Promise<ChimeraQueryItemDeleteResponse> {\n\t\tthis.#state = ChimeraQueryFetchingState.Deleting;\n\t\tconst { controller } = this.#prepareRequestParams();\n\n\t\tconst name = this.#entityConfig.name;\n\n\t\treturn this.#setPromise(\n\t\t\tmakeCancellablePromise(\n\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\tthis.#entityConfig.itemDeleter(this.#params.id, { signal: controller.signal }, name),\n\t\t\t\t\tcontroller,\n\t\t\t\t).then(\n\t\t\t\t\t({ result }) => {\n\t\t\t\t\t\tconst { id, success } = result;\n\t\t\t\t\t\tif (this.#entityConfig.trustQuery && !this.#debugConfig.devMode && success) {\n\t\t\t\t\t\t\tthis.#deleteItem();\n\t\t\t\t\t\t\treturn { result };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst localId = this.#params.id;\n\n\t\t\t\t\t\tif (localId !== id) {\n\t\t\t\t\t\t\tthis.#debugConfig.devMode &&\n\t\t\t\t\t\t\t\tthis.#entityConfig.trustQuery &&\n\t\t\t\t\t\t\t\tconsole.warn(new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, localId, id));\n\n\t\t\t\t\t\t\tif (!this.#entityConfig.trustQuery)\n\t\t\t\t\t\t\t\tthrow new ChimeraQueryTrustIdMismatchError(this.#entityConfig.name, localId, id);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (success) {\n\t\t\t\t\t\t\tthis.#deleteItem();\n\t\t\t\t\t\t\tthis.#emit(\"selfDeleted\", { id, instance: this });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst error = new ChimeraQueryUnsuccessfulDeletionError(this.#entityConfig.name, this.#params.id);\n\t\t\t\t\t\t\tthis.#state = ChimeraQueryFetchingState.ReErrored;\n\t\t\t\t\t\t\tthis.#lastError = error;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn { result };\n\t\t\t\t\t},\n\t\t\t\t\t(error) => this.#setError(error, new ChimeraQueryDeletingError(this.#entityConfig.name, error)),\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\t}\n\n\tconstructor(\n\t\tconfig: QueryEntityConfig<TEntityName, TItem, ChimeraOperatorMap>,\n\t\tdebugConfig: ChimeraDebugConfig,\n\t\tparams: ChimeraQueryEntityItemFetcherParams<TItem>,\n\t\texistingItem: TItem | null,\n\t\ttoCreateItem: DeepPartial<TItem> | null,\n\t) {\n\t\tsuper();\n\n\t\tthis.#entityConfig = config;\n\t\tthis.#debugConfig = debugConfig;\n\t\tthis.#idGetter = config.idGetter;\n\t\tthis.#params = params;\n\t\tthis.#promise = null;\n\t\tthis.#item = null;\n\t\tthis.#mutable = null;\n\t\tthis.#state = ChimeraQueryFetchingState.Initialized;\n\n\t\tconst name = config.name;\n\n\t\tif (existingItem) {\n\t\t\tconst item = existingItem;\n\n\t\t\tthis.#setItem(item);\n\n\t\t\tif (debugConfig.devMode && this.#idGetter(item, name) !== params.id) {\n\t\t\t\tthis.#state = ChimeraQueryFetchingState.Errored;\n\t\t\t\tthrow new ChimeraInternalError(\n\t\t\t\t\t`Invalid item query [id] (changed from \"${params.id}\" to \"${this.#idGetter(item, name)}\")`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.#state = ChimeraQueryFetchingState.Prefetched;\n\t\t} else if (toCreateItem) {\n\t\t\tthis.#state = ChimeraQueryFetchingState.Creating;\n\t\t\tconst { controller } = this.#prepareRequestParams();\n\t\t\tthis.#setPromise(\n\t\t\t\tthis.#watchPromise(\n\t\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\t\tconfig.itemCreator(toCreateItem, { signal: controller.signal }, name),\n\t\t\t\t\t\tcontroller,\n\t\t\t\t\t).then(({ data }) => {\n\t\t\t\t\t\tthis.#params.id = this.#idGetter(data, name);\n\t\t\t\t\t\treturn { data };\n\t\t\t\t\t}),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.#state = ChimeraQueryFetchingState.Fetching;\n\t\t\tconst { controller } = this.#prepareRequestParams();\n\t\t\tthis.#setPromise(\n\t\t\t\tthis.#watchPromise(\n\t\t\t\t\tmakeCancellablePromise(config.itemFetcher(params, { signal: controller.signal }, name), controller),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tthis.#emit(\"initialized\", { instance: this });\n\t}\n\n\tget name(): TEntityName {\n\t\treturn this.#entityConfig.name;\n\t}\n\n\tget [ChimeraGetParamsSym](): ChimeraQueryEntityItemFetcherParams<TItem> {\n\t\treturn this.#params;\n\t}\n\n\t[ChimeraSetOneSym](item: TItem) {\n\t\tthis.#setItem(item);\n\t\t!this.inProgress && (this.#state = ChimeraQueryFetchingState.Actualized);\n\t}\n\n\t[ChimeraDeleteOneSym](id: ChimeraEntityId) {\n\t\tif (id === this.#params.id) {\n\t\t\tthis.#promise?.cancel();\n\t\t\tthis.#promise = null;\n\t\t\tthis.#deleteItem();\n\t\t}\n\t}\n\n\tget state(): ChimeraQueryFetchingState {\n\t\treturn this.#state;\n\t}\n\n\tget inProgress(): boolean {\n\t\treturn IN_PROGRESS_STATES.includes(this.#state);\n\t}\n\n\tget ready(): boolean {\n\t\treturn this.#item !== null;\n\t}\n\n\tget lastError(): unknown {\n\t\treturn this.#lastError;\n\t}\n\n\tget id(): ChimeraEntityId {\n\t\treturn this.#params.id;\n\t}\n\n\t/** Return an item if it is ready, throw error otherwise */\n\tget data(): TItem {\n\t\treturn this.#readyItem();\n\t}\n\n\t/** Get ref for an item that can be changed as a regular object. To send changes to updater, use <commit> method */\n\tget mutable(): TItem {\n\t\tthis.#readyItem();\n\t\treturn this.#mutable as TItem;\n\t}\n\n\tget promise(): Promise<unknown> | null {\n\t\treturn this.#promise;\n\t}\n\n\t/**\n\t * Wait for the current progress process to complete (both success or error)\n\t */\n\tget progress(): Promise<void> {\n\t\treturn new Promise((res) => {\n\t\t\tconst resolve = () => queueMicrotask(() => res());\n\t\t\tif (this.#promise) {\n\t\t\t\tthis.#promise.then(resolve, resolve);\n\t\t\t\tthis.#promise.cancelled(() => this.progress.then(resolve, resolve));\n\t\t\t} else resolve();\n\t\t});\n\t}\n\n\t/**\n\t * Wait for the current progress process to complete, throw an error if it fails\n\t */\n\tget result(): Promise<void> {\n\t\treturn new Promise((res, rej) => {\n\t\t\tconst resolve = () => queueMicrotask(() => res());\n\t\t\tif (this.#promise) {\n\t\t\t\tthis.#promise.then(resolve, rej);\n\t\t\t\tthis.#promise.cancelled(() => (this.#promise ? this.result.then(res, rej) : rej(\"cancelled\")));\n\t\t\t} else resolve();\n\t\t});\n\t}\n\n\t/**\n\t * Trigger refetch, return existing refetch promise if already running\n\t * @param force If true cancels any running process and starts a new one\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\trefetch(force = false): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tif (\n\t\t\t!force &&\n\t\t\tthis.#promise &&\n\t\t\t[ChimeraQueryFetchingState.Fetching, ChimeraQueryFetchingState.Refetching].includes(this.#state)\n\t\t)\n\t\t\treturn this.#promise as Promise<ChimeraQueryItemFetcherResponse<TItem>>;\n\n\t\tif (this.#state === ChimeraQueryFetchingState.Creating)\n\t\t\tthrow new ChimeraQueryNotCreatedError(this.#entityConfig.name);\n\n\t\tif (!force && [ChimeraQueryFetchingState.Updating, ChimeraQueryFetchingState.Deleting].includes(this.#state))\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\tthis.#state = ChimeraQueryFetchingState.Refetching;\n\t\tconst { controller } = this.#prepareRequestParams();\n\t\treturn this.#setPromise(\n\t\t\tthis.#watchPromise(\n\t\t\t\tmakeCancellablePromise(\n\t\t\t\t\tthis.#entityConfig.itemFetcher(this.#params, { signal: controller.signal }, this.#entityConfig.name),\n\t\t\t\t\tcontroller,\n\t\t\t\t),\n\t\t\t\tcontroller,\n\t\t\t),\n\t\t);\n\t}\n\n\t/**\n\t * Update item using updated copy, a running update process will be cancelled\n\t * @param newItem new item to replace existing\n\t * @param force if true cancels any running process including fetch and delete\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\tupdate(newItem: TItem, force = false): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tif (this.#state === ChimeraQueryFetchingState.Creating)\n\t\t\tthrow new ChimeraQueryNotCreatedError(this.#entityConfig.name);\n\n\t\tif (\n\t\t\t!force &&\n\t\t\t[\n\t\t\t\tChimeraQueryFetchingState.Fetching,\n\t\t\t\tChimeraQueryFetchingState.Refetching,\n\t\t\t\tChimeraQueryFetchingState.Deleting,\n\t\t\t].includes(this.#state)\n\t\t)\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\tthis.#mutableItem();\n\t\treturn this.#updateItem(newItem);\n\t}\n\n\t/**\n\t * Update item using function with draft item as argument\n\t * that can be used to patch item in place or return a patched value,\n\t * a running update process will be cancelled\n\t * @param mutator mutator function\n\t * @param force if true cancels any running process including fetch and delete\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\tmutate(mutator: (draft: TItem) => TItem, force = false): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tif (this.#state === ChimeraQueryFetchingState.Creating)\n\t\t\tthrow new ChimeraQueryNotCreatedError(this.#entityConfig.name);\n\n\t\tif (\n\t\t\t!force &&\n\t\t\t[\n\t\t\t\tChimeraQueryFetchingState.Fetching,\n\t\t\t\tChimeraQueryFetchingState.Refetching,\n\t\t\t\tChimeraQueryFetchingState.Deleting,\n\t\t\t].includes(this.#state)\n\t\t)\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\tconst item = deepObjectClone(this.#mutableItem());\n\t\treturn this.#updateItem(mutator(item) ?? item);\n\t}\n\n\t/**\n\t * Commit updated value from mutable ref, a running update process will be canceled\n\t * @param force if true cancels any running process including fetch and delete\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\tcommit(force = false): Promise<ChimeraQueryItemFetcherResponse<TItem>> {\n\t\tif (this.#state === ChimeraQueryFetchingState.Creating)\n\t\t\tthrow new ChimeraQueryNotCreatedError(this.#entityConfig.name);\n\n\t\tif (\n\t\t\t!force &&\n\t\t\t[\n\t\t\t\tChimeraQueryFetchingState.Fetching,\n\t\t\t\tChimeraQueryFetchingState.Refetching,\n\t\t\t\tChimeraQueryFetchingState.Deleting,\n\t\t\t].includes(this.#state)\n\t\t)\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\tthis.#mutableItem();\n\t\treturn this.#updateItem(this.#mutable as TItem);\n\t}\n\n\t/**\n\t * Request to delete the value.\n\t * Local copy will still be available if it was present.\n\t * A running delete process will be canceled\n\t * @param force if true cancels any running process including fetch and update\n\t * @throws {ChimeraQueryAlreadyRunningError} If deleting or updating already in progress\n\t */\n\tdelete(force = false): Promise<ChimeraQueryItemDeleteResponse> {\n\t\tif (this.#state === ChimeraQueryFetchingState.Creating)\n\t\t\tthrow new ChimeraQueryNotCreatedError(this.#entityConfig.name);\n\n\t\tif (\n\t\t\t!force &&\n\t\t\t[\n\t\t\t\tChimeraQueryFetchingState.Fetching,\n\t\t\t\tChimeraQueryFetchingState.Refetching,\n\t\t\t\tChimeraQueryFetchingState.Updating,\n\t\t\t].includes(this.#state)\n\t\t)\n\t\t\tthrow new ChimeraQueryAlreadyRunningError(this.#entityConfig.name, this.#state);\n\n\t\treturn this.#requestDelete();\n\t}\n\n\ttoJSON() {\n\t\treturn this.#readyItem();\n\t}\n\n\toverride toString(): string {\n\t\treturn `${this.#readyItem()}`;\n\t}\n}\n\nexport type AnyChimeraItemQuery = ChimeraItemQuery<any, any>;\ntype ExtractedChimeraItemQuery<TItemQuery> =\n\tTItemQuery extends ChimeraItemQuery<infer TEntityName, infer TItem>\n\t\t? { entityName: TEntityName; item: TItem }\n\t\t: never;\nexport type ChimeraItemQueryName = ExtractedChimeraItemQuery<AnyChimeraItemQuery>[\"entityName\"];\nexport type ChimeraItemQueryEntity = ExtractedChimeraItemQuery<AnyChimeraItemQuery>[\"item\"];\n","import type { EventArgs, EventNames } from \"../ChimeraEventEmitter\";\nimport { ChimeraEventEmitter } from \"../ChimeraEventEmitter\";\nimport { ChimeraInternalError } from \"../errors.ts\";\n\nexport type ChimeraWeakValueMapEventMap<K, V extends object> = {\n\t/** An item was added to the map */\n\tset: { key: K; value: V; instance: ChimeraWeakValueMap<K, V> };\n\n\t/** An item was removed from the map */\n\tdelete: { key: K; value: V; instance: ChimeraWeakValueMap<K, V> };\n\n\t/** Weak reference was automatically collected */\n\tfinalize: { key: K; instance: ChimeraWeakValueMap<K, V> };\n\n\t/** All items were removed from the map */\n\tclear: { instance: ChimeraWeakValueMap<K, V> };\n};\n\nexport class ChimeraWeakValueMap<K, V extends object> extends ChimeraEventEmitter<ChimeraWeakValueMapEventMap<K, V>> {\n\treadonly #map: Map<K, WeakRef<V>>;\n\treadonly #registry: FinalizationRegistry<K>;\n\t#cleanupScheduled = false;\n\n\t#emit<T extends EventNames<ChimeraWeakValueMapEventMap<K, V>>>(\n\t\tevent: T,\n\t\targ: EventArgs<ChimeraWeakValueMapEventMap<K, V>, T>,\n\t) {\n\t\tqueueMicrotask(() => super.emit(event, arg));\n\t}\n\n\toverride emit(): never {\n\t\tthrow new ChimeraInternalError(\"External events dispatching is not supported.\");\n\t}\n\n\t#scheduleCleanup() {\n\t\tif (this.#cleanupScheduled) return;\n\t\tthis.#cleanupScheduled = true;\n\n\t\tconst scheduler =\n\t\t\ttypeof requestIdleCallback !== \"undefined\" ? requestIdleCallback : (cb: () => void) => setTimeout(cb, 0);\n\n\t\tscheduler(() => {\n\t\t\tthis.#cleanup();\n\t\t\tthis.#cleanupScheduled = false;\n\t\t});\n\t}\n\n\t#cleanup() {\n\t\tfor (const [key, weakRef] of this.#map.entries()) {\n\t\t\tif (weakRef.deref() === undefined) {\n\t\t\t\tthis.#map.delete(key);\n\t\t\t\tthis.#emit(\"finalize\", { instance: this, key });\n\t\t\t}\n\t\t}\n\t}\n\n\tconstructor(values?: readonly (readonly [K, V])[] | null) {\n\t\tsuper();\n\n\t\tthis.#registry = new FinalizationRegistry<K>((key) => {\n\t\t\tconst weakRef = this.#map.get(key);\n\t\t\tif (weakRef && weakRef.deref() === undefined) {\n\t\t\t\tthis.#map.delete(key);\n\t\t\t\tthis.#emit(\"finalize\", { instance: this, key });\n\t\t\t}\n\t\t});\n\n\t\tthis.#map = new Map(\n\t\t\tvalues\n\t\t\t\t? values.map(([k, v]): [K, WeakRef<V>] => {\n\t\t\t\t\t\tthis.#registry.register(v, k, v);\n\t\t\t\t\t\treturn [k, new WeakRef(v)];\n\t\t\t\t\t})\n\t\t\t\t: null,\n\t\t);\n\t}\n\n\tset(key: K, value: V): this {\n\t\tconst existingRef = this.#map.get(key);\n\t\tif (existingRef) {\n\t\t\tconst existingValue = existingRef.deref();\n\t\t\tif (existingValue) {\n\t\t\t\tthis.#registry.unregister(existingValue);\n\t\t\t}\n\t\t}\n\n\t\tthis.#registry.register(value, key, value);\n\t\tthis.#map.set(key, new WeakRef(value));\n\t\tthis.#emit(\"set\", { instance: this, key, value });\n\t\treturn this;\n\t}\n\n\tdelete(key: K): boolean {\n\t\tif (!this.#map.has(key)) return false;\n\t\tconst weakRef = this.#map.get(key);\n\t\tconst value = weakRef?.deref();\n\n\t\tif (value === undefined) {\n\t\t\tthis.#map.delete(key);\n\t\t\tthis.#emit(\"finalize\", { instance: this, key });\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.#map.delete(key);\n\t\tthis.#registry.unregister(value);\n\t\tthis.#emit(\"delete\", { instance: this, key, value });\n\t\treturn true;\n\t}\n\n\thas(key: K): boolean {\n\t\tconst weakRef = this.#map.get(key);\n\t\tconst value = weakRef?.deref();\n\n\t\tif (value === undefined && weakRef) {\n\t\t\tthis.#map.delete(key);\n\t\t\tthis.#emit(\"finalize\", { instance: this, key });\n\t\t\tthis.#scheduleCleanup();\n\t\t}\n\n\t\treturn value !== undefined;\n\t}\n\n\tforEach(callbackFn: (value: V, key: K, map: ChimeraWeakValueMap<K, V>) => void, thisArg?: any): void {\n\t\tthis.#map.forEach((weakRef, k) => {\n\t\t\tconst value = weakRef.deref();\n\t\t\tif (value !== undefined) {\n\t\t\t\tcallbackFn.call(thisArg, value, k, this);\n\t\t\t} else {\n\t\t\t\tthis.#map.delete(k);\n\t\t\t\tthis.#emit(\"finalize\", { instance: this, key: k });\n\t\t\t}\n\t\t});\n\n\t\tif (this.#map.size > 0) {\n\t\t\tthis.#scheduleCleanup();\n\t\t}\n\t}\n\n\tget(key: K): V | undefined {\n\t\tconst weakRef = this.#map.get(key);\n\t\tconst value = weakRef?.deref();\n\n\t\tif (value === undefined && weakRef) {\n\t\t\tthis.#map.delete(key);\n\t\t\tthis.#emit(\"finalize\", { instance: this, key });\n\t\t\tthis.#scheduleCleanup();\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tget size(): number {\n\t\tthis.#cleanup();\n\t\treturn this.#map.size;\n\t}\n\n\t*entries(): IterableIterator<[K, V]> {\n\t\tfor (const [k, weakRef] of this.#map.entries()) {\n\t\t\tconst value = weakRef.deref();\n\t\t\tif (value !== undefined) {\n\t\t\t\tyield [k, value];\n\t\t\t} else {\n\t\t\t\tthis.#map.delete(k);\n\t\t\t\tthis.#emit(\"finalize\", { instance: this, key: k });\n\t\t\t}\n\t\t}\n\n\t\tif (this.#map.size > 0) {\n\t\t\tthis.#scheduleCleanup();\n\t\t}\n\t}\n\n\t*keys(): IterableIterator<K> {\n\t\tfor (const [k, weakRef] of this.#map.entries()) {\n\t\t\tif (weakRef.deref() !== undefined) {\n\t\t\t\tyield k;\n\t\t\t} else {\n\t\t\t\tthis.#map.delete(k);\n\t\t\t\tthis.#emit(\"finalize\", { instance: this, key: k });\n\t\t\t}\n\t\t}\n\n\t\tif (this.#map.size > 0) {\n\t\t\tthis.#scheduleCleanup();\n\t\t}\n\t}\n\n\t*values(): IterableIterator<V> {\n\t\tfor (const weakRef of this.#map.values()) {\n\t\t\tconst value = weakRef.deref();\n\t\t\tif (value !== undefined) {\n\t\t\t\tyield value;\n\t\t\t}\n\t\t}\n\n\t\tthis.#cleanup();\n\t}\n\n\t*[Symbol.iterator](): IterableIterator<[K, V]> {\n\t\tyield* this.entries();\n\t}\n\n\tclear(): void {\n\t\tfor (const weakRef of this.#map.values()) {\n\t\t\tconst value = weakRef.deref();\n\t\t\tif (value !== undefined) {\n\t\t\t\tthis.#registry.unregister(value);\n\t\t\t}\n\t\t}\n\n\t\tthis.#map.clear();\n\t\tthis.#emit(\"clear\", { instance: this });\n\t}\n\n\tcleanup(): void {\n\t\tthis.#cleanup();\n\t}\n\n\tget rawSize(): number {\n\t\treturn this.#map.size;\n\t}\n}\n","import { chimeraDefaultQueryEntityConfig } from \"../../packages/store/defaults.ts\";\nimport { chimeraDefaultDebugConfig } from \"../debug/defaults.ts\";\nimport type { ChimeraDebugConfig } from \"../debug/types.ts\";\nimport { chimeraDefaultFilterConfig } from \"../filter/defaults.ts\";\nimport { compileFilter, isFilterSubset, simplifyFilter } from \"../filter/filter.ts\";\nimport type { ChimeraFilterConfig, ChimeraOperatorMap, ChimeraSimplifiedFilter } from \"../filter/types.ts\";\nimport { chimeraDefaultOrderConfig } from \"../order/defaults.ts\";\nimport { buildComparator, simplifyOrderBy } from \"../order/order.ts\";\nimport type { ChimeraOrderConfig } from \"../order/types.ts\";\nimport { ChimeraCollectionQuery } from \"../query/ChimeraCollectionQuery.ts\";\nimport { ChimeraItemQuery } from \"../query/ChimeraItemQuery.ts\";\nimport {\n\tChimeraDeleteManySym,\n\tChimeraDeleteOneSym,\n\tChimeraGetParamsSym,\n\tChimeraSetManySym,\n\tChimeraSetOneSym,\n} from \"../query/constants.ts\";\nimport type {\n\tChimeraIdGetterFunction,\n\tChimeraQueryEntityCollectionFetcherParams,\n\tChimeraQueryEntityConfig,\n\tQueryEntityConfig,\n} from \"../query/types.ts\";\nimport type { EventArgs, EventNames } from \"../shared/ChimeraEventEmitter/index.ts\";\nimport { ChimeraEventEmitter } from \"../shared/ChimeraEventEmitter/index.ts\";\nimport { ChimeraWeakValueMap } from \"../shared/ChimeraWeakValueMap/index.ts\";\nimport { ChimeraInternalError } from \"../shared/errors.ts\";\nimport type { ChimeraEntityId, DeepPartial } from \"../shared/types.ts\";\nimport type { ChimeraCollectionParams } from \"./types.ts\";\n\nexport type ChimeraEntityStoreEventMap<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n> = {\n\t/** Once the repository is initialized */\n\tinitialized: {\n\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t};\n\n\t/** Each time item added */\n\titemAdded: [\n\t\t{\n\t\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t\t\titem: TItem;\n\t\t},\n\t];\n\n\t/** Each time many items updated */\n\tupdated: [\n\t\t{\n\t\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t\t\titems: TItem[];\n\t\t},\n\t];\n\t/** Each time item updated */\n\titemUpdated: [\n\t\t{\n\t\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t\t\titem: TItem;\n\t\t\toldItem: TItem | null;\n\t\t},\n\t];\n\n\t/** Each time many items deleted */\n\tdeleted: [\n\t\t{\n\t\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t\t\tids: ChimeraEntityId[];\n\t\t},\n\t];\n\t/** Each time item deleted */\n\titemDeleted: [\n\t\t{\n\t\t\tinstance: ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\n\t\t\toldItem: TItem | null;\n\t\t},\n\t];\n};\n\ntype SkipParams<TEntityName extends string, TItem extends object, TOperatorsMap extends ChimeraOperatorMap> = {\n\titem?: ChimeraItemQuery<TEntityName, TItem>;\n\tcollection?: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>;\n};\n\nexport class ChimeraEntityStore<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n> extends ChimeraEventEmitter<ChimeraEntityStoreEventMap<TEntityName, TItem, TOperatorsMap>> {\n\treadonly #entityConfig: QueryEntityConfig<TEntityName, TItem, TOperatorsMap>;\n\treadonly #filterConfig: Required<ChimeraFilterConfig<TOperatorsMap>>;\n\treadonly #orderConfig: Required<ChimeraOrderConfig>;\n\treadonly #debugConfig: Required<ChimeraDebugConfig>;\n\treadonly #idGetter: ChimeraIdGetterFunction<TEntityName, TItem>;\n\n\treadonly #itemsMap: ChimeraWeakValueMap<ChimeraEntityId, TItem>;\n\n\treadonly #collectionQueryMap: ChimeraWeakValueMap<string, ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>>;\n\treadonly #itemQueryMap: ChimeraWeakValueMap<ChimeraEntityId, ChimeraItemQuery<TEntityName, TItem>>;\n\n\t#emit<T extends EventNames<ChimeraEntityStoreEventMap<TEntityName, TItem, TOperatorsMap>>>(\n\t\tevent: T,\n\t\targ: EventArgs<ChimeraEntityStoreEventMap<TEntityName, TItem, TOperatorsMap>, T>,\n\t) {\n\t\tqueueMicrotask(() => super.emit(event, arg as any));\n\t}\n\n\toverride emit(): never {\n\t\tthrow new ChimeraInternalError(\"External events dispatching is not supported.\");\n\t}\n\n\t#registerUpdate(item: TItem, skipItem?: ChimeraItemQuery<TEntityName, TItem>) {\n\t\tconst id = this.#idGetter(item, this.#entityConfig.name);\n\t\tconst oldItem = this.#itemsMap.get(id);\n\t\tthis.#itemsMap.set(id, item);\n\n\t\tconst itemQuery = this.#itemQueryMap.get(id);\n\t\titemQuery && skipItem !== itemQuery && itemQuery[ChimeraSetOneSym](item);\n\n\t\t!oldItem && this.#emit(\"itemAdded\", { instance: this, item });\n\t\tthis.#emit(\"itemUpdated\", {\n\t\t\tinstance: this,\n\t\t\titem,\n\t\t\toldItem: oldItem ?? null,\n\t\t});\n\t}\n\n\t#registerDelete(id: ChimeraEntityId, skipItem?: ChimeraItemQuery<TEntityName, TItem>) {\n\t\tconst oldItem = this.#itemsMap.get(id);\n\t\tif (!oldItem) return;\n\t\tthis.#itemsMap.delete(id);\n\n\t\tconst itemQuery = this.#itemQueryMap.get(id);\n\t\titemQuery && skipItem !== itemQuery && itemQuery[ChimeraDeleteOneSym](id);\n\n\t\tthis.#emit(\"itemDeleted\", { instance: this, oldItem: oldItem ?? null });\n\t}\n\n\t#propagateUpdateOne(\n\t\titem: TItem,\n\t\t{ item: skipItem, collection: skipCollection }: SkipParams<TEntityName, TItem, TOperatorsMap> = {},\n\t) {\n\t\tthis.#registerUpdate(item, skipItem);\n\t\tfor (const c of this.#collectionQueryMap.values()) c !== skipCollection && c[ChimeraSetOneSym](item);\n\t}\n\n\t#propagateDeleteOne(\n\t\tid: ChimeraEntityId,\n\t\t{ item: skipItem, collection: skipCollection }: SkipParams<TEntityName, TItem, TOperatorsMap> = {},\n\t) {\n\t\tthis.#registerDelete(id, skipItem);\n\t\tfor (const c of this.#collectionQueryMap.values()) c !== skipCollection && c[ChimeraDeleteOneSym](id);\n\t}\n\n\t#propagateUpdateMany(\n\t\titems: TItem[],\n\t\t{ item: skipItem, collection: skipCollection }: SkipParams<TEntityName, TItem, TOperatorsMap> = {},\n\t) {\n\t\tfor (const item of items) this.#registerUpdate(item, skipItem);\n\t\tthis.#emit(\"updated\", { instance: this, items });\n\t\tfor (const c of this.#collectionQueryMap.values()) c !== skipCollection && c[ChimeraSetManySym](items);\n\t}\n\n\t#propagateDeleteMany(\n\t\tids: ChimeraEntityId[],\n\t\t{ item: skipItem, collection: skipCollection }: SkipParams<TEntityName, TItem, TOperatorsMap> = {},\n\t) {\n\t\tfor (const id of ids) this.#registerDelete(id, skipItem);\n\t\tthis.#emit(\"deleted\", { ids, instance: this });\n\t\tfor (const c of this.#collectionQueryMap.values()) c !== skipCollection && c[ChimeraDeleteManySym](ids);\n\t}\n\n\t#itemUpdateHandler(query: ChimeraItemQuery<TEntityName, TItem>, item: TItem) {\n\t\tthis.#propagateUpdateOne(item, { item: query });\n\t}\n\n\t#itemDeleteHandler(query: ChimeraItemQuery<TEntityName, TItem>, id: ChimeraEntityId) {\n\t\tthis.#itemQueryMap.delete(id);\n\t\tthis.#propagateDeleteOne(id, { item: query });\n\t}\n\n\t#prepareItemQuery(query: ChimeraItemQuery<TEntityName, TItem>): ChimeraItemQuery<TEntityName, TItem> {\n\t\tif (query.id !== \"\") this.#itemQueryMap.set(query.id, query);\n\t\tquery.on(\"selfCreated\", ({ instance }) => this.#itemQueryMap.set(instance.id, instance));\n\t\tquery.on(\"selfUpdated\", ({ instance, item }) => this.#itemUpdateHandler(instance, item));\n\t\tquery.on(\"selfDeleted\", ({ instance, id }) => this.#itemDeleteHandler(instance, id));\n\t\treturn query;\n\t}\n\n\t#simplifyCollectionParams(\n\t\tparams: ChimeraCollectionParams<TOperatorsMap, TItem>,\n\t): ChimeraQueryEntityCollectionFetcherParams<TItem, TOperatorsMap> {\n\t\treturn {\n\t\t\tfilter: simplifyFilter(params.filter),\n\t\t\torder: simplifyOrderBy(params.order),\n\t\t\tmeta: params.meta,\n\t\t};\n\t}\n\n\t#getCollectionKey({ order, filter }: ChimeraQueryEntityCollectionFetcherParams<TItem, TOperatorsMap>): string {\n\t\treturn `${this.#entityConfig.name}:ORDER<${order ? this.#orderConfig.getKey(order) : \"\"}>:FILTER<${filter ? this.#filterConfig.getFilterKey(filter) : \"\"}>`;\n\t}\n\n\t#collectionUpdateHandler(query: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>, items: TItem[]) {\n\t\tthis.#propagateUpdateMany(items, { collection: query });\n\t}\n\n\t#collectionCreateHandler(query: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>, item: TItem) {\n\t\tthis.#propagateUpdateOne(item, { collection: query });\n\t}\n\n\t#collectionItemUpdated(query: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>, item: TItem) {\n\t\tthis.#propagateUpdateOne(item, { collection: query });\n\t}\n\n\t#collectionItemDeleted(query: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>, id: ChimeraEntityId) {\n\t\tthis.#propagateDeleteOne(id, { collection: query });\n\t}\n\n\t#prepareCollectionQuery(\n\t\tquery: ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap>,\n\t): ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap> {\n\t\tthis.#collectionQueryMap.set(this.#getCollectionKey(query[ChimeraGetParamsSym]), query);\n\t\tquery.on(\"selfUpdated\", ({ instance, items }) => this.#collectionUpdateHandler(instance, items));\n\t\tquery.on(\"selfItemCreated\", ({ instance, item }) => this.#collectionCreateHandler(instance, item));\n\t\tquery.on(\"selfItemUpdated\", ({ instance, item }) => this.#collectionItemUpdated(instance, item));\n\t\tquery.on(\"selfItemDeleted\", ({ instance, id }) => this.#collectionItemDeleted(instance, id));\n\t\treturn query;\n\t}\n\n\t#getParentQuery(\n\t\tfilter: ChimeraSimplifiedFilter<TOperatorsMap, keyof TItem & string>,\n\t): ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap> | null {\n\t\tfor (const q of this.#collectionQueryMap.values())\n\t\t\tif (q.ready && isFilterSubset(q[ChimeraGetParamsSym].filter, filter, this.#filterConfig.getOperatorKey)) return q;\n\t\treturn null;\n\t}\n\n\tconstructor(\n\t\tconfig: QueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\t\tfilterConfig: Required<ChimeraFilterConfig<TOperatorsMap>>,\n\t\torderConfig: Required<ChimeraOrderConfig>,\n\t\tdebugConfig: Required<ChimeraDebugConfig>,\n\t) {\n\t\tsuper();\n\n\t\tthis.#entityConfig = config;\n\t\tthis.#filterConfig = filterConfig;\n\t\tthis.#orderConfig = orderConfig;\n\t\tthis.#debugConfig = debugConfig;\n\t\tthis.#idGetter =\n\t\t\ttypeof this.#entityConfig.idGetter === \"function\"\n\t\t\t\t? this.#entityConfig.idGetter\n\t\t\t\t: (entity) => entity[this.#entityConfig.idGetter as keyof TItem] as unknown as ChimeraEntityId;\n\n\t\tthis.#itemsMap = new ChimeraWeakValueMap();\n\t\tthis.#collectionQueryMap = new ChimeraWeakValueMap();\n\t\tthis.#itemQueryMap = new ChimeraWeakValueMap();\n\n\t\tthis.#emit(\"initialized\", { instance: this });\n\t}\n\n\tget name(): TEntityName {\n\t\treturn this.#entityConfig.name;\n\t}\n\n\tupdateOne(TItem: TItem) {\n\t\tthis.#propagateUpdateOne(TItem);\n\t}\n\n\tdeleteOne(id: ChimeraEntityId) {\n\t\tthis.#propagateDeleteOne(id);\n\t}\n\n\tupdateMany(items: TItem[]) {\n\t\tthis.#propagateUpdateMany(items);\n\t}\n\n\tdeleteMany(ids: ChimeraEntityId[]) {\n\t\tthis.#propagateDeleteMany(ids);\n\t}\n\n\tupdateMixed(toAdd: TItem[], toDelete: ChimeraEntityId[]) {\n\t\tthis.#propagateUpdateMany(toAdd);\n\t\tthis.#propagateDeleteMany(toDelete);\n\t}\n\n\tcreateItem(TItem: DeepPartial<TItem>, meta?: any): ChimeraItemQuery<TEntityName, TItem> {\n\t\treturn this.#prepareItemQuery(\n\t\t\tnew ChimeraItemQuery(\n\t\t\t\tthis.#entityConfig,\n\t\t\t\tthis.#debugConfig,\n\t\t\t\t{\n\t\t\t\t\tid: \"\",\n\t\t\t\t\tmeta,\n\t\t\t\t},\n\t\t\t\tnull,\n\t\t\t\tTItem,\n\t\t\t),\n\t\t);\n\t}\n\n\tgetItem(id: ChimeraEntityId, meta?: any): ChimeraItemQuery<TEntityName, TItem> {\n\t\tconst query = this.#itemQueryMap.get(id);\n\t\tif (query) return query;\n\n\t\treturn this.#prepareItemQuery(\n\t\t\tnew ChimeraItemQuery(this.#entityConfig, this.#debugConfig, { id, meta }, this.#itemsMap.get(id) ?? null, null),\n\t\t);\n\t}\n\n\tgetCollection(\n\t\tparams: ChimeraCollectionParams<TOperatorsMap, TItem>,\n\t): ChimeraCollectionQuery<TEntityName, TItem, TOperatorsMap> {\n\t\tconst simplifiedParams = this.#simplifyCollectionParams(params);\n\t\tconst key = this.#getCollectionKey(simplifiedParams);\n\t\tconst query = this.#collectionQueryMap.get(key);\n\t\tif (query) return query;\n\n\t\treturn this.#prepareCollectionQuery(\n\t\t\tnew ChimeraCollectionQuery(\n\t\t\t\tthis.#entityConfig,\n\t\t\t\tthis.#debugConfig,\n\t\t\t\tsimplifiedParams,\n\t\t\t\tthis.#getParentQuery(simplifiedParams.filter),\n\t\t\t\tbuildComparator(this.#orderConfig.primitiveComparator, params.order),\n\t\t\t\tcompileFilter(this.#filterConfig, params.filter),\n\t\t\t\tfalse,\n\t\t\t),\n\t\t);\n\t}\n}\n\n/**\n * Creates a ChimeraEntityStore instance with populated default values\n * @param entityConfig Entity-specific configuration (idGetter is required)\n * @param filterConfig Optional filter configuration (defaults to chimeraDefaultFilterConfig)\n * @param orderConfig Optional order configuration (defaults to chimeraDefaultOrderConfig)\n * @param debugConfig Optional debug configuration (defaults to chimeraDefaultDebugConfig)\n * @returns ChimeraEntityStore instance\n */\nexport function createChimeraEntityStore<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n>(\n\tentityConfig: ChimeraQueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\tfilterConfig: Required<ChimeraFilterConfig<TOperatorsMap>>,\n\torderConfig: Required<ChimeraOrderConfig>,\n\tdebugConfig: Required<ChimeraDebugConfig>,\n): ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\nexport function createChimeraEntityStore<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n>(\n\tentityConfig: ChimeraQueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\tfilterConfig: Required<ChimeraFilterConfig<TOperatorsMap>>,\n\torderConfig: Required<ChimeraOrderConfig>,\n): ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\nexport function createChimeraEntityStore<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n>(\n\tentityConfig: ChimeraQueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\tfilterConfig: Required<ChimeraFilterConfig<TOperatorsMap>>,\n): ChimeraEntityStore<TEntityName, TItem, TOperatorsMap>;\nexport function createChimeraEntityStore<TEntityName extends string, TItem extends object>(\n\tentityConfig: ChimeraQueryEntityConfig<TEntityName, TItem, typeof chimeraDefaultFilterConfig.operators>,\n): ChimeraEntityStore<TEntityName, TItem, typeof chimeraDefaultFilterConfig.operators>;\nexport function createChimeraEntityStore<\n\tTEntityName extends string,\n\tTItem extends object,\n\tTOperatorsMap extends ChimeraOperatorMap,\n>(\n\tentityConfig: ChimeraQueryEntityConfig<TEntityName, TItem, TOperatorsMap>,\n\tfilterConfig?: Required<ChimeraFilterConfig<TOperatorsMap>>,\n\torderConfig?: Required<ChimeraOrderConfig>,\n\tdebugConfig?: Required<ChimeraDebugConfig>,\n): ChimeraEntityStore<TEntityName, TItem, TOperatorsMap> {\n\treturn new ChimeraEntityStore(\n\t\t{\n\t\t\t...chimeraDefaultQueryEntityConfig,\n\t\t\t...entityConfig,\n\t\t\tidGetter:\n\t\t\t\ttypeof entityConfig.idGetter === \"function\"\n\t\t\t\t\t? entityConfig.idGetter\n\t\t\t\t\t: (entity) => entity[entityConfig.idGetter as keyof TItem] as ChimeraEntityId,\n\t\t},\n\t\tfilterConfig ?? (chimeraDefaultFilterConfig as unknown as Required<ChimeraFilterConfig<TOperatorsMap>>),\n\t\torderConfig ?? chimeraDefaultOrderConfig,\n\t\tdebugConfig ?? chimeraDefaultDebugConfig,\n\t);\n}\n\nexport type AnyChimeraEntityStore = ChimeraEntityStore<any, any, any>;\ntype ExtractedChimeraEntityStore<TStore extends AnyChimeraEntityStore> =\n\tTStore extends ChimeraEntityStore<infer TEntityName, infer TItem, infer TOperatorsMap>\n\t\t? { entityName: TEntityName; item: TItem; operatorsMap: TOperatorsMap }\n\t\t: never;\nexport type ChimeraEntityStoreName<TStore extends AnyChimeraEntityStore> =\n\tExtractedChimeraEntityStore<TStore>[\"entityName\"];\nexport type ChimeraEntityStoreEntity<TStore extends AnyChimeraEntityStore> =\n\tExtractedChimeraEntityStore<TStore>[\"item\"];\nexport type ChimeraEntityStoreOperatorsMap<TStore extends AnyChimeraEntityStore> =\n\tExtractedChimeraEntityStore<TStore>[\"operatorsMap\"];\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ //#region ../../src/shared/types.d.ts
2
+ type KeysOfType<Obj, Type> = { [K in keyof Obj]: Obj[K] extends Type ? K : never }[keyof Obj];
3
+ type Constructable = {
4
+ new (...args: any[]): any;
5
+ };
6
+ type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
7
+ type Nullish<T> = null | undefined | T;
8
+ type ChimeraEntityId = string | number;
9
+ type ChimeraEntityGetter<Entity, Return = unknown> = (entity: Entity) => Return;
10
+ type ChimeraPropertyGetter<Entity, Type = unknown, Return = unknown> = {
11
+ get: ChimeraEntityGetter<Entity, Return> | KeysOfType<Entity, Type>;
12
+ key: string;
13
+ };
14
+ //#endregion
15
+ //#region ../../src/filter/constants.d.ts
16
+ declare const ChimeraOperatorSymbol: unique symbol;
17
+ declare const ChimeraConjunctionSymbol: unique symbol;
18
+ //#endregion
19
+ //#region ../../src/filter/types.d.ts
20
+ type ChimeraFilterChecker<Entity> = (item: Entity) => boolean;
21
+ type ChimeraConjunctionType = "and" | "or" | "not";
22
+ type ChimeraOperatorFunction = (itemValue: any, testValue: any) => boolean;
23
+ type ChimeraOperatorMap = Record<string, ChimeraOperatorFunction>;
24
+ type ChimeraFilterOperatorDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity, Op extends keyof OperatorsMap & string = keyof OperatorsMap & string> = { [K in Op]: {
25
+ type: typeof ChimeraOperatorSymbol;
26
+ op: K;
27
+ value: ChimeraPropertyGetter<Entity, Parameters<OperatorsMap[K]>[0]>;
28
+ test: Parameters<OperatorsMap[K]>[1];
29
+ } }[Op];
30
+ type ChimeraConjunctionOperationDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity> = ChimeraFilterOperatorDescriptor<OperatorsMap, Entity> | ChimeraConjunctionDescriptor<OperatorsMap, Entity>;
31
+ type ChimeraConjunctionDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity, Conj extends ChimeraConjunctionType = ChimeraConjunctionType> = { [K in Conj]: {
32
+ type: typeof ChimeraConjunctionSymbol;
33
+ kind: K;
34
+ operations: ChimeraConjunctionOperationDescriptor<OperatorsMap, Entity>[];
35
+ } }[Conj];
36
+ type ChimeraFilterDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity> = ChimeraConjunctionDescriptor<OperatorsMap, Entity>;
37
+ type ChimeraSimplifiedOperator<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string, Op extends keyof OperatorsMap & string = keyof OperatorsMap & string> = { [K in Op]: {
38
+ type: typeof ChimeraOperatorSymbol;
39
+ op: K;
40
+ key: Keys | string;
41
+ test: Parameters<OperatorsMap[K]>[1];
42
+ } }[Op];
43
+ type ChimeraSimplifiedConjunctionOperation<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string> = ChimeraSimplifiedOperator<OperatorsMap, Keys> | SimplifiedConjunction<OperatorsMap, Keys>;
44
+ type SimplifiedConjunction<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string, Conj extends ChimeraConjunctionType = ChimeraConjunctionType> = { [K in Conj]: {
45
+ type: typeof ChimeraConjunctionSymbol;
46
+ kind: K;
47
+ operations: ChimeraSimplifiedConjunctionOperation<OperatorsMap, Keys>[];
48
+ } }[Conj];
49
+ type ChimeraSimplifiedFilter<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string> = SimplifiedConjunction<OperatorsMap, Keys> | null;
50
+ type ChimeraKeyFromFilterGetter = <OperatorsMap extends ChimeraOperatorMap>(filter: ChimeraSimplifiedFilter<OperatorsMap> | null) => string;
51
+ type ChimeraKeyFromOperatorGetter = <OperatorsMap extends ChimeraOperatorMap>(operator: ChimeraSimplifiedOperator<OperatorsMap> | null) => string;
52
+ type ChimeraFilterConfig<OperatorsMap extends ChimeraOperatorMap> = {
53
+ operators: OperatorsMap;
54
+ getFilterKey?: ChimeraKeyFromFilterGetter;
55
+ getOperatorKey?: ChimeraKeyFromOperatorGetter;
56
+ };
57
+ //#endregion
58
+ //#region ../../src/filter/defaults.d.ts
59
+ declare const getKeyFromOperation: ChimeraKeyFromOperatorGetter;
60
+ declare const chimeraDefaultGetKeyFromFilter: ChimeraKeyFromFilterGetter;
61
+ declare const chimeraDefaultFilterOperators: {
62
+ contains: <I extends string | unknown[], T extends (I extends never[] ? unknown : I extends unknown[] ? I[number] | I : I extends string ? string : never)>(a: I, b: T) => boolean;
63
+ endsWith: (a: string, b: string) => boolean;
64
+ startsWith: (a: string, b: string) => boolean;
65
+ eq: <T>(a: T, b: T) => boolean;
66
+ gt: (a: any, b: any) => boolean;
67
+ gte: (a: any, b: any) => boolean;
68
+ in: <I, T extends (I extends never[] ? unknown[] : I extends unknown[] ? I : I[])>(a: I, b: T) => boolean;
69
+ lt: (a: any, b: any) => boolean;
70
+ lte: (a: any, b: any) => boolean;
71
+ neq: <T>(a: T, b: T) => boolean;
72
+ notIn: (a: any, b: any) => boolean;
73
+ };
74
+ declare const chimeraDefaultFilterConfig: {
75
+ getFilterKey: ChimeraKeyFromFilterGetter;
76
+ getOperatorKey: ChimeraKeyFromOperatorGetter;
77
+ operators: {
78
+ contains: <I extends string | unknown[], T extends (I extends never[] ? unknown : I extends unknown[] ? I[number] | I : I extends string ? string : never)>(a: I, b: T) => boolean;
79
+ endsWith: (a: string, b: string) => boolean;
80
+ startsWith: (a: string, b: string) => boolean;
81
+ eq: <T>(a: T, b: T) => boolean;
82
+ gt: (a: any, b: any) => boolean;
83
+ gte: (a: any, b: any) => boolean;
84
+ in: <I, T extends (I extends never[] ? unknown[] : I extends unknown[] ? I : I[])>(a: I, b: T) => boolean;
85
+ lt: (a: any, b: any) => boolean;
86
+ lte: (a: any, b: any) => boolean;
87
+ neq: <T>(a: T, b: T) => boolean;
88
+ notIn: (a: any, b: any) => boolean;
89
+ };
90
+ };
91
+ //#endregion
92
+ //#region ../../src/order/types.d.ts
93
+ declare enum ChimeraOrderNulls {
94
+ First = "first",
95
+ Last = "last",
96
+ }
97
+ type ChimeraOrderDescriptor<Entity> = {
98
+ key: ChimeraPropertyGetter<Entity>;
99
+ desc: boolean;
100
+ nulls: ChimeraOrderNulls;
101
+ };
102
+ type ChimeraOrderPriority<Entity> = ChimeraOrderDescriptor<Entity>[];
103
+ type ChimeraOrderByComparator<Entity> = (a: Entity, b: Entity) => number;
104
+ type ChimeraPrimitiveComparator = (a: unknown, b: unknown) => number;
105
+ type ChimeraSimplifiedOrderDescriptor<Keys extends string = string> = {
106
+ field: Keys | string;
107
+ desc: boolean;
108
+ nulls: ChimeraOrderNulls;
109
+ };
110
+ type ChimeraKeyFromOrderGetter = (order: ChimeraSimplifiedOrderDescriptor[] | null) => string;
111
+ type ChimeraOrderConfig = {
112
+ primitiveComparator?: ChimeraPrimitiveComparator;
113
+ getKey?: ChimeraKeyFromOrderGetter;
114
+ };
115
+ //#endregion
116
+ export { ChimeraPropertyGetter as A, ChimeraOperatorMap as C, SimplifiedConjunction as D, ChimeraSimplifiedOperator as E, DeepPartial as M, KeysOfType as N, ChimeraEntityGetter as O, Nullish as P, ChimeraOperatorFunction as S, ChimeraSimplifiedFilter as T, ChimeraFilterConfig as _, ChimeraOrderNulls as a, ChimeraKeyFromFilterGetter as b, ChimeraSimplifiedOrderDescriptor as c, chimeraDefaultGetKeyFromFilter as d, getKeyFromOperation as f, ChimeraFilterChecker as g, ChimeraConjunctionType as h, ChimeraOrderDescriptor as i, Constructable as j, ChimeraEntityId as k, chimeraDefaultFilterConfig as l, ChimeraConjunctionOperationDescriptor as m, ChimeraOrderByComparator as n, ChimeraOrderPriority as o, ChimeraConjunctionDescriptor as p, ChimeraOrderConfig as r, ChimeraPrimitiveComparator as s, ChimeraKeyFromOrderGetter as t, chimeraDefaultFilterOperators as u, ChimeraFilterDescriptor as v, ChimeraSimplifiedConjunctionOperation as w, ChimeraKeyFromOperatorGetter as x, ChimeraFilterOperatorDescriptor as y };
117
+ //# sourceMappingURL=types-CNGIuRUw.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-CNGIuRUw.d.mts","names":[],"sources":["../../../src/shared/types.ts","../../../src/filter/constants.ts","../../../src/filter/types.ts","../../../src/filter/defaults.ts","../../../src/order/types.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ //#region ../../src/shared/types.d.ts
2
+ type KeysOfType<Obj, Type> = { [K in keyof Obj]: Obj[K] extends Type ? K : never }[keyof Obj];
3
+ type Constructable = {
4
+ new (...args: any[]): any;
5
+ };
6
+ type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T;
7
+ type Nullish<T> = null | undefined | T;
8
+ type ChimeraEntityId = string | number;
9
+ type ChimeraEntityGetter<Entity, Return = unknown> = (entity: Entity) => Return;
10
+ type ChimeraPropertyGetter<Entity, Type = unknown, Return = unknown> = {
11
+ get: ChimeraEntityGetter<Entity, Return> | KeysOfType<Entity, Type>;
12
+ key: string;
13
+ };
14
+ //#endregion
15
+ //#region ../../src/filter/constants.d.ts
16
+ declare const ChimeraOperatorSymbol: unique symbol;
17
+ declare const ChimeraConjunctionSymbol: unique symbol;
18
+ //#endregion
19
+ //#region ../../src/filter/types.d.ts
20
+ type ChimeraFilterChecker<Entity> = (item: Entity) => boolean;
21
+ type ChimeraConjunctionType = "and" | "or" | "not";
22
+ type ChimeraOperatorFunction = (itemValue: any, testValue: any) => boolean;
23
+ type ChimeraOperatorMap = Record<string, ChimeraOperatorFunction>;
24
+ type ChimeraFilterOperatorDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity, Op extends keyof OperatorsMap & string = keyof OperatorsMap & string> = { [K in Op]: {
25
+ type: typeof ChimeraOperatorSymbol;
26
+ op: K;
27
+ value: ChimeraPropertyGetter<Entity, Parameters<OperatorsMap[K]>[0]>;
28
+ test: Parameters<OperatorsMap[K]>[1];
29
+ } }[Op];
30
+ type ChimeraConjunctionOperationDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity> = ChimeraFilterOperatorDescriptor<OperatorsMap, Entity> | ChimeraConjunctionDescriptor<OperatorsMap, Entity>;
31
+ type ChimeraConjunctionDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity, Conj extends ChimeraConjunctionType = ChimeraConjunctionType> = { [K in Conj]: {
32
+ type: typeof ChimeraConjunctionSymbol;
33
+ kind: K;
34
+ operations: ChimeraConjunctionOperationDescriptor<OperatorsMap, Entity>[];
35
+ } }[Conj];
36
+ type ChimeraFilterDescriptor<OperatorsMap extends ChimeraOperatorMap, Entity> = ChimeraConjunctionDescriptor<OperatorsMap, Entity>;
37
+ type ChimeraSimplifiedOperator<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string, Op extends keyof OperatorsMap & string = keyof OperatorsMap & string> = { [K in Op]: {
38
+ type: typeof ChimeraOperatorSymbol;
39
+ op: K;
40
+ key: Keys | string;
41
+ test: Parameters<OperatorsMap[K]>[1];
42
+ } }[Op];
43
+ type ChimeraSimplifiedConjunctionOperation<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string> = ChimeraSimplifiedOperator<OperatorsMap, Keys> | SimplifiedConjunction<OperatorsMap, Keys>;
44
+ type SimplifiedConjunction<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string, Conj extends ChimeraConjunctionType = ChimeraConjunctionType> = { [K in Conj]: {
45
+ type: typeof ChimeraConjunctionSymbol;
46
+ kind: K;
47
+ operations: ChimeraSimplifiedConjunctionOperation<OperatorsMap, Keys>[];
48
+ } }[Conj];
49
+ type ChimeraSimplifiedFilter<OperatorsMap extends ChimeraOperatorMap, Keys extends string = string> = SimplifiedConjunction<OperatorsMap, Keys> | null;
50
+ type ChimeraKeyFromFilterGetter = <OperatorsMap extends ChimeraOperatorMap>(filter: ChimeraSimplifiedFilter<OperatorsMap> | null) => string;
51
+ type ChimeraKeyFromOperatorGetter = <OperatorsMap extends ChimeraOperatorMap>(operator: ChimeraSimplifiedOperator<OperatorsMap> | null) => string;
52
+ type ChimeraFilterConfig<OperatorsMap extends ChimeraOperatorMap> = {
53
+ operators: OperatorsMap;
54
+ getFilterKey?: ChimeraKeyFromFilterGetter;
55
+ getOperatorKey?: ChimeraKeyFromOperatorGetter;
56
+ };
57
+ //#endregion
58
+ //#region ../../src/filter/defaults.d.ts
59
+ declare const getKeyFromOperation: ChimeraKeyFromOperatorGetter;
60
+ declare const chimeraDefaultGetKeyFromFilter: ChimeraKeyFromFilterGetter;
61
+ declare const chimeraDefaultFilterOperators: {
62
+ contains: <I extends string | unknown[], T extends (I extends never[] ? unknown : I extends unknown[] ? I[number] | I : I extends string ? string : never)>(a: I, b: T) => boolean;
63
+ endsWith: (a: string, b: string) => boolean;
64
+ startsWith: (a: string, b: string) => boolean;
65
+ eq: <T>(a: T, b: T) => boolean;
66
+ gt: (a: any, b: any) => boolean;
67
+ gte: (a: any, b: any) => boolean;
68
+ in: <I, T extends (I extends never[] ? unknown[] : I extends unknown[] ? I : I[])>(a: I, b: T) => boolean;
69
+ lt: (a: any, b: any) => boolean;
70
+ lte: (a: any, b: any) => boolean;
71
+ neq: <T>(a: T, b: T) => boolean;
72
+ notIn: (a: any, b: any) => boolean;
73
+ };
74
+ declare const chimeraDefaultFilterConfig: {
75
+ getFilterKey: ChimeraKeyFromFilterGetter;
76
+ getOperatorKey: ChimeraKeyFromOperatorGetter;
77
+ operators: {
78
+ contains: <I extends string | unknown[], T extends (I extends never[] ? unknown : I extends unknown[] ? I[number] | I : I extends string ? string : never)>(a: I, b: T) => boolean;
79
+ endsWith: (a: string, b: string) => boolean;
80
+ startsWith: (a: string, b: string) => boolean;
81
+ eq: <T>(a: T, b: T) => boolean;
82
+ gt: (a: any, b: any) => boolean;
83
+ gte: (a: any, b: any) => boolean;
84
+ in: <I, T extends (I extends never[] ? unknown[] : I extends unknown[] ? I : I[])>(a: I, b: T) => boolean;
85
+ lt: (a: any, b: any) => boolean;
86
+ lte: (a: any, b: any) => boolean;
87
+ neq: <T>(a: T, b: T) => boolean;
88
+ notIn: (a: any, b: any) => boolean;
89
+ };
90
+ };
91
+ //#endregion
92
+ //#region ../../src/order/types.d.ts
93
+ declare enum ChimeraOrderNulls {
94
+ First = "first",
95
+ Last = "last",
96
+ }
97
+ type ChimeraOrderDescriptor<Entity> = {
98
+ key: ChimeraPropertyGetter<Entity>;
99
+ desc: boolean;
100
+ nulls: ChimeraOrderNulls;
101
+ };
102
+ type ChimeraOrderPriority<Entity> = ChimeraOrderDescriptor<Entity>[];
103
+ type ChimeraOrderByComparator<Entity> = (a: Entity, b: Entity) => number;
104
+ type ChimeraPrimitiveComparator = (a: unknown, b: unknown) => number;
105
+ type ChimeraSimplifiedOrderDescriptor<Keys extends string = string> = {
106
+ field: Keys | string;
107
+ desc: boolean;
108
+ nulls: ChimeraOrderNulls;
109
+ };
110
+ type ChimeraKeyFromOrderGetter = (order: ChimeraSimplifiedOrderDescriptor[] | null) => string;
111
+ type ChimeraOrderConfig = {
112
+ primitiveComparator?: ChimeraPrimitiveComparator;
113
+ getKey?: ChimeraKeyFromOrderGetter;
114
+ };
115
+ //#endregion
116
+ export { ChimeraPropertyGetter as A, ChimeraOperatorMap as C, SimplifiedConjunction as D, ChimeraSimplifiedOperator as E, DeepPartial as M, KeysOfType as N, ChimeraEntityGetter as O, Nullish as P, ChimeraOperatorFunction as S, ChimeraSimplifiedFilter as T, ChimeraFilterConfig as _, ChimeraOrderNulls as a, ChimeraKeyFromFilterGetter as b, ChimeraSimplifiedOrderDescriptor as c, chimeraDefaultGetKeyFromFilter as d, getKeyFromOperation as f, ChimeraFilterChecker as g, ChimeraConjunctionType as h, ChimeraOrderDescriptor as i, Constructable as j, ChimeraEntityId as k, chimeraDefaultFilterConfig as l, ChimeraConjunctionOperationDescriptor as m, ChimeraOrderByComparator as n, ChimeraOrderPriority as o, ChimeraConjunctionDescriptor as p, ChimeraOrderConfig as r, ChimeraPrimitiveComparator as s, ChimeraKeyFromOrderGetter as t, chimeraDefaultFilterOperators as u, ChimeraFilterDescriptor as v, ChimeraSimplifiedConjunctionOperation as w, ChimeraKeyFromOperatorGetter as x, ChimeraFilterOperatorDescriptor as y };
117
+ //# sourceMappingURL=types-CuI5yXiY.d.cts.map