@entifix/core 0.7.2 → 0.9.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 (44) hide show
  1. package/README.md +3 -3
  2. package/dist/envelope/make-envelope.d.ts +7 -1
  3. package/dist/envelope/make-envelope.d.ts.map +1 -1
  4. package/dist/envelope/make-envelope.js +12 -0
  5. package/dist/envelope/make-envelope.js.map +1 -1
  6. package/dist/envelope/read-envelope.d.ts +7 -0
  7. package/dist/envelope/read-envelope.d.ts.map +1 -1
  8. package/dist/envelope/read-envelope.js +20 -0
  9. package/dist/envelope/read-envelope.js.map +1 -1
  10. package/dist/envelope/types.d.ts +3 -1
  11. package/dist/envelope/types.d.ts.map +1 -1
  12. package/dist/envelope/types.js.map +1 -1
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +2 -0
  16. package/dist/index.js.map +1 -1
  17. package/dist/query/fold.d.ts +40 -0
  18. package/dist/query/fold.d.ts.map +1 -0
  19. package/dist/query/fold.js +49 -0
  20. package/dist/query/fold.js.map +1 -0
  21. package/dist/query/in-memory-query.d.ts +12 -1
  22. package/dist/query/in-memory-query.d.ts.map +1 -1
  23. package/dist/query/in-memory-query.js +94 -19
  24. package/dist/query/in-memory-query.js.map +1 -1
  25. package/dist/rsql/facet-query-url.d.ts +25 -0
  26. package/dist/rsql/facet-query-url.d.ts.map +1 -0
  27. package/dist/rsql/facet-query-url.js +63 -0
  28. package/dist/rsql/facet-query-url.js.map +1 -0
  29. package/dist/rsql/index.d.ts +1 -0
  30. package/dist/rsql/index.d.ts.map +1 -1
  31. package/dist/rsql/index.js +1 -0
  32. package/dist/rsql/index.js.map +1 -1
  33. package/dist/types/EntityFacets.d.ts +30 -0
  34. package/dist/types/EntityFacets.d.ts.map +1 -0
  35. package/dist/types/EntityFacets.js +10 -0
  36. package/dist/types/EntityFacets.js.map +1 -0
  37. package/dist/types/EntityFiltering.d.ts +46 -1
  38. package/dist/types/EntityFiltering.d.ts.map +1 -1
  39. package/dist/types/EntityFiltering.js.map +1 -1
  40. package/dist/types/EntitySelection.d.ts +17 -0
  41. package/dist/types/EntitySelection.d.ts.map +1 -1
  42. package/dist/types/EntitySelection.js +19 -0
  43. package/dist/types/EntitySelection.js.map +1 -1
  44. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/types/EntitySelection.ts"],"sourcesContent":["import type { Entity, EntityId } from './Entity.js';\nimport type { FilterGroup } from './EntityFiltering.js';\n\n/**\n * What a collection-bound action acts on.\n *\n * The two members are **not** two shapes of one idea, and collapsing them is\n * the defect this type exists to prevent. \"Select all on this page\" is a list\n * of ids the browser already holds; \"select all 3.200 matching the filter\" is a\n * *filter expression the server evaluates* — the set is by definition larger\n * than the page, so there is nothing to enumerate. Written as one optional\n * field (`ids?: …` beside `all?: boolean`) the second quietly becomes the\n * first, and a bulk action that reads as \"the 25 rows I can see\" runs over\n * every row in the store.\n *\n * `excluded` is what makes the second member usable rather than all-or-nothing:\n * an operator takes everything matching and then drops the two rows they know\n * about. It is a subtraction from a server-side set, never an addition to a\n * client-side one.\n *\n * `total` is carried rather than derived because only the server knows it, and\n * the count is the whole affordance — \"Retirar 3.200 marcas\" is a different\n * sentence from \"Retirar\", and the user has to read the number *before* they\n * confirm.\n */\nexport type EntitySelection<TEntity extends Entity> =\n | {\n mode: 'ids';\n ids: ReadonlySet<EntityId>;\n }\n | {\n mode: 'matching';\n /** The filtering in effect when the set was taken. Absent means \"every row\". */\n filtering?: FilterGroup<TEntity>;\n /** How many rows the server said match. */\n total: number;\n /** Rows the user removed from the matching set. */\n excluded: ReadonlySet<EntityId>;\n };\n\n/** An empty `ids` selection — the state a table starts and clears to. */\nexport const emptySelection = <\n TEntity extends Entity,\n>(): EntitySelection<TEntity> => ({ mode: 'ids', ids: new Set<EntityId>() });\n\n/**\n * How many rows the action will touch.\n *\n * For `matching` this is the server's count minus what the user removed, which\n * is the number the confirmation must show. It can only ever be an estimate —\n * rows may have been written since the count was taken — and that is inherent\n * to the mode rather than a defect in it.\n */\nexport function selectionSize<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): number {\n return selection.mode === 'ids'\n ? selection.ids.size\n : Math.max(0, selection.total - selection.excluded.size);\n}\n\n/** Whether one row is part of the selection. */\nexport function isSelected<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n id: EntityId,\n): boolean {\n return selection.mode === 'ids'\n ? selection.ids.has(id)\n : !selection.excluded.has(id);\n}\n\n/** Whether the action would touch nothing. */\nexport function isSelectionEmpty<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): boolean {\n return selectionSize(selection) === 0;\n}\n\n/**\n * Add or remove one row, in whichever direction the current mode means.\n *\n * In `ids` mode a toggle writes the id set; in `matching` mode it writes the\n * *exclusion* set, because the selection is the server's answer and the only\n * thing the browser owns is what was taken back out of it. Both return a new\n * value — the selection is controlled state held above the table.\n */\nexport function toggleSelected<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n id: EntityId,\n selected: boolean,\n): EntitySelection<TEntity> {\n if (selection.mode === 'ids') {\n const ids = new Set(selection.ids);\n if (selected) ids.add(id);\n else ids.delete(id);\n return { mode: 'ids', ids };\n }\n\n const excluded = new Set(selection.excluded);\n if (selected) excluded.delete(id);\n else excluded.add(id);\n return { ...selection, excluded };\n}\n\n/**\n * The ids a bulk request should carry, or `undefined` when it must carry the\n * filter instead.\n *\n * A caller that treats `undefined` as \"no rows\" has made exactly the mistake\n * the two modes exist to prevent, so this returns `undefined` rather than an\n * empty array: an empty array is a plausible payload and would silently do\n * nothing, where `undefined` cannot be sent at all.\n */\nexport function selectionIds<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): EntityId[] | undefined {\n return selection.mode === 'ids' ? Array.from(selection.ids) : undefined;\n}\n\n/**\n * The selection as it crosses the wire.\n *\n * `Set` does not survive `JSON.stringify` — it serializes to `{}`, silently,\n * and arrives as an empty object that reads as \"no rows excluded\" rather than\n * as an error. That is the same class of fault an autosaved draft meets, and it is worse here: a `matching` selection whose exclusions\n * evaporate acts on rows the operator deliberately took out.\n *\n * So the wire form is arrays and the in-memory form is sets, named separately\n * rather than one type used loosely. The set is the right in-memory shape\n * because it dedupes by construction and answers `isSelected` in constant time;\n * the array is the only JSON shape there is.\n */\nexport type EntitySelectionWire<TEntity extends Entity> =\n | { mode: 'ids'; ids: EntityId[] }\n | {\n mode: 'matching';\n filtering?: FilterGroup<TEntity>;\n total: number;\n excluded: EntityId[];\n };\n\n/**\n * Convert a selection to its wire form.\n *\n * ⚠️ **`Array.from(set)`, never `[...set]`.** Every package here compiles with\n * `\"loose\": true` in its `.swcrc`, and SWC's loose spread helper skips the\n * iterable protocol: it treats the operand as array-like, finds no `length` on\n * a `Set`, and **wraps it as a single element** — `[...someSet]` becomes\n * `[Set]`, silently, with the right `.size` still on the inner value. Measured\n * against the running service, where it turned a two-row selection into one\n * outcome whose `id` serialized as `{}`. Vitest and Turbopack transpile\n * differently, so it passes every unit test and only fails in the built\n * bundle.\n */\nexport function toWireSelection<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): EntitySelectionWire<TEntity> {\n return selection.mode === 'ids'\n ? { mode: 'ids', ids: Array.from(selection.ids) }\n : { ...selection, excluded: Array.from(selection.excluded) };\n}\n\n/**\n * Read a wire selection back, rejecting anything that is not one.\n *\n * Untrusted input: this arrives in a request body and decides which rows a\n * bulk write touches. A missing `mode` must not fall through to a default —\n * defaulting to `ids` with no ids would act on nothing (merely confusing),\n * while defaulting to `matching` would act on **everything**.\n */\nexport function readWireSelection<TEntity extends Entity>(\n value: unknown,\n): EntitySelection<TEntity> | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const candidate = value as Partial<EntitySelectionWire<TEntity>>;\n\n if (candidate.mode === 'ids') {\n return Array.isArray(candidate.ids)\n ? { mode: 'ids', ids: new Set(candidate.ids) }\n : undefined;\n }\n\n if (candidate.mode === 'matching') {\n const matching = candidate as Extract<\n EntitySelectionWire<TEntity>,\n { mode: 'matching' }\n >;\n if (typeof matching.total !== 'number') return undefined;\n if (!Array.isArray(matching.excluded)) return undefined;\n return {\n mode: 'matching',\n filtering: matching.filtering,\n total: matching.total,\n excluded: new Set(matching.excluded),\n };\n }\n\n return undefined;\n}\n"],"names":["emptySelection","mode","ids","Set","selectionSize","selection","size","Math","max","total","excluded","isSelected","id","has","isSelectionEmpty","toggleSelected","selected","add","delete","selectionIds","Array","from","undefined","toWireSelection","readWireSelection","value","candidate","isArray","matching","filtering"],"mappings":";AAwCA,uEAAuE,GACvE,OAAO,MAAMA,iBAAiB,IAEI,CAAA;QAAEC,MAAM;QAAOC,KAAK,IAAIC;IAAgB,CAAA,EAAG;AAE7E;;;;;;;CAOC,GACD,OAAO,SAASC,cACdC,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QACtBI,UAAUH,GAAG,CAACI,IAAI,GAClBC,KAAKC,GAAG,CAAC,GAAGH,UAAUI,KAAK,GAAGJ,UAAUK,QAAQ,CAACJ,IAAI;AAC3D;AAEA,8CAA8C,GAC9C,OAAO,SAASK,WACdN,SAAmC,EACnCO,EAAY;IAEZ,OAAOP,UAAUJ,IAAI,KAAK,QACtBI,UAAUH,GAAG,CAACW,GAAG,CAACD,MAClB,CAACP,UAAUK,QAAQ,CAACG,GAAG,CAACD;AAC9B;AAEA,4CAA4C,GAC5C,OAAO,SAASE,iBACdT,SAAmC;IAEnC,OAAOD,cAAcC,eAAe;AACtC;AAEA;;;;;;;CAOC,GACD,OAAO,SAASU,eACdV,SAAmC,EACnCO,EAAY,EACZI,QAAiB;IAEjB,IAAIX,UAAUJ,IAAI,KAAK,OAAO;QAC5B,MAAMC,MAAM,IAAIC,IAAIE,UAAUH,GAAG;QACjC,IAAIc,UAAUd,IAAIe,GAAG,CAACL;aACjBV,IAAIgB,MAAM,CAACN;QAChB,OAAO;YAAEX,MAAM;YAAOC;QAAI;IAC5B;IAEA,MAAMQ,WAAW,IAAIP,IAAIE,UAAUK,QAAQ;IAC3C,IAAIM,UAAUN,SAASQ,MAAM,CAACN;SACzBF,SAASO,GAAG,CAACL;IAClB,OAAO,aAAKP;QAAWK;;AACzB;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASS,aACdd,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QAAQmB,MAAMC,IAAI,CAAChB,UAAUH,GAAG,IAAIoB;AAChE;AAwBA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASC,gBACdlB,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QACtB;QAAEA,MAAM;QAAOC,KAAKkB,MAAMC,IAAI,CAAChB,UAAUH,GAAG;IAAE,IAC9C,aAAKG;QAAWK,UAAUU,MAAMC,IAAI,CAAChB,UAAUK,QAAQ;;AAC7D;AAEA;;;;;;;CAOC,GACD,OAAO,SAASc,kBACdC,KAAc;IAEd,IAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM,OAAOH;IACxD,MAAMI,YAAYD;IAElB,IAAIC,UAAUzB,IAAI,KAAK,OAAO;QAC5B,OAAOmB,MAAMO,OAAO,CAACD,UAAUxB,GAAG,IAC9B;YAAED,MAAM;YAAOC,KAAK,IAAIC,IAAIuB,UAAUxB,GAAG;QAAE,IAC3CoB;IACN;IAEA,IAAII,UAAUzB,IAAI,KAAK,YAAY;QACjC,MAAM2B,WAAWF;QAIjB,IAAI,OAAOE,SAASnB,KAAK,KAAK,UAAU,OAAOa;QAC/C,IAAI,CAACF,MAAMO,OAAO,CAACC,SAASlB,QAAQ,GAAG,OAAOY;QAC9C,OAAO;YACLrB,MAAM;YACN4B,WAAWD,SAASC,SAAS;YAC7BpB,OAAOmB,SAASnB,KAAK;YACrBC,UAAU,IAAIP,IAAIyB,SAASlB,QAAQ;QACrC;IACF;IAEA,OAAOY;AACT"}
