@zmdb/sql 1.0.0-beta.1

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 (98) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +35 -0
  3. package/dist/aggregations/index.d.ts +30 -0
  4. package/dist/aggregations/index.d.ts.map +1 -0
  5. package/dist/aggregations/index.js +52 -0
  6. package/dist/aggregations/index.js.map +1 -0
  7. package/dist/clauses.d.ts +112 -0
  8. package/dist/clauses.d.ts.map +1 -0
  9. package/dist/clauses.js +267 -0
  10. package/dist/clauses.js.map +1 -0
  11. package/dist/comments/index.d.ts +26 -0
  12. package/dist/comments/index.d.ts.map +1 -0
  13. package/dist/comments/index.js +28 -0
  14. package/dist/comments/index.js.map +1 -0
  15. package/dist/compiled-query.d.ts +12 -0
  16. package/dist/compiled-query.d.ts.map +1 -0
  17. package/dist/compiled-query.js +2 -0
  18. package/dist/compiled-query.js.map +1 -0
  19. package/dist/dialects/index.d.ts +19 -0
  20. package/dist/dialects/index.d.ts.map +1 -0
  21. package/dist/dialects/index.js +43 -0
  22. package/dist/dialects/index.js.map +1 -0
  23. package/dist/dialects/protocol.d.ts +230 -0
  24. package/dist/dialects/protocol.d.ts.map +1 -0
  25. package/dist/dialects/protocol.js +230 -0
  26. package/dist/dialects/protocol.js.map +1 -0
  27. package/dist/errors.d.ts +9 -0
  28. package/dist/errors.d.ts.map +1 -0
  29. package/dist/errors.js +17 -0
  30. package/dist/errors.js.map +1 -0
  31. package/dist/expressions/index.d.ts +50 -0
  32. package/dist/expressions/index.d.ts.map +1 -0
  33. package/dist/expressions/index.js +77 -0
  34. package/dist/expressions/index.js.map +1 -0
  35. package/dist/extensions/index.d.ts +85 -0
  36. package/dist/extensions/index.d.ts.map +1 -0
  37. package/dist/extensions/index.js +120 -0
  38. package/dist/extensions/index.js.map +1 -0
  39. package/dist/fts/index.d.ts +28 -0
  40. package/dist/fts/index.d.ts.map +1 -0
  41. package/dist/fts/index.js +110 -0
  42. package/dist/fts/index.js.map +1 -0
  43. package/dist/index.d.ts +128 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +364 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/introspect/types.d.ts +58 -0
  48. package/dist/introspect/types.d.ts.map +1 -0
  49. package/dist/introspect/types.js +2 -0
  50. package/dist/introspect/types.js.map +1 -0
  51. package/dist/joins/index.d.ts +20 -0
  52. package/dist/joins/index.d.ts.map +1 -0
  53. package/dist/joins/index.js +24 -0
  54. package/dist/joins/index.js.map +1 -0
  55. package/dist/migrations/types.d.ts +100 -0
  56. package/dist/migrations/types.d.ts.map +1 -0
  57. package/dist/migrations/types.js +2 -0
  58. package/dist/migrations/types.js.map +1 -0
  59. package/dist/quoting.d.ts +40 -0
  60. package/dist/quoting.d.ts.map +1 -0
  61. package/dist/quoting.js +98 -0
  62. package/dist/quoting.js.map +1 -0
  63. package/dist/schema-objects/extensions.d.ts +5 -0
  64. package/dist/schema-objects/extensions.d.ts.map +1 -0
  65. package/dist/schema-objects/extensions.js +9 -0
  66. package/dist/schema-objects/extensions.js.map +1 -0
  67. package/dist/schema-objects/index.d.ts +25 -0
  68. package/dist/schema-objects/index.d.ts.map +1 -0
  69. package/dist/schema-objects/index.js +86 -0
  70. package/dist/schema-objects/index.js.map +1 -0
  71. package/dist/schema-objects/types.d.ts +62 -0
  72. package/dist/schema-objects/types.d.ts.map +1 -0
  73. package/dist/schema-objects/types.js +2 -0
  74. package/dist/schema-objects/types.js.map +1 -0
  75. package/dist/set-ops/index.d.ts +16 -0
  76. package/dist/set-ops/index.d.ts.map +1 -0
  77. package/dist/set-ops/index.js +41 -0
  78. package/dist/set-ops/index.js.map +1 -0
  79. package/package.json +70 -0
  80. package/src/aggregations/index.ts +127 -0
  81. package/src/clauses.ts +387 -0
  82. package/src/comments/index.ts +49 -0
  83. package/src/compiled-query.ts +12 -0
  84. package/src/dialects/index.ts +103 -0
  85. package/src/dialects/protocol.ts +478 -0
  86. package/src/errors.ts +18 -0
  87. package/src/expressions/index.ts +127 -0
  88. package/src/extensions/index.ts +235 -0
  89. package/src/fts/index.ts +157 -0
  90. package/src/index.ts +685 -0
  91. package/src/introspect/types.ts +60 -0
  92. package/src/joins/index.ts +69 -0
  93. package/src/migrations/types.ts +93 -0
  94. package/src/quoting.ts +111 -0
  95. package/src/schema-objects/extensions.ts +12 -0
  96. package/src/schema-objects/index.ts +125 -0
  97. package/src/schema-objects/types.ts +73 -0
  98. package/src/set-ops/index.ts +48 -0
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @zmdb/sql
2
+
3
+ `@zmdb/sql` turns typed query descriptions into SQL for each supported dialect. It covers reads and writes, joins, aggregates, full-text search, set operations, schema objects, and the vendor-neutral
4
+ dialect protocols consumed by higher layers.
5
+
6
+ Each database package owns a complete `SqlDialect` object with compiler traits, migration implementation, introspector and capabilities. Pass that object through the public SQL contract; built-in
7
+ string dialect selection is removed. A third-party database can provide the same contract without editing this package. Schema snapshots, migration execution, catalog introspection and declaration
8
+ emission are independently installable from `@zmdb/migrations`.
9
+
10
+ `@zmdb/sql` has no runtime dependencies or peers. Its [foundation guide](https://github.com/ambasta/zmdb/blob/main/docs-site/content/runtime-foundation.md) explains the inward package graph and the
11
+ separate database and tooling boundaries.
12
+
13
+ It is part of [zmdb](https://github.com/ambasta/zmdb), where one TypeScript schema drives validation, serialization, SQL, OpenAPI, and CRUD.
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ yarn add @zmdb/sql@1.0.0-beta.1
19
+ ```
20
+
21
+ > **Prerelease** (`1.0.0-beta.1`). Requires **Node.js 26+** and is **ESM-only**. Ships built ESM `.js` + `.d.ts` under `./dist`.
22
+
23
+ ## Entry points
24
+
25
+ - Query compilation: `@zmdb/sql`, `/joins`, `/aggregations`, `/fts`, `/set-ops`
26
+ - SQL metadata and DDL: `/schema-objects`, `/comments`
27
+ - Naming and outbox composition are owned by `@zmdb/schema/naming` and `@zmdb/orm/outbox`.
28
+
29
+ ## Documentation
30
+
31
+ Full docs: **https://ambasta.github.io/zmdb/**
32
+
33
+ ## License
34
+
35
+ GNU General Public License v3.0 or later (GPL-3.0-or-later) — see [LICENSE](./LICENSE).
@@ -0,0 +1,30 @@
1
+ import { type ComparisonPredicate, type JoinCondition, type Predicate } from '../clauses.js';
2
+ import type { DialectTarget } from '../dialects/index.js';
3
+ import { type CompiledQuery, type QueryCompilerOptions } from '../index.js';
4
+ export type { JoinCondition, JoinKind } from '../clauses.js';
5
+ export interface AggregateSelect {
6
+ select(cols: readonly string[]): AggregateSelect;
7
+ count(expr: string, alias: string): AggregateSelect;
8
+ sum(expr: string, alias: string): AggregateSelect;
9
+ avg(expr: string, alias: string): AggregateSelect;
10
+ min(expr: string, alias: string): AggregateSelect;
11
+ max(expr: string, alias: string): AggregateSelect;
12
+ expr(rawExpr: string, alias: string): AggregateSelect;
13
+ innerJoin(target: string, leftCol: string, rightCol: string, on?: readonly Predicate[]): AggregateSelect;
14
+ innerJoin(target: string, conditions: readonly JoinCondition[], on?: readonly Predicate[]): AggregateSelect;
15
+ leftJoin(target: string, leftCol: string, rightCol: string, on?: readonly Predicate[]): AggregateSelect;
16
+ leftJoin(target: string, conditions: readonly JoinCondition[], on?: readonly Predicate[]): AggregateSelect;
17
+ rightJoin(target: string, leftCol: string, rightCol: string, on?: readonly Predicate[]): AggregateSelect;
18
+ rightJoin(target: string, conditions: readonly JoinCondition[], on?: readonly Predicate[]): AggregateSelect;
19
+ where(col: string, op: string, value: unknown): AggregateSelect;
20
+ orWhere(col: string, op: string, value: unknown): AggregateSelect;
21
+ whereGroup(predicates: readonly ComparisonPredicate[]): AggregateSelect;
22
+ groupBy(...cols: string[]): AggregateSelect;
23
+ having(col: string, op: string, value: unknown): AggregateSelect;
24
+ orderBy(col: string, dir: 'asc' | 'desc'): AggregateSelect;
25
+ limit(n: number): AggregateSelect;
26
+ offset(n: number): AggregateSelect;
27
+ compile(): CompiledQuery;
28
+ }
29
+ export declare function aggregateSelectFrom(table: string, dialect: DialectTarget, options?: QueryCompilerOptions): AggregateSelect;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/aggregations/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { frozenQuery, havingClause, joinClauses, joinMethods, queryTelemetry, tailClause, tailMethods, whereClause, } from '../clauses.js';
2
+ import {} from '../index.js';
3
+ import { quoteColumn, quoteIdentifier, quoteTable } from '../quoting.js';
4
+ function make(d, s, telemetry) {
5
+ const next = (p) => make(d, { ...s, ...p }, telemetry);
6
+ const agg = (fn, col, alias) => next({ items: [...s.items, { kind: 'agg', fn, col, alias }] });
7
+ return {
8
+ ...joinMethods(s.joins, next),
9
+ ...tailMethods(s, next),
10
+ select: cols => next({ items: [...s.items, ...cols.map((c) => ({ kind: 'col', col: c }))] }),
11
+ count: (e, a) => agg('COUNT', e, a),
12
+ sum: (e, a) => agg('SUM', e, a),
13
+ avg: (e, a) => agg('AVG', e, a),
14
+ min: (e, a) => agg('MIN', e, a),
15
+ max: (e, a) => agg('MAX', e, a),
16
+ expr: (raw, alias) => next({ items: [...s.items, { kind: 'expr', raw, alias }] }),
17
+ where: (col, op, value) => next({ wheres: [...s.wheres, { col, op, value, connector: 'AND' }] }),
18
+ orWhere: (col, op, value) => next({ wheres: [...s.wheres, { col, op, value, connector: 'OR' }] }),
19
+ whereGroup: predicates => next({ wheres: [...s.wheres, { kind: 'group', predicates, connector: 'AND' }] }),
20
+ groupBy: (...cols) => next({ groups: [...s.groups, ...cols] }),
21
+ having: (col, op, value) => next({ havings: [...s.havings, { col, op, value }] }),
22
+ compile: () => {
23
+ const params = [];
24
+ const cols = s.items.map(it => {
25
+ if (it.kind === 'col') {
26
+ const m = /^(\S+)\s+as\s+(\S+)$/i.exec(it.col.trim());
27
+ if (m && m[1] && m[2])
28
+ return `${quoteColumn(d, m[1])} AS ${quoteIdentifier(d, m[2])}`;
29
+ if (it.col.includes('.') && !it.col.toLowerCase().startsWith(`${s.table.toLowerCase()}.`)) {
30
+ return `${quoteColumn(d, it.col)} AS ${quoteIdentifier(d, it.col)}`;
31
+ }
32
+ return quoteColumn(d, it.col);
33
+ }
34
+ if (it.kind === 'agg')
35
+ return `${it.fn}(${quoteColumn(d, it.col)}) AS ${quoteIdentifier(d, it.alias)}`;
36
+ return `${it.raw} AS ${quoteIdentifier(d, it.alias)}`;
37
+ });
38
+ const groupBy = s.groups.length > 0 ? ` GROUP BY ${s.groups.map(c => quoteColumn(d, c)).join(', ')}` : '';
39
+ const text = `SELECT ${cols.join(', ')} FROM ${quoteTable(d, s.table)}` +
40
+ joinClauses(d, s.joins, params) +
41
+ whereClause(d, s.wheres, params) +
42
+ groupBy +
43
+ havingClause(d, s.havings, params) +
44
+ tailClause(d, s);
45
+ return frozenQuery(text, params, queryTelemetry(d, 'SELECT', s.table, telemetry));
46
+ },
47
+ };
48
+ }
49
+ export function aggregateSelectFrom(table, dialect, options) {
50
+ return make(dialect, { table, items: [], joins: [], wheres: [], groups: [], havings: [], orderBys: [] }, options?.telemetry === true);
51
+ }
52
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/aggregations/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { type DialectTarget } from './dialects/index.js';
2
+ import { type SpatialPredicateNode } from './extensions/index.js';
3
+ import { type CompiledQuery, type QueryTelemetry } from './index.js';
4
+ export type JoinKind = 'inner' | 'left' | 'right';
5
+ export interface JoinCondition {
6
+ readonly leftCol: string;
7
+ readonly rightCol: string;
8
+ }
9
+ export interface JoinSpec {
10
+ readonly kind: JoinKind;
11
+ readonly target: string;
12
+ readonly conditions: readonly JoinCondition[];
13
+ /** Predicates that belong to this target and therefore stay in the ON clause. */
14
+ readonly on?: readonly Predicate[];
15
+ }
16
+ /**
17
+ * One comparison in a WHERE or HAVING list. `connector` says how it attaches to
18
+ * the predicate before it and is ignored on the first one; builders that only
19
+ * ever conjoin can leave it out.
20
+ */
21
+ export interface ComparisonPredicate {
22
+ readonly kind?: 'comparison';
23
+ readonly col: string;
24
+ readonly op: string;
25
+ readonly value: unknown;
26
+ readonly connector?: 'AND' | 'OR' | undefined;
27
+ }
28
+ /** One parenthesized predicate list, attached to the surrounding list by `connector`. */
29
+ export interface PredicateGroup {
30
+ readonly kind: 'group';
31
+ readonly predicates: readonly Predicate[];
32
+ readonly connector?: 'AND' | 'OR' | undefined;
33
+ }
34
+ export type Predicate = ComparisonPredicate | SpatialPredicateNode | PredicateGroup;
35
+ export interface Tail<C = string> {
36
+ readonly orderBys?: readonly {
37
+ readonly col: C;
38
+ readonly dir: 'asc' | 'desc';
39
+ }[] | undefined;
40
+ readonly limitN?: number | undefined;
41
+ readonly offsetN?: number | undefined;
42
+ /** Used by builders that render a richer ORDER BY expression before delegating pagination. */
43
+ readonly ordered?: boolean | undefined;
44
+ }
45
+ export declare const OP_MAP: Readonly<Record<string, string>>;
46
+ /**
47
+ * Anything with a `compile()` — a builder from this package, or a caller's own.
48
+ *
49
+ * boundary: the cast is inside the guard that the rest of the package relies on, and it
50
+ * reads the one property the `in` check on the line above has just proven is there. Its
51
+ * type is `unknown`, so the `typeof` is what establishes anything; a narrower cast would be
52
+ * the claim this function exists to test.
53
+ */
54
+ export declare function isSubqueryTarget(value: unknown): value is {
55
+ compile(): CompiledQuery;
56
+ };
57
+ /**
58
+ * Normalizes known operators to canonical SQL keywords and admits an unmapped
59
+ * operator only when it is one bounded SQL token.
60
+ */
61
+ export declare function sqlOperator(op: string, dialect: DialectTarget): string;
62
+ /** `col op $n`, or `EXISTS (…)` / `col op (…)` when the value is a subquery. */
63
+ export declare function renderPredicate(dialect: DialectTarget, p: Predicate, params: unknown[]): string;
64
+ /** ` WHERE …`, appending each predicate's parameters to `params` in order. */
65
+ export declare function whereClause(dialect: DialectTarget, preds: readonly Predicate[], params: unknown[]): string;
66
+ /** ` HAVING …` — same rendering as WHERE, which is why they share a code path. */
67
+ export declare function havingClause(dialect: DialectTarget, preds: readonly Predicate[], params: unknown[]): string;
68
+ /** ` INNER JOIN … ON … = … [AND … = …] [AND …]` for each join, in order. */
69
+ export declare function joinClauses(dialect: DialectTarget, joins: readonly JoinSpec[], params?: unknown[]): string;
70
+ /**
71
+ * ` ORDER BY … LIMIT n OFFSET n`. LIMIT and OFFSET are interpolated rather than
72
+ * parameterized because they are numbers this package produced, never caller
73
+ * strings — the builders' `limit`/`offset` take `number`.
74
+ */
75
+ export declare function tailClause(dialect: DialectTarget, tail: Tail): string;
76
+ /** Every `compile()` in this package returns this shape, frozen at both levels. */
77
+ export declare function frozenQuery(text: string, params: readonly unknown[], telemetry?: QueryTelemetry): CompiledQuery;
78
+ /** Compile-known database attributes, absent when telemetry was not requested. */
79
+ export declare function queryTelemetry(dialect: DialectTarget, operation: QueryTelemetry['operation'], collection: string, enabled: boolean): QueryTelemetry | undefined;
80
+ /**
81
+ * What {@link tailMethods} passes to a builder's `next`. Deliberately not
82
+ * `Partial<Tail>`: under `exactOptionalPropertyTypes` an optional property that
83
+ * also admits `undefined` is not assignable to one that doesn't, and no
84
+ * builder's state wants an explicit `undefined` written over its array.
85
+ */
86
+ export interface TailPatch<C = string> {
87
+ readonly orderBys?: readonly {
88
+ readonly col: C;
89
+ readonly dir: 'asc' | 'desc';
90
+ }[];
91
+ readonly limitN?: number;
92
+ readonly offsetN?: number;
93
+ }
94
+ /** `orderBy` / `limit` / `offset`, for any state carrying a {@link Tail}. */
95
+ export declare function tailMethods<C, B>(tail: Tail<C>, next: (patch: TailPatch<C>) => B): {
96
+ orderBy: (col: C, dir: 'asc' | 'desc') => B;
97
+ limit: (n: number) => B;
98
+ offset: (n: number) => B;
99
+ };
100
+ export interface JoinMethod<B> {
101
+ (target: string, leftCol: string, rightCol: string, on?: readonly Predicate[]): B;
102
+ (target: string, conditions: readonly JoinCondition[], on?: readonly Predicate[]): B;
103
+ }
104
+ /** `innerJoin` / `leftJoin` / `rightJoin`, for any state carrying a join list. */
105
+ export declare function joinMethods<B>(joins: readonly JoinSpec[], next: (patch: {
106
+ joins: readonly JoinSpec[];
107
+ }) => B): {
108
+ innerJoin: JoinMethod<B>;
109
+ leftJoin: JoinMethod<B>;
110
+ rightJoin: JoinMethod<B>;
111
+ };
112
+ //# sourceMappingURL=clauses.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clauses.d.ts","sourceRoot":"","sources":["../src/clauses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ // Clause rendering shared by every builder in this package.
2
+ //
3
+ // SELECT, the join builder, the aggregate builder, FTS, UPDATE and DELETE all
4
+ // have to turn the same three things into SQL: a predicate list, a join list,
5
+ // and the ORDER BY / LIMIT / OFFSET tail. Each builder used to carry its own
6
+ // copy, and the copies had drifted: the aggregate builder's `having` understood
7
+ // a subquery but its `where` pushed the builder object into the parameter list
8
+ // as if it were a value, and three of them reimplemented `renumberPlaceholders`
9
+ // inline rather than importing the one in ./quoting.ts.
10
+ //
11
+ // Everything here appends its own leading space and returns '' when it has
12
+ // nothing to render, so callers concatenate unconditionally.
13
+ import { dialectName, dialectTraits } from './dialects/index.js';
14
+ import { UnsupportedFeatureError } from './errors.js';
15
+ import { DISTANCE_OPERATORS, encodePgVector, isDistanceOp, renderSpatialPredicate, } from './extensions/index.js';
16
+ import {} from './index.js';
17
+ import { formatPlaceholder, quoteColumn, quoteTable, renumberPlaceholders, unaliasedTable } from './quoting.js';
18
+ const JOIN_KEYWORD = {
19
+ inner: 'INNER JOIN',
20
+ left: 'LEFT JOIN',
21
+ right: 'RIGHT JOIN',
22
+ };
23
+ // Object.create(null) prevents prototype inheritance so an operator named 'constructor' cannot resolve through Object.prototype.
24
+ export const OP_MAP = Object.freeze(Object.assign(Object.create(null), {
25
+ '=': '=',
26
+ '!=': '!=',
27
+ '<': '<',
28
+ '<=': '<=',
29
+ '>': '>',
30
+ '>=': '>=',
31
+ like: 'LIKE',
32
+ ilike: 'ILIKE',
33
+ in: 'IN',
34
+ 'not in': 'NOT IN',
35
+ nin: 'NOT IN',
36
+ exists: 'EXISTS',
37
+ 'not exists': 'NOT EXISTS',
38
+ 'is null': 'IS NULL',
39
+ 'is not null': 'IS NOT NULL',
40
+ ...DISTANCE_OPERATORS,
41
+ }));
42
+ /**
43
+ * The lexical shape of an operator the compiler does not know by name.
44
+ *
45
+ * This is deliberately not a dialect/operator allowlist: PostgreSQL extensions,
46
+ * SQLite GLOB, MySQL's null-safe equality and SQL Server's !< all remain usable.
47
+ * It is only the boundary between one SQL token and caller-controlled SQL text.
48
+ *
49
+ * `--` is excluded even though `-` is needed by real operators such as `->>`.
50
+ * `#` is restricted to PostgreSQL's `#>` / `#>>`; a bare hash starts a MySQL
51
+ * line comment. Placeholder markers are excluded on the dialects where they
52
+ * would be parsed as parameters. Slash is absent, so block-comment openers
53
+ * cannot be formed.
54
+ */
55
+ function isUnmappedOperatorToken(op, dialect) {
56
+ return dialectTraits(dialect).acceptsOperator(op);
57
+ }
58
+ /**
59
+ * Anything with a `compile()` — a builder from this package, or a caller's own.
60
+ *
61
+ * boundary: the cast is inside the guard that the rest of the package relies on, and it
62
+ * reads the one property the `in` check on the line above has just proven is there. Its
63
+ * type is `unknown`, so the `typeof` is what establishes anything; a narrower cast would be
64
+ * the claim this function exists to test.
65
+ */
66
+ export function isSubqueryTarget(value) {
67
+ return (value !== null &&
68
+ typeof value === 'object' &&
69
+ 'compile' in value &&
70
+ typeof value.compile === 'function');
71
+ }
72
+ /**
73
+ * Normalizes known operators to canonical SQL keywords and admits an unmapped
74
+ * operator only when it is one bounded SQL token.
75
+ */
76
+ export function sqlOperator(op, dialect) {
77
+ const normalized = op.toLowerCase().trim();
78
+ if (isDistanceOp(normalized) && !dialectTraits(dialect).vectorDistance) {
79
+ throw new UnsupportedFeatureError(normalized, dialectName(dialect));
80
+ }
81
+ // A plain index read, and no own-property guard: `OP_MAP` has a null prototype, so
82
+ // `OP_MAP['constructor']` is already `undefined` rather than a function off
83
+ // `Object.prototype`. That is what makes `??` safe here, and it is why the map is built
84
+ // the way it is.
85
+ const mapped = OP_MAP[normalized];
86
+ if (mapped !== undefined)
87
+ return mapped;
88
+ if (!isUnmappedOperatorToken(op, dialect)) {
89
+ const name = dialectName(dialect);
90
+ throw new TypeError(`invalid unmapped SQL operator ${JSON.stringify(op)} for dialect ${JSON.stringify(name)}; expected ` +
91
+ 'one non-comment operator token that does not conflict with the dialect placeholder syntax');
92
+ }
93
+ return op;
94
+ }
95
+ /** `col op $n`, or `EXISTS (…)` / `col op (…)` when the value is a subquery. */
96
+ export function renderPredicate(dialect, p, params) {
97
+ if (p.kind === 'group') {
98
+ if (p.predicates.length === 0)
99
+ throw new TypeError('predicate groups must not be empty');
100
+ return `(${predicateList(dialect, p.predicates, params)})`;
101
+ }
102
+ if (p.kind === 'spatial')
103
+ return renderSpatialPredicate(dialect, p, params);
104
+ const normalized = p.op.toLowerCase().trim();
105
+ const sqlOp = sqlOperator(p.op, dialect);
106
+ if (sqlOp === 'IS NULL' || sqlOp === 'IS NOT NULL') {
107
+ return `${quoteColumn(dialect, p.col)} ${sqlOp}`;
108
+ }
109
+ if (isDistanceOp(normalized)) {
110
+ params.push(encodePgVector(p.value));
111
+ return `${quoteColumn(dialect, p.col)} ${sqlOp} ${formatPlaceholder(dialect, params.length)}`;
112
+ }
113
+ if (sqlOp === 'IS NULL' || sqlOp === 'IS NOT NULL') {
114
+ return `${quoteColumn(dialect, p.col)} ${sqlOp}`;
115
+ }
116
+ if (isSubqueryTarget(p.value)) {
117
+ const sub = p.value.compile();
118
+ // Continue the outer statement's numbering. Positional placeholders are a
119
+ // no-op here, so the order of the pushes below is what matters.
120
+ const text = renumberPlaceholders(sub.text, params.length, dialect);
121
+ params.push(...sub.parameters);
122
+ if (sqlOp === 'EXISTS')
123
+ return `EXISTS (${text})`;
124
+ if (sqlOp === 'NOT EXISTS')
125
+ return `NOT EXISTS (${text})`;
126
+ return `${quoteColumn(dialect, p.col)} ${sqlOp} (${text})`;
127
+ }
128
+ if (sqlOp === 'IN' || sqlOp === 'NOT IN') {
129
+ const isNotIn = sqlOp === 'NOT IN';
130
+ let arr = Array.isArray(p.value) ? p.value : [p.value];
131
+ if (isNotIn) {
132
+ arr = arr.filter(item => item !== null && item !== undefined);
133
+ }
134
+ if (arr.length === 0) {
135
+ return isNotIn ? '1 = 1' : '1 = 0';
136
+ }
137
+ const placeholders = arr
138
+ .map(item => {
139
+ params.push(item);
140
+ return formatPlaceholder(dialect, params.length);
141
+ })
142
+ .join(', ');
143
+ return `${quoteColumn(dialect, p.col)} ${sqlOp} (${placeholders})`;
144
+ }
145
+ params.push(p.value);
146
+ return `${quoteColumn(dialect, p.col)} ${sqlOp} ${formatPlaceholder(dialect, params.length)}`;
147
+ }
148
+ function predicateList(dialect, preds, params) {
149
+ return preds
150
+ .map((p, i) => {
151
+ const cond = renderPredicate(dialect, p, params);
152
+ return i === 0 ? cond : `${p.connector ?? 'AND'} ${cond}`;
153
+ })
154
+ .join(' ');
155
+ }
156
+ /** ` WHERE …`, appending each predicate's parameters to `params` in order. */
157
+ export function whereClause(dialect, preds, params) {
158
+ if (preds.length === 0)
159
+ return '';
160
+ return ` WHERE ${predicateList(dialect, preds, params)}`;
161
+ }
162
+ /** ` HAVING …` — same rendering as WHERE, which is why they share a code path. */
163
+ export function havingClause(dialect, preds, params) {
164
+ if (preds.length === 0)
165
+ return '';
166
+ return ` HAVING ${predicateList(dialect, preds, params)}`;
167
+ }
168
+ /** ` INNER JOIN … ON … = … [AND … = …] [AND …]` for each join, in order. */
169
+ export function joinClauses(dialect, joins, params = []) {
170
+ return joins
171
+ .map(j => {
172
+ const conditions = j.conditions
173
+ .map(condition => `${quoteColumn(dialect, condition.leftCol)} = ${quoteColumn(dialect, condition.rightCol)}`)
174
+ .join(' AND ');
175
+ const targetPredicates = j.on === undefined || j.on.length === 0
176
+ ? ''
177
+ : j.on
178
+ .map((predicate, index) => {
179
+ const rendered = renderPredicate(dialect, predicate, params);
180
+ return `${index === 0 ? 'AND' : (predicate.connector ?? 'AND')} ${rendered}`;
181
+ })
182
+ .join(' ');
183
+ return (` ${JOIN_KEYWORD[j.kind]} ${quoteTable(dialect, j.target)} ` +
184
+ `ON ${conditions}` +
185
+ (targetPredicates.length === 0 ? '' : ` ${targetPredicates}`));
186
+ })
187
+ .join('');
188
+ }
189
+ /**
190
+ * ` ORDER BY … LIMIT n OFFSET n`. LIMIT and OFFSET are interpolated rather than
191
+ * parameterized because they are numbers this package produced, never caller
192
+ * strings — the builders' `limit`/`offset` take `number`.
193
+ */
194
+ export function tailClause(dialect, tail) {
195
+ let text = '';
196
+ const rendersOrderBy = tail.orderBys !== undefined && tail.orderBys.length > 0;
197
+ const ordered = tail.ordered ?? rendersOrderBy;
198
+ if (rendersOrderBy) {
199
+ const ob = tail.orderBys.map(o => `${quoteColumn(dialect, o.col)} ${o.dir.toUpperCase()}`).join(', ');
200
+ text += ` ORDER BY ${ob}`;
201
+ }
202
+ text += dialectTraits(dialect).paginate({
203
+ ...(tail.limitN === undefined ? {} : { limit: tail.limitN }),
204
+ ...(tail.offsetN === undefined ? {} : { offset: tail.offsetN }),
205
+ ordered,
206
+ });
207
+ return text;
208
+ }
209
+ /** Every `compile()` in this package returns this shape, frozen at both levels. */
210
+ export function frozenQuery(text, params, telemetry) {
211
+ const parameters = Object.freeze([...params]);
212
+ return telemetry === undefined ? Object.freeze({ text, parameters }) : Object.freeze({ text, parameters, telemetry });
213
+ }
214
+ /** Compile-known database attributes, absent when telemetry was not requested. */
215
+ export function queryTelemetry(dialect, operation, collection, enabled) {
216
+ if (!enabled)
217
+ return undefined;
218
+ return Object.freeze({
219
+ system: dialect.telemetrySystem,
220
+ operation,
221
+ collection: unaliasedTable(collection),
222
+ });
223
+ }
224
+ /** `orderBy` / `limit` / `offset`, for any state carrying a {@link Tail}. */
225
+ export function tailMethods(tail, next) {
226
+ return {
227
+ orderBy: (col, dir) => next({ orderBys: [...(tail.orderBys ?? []), { col, dir }] }),
228
+ limit: (n) => next({ limitN: n }),
229
+ offset: (n) => next({ offsetN: n }),
230
+ };
231
+ }
232
+ /** `innerJoin` / `leftJoin` / `rightJoin`, for any state carrying a join list. */
233
+ export function joinMethods(joins, next) {
234
+ const add = (kind) => {
235
+ function join(target, leftColOrConditions, rightColOrOn, scalarOn) {
236
+ const conditions = typeof leftColOrConditions === 'string'
237
+ ? typeof rightColOrOn === 'string'
238
+ ? [{ leftCol: leftColOrConditions, rightCol: rightColOrOn }]
239
+ : []
240
+ : leftColOrConditions;
241
+ if (conditions.length === 0) {
242
+ throw new RangeError(`join "${target}" needs at least one ON condition`);
243
+ }
244
+ const on = typeof leftColOrConditions === 'string' ? scalarOn : rightColOrOn;
245
+ if (on !== undefined && typeof on === 'string') {
246
+ throw new TypeError(`join "${target}" received an invalid ON predicate list`);
247
+ }
248
+ return next({
249
+ joins: [
250
+ ...joins,
251
+ {
252
+ kind,
253
+ target,
254
+ conditions: conditions.map(condition => ({
255
+ leftCol: condition.leftCol,
256
+ rightCol: condition.rightCol,
257
+ })),
258
+ ...(on === undefined ? {} : { on }),
259
+ },
260
+ ],
261
+ });
262
+ }
263
+ return join;
264
+ };
265
+ return { innerJoin: add('inner'), leftJoin: add('left'), rightJoin: add('right') };
266
+ }
267
+ //# sourceMappingURL=clauses.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clauses.js","sourceRoot":"","sources":["../src/clauses.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type CompiledQuery } from '../index.js';
2
+ /** The closed sqlcommenter key set. */
3
+ export type CommentKey = 'traceparent' | 'controller' | 'action' | 'route' | 'framework';
4
+ /** Values available to one query execution. */
5
+ export type CommentPairs = Readonly<Partial<Record<CommentKey, string>>>;
6
+ /** A non-empty configured key list: absence, not an empty list, means off. */
7
+ export type CommentKeys = readonly [CommentKey, ...CommentKey[]];
8
+ interface ExecuteOptions {
9
+ readonly signal?: AbortSignal;
10
+ readonly batchSize?: number;
11
+ }
12
+ /** Serialize the inside of a sqlcommenter block in deterministic key order. */
13
+ export declare function serializeComment(pairs: CommentPairs): string;
14
+ /** Append one trailing sqlcommenter block, or return the original text unchanged. */
15
+ export declare function appendComment(text: string, pairs: CommentPairs): string;
16
+ /**
17
+ * Render request-scoped comments at execution time without mutating or widening
18
+ * the reusable compiled query.
19
+ */
20
+ export declare function withComments<D extends {
21
+ execute(query: CompiledQuery, options?: ExecuteOptions): Promise<readonly Record<string, unknown>[]>;
22
+ }>(driver: D, pairs: () => CommentPairs): D & {
23
+ execute(query: CompiledQuery, options?: ExecuteOptions): Promise<readonly Record<string, unknown>[]>;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/comments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,uCAAuC;AACvC,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,CAAC;AAEzF,+CAA+C;AAC/C,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAEzE,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;AAEjE,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAK5D;AAED,qFAAqF;AACrF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAGvE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,CAAC,SAAS;IACR,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;CACtG,EACD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY;mBAGnB,aAAa,YAAY,cAAc,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;EAKvG"}
@@ -0,0 +1,28 @@
1
+ import {} from '../index.js';
2
+ const encode = (value) => encodeURIComponent(value).replace(/'/g, "\\'");
3
+ /** Serialize the inside of a sqlcommenter block in deterministic key order. */
4
+ export function serializeComment(pairs) {
5
+ return Object.entries(pairs)
6
+ .toSorted(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
7
+ .map(([key, value]) => `${encode(key)}='${encode(value)}'`)
8
+ .join(',');
9
+ }
10
+ /** Append one trailing sqlcommenter block, or return the original text unchanged. */
11
+ export function appendComment(text, pairs) {
12
+ const serialized = serializeComment(pairs);
13
+ return serialized.length === 0 ? text : `${text} /*${serialized}*/`;
14
+ }
15
+ /**
16
+ * Render request-scoped comments at execution time without mutating or widening
17
+ * the reusable compiled query.
18
+ */
19
+ export function withComments(driver, pairs) {
20
+ return {
21
+ ...driver,
22
+ execute(query, options) {
23
+ const text = appendComment(query.text, pairs());
24
+ return driver.execute(text === query.text ? query : { ...query, text }, options);
25
+ },
26
+ };
27
+ }
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/comments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,MAAM,aAAa,CAAC;AAgBjD,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEzF,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACzE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;SAC1D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,KAAmB;IAC7D,MAAM,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,UAAU,IAAI,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAI1B,MAAS,EAAE,KAAyB;IACpC,OAAO;QACL,GAAG,MAAM;QACT,OAAO,CAAC,KAAoB,EAAE,OAAwB;YACpD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACnF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface CompiledQuery {
2
+ readonly text: string;
3
+ readonly parameters: readonly unknown[];
4
+ readonly telemetry?: QueryTelemetry;
5
+ }
6
+ /** Compile-time database attributes consumed by tracing and metrics. */
7
+ export interface QueryTelemetry {
8
+ readonly system: string;
9
+ readonly operation: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
10
+ readonly collection: string;
11
+ }
12
+ //# sourceMappingURL=compiled-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiled-query.d.ts","sourceRoot":"","sources":["../src/compiled-query.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;CACrC;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC9D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compiled-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compiled-query.js","sourceRoot":"","sources":["../src/compiled-query.ts"],"names":[],"mappings":""}