@sequenceholdings/orm 2.1.0 → 2.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 (77) hide show
  1. package/README.md +40 -1
  2. package/dist/authoring.cjs +1619 -121
  3. package/dist/authoring.cjs.map +1 -1
  4. package/dist/authoring.d.cts +252 -8
  5. package/dist/authoring.d.ts +252 -8
  6. package/dist/authoring.js +1607 -123
  7. package/dist/authoring.js.map +1 -1
  8. package/dist/canonical.cjs +713 -41
  9. package/dist/canonical.cjs.map +1 -1
  10. package/dist/canonical.d.cts +1520 -51
  11. package/dist/canonical.d.ts +1520 -51
  12. package/dist/canonical.js +693 -42
  13. package/dist/canonical.js.map +1 -1
  14. package/dist/cli.cjs +7103 -3901
  15. package/dist/cli.cjs.map +1 -1
  16. package/dist/cli.js +7104 -3902
  17. package/dist/cli.js.map +1 -1
  18. package/dist/client.cjs +122 -40
  19. package/dist/client.cjs.map +1 -1
  20. package/dist/client.d.cts +85 -25
  21. package/dist/client.d.ts +85 -25
  22. package/dist/client.js +119 -41
  23. package/dist/client.js.map +1 -1
  24. package/dist/compiler.cjs +2464 -450
  25. package/dist/compiler.cjs.map +1 -1
  26. package/dist/compiler.d.cts +79 -4
  27. package/dist/compiler.d.ts +79 -4
  28. package/dist/compiler.js +2457 -451
  29. package/dist/compiler.js.map +1 -1
  30. package/dist/constants-C6EG6Wq7.d.cts +99 -0
  31. package/dist/constants-C6EG6Wq7.d.ts +99 -0
  32. package/dist/definition-DjfC7Lll.d.cts +91 -0
  33. package/dist/definition-DjfC7Lll.d.ts +91 -0
  34. package/dist/dynamic-input.cjs +2 -1
  35. package/dist/dynamic-input.cjs.map +1 -1
  36. package/dist/dynamic-input.d.cts +9 -1
  37. package/dist/dynamic-input.d.ts +9 -1
  38. package/dist/dynamic-input.js +2 -1
  39. package/dist/dynamic-input.js.map +1 -1
  40. package/dist/index.cjs +2656 -418
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.cts +693 -116
  43. package/dist/index.d.ts +693 -116
  44. package/dist/index.js +2622 -420
  45. package/dist/index.js.map +1 -1
  46. package/dist/ir.cjs +811 -48
  47. package/dist/ir.cjs.map +1 -1
  48. package/dist/ir.d.cts +670 -27
  49. package/dist/ir.d.ts +670 -27
  50. package/dist/ir.js +802 -49
  51. package/dist/ir.js.map +1 -1
  52. package/dist/{naming-DCn94LJ4.d.ts → naming-CPfx7EfF.d.ts} +14 -1
  53. package/dist/{naming-DPglwzkB.d.cts → naming-CU9ThP_E.d.cts} +14 -1
  54. package/dist/policy-1iZbGnZZ.d.cts +24 -0
  55. package/dist/policy-1iZbGnZZ.d.ts +24 -0
  56. package/dist/predicate-v2.cjs +804 -51
  57. package/dist/predicate-v2.cjs.map +1 -1
  58. package/dist/predicate-v2.d.cts +2 -1
  59. package/dist/predicate-v2.d.ts +2 -1
  60. package/dist/predicate-v2.js +804 -51
  61. package/dist/predicate-v2.js.map +1 -1
  62. package/dist/sdl.cjs +1014 -75
  63. package/dist/sdl.cjs.map +1 -1
  64. package/dist/sdl.d.cts +14 -3
  65. package/dist/sdl.d.ts +14 -3
  66. package/dist/sdl.js +1012 -76
  67. package/dist/sdl.js.map +1 -1
  68. package/package.json +13 -7
  69. package/src/codegen-gql/server-fns.cjs +2 -2
  70. package/templates/orm-namespace/AGENTS.md +10 -0
  71. package/templates/orm-namespace/CLAUDE.md +1 -82
  72. package/templates/orm-namespace/codegen.preset.d.cts +7 -0
  73. package/templates/orm-namespace/codegen.ts +2 -1
  74. package/templates/orm-namespace/graphql/example/queries.ts +4 -3
  75. package/templates/orm-namespace/package.json +2 -1
  76. package/templates/orm-namespace/schema/tables.ts +3 -2
  77. package/templates/orm-namespace/sequence.config.ts +7 -11