1
+ {"version":3,"sources":["../../src/types/EntitySelection.ts"],"sourcesContent":["import type { Entity, EntityId } from './Entity.js';\nimport type { FilterGroup } from './EntityFiltering.js';\nimport type { EntityLoadRequest } from './EntityLoadRequest.js';\n\n/**\n * What a collection-bound action acts on.\n *\n * The two members are **not** two shapes of one idea, and collapsing them is\n * the defect this type exists to prevent. \"Select all on this page\" is a list\n * of ids the browser already holds; \"select all 3.200 matching the filter\" is a\n * *filter expression the server evaluates* — the set is by definition larger\n * than the page, so there is nothing to enumerate. Written as one optional\n * field (`ids?: …` beside `all?: boolean`) the second quietly becomes the\n * first, and a bulk action that reads as \"the 25 rows I can see\" runs over\n * every row in the store.\n *\n * `excluded` is what makes the second member usable rather than all-or-nothing:\n * an operator takes everything matching and then drops the two rows they know\n * about. It is a subtraction from a server-side set, never an addition to a\n * client-side one.\n *\n * `total` is carried rather than derived because only the server knows it, and\n * the count is the whole affordance — \"Retirar 3.200 marcas\" is a different\n * sentence from \"Retirar\", and the user has to read the number *before* they\n * confirm.\n */\nexport type EntitySelection<TEntity extends Entity> =\n | {\n mode: 'ids';\n ids: ReadonlySet<EntityId>;\n }\n | {\n mode: 'matching';\n /** The filtering in effect when the set was taken. Absent means \"every row\". */\n filtering?: FilterGroup<TEntity>;\n /** How many rows the server said match. */\n total: number;\n /** Rows the user removed from the matching set. */\n excluded: ReadonlySet<EntityId>;\n };\n\n/** An empty `ids` selection — the state a table starts and clears to. */\nexport const emptySelection = <\n TEntity extends Entity,\n>(): EntitySelection<TEntity> => ({ mode: 'ids', ids: new Set<EntityId>() });\n\n/**\n * How many rows the action will touch.\n *\n * For `matching` this is the server's count minus what the user removed, which\n * is the number the confirmation must show. It can only ever be an estimate —\n * rows may have been written since the count was taken — and that is inherent\n * to the mode rather than a defect in it.\n */\nexport function selectionSize<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): number {\n return selection.mode === 'ids'\n ? selection.ids.size\n : Math.max(0, selection.total - selection.excluded.size);\n}\n\n/** Whether one row is part of the selection. */\nexport function isSelected<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n id: EntityId,\n): boolean {\n return selection.mode === 'ids'\n ? selection.ids.has(id)\n : !selection.excluded.has(id);\n}\n\n/** Whether the action would touch nothing. */\nexport function isSelectionEmpty<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): boolean {\n return selectionSize(selection) === 0;\n}\n\n/**\n * Add or remove one row, in whichever direction the current mode means.\n *\n * In `ids` mode a toggle writes the id set; in `matching` mode it writes the\n * *exclusion* set, because the selection is the server's answer and the only\n * thing the browser owns is what was taken back out of it. Both return a new\n * value — the selection is controlled state held above the table.\n */\nexport function toggleSelected<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n id: EntityId,\n selected: boolean,\n): EntitySelection<TEntity> {\n if (selection.mode === 'ids') {\n const ids = new Set(selection.ids);\n if (selected) ids.add(id);\n else ids.delete(id);\n return { mode: 'ids', ids };\n }\n\n const excluded = new Set(selection.excluded);\n if (selected) excluded.delete(id);\n else excluded.add(id);\n return { ...selection, excluded };\n}\n\n/**\n * The ids a bulk request should carry, or `undefined` when it must carry the\n * filter instead.\n *\n * A caller that treats `undefined` as \"no rows\" has made exactly the mistake\n * the two modes exist to prevent, so this returns `undefined` rather than an\n * empty array: an empty array is a plausible payload and would silently do\n * nothing, where `undefined` cannot be sent at all.\n */\nexport function selectionIds<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): EntityId[] | undefined {\n return selection.mode === 'ids' ? Array.from(selection.ids) : undefined;\n}\n\n/**\n * The load request that reads what a `matching` selection names, one page at a\n * time.\n *\n * A selection carries **one** filter group, and a load request a list of them:\n * the group is wrapped, never cast. A selection with no filtering reads every\n * row. The selection's exclusions are not part of the request — a server\n * resolving the set removes them from what the page answers, because an\n * exclusion is a row the operator took out after the filter was applied.\n */\nexport function loadRequestFor<TEntity extends Entity>(\n selection: Extract<EntitySelection<TEntity>, { mode: 'matching' }>,\n page: { readonly page: number; readonly pageSize: number },\n): EntityLoadRequest<TEntity> {\n return {\n ...(selection.filtering === undefined\n ? {}\n : { filtering: [selection.filtering] }),\n page: page.page,\n pageSize: page.pageSize,\n };\n}\n\n/**\n * The selection as it crosses the wire.\n *\n * `Set` does not survive `JSON.stringify` — it serializes to `{}`, silently,\n * and arrives as an empty object that reads as \"no rows excluded\" rather than\n * as an error. That is the same class of fault an autosaved draft meets, and it is worse here: a `matching` selection whose exclusions\n * evaporate acts on rows the operator deliberately took out.\n *\n * So the wire form is arrays and the in-memory form is sets, named separately\n * rather than one type used loosely. The set is the right in-memory shape\n * because it dedupes by construction and answers `isSelected` in constant time;\n * the array is the only JSON shape there is.\n */\nexport type EntitySelectionWire<TEntity extends Entity> =\n | { mode: 'ids'; ids: EntityId[] }\n | {\n mode: 'matching';\n filtering?: FilterGroup<TEntity>;\n total: number;\n excluded: EntityId[];\n };\n\n/**\n * Convert a selection to its wire form.\n *\n * ⚠️ **`Array.from(set)`, never `[...set]`.** Every package here compiles with\n * `\"loose\": true` in its `.swcrc`, and SWC's loose spread helper skips the\n * iterable protocol: it treats the operand as array-like, finds no `length` on\n * a `Set`, and **wraps it as a single element** — `[...someSet]` becomes\n * `[Set]`, silently, with the right `.size` still on the inner value. Measured\n * against the running service, where it turned a two-row selection into one\n * outcome whose `id` serialized as `{}`. Vitest and Turbopack transpile\n * differently, so it passes every unit test and only fails in the built\n * bundle.\n */\nexport function toWireSelection<TEntity extends Entity>(\n selection: EntitySelection<TEntity>,\n): EntitySelectionWire<TEntity> {\n return selection.mode === 'ids'\n ? { mode: 'ids', ids: Array.from(selection.ids) }\n : { ...selection, excluded: Array.from(selection.excluded) };\n}\n\n/**\n * Read a wire selection back, rejecting anything that is not one.\n *\n * Untrusted input: this arrives in a request body and decides which rows a\n * bulk write touches. A missing `mode` must not fall through to a default —\n * defaulting to `ids` with no ids would act on nothing (merely confusing),\n * while defaulting to `matching` would act on **everything**.\n */\nexport function readWireSelection<TEntity extends Entity>(\n value: unknown,\n): EntitySelection<TEntity> | undefined {\n if (typeof value !== 'object' || value === null) return undefined;\n const candidate = value as Partial<EntitySelectionWire<TEntity>>;\n\n if (candidate.mode === 'ids') {\n return Array.isArray(candidate.ids)\n ? { mode: 'ids', ids: new Set(candidate.ids) }\n : undefined;\n }\n\n if (candidate.mode === 'matching') {\n const matching = candidate as Extract<\n EntitySelectionWire<TEntity>,\n { mode: 'matching' }\n >;\n if (typeof matching.total !== 'number') return undefined;\n if (!Array.isArray(matching.excluded)) return undefined;\n return {\n mode: 'matching',\n filtering: matching.filtering,\n total: matching.total,\n excluded: new Set(matching.excluded),\n };\n }\n\n return undefined;\n}\n"],"names":["emptySelection","mode","ids","Set","selectionSize","selection","size","Math","max","total","excluded","isSelected","id","has","isSelectionEmpty","toggleSelected","selected","add","delete","selectionIds","Array","from","undefined","loadRequestFor","page","filtering","pageSize","toWireSelection","readWireSelection","value","candidate","isArray","matching"],"mappings":";AAyCA,uEAAuE,GACvE,OAAO,MAAMA,iBAAiB,IAEI,CAAA;QAAEC,MAAM;QAAOC,KAAK,IAAIC;IAAgB,CAAA,EAAG;AAE7E;;;;;;;CAOC,GACD,OAAO,SAASC,cACdC,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QACtBI,UAAUH,GAAG,CAACI,IAAI,GAClBC,KAAKC,GAAG,CAAC,GAAGH,UAAUI,KAAK,GAAGJ,UAAUK,QAAQ,CAACJ,IAAI;AAC3D;AAEA,8CAA8C,GAC9C,OAAO,SAASK,WACdN,SAAmC,EACnCO,EAAY;IAEZ,OAAOP,UAAUJ,IAAI,KAAK,QACtBI,UAAUH,GAAG,CAACW,GAAG,CAACD,MAClB,CAACP,UAAUK,QAAQ,CAACG,GAAG,CAACD;AAC9B;AAEA,4CAA4C,GAC5C,OAAO,SAASE,iBACdT,SAAmC;IAEnC,OAAOD,cAAcC,eAAe;AACtC;AAEA;;;;;;;CAOC,GACD,OAAO,SAASU,eACdV,SAAmC,EACnCO,EAAY,EACZI,QAAiB;IAEjB,IAAIX,UAAUJ,IAAI,KAAK,OAAO;QAC5B,MAAMC,MAAM,IAAIC,IAAIE,UAAUH,GAAG;QACjC,IAAIc,UAAUd,IAAIe,GAAG,CAACL;aACjBV,IAAIgB,MAAM,CAACN;QAChB,OAAO;YAAEX,MAAM;YAAOC;QAAI;IAC5B;IAEA,MAAMQ,WAAW,IAAIP,IAAIE,UAAUK,QAAQ;IAC3C,IAAIM,UAAUN,SAASQ,MAAM,CAACN;SACzBF,SAASO,GAAG,CAACL;IAClB,OAAO,aAAKP;QAAWK;;AACzB;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASS,aACdd,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QAAQmB,MAAMC,IAAI,CAAChB,UAAUH,GAAG,IAAIoB;AAChE;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASC,eACdlB,SAAkE,EAClEmB,IAA0D;IAE1D,OAAO,aACDnB,UAAUoB,SAAS,KAAKH,YACxB,CAAC,IACD;QAAEG,WAAW;YAACpB,UAAUoB,SAAS;SAAC;IAAC;QACvCD,MAAMA,KAAKA,IAAI;QACfE,UAAUF,KAAKE,QAAQ;;AAE3B;AAwBA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASC,gBACdtB,SAAmC;IAEnC,OAAOA,UAAUJ,IAAI,KAAK,QACtB;QAAEA,MAAM;QAAOC,KAAKkB,MAAMC,IAAI,CAAChB,UAAUH,GAAG;IAAE,IAC9C,aAAKG;QAAWK,UAAUU,MAAMC,IAAI,CAAChB,UAAUK,QAAQ;;AAC7D;AAEA;;;;;;;CAOC,GACD,OAAO,SAASkB,kBACdC,KAAc;IAEd,IAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM,OAAOP;IACxD,MAAMQ,YAAYD;IAElB,IAAIC,UAAU7B,IAAI,KAAK,OAAO;QAC5B,OAAOmB,MAAMW,OAAO,CAACD,UAAU5B,GAAG,IAC9B;YAAED,MAAM;YAAOC,KAAK,IAAIC,IAAI2B,UAAU5B,GAAG;QAAE,IAC3CoB;IACN;IAEA,IAAIQ,UAAU7B,IAAI,KAAK,YAAY;QACjC,MAAM+B,WAAWF;QAIjB,IAAI,OAAOE,SAASvB,KAAK,KAAK,UAAU,OAAOa;QAC/C,IAAI,CAACF,MAAMW,OAAO,CAACC,SAAStB,QAAQ,GAAG,OAAOY;QAC9C,OAAO;YACLrB,MAAM;YACNwB,WAAWO,SAASP,SAAS;YAC7BhB,OAAOuB,SAASvB,KAAK;YACrBC,UAAU,IAAIP,IAAI6B,SAAStB,QAAQ;QACrC;IACF;IAEA,OAAOY;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@entifix/core",
3
- "version": "0.7.2",
3
+ "version": "0.9.0",
4
4
  "description": "The entity system: decorators that make a class describe itself, entity serialization, the RSQL query protocol and the wire envelopes.",
5
5
  "license": "MIT",
6
6
  "repository": {