@venizia/ignis-filter 0.2.0-9 → 0.2.1-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 (39) hide show
  1. package/LICENSE.md +0 -1
  2. package/README.md +76 -55
  3. package/dist/cjs/common/index.d.ts +1 -0
  4. package/dist/cjs/common/index.d.ts.map +1 -1
  5. package/dist/cjs/common/index.js +1 -0
  6. package/dist/cjs/common/index.js.map +1 -1
  7. package/dist/cjs/common/operators.d.ts +2 -0
  8. package/dist/cjs/common/operators.d.ts.map +1 -1
  9. package/dist/cjs/common/operators.js +5 -0
  10. package/dist/cjs/common/operators.js.map +1 -1
  11. package/dist/cjs/common/order.d.ts +10 -0
  12. package/dist/cjs/common/order.d.ts.map +1 -0
  13. package/dist/cjs/common/order.js +77 -0
  14. package/dist/cjs/common/order.js.map +1 -0
  15. package/dist/cjs/common/types.d.ts +38 -1
  16. package/dist/cjs/common/types.d.ts.map +1 -1
  17. package/dist/esm/common/index.d.ts +3 -2
  18. package/dist/esm/common/index.d.ts.map +1 -1
  19. package/dist/esm/common/index.js +3 -2
  20. package/dist/esm/common/index.js.map +1 -1
  21. package/dist/esm/common/operators.d.ts +2 -0
  22. package/dist/esm/common/operators.d.ts.map +1 -1
  23. package/dist/esm/common/operators.js +5 -0
  24. package/dist/esm/common/operators.js.map +1 -1
  25. package/dist/esm/common/order.d.ts +10 -0
  26. package/dist/esm/common/order.d.ts.map +1 -0
  27. package/dist/esm/common/order.js +73 -0
  28. package/dist/esm/common/order.js.map +1 -0
  29. package/dist/esm/common/types.d.ts +38 -1
  30. package/dist/esm/common/types.d.ts.map +1 -1
  31. package/dist/esm/index.d.ts +1 -1
  32. package/dist/esm/index.js +1 -1
  33. package/dist/esm/package.json +4 -0
  34. package/dist/esm/schemas/builder.d.ts +1 -1
  35. package/dist/esm/schemas/common/index.d.ts +1 -1
  36. package/dist/esm/schemas/common/index.js +1 -1
  37. package/dist/esm/schemas/index.d.ts +2 -2
  38. package/dist/esm/schemas/index.js +3 -3
  39. package/package.json +4 -4
package/LICENSE.md CHANGED
@@ -72,7 +72,6 @@ Ignis uses the following open-source libraries. We are grateful to the authors a
72
72
 
73
73
  | Library | License | Description |
74
74
  |---------|---------|-------------|