@@ -0,0 +1,99 @@
1
+ /** Shared grammar for namespace identifiers; never interpolate arbitrary paths. */
2
+ declare const NAMESPACE_PATTERN: RegExp;
3
+ /** Caller-scoped delegated data credential, supplied by an authenticated host. */
4
+ declare const ORM_DATA_TOKEN_HEADER = "x-sequence-data-token";
5
+ /** Separate service-identity credential; never used as an implicit fallback. */
6
+ declare const ORM_SERVICE_DATA_TOKEN_HEADER = "x-sequence-data-token-service";
7
+ declare const IDENTIFIER_PATTERN: RegExp;
8
+ /** Native source columns may have one leading underscore; relation names may not. */
9
+ declare const COLUMN_IDENTIFIER_PATTERN: RegExp;
10
+ declare const MAX_IDENTIFIER_LENGTH = 63;
11
+ /**
12
+ * Custom Roles & Capabilities claim keys as policies reference them: a
13
+ * host-scoped registry key, an org pin's `org/<key>`, or an Application
14
+ * capability pin's `app/<application-id>/<key>`. Matches the registry
15
+ * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id
16
+ * delimiter) so any capability that's declarable/attachable in namespace.yaml
17
+ * can also be referenced here — a stricter pattern would let a valid key
18
+ * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).
19
+ */
20
+ declare const CAPABILITY_KEY_PATTERN: RegExp;
21
+ declare const CLAIM_KEY_PATTERN: RegExp;
22
+ /** Qualified reference to a table outside the defining file: `<schema>.<table>`. */
23
+ declare const QUALIFIED_TABLE_PATTERN: RegExp;
24
+ /** Qualified source syntax only; the serving installation controls authorized backing. */
25
+ declare const SYNCED_SOURCE_PATTERN: RegExp;
26
+ declare const ORM_SCHEMA_PREFIX = "orm_";
27
+ declare const CONSUMER_ROLE_SUFFIX = "_consumer";
28
+ declare const ormSchemaName: (namespace: string) => string;
29
+ declare const consumerRoleName: (namespace: string) => string;
30
+ declare const DEFINITION_FILE_EXTENSIONS: readonly [".yml", ".yaml"];
31
+ /** Reserved basenames for the namespace-level config file (description, org capability pins). */
32
+ declare const NAMESPACE_CONFIG_FILENAMES: Set<string>;
33
+ declare const HASH_DOMAIN = "sequence-orm-definitions\0";
34
+ /**
35
+ * A per-file byte cap where the loader reads untrusted YAML into memory — a real failure mode, not a product
36
+ * limit. Counts of tables/indexes/params and policy/SQL lengths are
37
+ * deliberately uncapped; Postgres enforces its own limits loudly at apply.
38
+ */
39
+ declare const MAX_DEFINITION_FILE_BYTES: number;
40
+ /** Generated SDL aggregates every table/view; it is not an individual source file. */
41
+ declare const MAX_GENERATED_SDL_BYTES: number;
42
+ /** Registration and reviewed exports carry SDL, canonical metadata, snapshots and migrations. */
43
+ declare const ORM_REGISTRATION_MAX_BYTES: number;
44
+ /** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */
45
+ declare const RESERVED_TABLE_NAMES: Set<string>;
46
+ /**
47
+ * The Data API's query-string grammar owns these parameter names — a column
48
+ * with one of them could never be filtered over the wire, so definitions
49
+ * refuse it up front ("validate rejects only what can never work").
50
+ */
51
+ declare const RESERVED_COLUMN_NAMES: Set<string>;
52
+ /**
53
+ * Per-cell metadata (`cellMetadata: true`, and every resolved-table source) is
54
+ * stored as typed system columns beside each tracked column `c`:
55
+ *
56
+ * - `c__at` timestamptz — when the cell was last written (NULL: never / no opinion)
57
+ * - `c__by` text — who wrote it
58
+ * - `c__rev` uuid — a resolved table's manual source only: the edit's
59
+ * identity, so an async writeback confirmation clears
60
+ * only the exact edit it delivered
61
+ *
62
+ * A resolved view additionally exposes, per resolved column, the winner's
63
+ * `c__src` (source name) and `c__lost` (newer candidates that lost, jsonb).
64
+ * None of these are GraphQL columns: they surface through the typed `cells`
65
+ * object and are never client-writable.
66
+ */
67
+ declare const CELL_PARTS: readonly ["at", "by", "rev", "source", "conflicts"];
68
+ type CellPart = (typeof CELL_PARTS)[number];
69
+ declare const CELL_PART_SUFFIX: Readonly<Record<CellPart, string>>;
70
+ /** Longest physical column name that can carry cell parts (63 minus the longest suffix). */
71
+ declare const MAX_TRACKED_COLUMN_NAME: number;
72
+ /** GraphQL field carrying a row's per-cell metadata object. */
73
+ declare const CELLS_FIELD = "cells";
74
+ /** Physical (and logical) name of one cell part of a column. */
75
+ declare function cellColumnName(column: string, part: CellPart): string;
76
+ /**
77
+ * Actor recorded when the data plane computes a materialized resolved table's
78
+ * rows for every caller. Its claims are what the compute view's synced
79
+ * sources see (materialized ETL sources must be readable by anyone).
80
+ */
81
+ declare const MATERIALIZE_ACTOR = "orm:materialize";
82
+ declare const MATERIALIZE_CLAIMS_JSON: string;
83
+ /**
84
+ * Apply-generated function that reconciles a materialized resolved table with
85
+ * its compute view: `SELECT * FROM orm_<ns>."<table>__refresh"(wait)` returns
86
+ * `(upserted, deleted, locked)`; without `wait` it skips when another refresh
87
+ * holds the table's lock. The one refresh implementation — the Atlas
88
+ * reconcile, the post-ETL hook, and an operator in psql all call it.
89
+ */
90
+ declare function materializedRefreshFunctionName(table: string): string;
91
+ /**
92
+ * Advisory-lock key serializing a materialized table's refreshes (hashed with
93
+ * `hashtext`). A full refresh holds it exclusively and every ORM write's
94
+ * per-row refresh holds it shared, both before reading the compute view — so
95
+ * a full refresh never reads a snapshot older than a write it then overwrites.
96
+ */
97
+ declare function materializeLockKey(schema: string, table: string): string;
98
+
99
+ export { CELLS_FIELD as C, DEFINITION_FILE_EXTENSIONS as D, HASH_DOMAIN as H, IDENTIFIER_PATTERN as I, MATERIALIZE_ACTOR as M, NAMESPACE_PATTERN as N, ORM_DATA_TOKEN_HEADER as O, QUALIFIED_TABLE_PATTERN as Q, RESERVED_COLUMN_NAMES as R, SYNCED_SOURCE_PATTERN as S, CELL_PARTS as a, type CellPart as b, cellColumnName as c, ORM_SERVICE_DATA_TOKEN_HEADER as d, CAPABILITY_KEY_PATTERN as e, CELL_PART_SUFFIX as f, CLAIM_KEY_PATTERN as g, COLUMN_IDENTIFIER_PATTERN as h, CONSUMER_ROLE_SUFFIX as i, MATERIALIZE_CLAIMS_JSON as j, MAX_DEFINITION_FILE_BYTES as k, MAX_GENERATED_SDL_BYTES as l, MAX_IDENTIFIER_LENGTH as m, MAX_TRACKED_COLUMN_NAME as n, NAMESPACE_CONFIG_FILENAMES as o, ORM_REGISTRATION_MAX_BYTES as p, ORM_SCHEMA_PREFIX as q, RESERVED_TABLE_NAMES as r, consumerRoleName as s, materializeLockKey as t, materializedRefreshFunctionName as u, ormSchemaName as v };
@@ -0,0 +1,99 @@
1
+ /** Shared grammar for namespace identifiers; never interpolate arbitrary paths. */
2
+ declare const NAMESPACE_PATTERN: RegExp;
3
+ /** Caller-scoped delegated data credential, supplied by an authenticated host. */
4
+ declare const ORM_DATA_TOKEN_HEADER = "x-sequence-data-token";
5
+ /** Separate service-identity credential; never used as an implicit fallback. */
6
+ declare const ORM_SERVICE_DATA_TOKEN_HEADER = "x-sequence-data-token-service";
7
+ declare const IDENTIFIER_PATTERN: RegExp;
8
+ /** Native source columns may have one leading underscore; relation names may not. */
9
+ declare const COLUMN_IDENTIFIER_PATTERN: RegExp;
10
+ declare const MAX_IDENTIFIER_LENGTH = 63;
11
+ /**
12
+ * Custom Roles & Capabilities claim keys as policies reference them: a
13
+ * host-scoped registry key, an org pin's `org/<key>`, or an Application
14
+ * capability pin's `app/<application-id>/<key>`. Matches the registry
15
+ * key grammar EXACTLY (`[a-z0-9-]`, 1–64 chars, no `_` — the FGA object-id
16
+ * delimiter) so any capability that's declarable/attachable in namespace.yaml
17
+ * can also be referenced here — a stricter pattern would let a valid key
18
+ * register yet fail at apply (e.g. `org/2fa`, a one-char or digit-led key).
19
+ */
20
+ declare const CAPABILITY_KEY_PATTERN: RegExp;
21
+ declare const CLAIM_KEY_PATTERN: RegExp;
22
+ /** Qualified reference to a table outside the defining file: `<schema>.<table>`. */
23
+ declare const QUALIFIED_TABLE_PATTERN: RegExp;
24
+ /** Qualified source syntax only; the serving installation controls authorized backing. */
25
+ declare const SYNCED_SOURCE_PATTERN: RegExp;
26
+ declare const ORM_SCHEMA_PREFIX = "orm_";
27
+ declare const CONSUMER_ROLE_SUFFIX = "_consumer";
28
+ declare const ormSchemaName: (namespace: string) => string;
29
+ declare const consumerRoleName: (namespace: string) => string;
30
+ declare const DEFINITION_FILE_EXTENSIONS: readonly [".yml", ".yaml"];
31
+ /** Reserved basenames for the namespace-level config file (description, org capability pins). */
32
+ declare const NAMESPACE_CONFIG_FILENAMES: Set<string>;
33
+ declare const HASH_DOMAIN = "sequence-orm-definitions\0";
34
+ /**
35
+ * A per-file byte cap where the loader reads untrusted YAML into memory — a real failure mode, not a product
36
+ * limit. Counts of tables/indexes/params and policy/SQL lengths are
37
+ * deliberately uncapped; Postgres enforces its own limits loudly at apply.
38
+ */
39
+ declare const MAX_DEFINITION_FILE_BYTES: number;
40
+ /** Generated SDL aggregates every table/view; it is not an individual source file. */
41
+ declare const MAX_GENERATED_SDL_BYTES: number;
42
+ /** Registration and reviewed exports carry SDL, canonical metadata, snapshots and migrations. */
43
+ declare const ORM_REGISTRATION_MAX_BYTES: number;
44
+ /** `/api/data/<ns>/actions/…` and `/api/data/<ns>/query` share the table path segment. */
45
+ declare const RESERVED_TABLE_NAMES: Set<string>;
46
+ /**
47
+ * The Data API's query-string grammar owns these parameter names — a column
48
+ * with one of them could never be filtered over the wire, so definitions
49
+ * refuse it up front ("validate rejects only what can never work").
50
+ */
51
+ declare const RESERVED_COLUMN_NAMES: Set<string>;
52
+ /**
53
+ * Per-cell metadata (`cellMetadata: true`, and every resolved-table source) is
54
+ * stored as typed system columns beside each tracked column `c`:
55
+ *
56
+ * - `c__at` timestamptz — when the cell was last written (NULL: never / no opinion)
57
+ * - `c__by` text — who wrote it
58
+ * - `c__rev` uuid — a resolved table's manual source only: the edit's
59
+ * identity, so an async writeback confirmation clears
60
+ * only the exact edit it delivered
61
+ *
62
+ * A resolved view additionally exposes, per resolved column, the winner's
63
+ * `c__src` (source name) and `c__lost` (newer candidates that lost, jsonb).
64
+ * None of these are GraphQL columns: they surface through the typed `cells`
65
+ * object and are never client-writable.
66
+ */
67
+ declare const CELL_PARTS: readonly ["at", "by", "rev", "source", "conflicts"];
68
+ type CellPart = (typeof CELL_PARTS)[number];
69
+ declare const CELL_PART_SUFFIX: Readonly<Record<CellPart, string>>;
70
+ /** Longest physical column name that can carry cell parts (63 minus the longest suffix). */
71
+ declare const MAX_TRACKED_COLUMN_NAME: number;
72
+ /** GraphQL field carrying a row's per-cell metadata object. */
73
+ declare const CELLS_FIELD = "cells";
74
+ /** Physical (and logical) name of one cell part of a column. */
75
+ declare function cellColumnName(column: string, part: CellPart): string;
76
+ /**
77
+ * Actor recorded when the data plane computes a materialized resolved table's
78
+ * rows for every caller. Its claims are what the compute view's synced
79
+ * sources see (materialized ETL sources must be readable by anyone).
80
+ */
81
+ declare const MATERIALIZE_ACTOR = "orm:materialize";
82
+ declare const MATERIALIZE_CLAIMS_JSON: string;
83
+ /**
84
+ * Apply-generated function that reconciles a materialized resolved table with
85
+ * its compute view: `SELECT * FROM orm_<ns>."<table>__refresh"(wait)` returns
86
+ * `(upserted, deleted, locked)`; without `wait` it skips when another refresh
87
+ * holds the table's lock. The one refresh implementation — the Atlas
88
+ * reconcile, the post-ETL hook, and an operator in psql all call it.
89
+ */
90
+ declare function materializedRefreshFunctionName(table: string): string;
91
+ /**
92
+ * Advisory-lock key serializing a materialized table's refreshes (hashed with
93
+ * `hashtext`). A full refresh holds it exclusively and every ORM write's
94
+ * per-row refresh holds it shared, both before reading the compute view — so
95
+ * a full refresh never reads a snapshot older than a write it then overwrites.
96
+ */
97
+ declare function materializeLockKey(schema: string, table: string): string;
98
+
99
+ export { CELLS_FIELD as C, DEFINITION_FILE_EXTENSIONS as D, HASH_DOMAIN as H, IDENTIFIER_PATTERN as I, MATERIALIZE_ACTOR as M, NAMESPACE_PATTERN as N, ORM_DATA_TOKEN_HEADER as O, QUALIFIED_TABLE_PATTERN as Q, RESERVED_COLUMN_NAMES as R, SYNCED_SOURCE_PATTERN as S, CELL_PARTS as a, type CellPart as b, cellColumnName as c, ORM_SERVICE_DATA_TOKEN_HEADER as d, CAPABILITY_KEY_PATTERN as e, CELL_PART_SUFFIX as f, CLAIM_KEY_PATTERN as g, COLUMN_IDENTIFIER_PATTERN as h, CONSUMER_ROLE_SUFFIX as i, MATERIALIZE_CLAIMS_JSON as j, MAX_DEFINITION_FILE_BYTES as k, MAX_GENERATED_SDL_BYTES as l, MAX_IDENTIFIER_LENGTH as m, MAX_TRACKED_COLUMN_NAME as n, NAMESPACE_CONFIG_FILENAMES as o, ORM_REGISTRATION_MAX_BYTES as p, ORM_SCHEMA_PREFIX as q, RESERVED_TABLE_NAMES as r, consumerRoleName as s, materializeLockKey as t, materializedRefreshFunctionName as u, ormSchemaName as v };
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const fixed: z.ZodObject<{
4
+ name: z.ZodString;
5
+ namespace: z.ZodString;
6
+ language: z.ZodLiteral<"sql">;
7
+ kind: z.ZodLiteral<"query">;
8
+ requires: z.ZodObject<{
9
+ capability: z.ZodString;
10
+ }, z.core.$strict>;
11
+ ontology: z.ZodObject<{
12
+ read: z.ZodArray<z.ZodString>;
13
+ }, z.core.$strict>;
14
+ maxRows: z.ZodDefault<z.ZodNumber>;
15
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ type: z.ZodEnum<{
17
+ bigint: "bigint";
18
+ boolean: "boolean";
19
+ date: "date";
20
+ text: "text";
21
+ timestamptz: "timestamptz";
22
+ uuid: "uuid";
23
+ integer: "integer";
24
+ numeric: "numeric";
25
+ double: "double";
26
+ }>;
27
+ required: z.ZodDefault<z.ZodBoolean>;
28
+ }, z.core.$strict>>>;
29
+ sql: z.ZodString;
30
+ }, z.core.$strict>;
31
+ declare const runtime: z.ZodObject<{
32
+ name: z.ZodString;
33
+ namespace: z.ZodString;
34
+ language: z.ZodLiteral<"sql">;
35
+ kind: z.ZodLiteral<"query">;
36
+ requires: z.ZodObject<{
37
+ capability: z.ZodString;
38
+ }, z.core.$strict>;
39
+ ontology: z.ZodObject<{
40
+ read: z.ZodArray<z.ZodString>;
41
+ }, z.core.$strict>;
42
+ maxRows: z.ZodDefault<z.ZodNumber>;
43
+ mode: z.ZodLiteral<"runtime">;
44
+ }, z.core.$strict>;
45
+ declare const sqlOperationDefinitionSchema: z.ZodUnion<readonly [z.ZodObject<{
46
+ name: z.ZodString;
47
+ namespace: z.ZodString;
48
+ language: z.ZodLiteral<"sql">;
49
+ kind: z.ZodLiteral<"query">;
50
+ requires: z.ZodObject<{
51
+ capability: z.ZodString;
52
+ }, z.core.$strict>;
53
+ ontology: z.ZodObject<{
54
+ read: z.ZodArray<z.ZodString>;
55
+ }, z.core.$strict>;
56
+ maxRows: z.ZodDefault<z.ZodNumber>;
57
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
58
+ type: z.ZodEnum<{
59
+ bigint: "bigint";
60
+ boolean: "boolean";
61
+ date: "date";
62
+ text: "text";
63
+ timestamptz: "timestamptz";
64
+ uuid: "uuid";
65
+ integer: "integer";
66
+ numeric: "numeric";
67
+ double: "double";
68
+ }>;
69
+ required: z.ZodDefault<z.ZodBoolean>;
70
+ }, z.core.$strict>>>;
71
+ sql: z.ZodString;
72
+ }, z.core.$strict>, z.ZodObject<{
73
+ name: z.ZodString;
74
+ namespace: z.ZodString;
75
+ language: z.ZodLiteral<"sql">;
76
+ kind: z.ZodLiteral<"query">;
77
+ requires: z.ZodObject<{
78
+ capability: z.ZodString;
79
+ }, z.core.$strict>;
80
+ ontology: z.ZodObject<{
81
+ read: z.ZodArray<z.ZodString>;
82
+ }, z.core.$strict>;
83
+ maxRows: z.ZodDefault<z.ZodNumber>;
84
+ mode: z.ZodLiteral<"runtime">;
85
+ }, z.core.$strict>]>;
86
+ type SqlOperationDefinition = z.infer<typeof sqlOperationDefinitionSchema>;
87
+ declare function defineOperation(input: z.input<typeof fixed>): z.infer<typeof fixed>;
88
+ declare function defineOperation(input: z.input<typeof runtime>): z.infer<typeof runtime>;
89
+ declare function defineOperation(input: z.input<typeof sqlOperationDefinitionSchema>): SqlOperationDefinition;
90
+
91
+ export { type SqlOperationDefinition as S, defineOperation as d, sqlOperationDefinitionSchema as s };
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+
3
+ declare const fixed: z.ZodObject<{
4
+ name: z.ZodString;
5
+ namespace: z.ZodString;
6
+ language: z.ZodLiteral<"sql">;
7
+ kind: z.ZodLiteral<"query">;
8
+ requires: z.ZodObject<{
9
+ capability: z.ZodString;
10
+ }, z.core.$strict>;
11
+ ontology: z.ZodObject<{
12
+ read: z.ZodArray<z.ZodString>;
13
+ }, z.core.$strict>;
14
+ maxRows: z.ZodDefault<z.ZodNumber>;
15
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
16
+ type: z.ZodEnum<{
17
+ bigint: "bigint";
18
+ boolean: "boolean";
19
+ date: "date";
20
+ text: "text";
21
+ timestamptz: "timestamptz";
22
+ uuid: "uuid";
23
+ integer: "integer";
24
+ numeric: "numeric";
25
+ double: "double";
26
+ }>;
27
+ required: z.ZodDefault<z.ZodBoolean>;
28
+ }, z.core.$strict>>>;
29
+ sql: z.ZodString;
30
+ }, z.core.$strict>;
31
+ declare const runtime: z.ZodObject<{
32
+ name: z.ZodString;
33
+ namespace: z.ZodString;
34
+ language: z.ZodLiteral<"sql">;
35
+ kind: z.ZodLiteral<"query">;
36
+ requires: z.ZodObject<{
37
+ capability: z.ZodString;
38
+ }, z.core.$strict>;
39
+ ontology: z.ZodObject<{
40
+ read: z.ZodArray<z.ZodString>;
41
+ }, z.core.$strict>;
42
+ maxRows: z.ZodDefault<z.ZodNumber>;
43
+ mode: z.ZodLiteral<"runtime">;
44
+ }, z.core.$strict>;
45
+ declare const sqlOperationDefinitionSchema: z.ZodUnion<readonly [z.ZodObject<{
46
+ name: z.ZodString;
47
+ namespace: z.ZodString;
48
+ language: z.ZodLiteral<"sql">;
49
+ kind: z.ZodLiteral<"query">;
50
+ requires: z.ZodObject<{
51
+ capability: z.ZodString;
52
+ }, z.core.$strict>;
53
+ ontology: z.ZodObject<{
54
+ read: z.ZodArray<z.ZodString>;
55
+ }, z.core.$strict>;
56
+ maxRows: z.ZodDefault<z.ZodNumber>;
57
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodObject<{
58
+ type: z.ZodEnum<{
59
+ bigint: "bigint";
60
+ boolean: "boolean";
61
+ date: "date";
62
+ text: "text";
63
+ timestamptz: "timestamptz";
64
+ uuid: "uuid";
65
+ integer: "integer";
66
+ numeric: "numeric";
67
+ double: "double";
68
+ }>;
69
+ required: z.ZodDefault<z.ZodBoolean>;
70
+ }, z.core.$strict>>>;
71
+ sql: z.ZodString;
72
+ }, z.core.$strict>, z.ZodObject<{
73
+ name: z.ZodString;
74
+ namespace: z.ZodString;
75
+ language: z.ZodLiteral<"sql">;
76
+ kind: z.ZodLiteral<"query">;
77
+ requires: z.ZodObject<{
78
+ capability: z.ZodString;
79
+ }, z.core.$strict>;
80
+ ontology: z.ZodObject<{
81
+ read: z.ZodArray<z.ZodString>;
82
+ }, z.core.$strict>;
83
+ maxRows: z.ZodDefault<z.ZodNumber>;
84
+ mode: z.ZodLiteral<"runtime">;
85
+ }, z.core.$strict>]>;
86
+ type SqlOperationDefinition = z.infer<typeof sqlOperationDefinitionSchema>;
87
+ declare function defineOperation(input: z.input<typeof fixed>): z.infer<typeof fixed>;
88
+ declare function defineOperation(input: z.input<typeof runtime>): z.infer<typeof runtime>;
89
+ declare function defineOperation(input: z.input<typeof sqlOperationDefinitionSchema>): SqlOperationDefinition;
90
+
91
+ export { type SqlOperationDefinition as S, defineOperation as d, sqlOperationDefinitionSchema as s };
@@ -31,9 +31,10 @@ function allowedOps(type) {
31
31
  case "text":
32
32
  return ["eq", "neq", "gt", "gte", "lt", "lte", "in", "nin", "like", "ilike", "isNull"];
33
33
  case "uuid":
34
- return ["eq", "neq", "in", "nin", "isNull"];
34
+ return ["eq", "neq", "in", "nin", "like", "ilike", "isNull"];
35
35
  case "integer":
36
36
  case "bigint":
37
+ return ["eq", "neq", "gt", "gte", "lt", "lte", "in", "nin", "like", "ilike", "isNull"];
37
38
  case "numeric":
38
39
  case "double":
39
40
  case "timestamptz":
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/compiler-gql/dynamic-input.ts"],"names":[],"mappings":"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","file":"dynamic-input.cjs","sourcesContent":["/**\n * §4f dynamic-input validators — PURE, data-only functions the data plane\n * imports to check client-supplied values for dynamic slots (BoolExp /\n * OrderBy / SelectColumn / InsertInput / SetInput / AppendInput / OnConflict)\n * against the artifact's per-table whitelist metadata (TableMetaIr).\n *\n * No drizzle imports, no IO. Each validator returns a normalized tree or\n * typed issues; the executor's runtime lowering step consumes the normalized\n * form and ANDs the result with the baked policy predicate — the policy is\n * non-negotiable regardless of what the client sends.\n */\nimport type { CmpOp, TableMetaIr } from '../ir/index.js'\n\nexport interface DynamicInputIssue {\n code:\n | 'invalid-shape'\n | 'unknown-column'\n | 'unknown-link'\n | 'unknown-operator'\n | 'invalid-value'\n | 'column-not-allowed'\n | 'nested-insert'\n | 'unknown-constraint'\n | 'too-deep'\n | 'too-many-nodes'\n | 'too-many-rows'\n path: string\n message: string\n}\n\nexport type DynamicInputResult<T> = { ok: true; value: T } | { ok: false; issues: DynamicInputIssue[] }\n\nexport type NormalizedBoolExp =\n | { kind: 'and' | 'or'; operands: NormalizedBoolExp[] }\n | { kind: 'not'; operand: NormalizedBoolExp }\n | { kind: 'cmp'; op: CmpOp; column: string; value: unknown }\n | { kind: 'exists'; link: string; target: string; where: NormalizedBoolExp }\n\nexport interface NormalizedOrderBy {\n column: string\n link?: string\n direction: 'asc' | 'desc'\n nulls?: 'first' | 'last'\n}\n\nexport type NormalizedRow = Record<string, unknown>\n\nexport interface NormalizedOnConflict {\n constraint: string\n updateColumns: string[]\n}\n\nconst CONST_TRUE: NormalizedBoolExp = { kind: 'and', operands: [] }\n\nconst ORDER_DIRECTIONS: Readonly<Record<string, { direction: 'asc' | 'desc'; nulls?: 'first' | 'last' }>> = {\n ASC: { direction: 'asc' },\n DESC: { direction: 'desc' },\n ASC_NULLS_FIRST: { direction: 'asc', nulls: 'first' },\n ASC_NULLS_LAST: { direction: 'asc', nulls: 'last' },\n DESC_NULLS_FIRST: { direction: 'desc', nulls: 'first' },\n DESC_NULLS_LAST: { direction: 'desc', nulls: 'last' },\n}\n\nconst BOOLEXP_OPS: Readonly<Record<string, CmpOp>> = {\n _eq: 'eq',\n _neq: 'neq',\n _gt: 'gt',\n _gte: 'gte',\n _lt: 'lt',\n _lte: 'lte',\n _in: 'in',\n _nin: 'nin',\n _like: 'like',\n _ilike: 'ilike',\n _isNull: 'isNull',\n _contains: 'contains',\n _hasKey: 'hasKey',\n}\n\nexport type ScalarKind = TableMetaIr['columns'][number]['type']\n\n/** Operators each column type accepts — anything else is rejected, never lowered. */\nexport function allowedOps(type: ScalarKind): readonly CmpOp[] {\n if (typeof type !== 'string') return ['eq', 'neq', 'in', 'nin', 'isNull']\n switch (type) {\n case 'text':\n return ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'like', 'ilike', 'isNull']\n case 'uuid':\n return ['eq', 'neq', 'in', 'nin', 'isNull']\n case 'integer':\n case 'bigint':\n case 'numeric':\n case 'double':\n case 'timestamptz':\n case 'date':\n return ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'isNull']\n case 'boolean':\n return ['eq', 'neq', 'isNull']\n case 'jsonb':\n return ['eq', 'neq', 'contains', 'hasKey', 'isNull']\n }\n}\n\n/** `eq` → `_eq` — the reverse of BOOLEXP_OPS, built once. */\nconst CMP_OP_TO_BOOLEXP_KEY: Readonly<Record<string, string>> = Object.fromEntries(\n Object.entries(BOOLEXP_OPS).map(([key, op]) => [op, key]),\n)\n\n/**\n * The comparison keys a client may put on this column inside a `BoolExp` —\n * `['_eq', '_neq', '_in', '_nin', '_isNull']` for a uuid.\n *\n * This is `allowedOps` in the wire spelling, and it is deliberately the same\n * function the validator consults. The generated SDL is NOT a substitute: it\n * renders a wider comparison type per scalar family (a uuid gets `_gt`, a\n * boolean gets `_in`, jsonb gets `_nin`), so a form built from the SDL offers\n * operators the executor answers with BAD_USER_INPUT.\n */\nexport function allowedBoolExpOperators(type: ScalarKind): readonly string[] {\n return allowedOps(type).map((op) => CMP_OP_TO_BOOLEXP_KEY[op] ?? `_${op}`)\n}\n\n/** Every `OrderBy` enum value the executor accepts, in SDL order. */\nexport const ORDER_BY_DIRECTIONS: readonly string[] = Object.keys(ORDER_DIRECTIONS)\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction scalarMatches(type: ScalarKind, value: unknown): boolean {\n if (typeof type !== 'string') return typeof value === 'string' && type.values.includes(value)\n switch (type) {\n case 'text':\n case 'uuid':\n case 'timestamptz':\n case 'date':\n return typeof value === 'string'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'double':\n return typeof value === 'number'\n // bigint/numeric exceed JS number precision — the JSON wire form may be a string.\n case 'bigint':\n case 'numeric':\n return typeof value === 'number' || typeof value === 'string'\n case 'boolean':\n return typeof value === 'boolean'\n case 'jsonb':\n return true\n }\n}\n\nclass IssueCollector {\n readonly issues: DynamicInputIssue[] = []\n\n add(code: DynamicInputIssue['code'], path: string, message: string): void {\n this.issues.push({ code, path, message })\n }\n}\n\nfunction finish<T>(collector: IssueCollector, value: T): DynamicInputResult<T> {\n return collector.issues.length > 0 ? { ok: false, issues: collector.issues } : { ok: true, value }\n}\n\nexport interface BoolExpInput {\n table: TableMetaIr\n /** Artifact tables record — relationship predicates resolve targets here. */\n tables: Record<string, TableMetaIr>\n value: unknown\n maxDepth?: number\n maxNodes?: number\n}\n\nexport function validateBoolExpInput({ table, tables, value, maxDepth, maxNodes }: BoolExpInput): DynamicInputResult<NormalizedBoolExp> {\n const collector = new IssueCollector()\n const depthCap = maxDepth ?? table.dynamicFilterMaxDepth\n const nodeCap = maxNodes ?? table.dynamicFilterMaxNodes\n let nodes = 0\n let capped = false\n\n /** Every crossing reports exactly once; a capped result is ALWAYS ok:false — a silently truncated `_or` branch would widen results. */\n const consumeNode = (path: string): boolean => {\n nodes += 1\n if (nodes <= nodeCap) return true\n if (!capped) {\n capped = true\n collector.add('too-many-nodes', path, `filter tree exceeds the node cap of ${nodeCap}`)\n }\n return false\n }\n\n const walk = (input: unknown, meta: TableMetaIr, depth: number, path: string): NormalizedBoolExp => {\n if (capped) return CONST_TRUE\n if (depth > depthCap) {\n collector.add('too-deep', path, `filter tree exceeds the depth cap of ${depthCap}`)\n return CONST_TRUE\n }\n if (!isPlainObject(input)) {\n collector.add('invalid-shape', path, 'a boolean expression must be an object')\n return CONST_TRUE\n }\n\n const operands: NormalizedBoolExp[] = []\n for (const [key, entry] of Object.entries(input)) {\n if (entry === undefined || entry === null) continue\n if (!consumeNode(path)) return CONST_TRUE\n\n if (key === '_and' || key === '_or') {\n const items = Array.isArray(entry) ? entry : [entry]\n const children = items.map((item, index) => walk(item, meta, depth + 1, `${path}.${key}[${index}]`))\n if (children.length > 0) operands.push({ kind: key === '_and' ? 'and' : 'or', operands: children })\n continue\n }\n if (key === '_not') {\n operands.push({ kind: 'not', operand: walk(entry, meta, depth + 1, `${path}._not`) })\n continue\n }\n\n const column = meta.columns.find((c) => c.name === key)\n if (column) {\n if (!meta.filterable.includes(key)) {\n collector.add('column-not-allowed', `${path}.${key}`, `column '${key}' is not filterable on '${meta.table}'`)\n continue\n }\n if (!isPlainObject(entry)) {\n collector.add('invalid-shape', `${path}.${key}`, `comparison on '${key}' must be an object like { _eq: … }`)\n continue\n }\n for (const [opKey, opValue] of Object.entries(entry)) {\n if (opValue === undefined) continue\n if (!consumeNode(`${path}.${key}`)) return CONST_TRUE\n const op = BOOLEXP_OPS[opKey]\n if (!op || !allowedOps(column.type).includes(op)) {\n collector.add('unknown-operator', `${path}.${key}.${opKey}`, `operator '${opKey}' is not allowed on '${meta.table}.${key}'`)\n continue\n }\n const issue = checkOperatorValue(op, column.type, opValue)\n if (issue) {\n collector.add('invalid-value', `${path}.${key}.${opKey}`, issue)\n continue\n }\n operands.push({ kind: 'cmp', op, column: key, value: opValue })\n }\n continue\n }\n\n const link = meta.links.find((l) => l.name === key)\n if (link) {\n const target = tables[link.target]\n if (!target) {\n collector.add('unknown-link', `${path}.${key}`, `link target '${link.target}' is not in the artifact`)\n continue\n }\n operands.push({ kind: 'exists', link: key, target: link.target, where: walk(entry, target, depth + 1, `${path}.${key}`) })\n continue\n }\n\n // Aggregation predicates are deliberately NOT accepted from dynamic\n // input in v2.0 — only document-authored filters may use them.\n collector.add(\n 'unknown-column',\n `${path}.${key}`,\n `unknown field '${key}' in a filter on '${meta.table}' (declared columns and links only)`,\n )\n }\n if (operands.length === 0) return CONST_TRUE\n return operands.length === 1 ? (operands[0] as NormalizedBoolExp) : { kind: 'and', operands }\n }\n\n const normalized = walk(value, table, 1, '$')\n return finish(collector, normalized)\n}\n\nfunction checkOperatorValue(op: CmpOp, type: ScalarKind, value: unknown): string | undefined {\n if (op === 'isNull') return typeof value === 'boolean' ? undefined : '_isNull takes a boolean'\n if (op === 'hasKey') return typeof value === 'string' ? undefined : '_hasKey takes a string key'\n if (op === 'contains') return undefined // jsonb containment takes arbitrary JSON\n if (op === 'in' || op === 'nin') {\n if (!Array.isArray(value)) return `${op === 'in' ? '_in' : '_nin'} takes an array`\n return value.every((item) => scalarMatches(type, item)) ? undefined : 'array items do not match the column type'\n }\n if (op === 'like' || op === 'ilike') return typeof value === 'string' ? undefined : 'pattern must be a string'\n return scalarMatches(type, value) ? undefined : 'value does not match the column type'\n}\n\nexport function validateOrderByInput({\n table,\n tables,\n value,\n}: {\n table: TableMetaIr\n tables: Record<string, TableMetaIr>\n value: unknown\n}): DynamicInputResult<NormalizedOrderBy[]> {\n const collector = new IssueCollector()\n const normalized: NormalizedOrderBy[] = []\n const items = Array.isArray(value) ? value : [value]\n\n items.forEach((item, index) => {\n const path = `$[${index}]`\n if (!isPlainObject(item)) {\n collector.add('invalid-shape', path, 'orderBy entries must be objects')\n return\n }\n for (const [key, direction] of Object.entries(item)) {\n if (direction === undefined || direction === null) continue\n if (table.orderable.includes(key)) {\n const resolved = typeof direction === 'string' ? ORDER_DIRECTIONS[direction] : undefined\n if (!resolved) {\n collector.add('invalid-value', `${path}.${key}`, `unknown order direction '${String(direction)}'`)\n continue\n }\n normalized.push({ column: key, ...resolved })\n continue\n }\n const link = table.links.find((l) => l.name === key)\n if (link && link.kind !== 'toMany') {\n const target = tables[link.target]\n if (!target || !isPlainObject(direction) || Object.keys(direction).length !== 1) {\n collector.add('invalid-shape', `${path}.${key}`, `orderBy through '${key}' needs exactly one target column`)\n continue\n }\n const [targetColumn, targetDirection] = Object.entries(direction)[0] as [string, unknown]\n const resolved = typeof targetDirection === 'string' ? ORDER_DIRECTIONS[targetDirection] : undefined\n if (!target.orderable.includes(targetColumn)) {\n collector.add('unknown-column', `${path}.${key}.${targetColumn}`, `'${targetColumn}' is not orderable on '${link.target}'`)\n continue\n }\n if (!resolved) {\n collector.add('invalid-value', `${path}.${key}.${targetColumn}`, `unknown order direction '${String(targetDirection)}'`)\n continue\n }\n normalized.push({ column: targetColumn, link: key, ...resolved })\n continue\n }\n collector.add('unknown-column', `${path}.${key}`, `'${key}' is not orderable on '${table.table}' (columns and to-one links only)`)\n }\n })\n\n return finish(collector, normalized)\n}\n\nexport function validateSelectColumns({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<string[]> {\n const collector = new IssueCollector()\n const items = Array.isArray(value) ? value : [value]\n const normalized: string[] = []\n items.forEach((item, index) => {\n if (typeof item !== 'string' || !table.filterable.includes(item)) {\n collector.add('unknown-column', `$[${index}]`, `'${String(item)}' is not a selectable column of '${table.table}'`)\n return\n }\n normalized.push(item)\n })\n return finish(collector, normalized)\n}\n\nexport function validateInsertInput({\n table,\n value,\n list,\n maxRows,\n}: {\n table: TableMetaIr\n value: unknown\n /** true for `$objects: [FooInsertInput!]`, false for `$object: FooInsertInput`. */\n list: boolean\n maxRows?: number\n}): DynamicInputResult<NormalizedRow[]> {\n const collector = new IssueCollector()\n const rowCap = maxRows ?? 1000\n const rows = list ? value : [value]\n if (!Array.isArray(rows)) {\n collector.add('invalid-shape', '$', 'objects must be an array of rows')\n return { ok: false, issues: collector.issues }\n }\n if (rows.length > rowCap) {\n collector.add('too-many-rows', '$', `insert exceeds the row cap of ${rowCap}`)\n return { ok: false, issues: collector.issues }\n }\n\n const normalized: NormalizedRow[] = []\n rows.forEach((row, index) => {\n const path = list ? `$[${index}]` : '$'\n if (!isPlainObject(row)) {\n collector.add('invalid-shape', path, 'insert rows must be objects')\n return\n }\n const out: NormalizedRow = {}\n for (const [key, entry] of Object.entries(row)) {\n if (entry === undefined) continue\n if (table.links.some((l) => l.name === key)) {\n collector.add('nested-insert', `${path}.${key}`, `nested inserts are not supported — '${key}' is a link (a { data: … } shape was rejected)`)\n continue\n }\n const column = table.columns.find((c) => c.name === key)\n if (!column || !table.insertable.includes(key)) {\n const reason = column ? 'not insertable (pinned by the write policy or deprecated)' : 'not a declared column'\n collector.add(column ? 'column-not-allowed' : 'unknown-column', `${path}.${key}`, `'${key}' is ${reason} on '${table.table}'`)\n continue\n }\n if (entry === null) {\n if (!column.nullable) {\n collector.add('invalid-value', `${path}.${key}`, `'${key}' is not nullable`)\n continue\n }\n } else if (!scalarMatches(column.type, entry)) {\n collector.add('invalid-value', `${path}.${key}`, `value for '${key}' does not match its column type`)\n continue\n }\n out[key] = entry\n }\n normalized.push(out)\n })\n\n return finish(collector, normalized)\n}\n\nfunction validateColumnMap({\n table,\n value,\n whitelist,\n argName,\n typeCheck,\n}: {\n table: TableMetaIr\n value: unknown\n whitelist: readonly string[]\n argName: string\n typeCheck: boolean\n}): DynamicInputResult<NormalizedRow> {\n const collector = new IssueCollector()\n if (!isPlainObject(value)) {\n collector.add('invalid-shape', '$', `${argName} must be an object`)\n return { ok: false, issues: collector.issues }\n }\n const out: NormalizedRow = {}\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined) continue\n if (!whitelist.includes(key)) {\n const known = table.columns.some((c) => c.name === key)\n collector.add(known ? 'column-not-allowed' : 'unknown-column', `$.${key}`, `'${key}' is not allowed in ${argName} on '${table.table}'`)\n continue\n }\n const column = table.columns.find((c) => c.name === key)\n if (column && entry === null && !column.nullable) {\n collector.add('invalid-value', `$.${key}`, `'${key}' is not nullable`)\n continue\n }\n if (typeCheck && column && entry !== null && !scalarMatches(column.type, entry)) {\n collector.add('invalid-value', `$.${key}`, `value for '${key}' does not match its column type`)\n continue\n }\n out[key] = entry\n }\n return finish(collector, out)\n}\n\nexport function validateSetInput({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<NormalizedRow> {\n return validateColumnMap({ table, value, whitelist: table.settable, argName: '_set', typeCheck: true })\n}\n\n/** _append targets jsonb columns; values are arbitrary JSON (no scalar check). */\nexport function validateAppendInput({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<NormalizedRow> {\n return validateColumnMap({ table, value, whitelist: table.appendable, argName: '_append', typeCheck: false })\n}\n\nexport function validateOnConflictInput({\n table,\n value,\n}: {\n table: TableMetaIr\n value: unknown\n}): DynamicInputResult<NormalizedOnConflict> {\n const collector = new IssueCollector()\n if (!isPlainObject(value)) {\n collector.add('invalid-shape', '$', 'onConflict must be an object')\n return { ok: false, issues: collector.issues }\n }\n for (const key of Object.keys(value)) {\n if (key !== 'constraint' && key !== 'updateColumns') {\n collector.add('invalid-shape', `$.${key}`, `unknown onConflict key '${key}' (constraint, updateColumns)`)\n }\n }\n\n const constraint = value['constraint']\n if (typeof constraint !== 'string' || !table.constraints.some((c) => c.name === constraint)) {\n collector.add(\n 'unknown-constraint',\n '$.constraint',\n `'${String(constraint)}' is not a declared constraint of '${table.table}'`,\n )\n }\n\n const updateColumns: string[] = []\n const rawColumns = value['updateColumns'] ?? []\n if (!Array.isArray(rawColumns)) {\n collector.add('invalid-shape', '$.updateColumns', 'updateColumns must be an array')\n } else {\n rawColumns.forEach((item, index) => {\n if (typeof item !== 'string' || !table.settable.includes(item)) {\n collector.add('column-not-allowed', `$.updateColumns[${index}]`, `'${String(item)}' is not updatable on '${table.table}'`)\n return\n }\n updateColumns.push(item)\n })\n }\n\n return finish(collector, { constraint: constraint as string, updateColumns })\n}\n"]}
1
+ {"version":3,"sources":["../src/compiler-gql/dynamic-input.ts"],"names":[],"mappings":"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","file":"dynamic-input.cjs","sourcesContent":["/**\n * §4f dynamic-input validators — PURE, data-only functions the data plane\n * imports to check client-supplied values for dynamic slots (BoolExp /\n * OrderBy / SelectColumn / InsertInput / SetInput / AppendInput / OnConflict)\n * against the artifact's per-table whitelist metadata (TableMetaIr).\n *\n * No drizzle imports, no IO. Each validator returns a normalized tree or\n * typed issues; the executor's runtime lowering step consumes the normalized\n * form and ANDs the result with the baked policy predicate — the policy is\n * non-negotiable regardless of what the client sends.\n */\nimport type { CmpOp, TableMetaIr } from '../ir/index.js'\n\nexport interface DynamicInputIssue {\n code:\n | 'invalid-shape'\n | 'unknown-column'\n | 'unknown-link'\n | 'unknown-operator'\n | 'invalid-value'\n | 'column-not-allowed'\n | 'nested-insert'\n | 'unknown-constraint'\n | 'too-deep'\n | 'too-many-nodes'\n | 'too-many-rows'\n path: string\n message: string\n}\n\nexport type DynamicInputResult<T> = { ok: true; value: T } | { ok: false; issues: DynamicInputIssue[] }\n\nexport type NormalizedBoolExp =\n | { kind: 'and' | 'or'; operands: NormalizedBoolExp[] }\n | { kind: 'not'; operand: NormalizedBoolExp }\n | { kind: 'cmp'; op: CmpOp; column: string; value: unknown }\n | { kind: 'exists'; link: string; target: string; where: NormalizedBoolExp }\n\nexport interface NormalizedOrderBy {\n column: string\n link?: string\n direction: 'asc' | 'desc'\n nulls?: 'first' | 'last'\n}\n\nexport type NormalizedRow = Record<string, unknown>\n\nexport interface NormalizedOnConflict {\n constraint: string\n updateColumns: string[]\n}\n\nconst CONST_TRUE: NormalizedBoolExp = { kind: 'and', operands: [] }\n\nconst ORDER_DIRECTIONS: Readonly<Record<string, { direction: 'asc' | 'desc'; nulls?: 'first' | 'last' }>> = {\n ASC: { direction: 'asc' },\n DESC: { direction: 'desc' },\n ASC_NULLS_FIRST: { direction: 'asc', nulls: 'first' },\n ASC_NULLS_LAST: { direction: 'asc', nulls: 'last' },\n DESC_NULLS_FIRST: { direction: 'desc', nulls: 'first' },\n DESC_NULLS_LAST: { direction: 'desc', nulls: 'last' },\n}\n\nconst BOOLEXP_OPS: Readonly<Record<string, CmpOp>> = {\n _eq: 'eq',\n _neq: 'neq',\n _gt: 'gt',\n _gte: 'gte',\n _lt: 'lt',\n _lte: 'lte',\n _in: 'in',\n _nin: 'nin',\n _like: 'like',\n _ilike: 'ilike',\n _isNull: 'isNull',\n _contains: 'contains',\n _hasKey: 'hasKey',\n}\n\nexport type ScalarKind = TableMetaIr['columns'][number]['type']\n\n/**\n * Operators each column type accepts — anything else is rejected, never lowered.\n *\n * Integer, bigint and uuid columns also take `_like`/`_ilike`, matched against\n * the column's text form (`col::text ILIKE $1`): substring search on numbers\n * and ids people type part of, such as an application number. The cast skips\n * the column's index, so pair it with filters that narrow the scan.\n */\nexport function allowedOps(type: ScalarKind): readonly CmpOp[] {\n if (typeof type !== 'string') return ['eq', 'neq', 'in', 'nin', 'isNull']\n switch (type) {\n case 'text':\n return ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'like', 'ilike', 'isNull']\n case 'uuid':\n return ['eq', 'neq', 'in', 'nin', 'like', 'ilike', 'isNull']\n case 'integer':\n case 'bigint':\n return ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'like', 'ilike', 'isNull']\n case 'numeric':\n case 'double':\n case 'timestamptz':\n case 'date':\n return ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'in', 'nin', 'isNull']\n case 'boolean':\n return ['eq', 'neq', 'isNull']\n case 'jsonb':\n return ['eq', 'neq', 'contains', 'hasKey', 'isNull']\n }\n}\n\n/** `eq` → `_eq` — the reverse of BOOLEXP_OPS, built once. */\nconst CMP_OP_TO_BOOLEXP_KEY: Readonly<Record<string, string>> = Object.fromEntries(\n Object.entries(BOOLEXP_OPS).map(([key, op]) => [op, key]),\n)\n\n/**\n * The comparison keys a client may put on this column inside a `BoolExp` —\n * `['_eq', '_neq', '_in', '_nin', '_isNull']` for a uuid.\n *\n * This is `allowedOps` in the wire spelling, and it is deliberately the same\n * function the validator consults. The generated SDL is NOT a substitute: it\n * renders a wider comparison type per scalar family (a uuid gets `_gt`, a\n * boolean gets `_in`, jsonb gets `_nin`), so a form built from the SDL offers\n * operators the executor answers with BAD_USER_INPUT.\n */\nexport function allowedBoolExpOperators(type: ScalarKind): readonly string[] {\n return allowedOps(type).map((op) => CMP_OP_TO_BOOLEXP_KEY[op] ?? `_${op}`)\n}\n\n/** Every `OrderBy` enum value the executor accepts, in SDL order. */\nexport const ORDER_BY_DIRECTIONS: readonly string[] = Object.keys(ORDER_DIRECTIONS)\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction scalarMatches(type: ScalarKind, value: unknown): boolean {\n if (typeof type !== 'string') return typeof value === 'string' && type.values.includes(value)\n switch (type) {\n case 'text':\n case 'uuid':\n case 'timestamptz':\n case 'date':\n return typeof value === 'string'\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value)\n case 'double':\n return typeof value === 'number'\n // bigint/numeric exceed JS number precision — the JSON wire form may be a string.\n case 'bigint':\n case 'numeric':\n return typeof value === 'number' || typeof value === 'string'\n case 'boolean':\n return typeof value === 'boolean'\n case 'jsonb':\n return true\n }\n}\n\nclass IssueCollector {\n readonly issues: DynamicInputIssue[] = []\n\n add(code: DynamicInputIssue['code'], path: string, message: string): void {\n this.issues.push({ code, path, message })\n }\n}\n\nfunction finish<T>(collector: IssueCollector, value: T): DynamicInputResult<T> {\n return collector.issues.length > 0 ? { ok: false, issues: collector.issues } : { ok: true, value }\n}\n\nexport interface BoolExpInput {\n table: TableMetaIr\n /** Artifact tables record — relationship predicates resolve targets here. */\n tables: Record<string, TableMetaIr>\n value: unknown\n maxDepth?: number\n maxNodes?: number\n}\n\nexport function validateBoolExpInput({ table, tables, value, maxDepth, maxNodes }: BoolExpInput): DynamicInputResult<NormalizedBoolExp> {\n const collector = new IssueCollector()\n const depthCap = maxDepth ?? table.dynamicFilterMaxDepth\n const nodeCap = maxNodes ?? table.dynamicFilterMaxNodes\n let nodes = 0\n let capped = false\n\n /** Every crossing reports exactly once; a capped result is ALWAYS ok:false — a silently truncated `_or` branch would widen results. */\n const consumeNode = (path: string): boolean => {\n nodes += 1\n if (nodes <= nodeCap) return true\n if (!capped) {\n capped = true\n collector.add('too-many-nodes', path, `filter tree exceeds the node cap of ${nodeCap}`)\n }\n return false\n }\n\n const walk = (input: unknown, meta: TableMetaIr, depth: number, path: string): NormalizedBoolExp => {\n if (capped) return CONST_TRUE\n if (depth > depthCap) {\n collector.add('too-deep', path, `filter tree exceeds the depth cap of ${depthCap}`)\n return CONST_TRUE\n }\n if (!isPlainObject(input)) {\n collector.add('invalid-shape', path, 'a boolean expression must be an object')\n return CONST_TRUE\n }\n\n const operands: NormalizedBoolExp[] = []\n for (const [key, entry] of Object.entries(input)) {\n if (entry === undefined || entry === null) continue\n if (!consumeNode(path)) return CONST_TRUE\n\n if (key === '_and' || key === '_or') {\n const items = Array.isArray(entry) ? entry : [entry]\n const children = items.map((item, index) => walk(item, meta, depth + 1, `${path}.${key}[${index}]`))\n if (children.length > 0) operands.push({ kind: key === '_and' ? 'and' : 'or', operands: children })\n continue\n }\n if (key === '_not') {\n operands.push({ kind: 'not', operand: walk(entry, meta, depth + 1, `${path}._not`) })\n continue\n }\n\n const column = meta.columns.find((c) => c.name === key)\n if (column) {\n if (!meta.filterable.includes(key)) {\n collector.add('column-not-allowed', `${path}.${key}`, `column '${key}' is not filterable on '${meta.table}'`)\n continue\n }\n if (!isPlainObject(entry)) {\n collector.add('invalid-shape', `${path}.${key}`, `comparison on '${key}' must be an object like { _eq: … }`)\n continue\n }\n for (const [opKey, opValue] of Object.entries(entry)) {\n if (opValue === undefined) continue\n if (!consumeNode(`${path}.${key}`)) return CONST_TRUE\n const op = BOOLEXP_OPS[opKey]\n if (!op || !allowedOps(column.type).includes(op)) {\n collector.add('unknown-operator', `${path}.${key}.${opKey}`, `operator '${opKey}' is not allowed on '${meta.table}.${key}'`)\n continue\n }\n const issue = checkOperatorValue(op, column.type, opValue)\n if (issue) {\n collector.add('invalid-value', `${path}.${key}.${opKey}`, issue)\n continue\n }\n operands.push({ kind: 'cmp', op, column: key, value: opValue })\n }\n continue\n }\n\n const link = meta.links.find((l) => l.name === key)\n if (link) {\n const target = tables[link.target]\n if (!target) {\n collector.add('unknown-link', `${path}.${key}`, `link target '${link.target}' is not in the artifact`)\n continue\n }\n operands.push({ kind: 'exists', link: key, target: link.target, where: walk(entry, target, depth + 1, `${path}.${key}`) })\n continue\n }\n\n // Aggregation predicates are deliberately NOT accepted from dynamic\n // input in v2.0 — only document-authored filters may use them.\n collector.add(\n 'unknown-column',\n `${path}.${key}`,\n `unknown field '${key}' in a filter on '${meta.table}' (declared columns and links only)`,\n )\n }\n if (operands.length === 0) return CONST_TRUE\n return operands.length === 1 ? (operands[0] as NormalizedBoolExp) : { kind: 'and', operands }\n }\n\n const normalized = walk(value, table, 1, '$')\n return finish(collector, normalized)\n}\n\nfunction checkOperatorValue(op: CmpOp, type: ScalarKind, value: unknown): string | undefined {\n if (op === 'isNull') return typeof value === 'boolean' ? undefined : '_isNull takes a boolean'\n if (op === 'hasKey') return typeof value === 'string' ? undefined : '_hasKey takes a string key'\n if (op === 'contains') return undefined // jsonb containment takes arbitrary JSON\n if (op === 'in' || op === 'nin') {\n if (!Array.isArray(value)) return `${op === 'in' ? '_in' : '_nin'} takes an array`\n return value.every((item) => scalarMatches(type, item)) ? undefined : 'array items do not match the column type'\n }\n if (op === 'like' || op === 'ilike') return typeof value === 'string' ? undefined : 'pattern must be a string'\n return scalarMatches(type, value) ? undefined : 'value does not match the column type'\n}\n\nexport function validateOrderByInput({\n table,\n tables,\n value,\n}: {\n table: TableMetaIr\n tables: Record<string, TableMetaIr>\n value: unknown\n}): DynamicInputResult<NormalizedOrderBy[]> {\n const collector = new IssueCollector()\n const normalized: NormalizedOrderBy[] = []\n const items = Array.isArray(value) ? value : [value]\n\n items.forEach((item, index) => {\n const path = `$[${index}]`\n if (!isPlainObject(item)) {\n collector.add('invalid-shape', path, 'orderBy entries must be objects')\n return\n }\n for (const [key, direction] of Object.entries(item)) {\n if (direction === undefined || direction === null) continue\n if (table.orderable.includes(key)) {\n const resolved = typeof direction === 'string' ? ORDER_DIRECTIONS[direction] : undefined\n if (!resolved) {\n collector.add('invalid-value', `${path}.${key}`, `unknown order direction '${String(direction)}'`)\n continue\n }\n normalized.push({ column: key, ...resolved })\n continue\n }\n const link = table.links.find((l) => l.name === key)\n if (link && link.kind !== 'toMany') {\n const target = tables[link.target]\n if (!target || !isPlainObject(direction) || Object.keys(direction).length !== 1) {\n collector.add('invalid-shape', `${path}.${key}`, `orderBy through '${key}' needs exactly one target column`)\n continue\n }\n const [targetColumn, targetDirection] = Object.entries(direction)[0] as [string, unknown]\n const resolved = typeof targetDirection === 'string' ? ORDER_DIRECTIONS[targetDirection] : undefined\n if (!target.orderable.includes(targetColumn)) {\n collector.add('unknown-column', `${path}.${key}.${targetColumn}`, `'${targetColumn}' is not orderable on '${link.target}'`)\n continue\n }\n if (!resolved) {\n collector.add('invalid-value', `${path}.${key}.${targetColumn}`, `unknown order direction '${String(targetDirection)}'`)\n continue\n }\n normalized.push({ column: targetColumn, link: key, ...resolved })\n continue\n }\n collector.add('unknown-column', `${path}.${key}`, `'${key}' is not orderable on '${table.table}' (columns and to-one links only)`)\n }\n })\n\n return finish(collector, normalized)\n}\n\nexport function validateSelectColumns({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<string[]> {\n const collector = new IssueCollector()\n const items = Array.isArray(value) ? value : [value]\n const normalized: string[] = []\n items.forEach((item, index) => {\n if (typeof item !== 'string' || !table.filterable.includes(item)) {\n collector.add('unknown-column', `$[${index}]`, `'${String(item)}' is not a selectable column of '${table.table}'`)\n return\n }\n normalized.push(item)\n })\n return finish(collector, normalized)\n}\n\nexport function validateInsertInput({\n table,\n value,\n list,\n maxRows,\n}: {\n table: TableMetaIr\n value: unknown\n /** true for `$objects: [FooInsertInput!]`, false for `$object: FooInsertInput`. */\n list: boolean\n maxRows?: number\n}): DynamicInputResult<NormalizedRow[]> {\n const collector = new IssueCollector()\n const rowCap = maxRows ?? 1000\n const rows = list ? value : [value]\n if (!Array.isArray(rows)) {\n collector.add('invalid-shape', '$', 'objects must be an array of rows')\n return { ok: false, issues: collector.issues }\n }\n if (rows.length > rowCap) {\n collector.add('too-many-rows', '$', `insert exceeds the row cap of ${rowCap}`)\n return { ok: false, issues: collector.issues }\n }\n\n const normalized: NormalizedRow[] = []\n rows.forEach((row, index) => {\n const path = list ? `$[${index}]` : '$'\n if (!isPlainObject(row)) {\n collector.add('invalid-shape', path, 'insert rows must be objects')\n return\n }\n const out: NormalizedRow = {}\n for (const [key, entry] of Object.entries(row)) {\n if (entry === undefined) continue\n if (table.links.some((l) => l.name === key)) {\n collector.add('nested-insert', `${path}.${key}`, `nested inserts are not supported — '${key}' is a link (a { data: … } shape was rejected)`)\n continue\n }\n const column = table.columns.find((c) => c.name === key)\n if (!column || !table.insertable.includes(key)) {\n const reason = column ? 'not insertable (pinned by the write policy or deprecated)' : 'not a declared column'\n collector.add(column ? 'column-not-allowed' : 'unknown-column', `${path}.${key}`, `'${key}' is ${reason} on '${table.table}'`)\n continue\n }\n if (entry === null) {\n if (!column.nullable) {\n collector.add('invalid-value', `${path}.${key}`, `'${key}' is not nullable`)\n continue\n }\n } else if (!scalarMatches(column.type, entry)) {\n collector.add('invalid-value', `${path}.${key}`, `value for '${key}' does not match its column type`)\n continue\n }\n out[key] = entry\n }\n normalized.push(out)\n })\n\n return finish(collector, normalized)\n}\n\nfunction validateColumnMap({\n table,\n value,\n whitelist,\n argName,\n typeCheck,\n}: {\n table: TableMetaIr\n value: unknown\n whitelist: readonly string[]\n argName: string\n typeCheck: boolean\n}): DynamicInputResult<NormalizedRow> {\n const collector = new IssueCollector()\n if (!isPlainObject(value)) {\n collector.add('invalid-shape', '$', `${argName} must be an object`)\n return { ok: false, issues: collector.issues }\n }\n const out: NormalizedRow = {}\n for (const [key, entry] of Object.entries(value)) {\n if (entry === undefined) continue\n if (!whitelist.includes(key)) {\n const known = table.columns.some((c) => c.name === key)\n collector.add(known ? 'column-not-allowed' : 'unknown-column', `$.${key}`, `'${key}' is not allowed in ${argName} on '${table.table}'`)\n continue\n }\n const column = table.columns.find((c) => c.name === key)\n if (column && entry === null && !column.nullable) {\n collector.add('invalid-value', `$.${key}`, `'${key}' is not nullable`)\n continue\n }\n if (typeCheck && column && entry !== null && !scalarMatches(column.type, entry)) {\n collector.add('invalid-value', `$.${key}`, `value for '${key}' does not match its column type`)\n continue\n }\n out[key] = entry\n }\n return finish(collector, out)\n}\n\nexport function validateSetInput({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<NormalizedRow> {\n return validateColumnMap({ table, value, whitelist: table.settable, argName: '_set', typeCheck: true })\n}\n\n/** _append targets jsonb columns; values are arbitrary JSON (no scalar check). */\nexport function validateAppendInput({ table, value }: { table: TableMetaIr; value: unknown }): DynamicInputResult<NormalizedRow> {\n return validateColumnMap({ table, value, whitelist: table.appendable, argName: '_append', typeCheck: false })\n}\n\nexport function validateOnConflictInput({\n table,\n value,\n}: {\n table: TableMetaIr\n value: unknown\n}): DynamicInputResult<NormalizedOnConflict> {\n const collector = new IssueCollector()\n if (!isPlainObject(value)) {\n collector.add('invalid-shape', '$', 'onConflict must be an object')\n return { ok: false, issues: collector.issues }\n }\n for (const key of Object.keys(value)) {\n if (key !== 'constraint' && key !== 'updateColumns') {\n collector.add('invalid-shape', `$.${key}`, `unknown onConflict key '${key}' (constraint, updateColumns)`)\n }\n }\n\n const constraint = value['constraint']\n if (typeof constraint !== 'string' || !table.constraints.some((c) => c.name === constraint)) {\n collector.add(\n 'unknown-constraint',\n '$.constraint',\n `'${String(constraint)}' is not a declared constraint of '${table.table}'`,\n )\n }\n\n const updateColumns: string[] = []\n const rawColumns = value['updateColumns'] ?? []\n if (!Array.isArray(rawColumns)) {\n collector.add('invalid-shape', '$.updateColumns', 'updateColumns must be an array')\n } else {\n rawColumns.forEach((item, index) => {\n if (typeof item !== 'string' || !table.settable.includes(item)) {\n collector.add('column-not-allowed', `$.updateColumns[${index}]`, `'${String(item)}' is not updatable on '${table.table}'`)\n return\n }\n updateColumns.push(item)\n })\n }\n\n return finish(collector, { constraint: constraint as string, updateColumns })\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import { CmpOp, TableMetaIr } from './ir.cjs';
2
2
  import 'zod';
3
+ import './constants-C6EG6Wq7.cjs';
3
4
 
4
5
  /**
5
6
  * §4f dynamic-input validators — PURE, data-only functions the data plane
@@ -54,7 +55,14 @@ interface NormalizedOnConflict {
54
55
  updateColumns: string[];
55
56
  }
56
57
  type ScalarKind = TableMetaIr['columns'][number]['type'];
57
- /** Operators each column type accepts — anything else is rejected, never lowered. */
58
+ /**
59
+ * Operators each column type accepts — anything else is rejected, never lowered.
60
+ *
61
+ * Integer, bigint and uuid columns also take `_like`/`_ilike`, matched against
62
+ * the column's text form (`col::text ILIKE $1`): substring search on numbers
63
+ * and ids people type part of, such as an application number. The cast skips
64
+ * the column's index, so pair it with filters that narrow the scan.
65
+ */
58
66
  declare function allowedOps(type: ScalarKind): readonly CmpOp[];
59
67
  /**
60
68
  * The comparison keys a client may put on this column inside a `BoolExp` —
@@ -1,5 +1,6 @@
1
1
  import { CmpOp, TableMetaIr } from './ir.js';
2
2
  import 'zod';
3
+ import './constants-C6EG6Wq7.js';
3
4
 
4
5
  /**
5
6
  * §4f dynamic-input validators — PURE, data-only functions the data plane
@@ -54,7 +55,14 @@ interface NormalizedOnConflict {
54
55
  updateColumns: string[];
55
56
  }
56
57
  type ScalarKind = TableMetaIr['columns'][number]['type'];
57
- /** Operators each column type accepts — anything else is rejected, never lowered. */
58
+ /**
59
+ * Operators each column type accepts — anything else is rejected, never lowered.
60
+ *
61
+ * Integer, bigint and uuid columns also take `_like`/`_ilike`, matched against
62
+ * the column's text form (`col::text ILIKE $1`): substring search on numbers
63
+ * and ids people type part of, such as an application number. The cast skips
64
+ * the column's index, so pair it with filters that narrow the scan.
65
+ */
58
66
  declare function allowedOps(type: ScalarKind): readonly CmpOp[];
59
67
  /**
60
68
  * The comparison keys a client may put on this column inside a `BoolExp` —