75
- | [Lodash](https://github.com/lodash/lodash) | MIT | Utility library |
76
75
  | [reflect-metadata](https://github.com/rbuckton/reflect-metadata) | Apache-2.0 | Metadata reflection API |
77
76
 
78
77
  ### Documentation Dependencies
package/README.md CHANGED
@@ -1,13 +1,8 @@
1
1
  # @venizia/ignis-filter
2
2
 
3
- The engine-neutral query filter vocabulary shared across IGNIS: the filter shape, the operator set,
4
- and the sort direction constants.
5
-
6
- It is **isomorphic by construction**. The package resolves to no node builtin and no server-only
7
- peer, so the same filter language describes a query against a Postgres repository on the server and
8
- against a WASM database in a browser worker. A guard test bundles the barrel for `target: 'browser'`
9
- and fails if anything outside `@venizia/ignis-inversion`, `lodash` and `reflect-metadata` enters the
10
- graph.
3
+ The query filter language of IGNIS: the `TFilter` shape, its operators, and the zod schemas that
4
+ validate it. Install it directly when you want the language without the server framework, for
5
+ example in a browser.
11
6
 
12
7
  ## Install
13
8
 
@@ -15,72 +10,98 @@ graph.
15
10
  bun add @venizia/ignis-filter
16
11
  ```
17
12
 
18
- Applications on `@venizia/ignis` already get everything here re-exported from the core barrel - there
19
- is no need to add this package to reach `TFilter` or `QueryOperators`. Install it directly when you
20
- want the vocabulary **without** the server framework, which is the browser case.
13
+ An application on `@venizia/ignis` does not need it: `TFilter`, `QueryOperators`, `Sorts` and the
14
+ schemas are re-exported from `@venizia/ignis`.
21
15
 
22
- ## What it carries
16
+ ## Use it
23
17
 
24
- | Export | Purpose |
25
- |---|---|
26
- | `TFilter` | `{ where, order, limit, offset, skip, fields, include }` |
27
- | `TWhere` | Query conditions, with nested `and` / `or` |
28
- | `TFields` | Field selection - array of names, or an object keyed by name |
29
- | `TInclusion` | One relation to include, with an optional nested `scope` |
30
- | `TLimit`, `TOffset`, `TSkip`, `TOrderBy` | The scalar members of the shape |
31
- | `QueryOperators` | Comparison, pattern, null, array and logical operators, plus `isValid` |
32
- | `TQueryOperator` | The operator union, derived from the const class |
33
- | `Sorts` | `ASC` / `DESC`, plus `isValid` |
34
-
35
- ```ts
18
+ A filter is a plain object. Type it against your entity, and an unknown field in `where` is a
19
+ compile error.
20
+
21
+ ```typescript
36
22
  import { QueryOperators, Sorts, type TFilter } from '@venizia/ignis-filter';
37
23
 
38
- const filter: TFilter = {
39
- where: { status: 'active', createdAt: { [QueryOperators.GTE]: '2026-01-01' } },
24
+ type TUser = { id: number; status: string; createdAt: string };
25
+
26
+ const filter: TFilter<TUser> = {
27
+ where: {
28
+ status: 'active',
29
+ createdAt: { [QueryOperators.GTE]: '2026-01-01' },
30
+ or: [{ id: { [QueryOperators.IN]: [1, 2, 3] } }, { status: 'pending' }],
31
+ },
40
32
  order: [`createdAt ${Sorts.DESC}`],
41
33
  limit: 20,
42
34
  };
43
35
  ```
44
36
 
45
- ## Validation - the `/schemas` sub-path
37
+ A bare value means `eq`, and `null` means `is`. The same object works against every IGNIS
38
+ repository. Each connector translates it for its engine and throws on an operator the engine does
39
+ not support.
46
40
 
47
- ```ts
41
+ ## Validate a filter from the wire
42
+
43
+ Import the schemas from the `/schemas` entry point. `FilterSchema` and `WhereSchema` accept an
44
+ object or a JSON string.
45
+
46
+ ```typescript
48
47
  import { FilterSchema, WhereSchema } from '@venizia/ignis-filter/schemas';
49
48
 
50
- const parsed = FilterSchema.parse({ where: { status: 'active' }, limit: 20 });
51
- const where = WhereSchema.parse('{"status":"active"}'); // a JSON string parses too
49
+ const filter = FilterSchema.parse('{"where":{"status":"active"},"limit":20}');
50
+ const where = WhereSchema.safeParse('not-json'); // success: false - a validation issue, not a throw
52
51
  ```
53
52
 
54
- A separate entry point on purpose: importing the vocabulary must not drag `zod` into a bundle that
55
- only needs `QueryOperators`. Available: `FilterSchema`, `WhereSchema`, `FieldsSchema`,
56
- `InclusionSchema`, `LimitSchema`, `OffsetSchema`, `SkipSchema`, `OrderBySchema`.
53
+ A negative or fractional `limit`, `offset` or `skip` fails validation. `include[].scope` takes a
54
+ nested filter.
57
55
 
58
- > **On a server, import these from `@venizia/ignis-core` instead.** The instances here carry no
59
- > OpenAPI metadata - they validate identically but document nothing, so a route built on them
60
- > produces an API reference with no descriptions.
56
+ ## What it carries
61
57
 
62
- Need your own metadata layer? `buildQuerySchemas({ decorate })` takes a decorator applied to every
63
- node, including nested ones:
58
+ | Export | What it is |
59
+ | :--- | :--- |
60
+ | `TFilter<T>` | `{ where, fields, include, order, limit, offset, skip }` |
61
+ | `TWhere<T>` | Conditions keyed by the fields of `T`, with nested `and` / `or` |
62
+ | `TWhereOperators<V>`, `TWhereValue<V>` | The operator object and what one field accepts |
63
+ | `TFields<T>` | An array of field names, or `{ field: true \| false }` |
64
+ | `TInclusion` | `{ relation, scope? }`: a relation to load, with its own filter |
65
+ | `TIsoTimestamp` | A branded string for ISO timestamp columns; `where` also accepts a `Date` for it |
66
+ | `QueryOperators` | The operator names, plus `isValid()` |
67
+ | `Sorts` | `ASC` / `DESC`, plus `isValid()` |
64
68
 
65
- ```ts
66
- import { buildQuerySchemas } from '@venizia/ignis-filter/schemas';
69
+ | Operators | Names |
70
+ | :--- | :--- |
71
+ | Comparison | `eq`, `ne`, `neq`, `gt`, `gte`, `lt`, `lte` |
72
+ | Pattern | `like`, `nlike`, `ilike`, `nilike`, `regexp`, `iregexp` |
73
+ | Null | `is`, `isn` |
74
+ | List and range | `in`, `inq`, `nin`, `between`, `notBetween` |
75
+ | Array columns | `contains`, `containedBy`, `overlaps` |
76
+ | Other | `exists`, `notExists`, `not`, `and`, `or` |
67
77
 
68
- const { FilterSchema } = buildQuerySchemas({
69
- decorate: (schema, metadata) => schema.describe(metadata.description ?? ''),
70
- });
71
- ```
78
+ ## Entry points
79
+
80
+ | Entry point | What it gives | Extra peers |
81
+ | :--- | :--- | :--- |
82
+ | `@venizia/ignis-filter` | Types, `QueryOperators`, `Sorts`. Does not load zod | none |
83
+ | `@venizia/ignis-filter/schemas` | `FilterSchema`, `WhereSchema`, `FieldsSchema`, `InclusionSchema`, `LimitSchema`, `OffsetSchema`, `SkipSchema`, `OrderBySchema`, `buildQuerySchemas` | none (`zod` is a dependency) |
84
+
85
+ Both ship CommonJS and ES module builds, with no node builtin, so they load in a browser.
86
+
87
+ The schemas here carry no OpenAPI descriptions. On a server, import them from `@venizia/ignis`
88
+ instead: the same schemas, built through `buildQuerySchemas({ decorate })` with an OpenAPI
89
+ decorator, so your API reference documents them.
90
+
91
+ The schema's inferred type is looser than `TFilter<T>`. It describes what arrives over the wire,
92
+ so it accepts any field name in `where`.
93
+
94
+ ## Where it sits
72
95
 
73
- ## What it deliberately does not carry
96
+ Depends on inversion. Used by kernel and connectors: dev-configs -> inversion -> {**filter**,
97
+ helpers} -> {boot, kernel} -> connectors -> {core-worker, core-server} -> atlas.
74
98
 
75
- - **Any translation to a query language.** Turning a `TFilter` into SQL is engine-specific - the
76
- Postgres translator is Drizzle-coupled and lives with its connector. Operator support differs per
77
- engine, and an unsupported operator throws at translation time rather than being dropped from this
78
- list.
79
- - **Types inferred from the schemas.** `TFilter<T>` is generic over the entity, so `TFilter<User>`
80
- rejects `{ where: { notAField: 1 } }`; `z.infer<typeof FilterSchema>` accepts it, because the
81
- recursive where-clause is `z.ZodType<any>`. The schema describes what arrives over the wire, the
82
- type describes what application code builds, and they only overlap in the middle.
99
+ ## Links
83
100
 
84
- ## License
101
+ - [Filter system](https://ignis.venizia.ai/references/base/filter-system/)
102
+ - [Filter quick reference](https://ignis.venizia.ai/references/base/filter-system/quick-reference)
103
+ - [Changelog: the filter package](https://ignis.venizia.ai/changelogs/2026-07-25-ignis-filter-package)
104
+ - [Changelog](https://ignis.venizia.ai/changelogs/)
105
+ - [Source](https://github.com/VENIZIA-AI/ignis/blob/main/packages/filter)
85
106
 
86
- MIT
107
+ MIT licensed - see [LICENSE.md](./LICENSE.md).
@@ -1,3 +1,4 @@
1
1
  export * from './operators';
2
+ export * from './order';
2
3
  export * from './types';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -15,5 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./operators"), exports);
18
+ __exportStar(require("./order"), exports);
18
19
  __exportStar(require("./types"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,0CAAwB;AACxB,0CAAwB"}
@@ -30,6 +30,8 @@ export declare class QueryOperators {
30
30
  static readonly NOT_EXISTS = "notExists";
31
31
  static readonly BETWEEN = "between";
32
32
  static readonly NOT_BETWEEN = "notBetween";
33
+ static readonly IN_SQL = "inSql";
34
+ static readonly NOT_IN_SQL = "ninSql";
33
35
  static readonly CONTAINS = "contains";
34
36
  static readonly CONTAINED_BY = "containedBy";
35
37
  static readonly OVERLAPS = "overlaps";
@@ -1 +1 @@
1
- {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAItE,qDAAqD;AACrD,qBAAa,KAAK;IAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAoC;IAE9D,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGvC;AAeD,iGAAiG;AACjG,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IAErC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,SAAS;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IAEpC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAe;IAEzC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAG3C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,iBAAiB;IAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IAEtC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAE1B,MAAM,CAAC,QAAQ,CAAC,UAAU,cA6BvB;IAEH,MAAM,CAAC,QAAQ,CAAC,uBAAuB,cAAgC;IAEvE,MAAM,CAAC,QAAQ,CAAC,4BAA4B,cAOzC;IAEH,4FAA4F;IAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO;IAyB9E,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzC;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAItE,qDAAqD;AACrD,qBAAa,KAAK;IAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAoC;IAE9D,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGvC;AAeD,iGAAiG;AACjG,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IAErC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,SAAS;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IAEpC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAe;IAEzC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAG3C,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW;IACjC,MAAM,CAAC,QAAQ,CAAC,UAAU,YAAY;IAGtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,iBAAiB;IAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IAEtC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAE1B,MAAM,CAAC,QAAQ,CAAC,UAAU,cA+BvB;IAEH,MAAM,CAAC,QAAQ,CAAC,uBAAuB,cAAgC;IAEvE,MAAM,CAAC,QAAQ,CAAC,4BAA4B,cAOzC;IAEH,4FAA4F;IAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO;IAyB9E,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzC;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -47,6 +47,9 @@ class QueryOperators {
47
47
  static { this.NOT_EXISTS = 'notExists'; }
48
48
  static { this.BETWEEN = 'between'; }
49
49
  static { this.NOT_BETWEEN = 'notBetween'; }
50
+ // Subquery operators: the operand is a Drizzle SQL object built in code, never a request value.
51
+ static { this.IN_SQL = 'inSql'; }
52
+ static { this.NOT_IN_SQL = 'ninSql'; }
50
53
  // Array Column Operators (PostgreSQL specific)
51
54
  static { this.CONTAINS = 'contains'; } // @> array contains
52
55
  static { this.CONTAINED_BY = 'containedBy'; } // <@ array is contained by
@@ -77,6 +80,8 @@ class QueryOperators {
77
80
  this.NOT_EXISTS,
78
81
  this.BETWEEN,
79
82
  this.NOT_BETWEEN,
83
+ this.IN_SQL,
84
+ this.NOT_IN_SQL,
80
85
  this.CONTAINS,
81
86
  this.CONTAINED_BY,
82
87
  this.OVERLAPS,
@@ -1 +1 @@
1
- {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TParsedOrderEntry } from './types';
2
+ /**
3
+ * Reads one order entry - `field` or `field direction`, tokens separated by whitespace, direction
4
+ * `ASC` or `DESC` in any case (default `ASC`). Throws a 400 naming the whole entry when the field is
5
+ * missing, the direction is unknown, or the entry has more than two tokens.
6
+ */
7
+ export declare const parseOrderEntry: (opts: {
8
+ entry: string;
9
+ }) => TParsedOrderEntry;
10
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../../src/common/order.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAC;AAmCjE;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,iBAiDzD,CAAC"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseOrderEntry = void 0;
4
+ const ignis_inversion_1 = require("@venizia/ignis-inversion");
5
+ const operators_1 = require("./operators");
6
+ /** Characters `JSON.stringify` leaves raw that still break a log line: DEL, C1 controls, U+2028, U+2029. */
7
+ const RAW_AFTER_JSON = /[\u007f-\u009f\u2028\u2029]/g;
8
+ /** The entry quoted for an error message: JSON-escaped, and on one line whatever it holds. */
9
+ const quoteEntry = (opts) => JSON.stringify(opts.entry).replace(RAW_AFTER_JSON, character => `\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`);
10
+ // ASCII whitespace: space, tab, line feed, vertical tab, form feed, carriage return.
11
+ const isSeparator = (code) => code === 32 || (code >= 9 && code <= 13);
12
+ const toSortDirection = (opts) => {
13
+ const { direction } = opts;
14
+ // The spellings callers write, compared without allocating; anything else is lowercased.
15
+ switch (direction) {
16
+ case 'ASC':
17
+ case 'asc': {
18
+ return operators_1.Sorts.ASC;
19
+ }
20
+ case 'DESC':
21
+ case 'desc': {
22
+ return operators_1.Sorts.DESC;
23
+ }
24
+ default: {
25
+ const lowered = direction.toLowerCase();
26
+ return lowered === operators_1.Sorts.ASC || lowered === operators_1.Sorts.DESC ? lowered : undefined;
27
+ }
28
+ }
29
+ };
30
+ /**
31
+ * Reads one order entry - `field` or `field direction`, tokens separated by whitespace, direction
32
+ * `ASC` or `DESC` in any case (default `ASC`). Throws a 400 naming the whole entry when the field is
33
+ * missing, the direction is unknown, or the entry has more than two tokens.
34
+ */
35
+ const parseOrderEntry = (opts) => {
36
+ const { entry } = opts;
37
+ const trimmed = entry.trim();
38
+ const length = trimmed.length;
39
+ if (length === 0) {
40
+ throw (0, ignis_inversion_1.getError)({
41
+ statusCode: 400,
42
+ message: `[parseOrderEntry] Order entry has no field | entry: ${quoteEntry({ entry })}`,
43
+ });
44
+ }
45
+ let fieldEnd = 0;
46
+ while (fieldEnd < length && !isSeparator(trimmed.charCodeAt(fieldEnd))) {
47
+ fieldEnd++;
48
+ }
49
+ if (fieldEnd === length) {
50
+ return { field: trimmed, direction: operators_1.Sorts.ASC };
51
+ }
52
+ // `trimmed` ends on a non-separator, so a direction token follows the gap.
53
+ let directionStart = fieldEnd + 1;
54
+ while (isSeparator(trimmed.charCodeAt(directionStart))) {
55
+ directionStart++;
56
+ }
57
+ let directionEnd = directionStart + 1;
58
+ while (directionEnd < length && !isSeparator(trimmed.charCodeAt(directionEnd))) {
59
+ directionEnd++;
60
+ }
61
+ if (directionEnd !== length) {
62
+ throw (0, ignis_inversion_1.getError)({
63
+ statusCode: 400,
64
+ message: `[parseOrderEntry] Too many tokens | entry: ${quoteEntry({ entry })} | Expected: '<field>' or '<field> ASC|DESC'`,
65
+ });
66
+ }
67
+ const direction = toSortDirection({ direction: trimmed.slice(directionStart) });
68
+ if (!direction) {
69
+ throw (0, ignis_inversion_1.getError)({
70
+ statusCode: 400,
71
+ message: `[parseOrderEntry] Invalid direction | entry: ${quoteEntry({ entry })} | Expected: 'ASC' or 'DESC'`,
72
+ });
73
+ }
74
+ return { field: trimmed.slice(0, fieldEnd), direction };
75
+ };
76
+ exports.parseOrderEntry = parseOrderEntry;
77
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/common/order.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  /** The filter shape, free of any runtime import. The zod schemas that validate this shape over HTTP stay in `@venizia/ignis-core` - they parse query strings and pull in the OpenAPI layer, which is a server concern. Do not import a value here; the purity guard fails if this file resolves to anything. */
2
+ import type { TConstValue } from '@venizia/ignis-inversion';
3
+ import type { Sorts } from './operators';
2
4
  /** Fields selection - an array of field names to include, or an object keyed by field name (`true` includes, `false` excludes). */
3
5
  export type TFields<T = any> = Partial<{
4
6
  [K in keyof T]: boolean;
@@ -14,6 +16,13 @@ export type TIsoTimestamp = string & {
14
16
  };
15
17
  /** Adds `Date` to a branded `TIsoTimestamp` value type; every other type passes through unchanged. */
16
18
  type TWidenIsoTimestamp<V> = V extends TIsoTimestamp ? V | Date : V;
19
+ /**
20
+ * A SQL fragment built in code - a Drizzle `SQL` or `SQLWrapper` - named structurally so this
21
+ * package stays free of Drizzle. JSON from a request can never satisfy it.
22
+ */
23
+ export type TSqlFragment = {
24
+ getSQL(): unknown;
25
+ };
17
26
  /** Field-level comparison operators, mirrored 1:1 from `QueryOperators` in `common/operators.ts`. */
18
27
  export type TWhereOperators<V> = {
19
28
  eq?: V;
@@ -38,6 +47,8 @@ export type TWhereOperators<V> = {
38
47
  notExists?: boolean;
39
48
  between?: [V, V];
40
49
  notBetween?: [V, V];
50
+ inSql?: TSqlFragment;
51
+ ninSql?: TSqlFragment;
41
52
  contains?: V | V[];
42
53
  containedBy?: V | V[];
43
54
  overlaps?: V | V[];
@@ -49,9 +60,22 @@ export type TWhereOperators<V> = {
49
60
  * bare - the column's own `toDriver` already converts one.
50
61
  */
51
62
  export type TWhereValue<V> = TWidenIsoTimestamp<V> | null | TWhereOperators<TWidenIsoTimestamp<V>>;
52
- /** Query conditions for selecting data, with nested `and` / `or`. */
63
+ /** `true` when a column value can hold JSON: `unknown`, `any` or an object other than a `Date` or a `TIsoTimestamp`. */
64
+ type TIsJsonValue<V> = unknown extends V ? true : V extends Date | TIsoTimestamp ? false : V extends object ? true : false;
65
+ /** The columns of `T` whose value can hold JSON - the only columns a JSON-path key may start with. */
66
+ export type TJsonColumnKey<T> = {
67
+ [K in keyof T & string]: TIsJsonValue<NonNullable<T[K]>> extends true ? K : never;
68
+ }[keyof T & string];
69
+ /** A JSON-path key on a JSON column of `T`: `metadata.a.b` or `metadata[0]`. */
70
+ export type TJsonPathKey<T> = `${TJsonColumnKey<T>}.${string}` | `${TJsonColumnKey<T>}[${string}`;
71
+ /**
72
+ * Query conditions for selecting data - column keys, JSON-path keys on JSON columns, and nested
73
+ * `and` / `or`. A JSON-path value is `unknown` so a `Record<string, unknown>` still assigns.
74
+ */
53
75
  export type TWhere<T = any> = {
54
76
  [key in keyof T]?: TWhereValue<T[key]>;
77
+ } & {
78
+ [key in TJsonPathKey<T>]?: unknown;
55
79
  } & {
56
80
  and?: TWhere<T>[];
57
81
  or?: TWhere<T>[];
@@ -70,6 +94,19 @@ export type TOffset = number | undefined;
70
94
  export type TSkip = number | undefined;
71
95
  /** Sorting order for results - regular columns (`fieldName ASC`) and JSON/JSONB paths (`metadata.field DESC`). */
72
96
  export type TOrderBy = string[] | undefined;
97
+ /** A sort direction, exactly the `Sorts` values. */
98
+ export type TSortDirection = TConstValue<typeof Sorts>;
99
+ /** One order entry read by `parseOrderEntry`: the field as written, the direction lower-cased. */
100
+ export type TParsedOrderEntry = {
101
+ field: string;
102
+ direction: TSortDirection;
103
+ };
104
+ /** An order direction in either case. */
105
+ type TOrderDirection = TSortDirection | Uppercase<TSortDirection>;
106
+ /** A column of `T` or a JSON-path key on one of its JSON columns. */
107
+ type TOrderKey<T> = (keyof T & string) | TJsonPathKey<T>;
108
+ /** One typed order entry, opt-in through `satisfies TOrderEntry<T>[]` - `TFilter.order` stays `string[]`. */
109
+ export type TOrderEntry<T> = TOrderKey<T> | `${TOrderKey<T>} ${TOrderDirection}`;
73
110
  /** Comprehensive filter configuration used across all repository query methods. */
74
111
  export type TFilter<T = any> = {
75
112
  where?: TWhere<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"AAAA,gTAAgT;AAEhT,mIAAmI;AACnI,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,OAAO,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO;CAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AAErF;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,MAAM,CAAA;CAAE,CAAC;AAEnF,sGAAsG;AACtG,KAAK,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;AAEpE,qGAAqG;AACrG,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,EAAE,CAAC,EAAE,CAAC,CAAC;IACP,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACd,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACT,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAEnG,qEAAqE;AACrE,MAAM,MAAM,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI;KAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CAAE,GAAG;IACzE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;CAClB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,oFAAoF;AACpF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAExC,gDAAgD;AAChD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEzC,8CAA8C;AAC9C,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAEvC,kHAAkH;AAClH,MAAM,MAAM,QAAQ,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAE5C,mFAAmF;AACnF,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
- export * from './operators';
2
- export * from './types';
1
+ export * from './operators.js';
2
+ export * from './order.js';
3
+ export * from './types.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -1,3 +1,4 @@
1
- export * from './operators';
2
- export * from './types';
1
+ export * from './operators.js';
2
+ export * from './order.js';
3
+ export * from './types.js';
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -30,6 +30,8 @@ export declare class QueryOperators {
30
30
  static readonly NOT_EXISTS = "notExists";
31
31
  static readonly BETWEEN = "between";
32
32
  static readonly NOT_BETWEEN = "notBetween";
33
+ static readonly IN_SQL = "inSql";
34
+ static readonly NOT_IN_SQL = "ninSql";
33
35
  static readonly CONTAINS = "contains";
34
36
  static readonly CONTAINED_BY = "containedBy";
35
37
  static readonly OVERLAPS = "overlaps";
@@ -1 +1 @@
1
- {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAItE,qDAAqD;AACrD,qBAAa,KAAK;IAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAoC;IAE9D,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGvC;AAeD,iGAAiG;AACjG,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IAErC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,SAAS;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IAEpC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAe;IAEzC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAG3C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,iBAAiB;IAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IAEtC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAE1B,MAAM,CAAC,QAAQ,CAAC,UAAU,cA6BvB;IAEH,MAAM,CAAC,QAAQ,CAAC,uBAAuB,cAAgC;IAEvE,MAAM,CAAC,QAAQ,CAAC,4BAA4B,cAOzC;IAEH,4FAA4F;IAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO;IAyB9E,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzC;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAItE,qDAAqD;AACrD,qBAAa,KAAK;IAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,UAAU,cAAoC;IAE9D,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CAGvC;AAeD,iGAAiG;AACjG,qBAAa,cAAc;IACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,IAAI,UAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,QAAQ,WAAW;IACnC,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,YAAY;IAErC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,MAAM,SAAS;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IAEpC,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAC1B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAE5B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAe;IAEzC,MAAM,CAAC,QAAQ,CAAC,OAAO,aAAa;IACpC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;IAG3C,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW;IACjC,MAAM,CAAC,QAAQ,CAAC,UAAU,YAAY;IAGtC,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IACtC,MAAM,CAAC,QAAQ,CAAC,YAAY,iBAAiB;IAC7C,MAAM,CAAC,QAAQ,CAAC,QAAQ,cAAc;IAEtC,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAC5B,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ;IAE1B,MAAM,CAAC,QAAQ,CAAC,UAAU,cA+BvB;IAEH,MAAM,CAAC,QAAQ,CAAC,uBAAuB,cAAgC;IAEvE,MAAM,CAAC,QAAQ,CAAC,4BAA4B,cAOzC;IAEH,4FAA4F;IAC5F,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,GAAG,OAAO;IAyB9E,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;CAGzC;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -43,6 +43,9 @@ export class QueryOperators {
43
43
  static { this.NOT_EXISTS = 'notExists'; }
44
44
  static { this.BETWEEN = 'between'; }
45
45
  static { this.NOT_BETWEEN = 'notBetween'; }
46
+ // Subquery operators: the operand is a Drizzle SQL object built in code, never a request value.
47
+ static { this.IN_SQL = 'inSql'; }
48
+ static { this.NOT_IN_SQL = 'ninSql'; }
46
49
  // Array Column Operators (PostgreSQL specific)
47
50
  static { this.CONTAINS = 'contains'; } // @> array contains
48
51
  static { this.CONTAINED_BY = 'containedBy'; } // <@ array is contained by
@@ -73,6 +76,8 @@ export class QueryOperators {
73
76
  this.NOT_EXISTS,
74
77
  this.BETWEEN,
75
78
  this.NOT_BETWEEN,
79
+ this.IN_SQL,
80
+ this.NOT_IN_SQL,
76
81
  this.CONTAINS,
77
82
  this.CONTAINED_BY,
78
83
  this.OVERLAPS,
@@ -1 +1 @@
1
- {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../../src/common/operators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TParsedOrderEntry } from './types.js';
2
+ /**
3
+ * Reads one order entry - `field` or `field direction`, tokens separated by whitespace, direction
4
+ * `ASC` or `DESC` in any case (default `ASC`). Throws a 400 naming the whole entry when the field is
5
+ * missing, the direction is unknown, or the entry has more than two tokens.
6
+ */
7
+ export declare const parseOrderEntry: (opts: {
8
+ entry: string;
9
+ }) => TParsedOrderEntry;
10
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../../src/common/order.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAkB,MAAM,SAAS,CAAC;AAmCjE;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,KAAG,iBAiDzD,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { getError } from '@venizia/ignis-inversion';
2
+ import { Sorts } from './operators.js';
3
+ /** Characters `JSON.stringify` leaves raw that still break a log line: DEL, C1 controls, U+2028, U+2029. */
4
+ const RAW_AFTER_JSON = /[\u007f-\u009f\u2028\u2029]/g;
5
+ /** The entry quoted for an error message: JSON-escaped, and on one line whatever it holds. */
6
+ const quoteEntry = (opts) => JSON.stringify(opts.entry).replace(RAW_AFTER_JSON, character => `\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`);
7
+ // ASCII whitespace: space, tab, line feed, vertical tab, form feed, carriage return.
8
+ const isSeparator = (code) => code === 32 || (code >= 9 && code <= 13);
9
+ const toSortDirection = (opts) => {
10
+ const { direction } = opts;
11
+ // The spellings callers write, compared without allocating; anything else is lowercased.
12
+ switch (direction) {
13
+ case 'ASC':
14
+ case 'asc': {
15
+ return Sorts.ASC;
16
+ }
17
+ case 'DESC':
18
+ case 'desc': {
19
+ return Sorts.DESC;
20
+ }
21
+ default: {
22
+ const lowered = direction.toLowerCase();
23
+ return lowered === Sorts.ASC || lowered === Sorts.DESC ? lowered : undefined;
24
+ }
25
+ }
26
+ };
27
+ /**
28
+ * Reads one order entry - `field` or `field direction`, tokens separated by whitespace, direction
29
+ * `ASC` or `DESC` in any case (default `ASC`). Throws a 400 naming the whole entry when the field is
30
+ * missing, the direction is unknown, or the entry has more than two tokens.
31
+ */
32
+ export const parseOrderEntry = (opts) => {
33
+ const { entry } = opts;
34
+ const trimmed = entry.trim();
35
+ const length = trimmed.length;
36
+ if (length === 0) {
37
+ throw getError({
38
+ statusCode: 400,
39
+ message: `[parseOrderEntry] Order entry has no field | entry: ${quoteEntry({ entry })}`,
40
+ });
41
+ }
42
+ let fieldEnd = 0;
43
+ while (fieldEnd < length && !isSeparator(trimmed.charCodeAt(fieldEnd))) {
44
+ fieldEnd++;
45
+ }
46
+ if (fieldEnd === length) {
47
+ return { field: trimmed, direction: Sorts.ASC };
48
+ }
49
+ // `trimmed` ends on a non-separator, so a direction token follows the gap.
50
+ let directionStart = fieldEnd + 1;
51
+ while (isSeparator(trimmed.charCodeAt(directionStart))) {
52
+ directionStart++;
53
+ }
54
+ let directionEnd = directionStart + 1;
55
+ while (directionEnd < length && !isSeparator(trimmed.charCodeAt(directionEnd))) {
56
+ directionEnd++;
57
+ }
58
+ if (directionEnd !== length) {
59
+ throw getError({
60
+ statusCode: 400,
61
+ message: `[parseOrderEntry] Too many tokens | entry: ${quoteEntry({ entry })} | Expected: '<field>' or '<field> ASC|DESC'`,
62
+ });
63
+ }
64
+ const direction = toSortDirection({ direction: trimmed.slice(directionStart) });
65
+ if (!direction) {
66
+ throw getError({
67
+ statusCode: 400,
68
+ message: `[parseOrderEntry] Invalid direction | entry: ${quoteEntry({ entry })} | Expected: 'ASC' or 'DESC'`,
69
+ });
70
+ }
71
+ return { field: trimmed.slice(0, fieldEnd), direction };
72
+ };
73
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/common/order.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  /** The filter shape, free of any runtime import. The zod schemas that validate this shape over HTTP stay in `@venizia/ignis-core` - they parse query strings and pull in the OpenAPI layer, which is a server concern. Do not import a value here; the purity guard fails if this file resolves to anything. */
2
+ import type { TConstValue } from '@venizia/ignis-inversion';
3
+ import type { Sorts } from './operators.js';
2
4
  /** Fields selection - an array of field names to include, or an object keyed by field name (`true` includes, `false` excludes). */
3
5
  export type TFields<T = any> = Partial<{
4
6
  [K in keyof T]: boolean;
@@ -14,6 +16,13 @@ export type TIsoTimestamp = string & {
14
16
  };
15
17
  /** Adds `Date` to a branded `TIsoTimestamp` value type; every other type passes through unchanged. */
16
18
  type TWidenIsoTimestamp<V> = V extends TIsoTimestamp ? V | Date : V;
19
+ /**
20
+ * A SQL fragment built in code - a Drizzle `SQL` or `SQLWrapper` - named structurally so this
21
+ * package stays free of Drizzle. JSON from a request can never satisfy it.
22
+ */
23
+ export type TSqlFragment = {
24
+ getSQL(): unknown;
25
+ };
17
26
  /** Field-level comparison operators, mirrored 1:1 from `QueryOperators` in `common/operators.ts`. */
18
27
  export type TWhereOperators<V> = {
19
28
  eq?: V;
@@ -38,6 +47,8 @@ export type TWhereOperators<V> = {
38
47
  notExists?: boolean;
39
48
  between?: [V, V];
40
49
  notBetween?: [V, V];
50
+ inSql?: TSqlFragment;
51
+ ninSql?: TSqlFragment;
41
52
  contains?: V | V[];
42
53
  containedBy?: V | V[];
43
54
  overlaps?: V | V[];
@@ -49,9 +60,22 @@ export type TWhereOperators<V> = {
49
60
  * bare - the column's own `toDriver` already converts one.
50
61
  */
51
62
  export type TWhereValue<V> = TWidenIsoTimestamp<V> | null | TWhereOperators<TWidenIsoTimestamp<V>>;
52
- /** Query conditions for selecting data, with nested `and` / `or`. */
63
+ /** `true` when a column value can hold JSON: `unknown`, `any` or an object other than a `Date` or a `TIsoTimestamp`. */
64
+ type TIsJsonValue<V> = unknown extends V ? true : V extends Date | TIsoTimestamp ? false : V extends object ? true : false;
65
+ /** The columns of `T` whose value can hold JSON - the only columns a JSON-path key may start with. */
66
+ export type TJsonColumnKey<T> = {
67
+ [K in keyof T & string]: TIsJsonValue<NonNullable<T[K]>> extends true ? K : never;
68
+ }[keyof T & string];
69
+ /** A JSON-path key on a JSON column of `T`: `metadata.a.b` or `metadata[0]`. */
70
+ export type TJsonPathKey<T> = `${TJsonColumnKey<T>}.${string}` | `${TJsonColumnKey<T>}[${string}`;
71
+ /**
72
+ * Query conditions for selecting data - column keys, JSON-path keys on JSON columns, and nested
73
+ * `and` / `or`. A JSON-path value is `unknown` so a `Record<string, unknown>` still assigns.
74
+ */
53
75
  export type TWhere<T = any> = {
54
76
  [key in keyof T]?: TWhereValue<T[key]>;
77
+ } & {
78
+ [key in TJsonPathKey<T>]?: unknown;
55
79
  } & {
56
80
  and?: TWhere<T>[];
57
81
  or?: TWhere<T>[];
@@ -70,6 +94,19 @@ export type TOffset = number | undefined;
70
94
  export type TSkip = number | undefined;
71
95
  /** Sorting order for results - regular columns (`fieldName ASC`) and JSON/JSONB paths (`metadata.field DESC`). */
72
96
  export type TOrderBy = string[] | undefined;
97
+ /** A sort direction, exactly the `Sorts` values. */
98
+ export type TSortDirection = TConstValue<typeof Sorts>;
99
+ /** One order entry read by `parseOrderEntry`: the field as written, the direction lower-cased. */
100
+ export type TParsedOrderEntry = {
101
+ field: string;
102
+ direction: TSortDirection;
103
+ };
104
+ /** An order direction in either case. */
105
+ type TOrderDirection = TSortDirection | Uppercase<TSortDirection>;
106
+ /** A column of `T` or a JSON-path key on one of its JSON columns. */
107
+ type TOrderKey<T> = (keyof T & string) | TJsonPathKey<T>;
108
+ /** One typed order entry, opt-in through `satisfies TOrderEntry<T>[]` - `TFilter.order` stays `string[]`. */
109
+ export type TOrderEntry<T> = TOrderKey<T> | `${TOrderKey<T>} ${TOrderDirection}`;
73
110
  /** Comprehensive filter configuration used across all repository query methods. */
74
111
  export type TFilter<T = any> = {
75
112
  where?: TWhere<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/common/types.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export * from './common';
1
+ export * from './common/index.js';
2
2
  //# sourceMappingURL=index.d.ts.map
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export * from './common';
1
+ export * from './common/index.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,4 @@
1
+ {
2
+ "type": "module",
3
+ "sideEffects": false
4
+ }
@@ -1,5 +1,5 @@
1
1
  import { z } from 'zod';
2
- import type { TSchemaDecorator } from './common';
2
+ import type { TSchemaDecorator } from './common/index.js';
3
3
  export declare const buildQuerySchemas: (opts?: {
4
4
  decorate?: TSchemaDecorator;
5
5
  }) => {
@@ -1,2 +1,2 @@
1
- export * from './types';
1
+ export * from './types.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export * from './types';
1
+ export * from './types.js';
2
2
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
- export * from './builder';
2
- export * from './common';
1
+ export * from './builder.js';
2
+ export * from './common/index.js';
3
3
  /** Ready-to-use schemas with no documentation metadata attached - the browser case, and the reason most consumers never touch `buildQuerySchemas` directly. */
4
4
  export declare const FieldsSchema: import("zod").ZodOptional<import("zod").ZodUnion<[import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodBoolean>, import("zod").ZodArray<import("zod").ZodString>]>>, FilterSchema: import("zod").ZodOptional<import("zod").ZodUnion<readonly [any, import("zod").ZodPipe<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<any, string>>, any>]>>, InclusionSchema: any, LimitSchema: import("zod").ZodOptional<import("zod").ZodNumber>, OffsetSchema: import("zod").ZodOptional<import("zod").ZodNumber>, OrderBySchema: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>, SkipSchema: import("zod").ZodOptional<import("zod").ZodNumber>, WhereSchema: import("zod").ZodUnion<readonly [import("zod").ZodType<any, unknown, import("zod/v4/core").$ZodTypeInternals<any, unknown>>, import("zod").ZodPipe<import("zod").ZodPipe<import("zod").ZodString, import("zod").ZodTransform<any, string>>, import("zod").ZodType<any, unknown, import("zod/v4/core").$ZodTypeInternals<any, unknown>>>]>;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,6 @@
1
- import { buildQuerySchemas } from './builder';
2
- export * from './builder';
3
- export * from './common';
1
+ import { buildQuerySchemas } from './builder.js';
2
+ export * from './builder.js';
3
+ export * from './common/index.js';
4
4
  /** Ready-to-use schemas with no documentation metadata attached - the browser case, and the reason most consumers never touch `buildQuerySchemas` directly. */
5
5
  export const { FieldsSchema, FilterSchema, InclusionSchema, LimitSchema, OffsetSchema, OrderBySchema, SkipSchema, WhereSchema, } = buildQuerySchemas();
6
6
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ignis-filter",
3
- "version": "0.2.0-9",
3
+ "version": "0.2.1-0",
4
4
  "description": "Engine-neutral query filter vocabulary for TypeScript: the `{ where, order, limit, offset, skip, fields, include }` shape, comparison/pattern/null/array/logical operators, and sort direction constants. Isomorphic by construction - no node builtins and no server-only peer, so the same filter language serves a server repository and a browser data layer.",
5
5
  "keywords": [
6
6
  "browser",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  "license": "MIT",
36
36
  "engines": {
37
- "bun": ">=1.3"
37
+ "bun": ">=1.4"
38
38
  },
39
39
  "main": "./dist/cjs/index.js",
40
40
  "exports": {
@@ -79,12 +79,12 @@
79
79
  "prepublishOnly": "bun run rebuild"
80
80
  },
81
81
  "dependencies": {
82
- "@venizia/ignis-inversion": "^0.2.0-9",
82
+ "@venizia/ignis-inversion": "^0.2.0",
83
83
  "zod": "^4.5.4"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@types/bun": "^1.4.1",
87
- "@venizia/dev-configs": "^0.2.0-3",
87
+ "@venizia/dev-configs": "^0.2.0",
88
88
  "eslint": "^10.10.0",
89
89
  "prettier": "^3.9.6",
90
90
  "tsc-alias": "^1.9.4",