@prisma-next/adapter-postgres 0.4.1 → 0.4.3

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 (59) hide show
  1. package/README.md +21 -15
  2. package/dist/adapter-_L4wXA4O.mjs +64 -0
  3. package/dist/adapter-_L4wXA4O.mjs.map +1 -0
  4. package/dist/adapter.d.mts +3 -8
  5. package/dist/adapter.d.mts.map +1 -1
  6. package/dist/adapter.mjs +1 -1
  7. package/dist/column-types.d.mts +15 -23
  8. package/dist/column-types.d.mts.map +1 -1
  9. package/dist/column-types.mjs +15 -58
  10. package/dist/column-types.mjs.map +1 -1
  11. package/dist/control.d.mts +73 -67
  12. package/dist/control.d.mts.map +1 -1
  13. package/dist/control.mjs +59 -162
  14. package/dist/control.mjs.map +1 -1
  15. package/dist/{descriptor-meta-BB9XPAFi.mjs → descriptor-meta-Dxnoq_rr.mjs} +27 -26
  16. package/dist/descriptor-meta-Dxnoq_rr.mjs.map +1 -0
  17. package/dist/operation-types.d.mts +11 -10
  18. package/dist/operation-types.d.mts.map +1 -1
  19. package/dist/runtime.d.mts +3 -11
  20. package/dist/runtime.d.mts.map +1 -1
  21. package/dist/runtime.mjs +23 -66
  22. package/dist/runtime.mjs.map +1 -1
  23. package/dist/{adapter-Du9Hr9Rl.mjs → sql-renderer-DLwYpnxz.mjs} +176 -113
  24. package/dist/sql-renderer-DLwYpnxz.mjs.map +1 -0
  25. package/dist/{types-TyL62f9Y.d.mts → types-tLtmYqCO.d.mts} +12 -1
  26. package/dist/types-tLtmYqCO.d.mts.map +1 -0
  27. package/dist/types.d.mts +1 -1
  28. package/package.json +22 -18
  29. package/src/core/adapter.ts +13 -626
  30. package/src/core/codec-lookup.ts +24 -0
  31. package/src/core/control-adapter.ts +88 -47
  32. package/src/core/descriptor-meta.ts +34 -16
  33. package/src/core/enum-control-hooks.ts +7 -2
  34. package/src/core/sql-renderer.ts +778 -0
  35. package/src/core/types.ts +11 -0
  36. package/src/exports/column-types.ts +14 -59
  37. package/src/exports/control.ts +11 -5
  38. package/src/exports/runtime.ts +29 -42
  39. package/src/types/operation-types.ts +19 -9
  40. package/dist/adapter-Du9Hr9Rl.mjs.map +0 -1
  41. package/dist/codec-ids-5g4Gwrgm.mjs +0 -29
  42. package/dist/codec-ids-5g4Gwrgm.mjs.map +0 -1
  43. package/dist/codec-types.d.mts +0 -107
  44. package/dist/codec-types.d.mts.map +0 -1
  45. package/dist/codec-types.mjs +0 -3
  46. package/dist/codecs-DiPlMi3-.mjs +0 -385
  47. package/dist/codecs-DiPlMi3-.mjs.map +0 -1
  48. package/dist/descriptor-meta-BB9XPAFi.mjs.map +0 -1
  49. package/dist/sql-utils-DkUJyZmA.mjs +0 -78
  50. package/dist/sql-utils-DkUJyZmA.mjs.map +0 -1
  51. package/dist/types-TyL62f9Y.d.mts.map +0 -1
  52. package/src/core/codec-ids.ts +0 -30
  53. package/src/core/codecs.ts +0 -645
  54. package/src/core/default-normalizer.ts +0 -145
  55. package/src/core/json-schema-type-expression.ts +0 -131
  56. package/src/core/json-schema-validator.ts +0 -53
  57. package/src/core/sql-utils.ts +0 -111
  58. package/src/core/standard-schema.ts +0 -71
  59. package/src/exports/codec-types.ts +0 -44
@@ -1,98 +1,115 @@
1
- import { m as PG_JSON_CODEC_ID, p as PG_JSONB_CODEC_ID } from "./codec-ids-5g4Gwrgm.mjs";
2
- import { t as codecDefinitions } from "./codecs-DiPlMi3-.mjs";
3
- import { i as quoteIdentifier, n as escapeLiteral } from "./sql-utils-DkUJyZmA.mjs";
4
- import { LiteralExpr, createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
5
- import { ifDefined } from "@prisma-next/utils/defined";
1
+ import { LiteralExpr, collectOrderedParamRefs } from "@prisma-next/sql-relational-core/ast";
2
+ import { codecDefinitions } from "@prisma-next/target-postgres/codecs";
3
+ import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
6
4
 
7
- //#region src/core/adapter.ts
8
- const VECTOR_CODEC_ID = "pg/vector@1";
9
- function getCodecParamCast(codecId) {
10
- if (codecId === VECTOR_CODEC_ID) return "vector";
11
- if (codecId === PG_JSON_CODEC_ID) return "json";
12
- if (codecId === PG_JSONB_CODEC_ID) return "jsonb";
5
+ //#region src/core/codec-lookup.ts
6
+ /**
7
+ * Build a {@link CodecLookup} populated with the Postgres-builtin codec
8
+ * definitions only.
9
+ *
10
+ * This is the default lookup used by `createPostgresAdapter()` and
11
+ * `new PostgresControlAdapter()` when called without a stack-derived lookup
12
+ * (e.g. from tests, or one-off scripts that don't compose a full stack).
13
+ *
14
+ * Extension codecs (e.g. `pg/vector@1` from `@prisma-next/extension-pgvector`)
15
+ * are intentionally NOT included here: a bare adapter cannot see extensions.
16
+ * Stack-composed paths (`SqlControlAdapterDescriptor.create(stack)` /
17
+ * `SqlRuntimeAdapterDescriptor.create(stack)`) supply the broader,
18
+ * extension-inclusive lookup at construction time.
19
+ */
20
+ function createPostgresBuiltinCodecLookup() {
21
+ const byId = /* @__PURE__ */ new Map();
22
+ for (const definition of Object.values(codecDefinitions)) byId.set(definition.codec.id, definition.codec);
23
+ return { get: (id) => byId.get(id) };
13
24
  }
14
- function renderTypedParam(index, codecId) {
15
- const cast = getCodecParamCast(codecId);
16
- return cast ? `$${index}::${cast}` : `$${index}`;
25
+
26
+ //#endregion
27
+ //#region src/core/sql-renderer.ts
28
+ /**
29
+ * Postgres native types whose unknown-OID parameter inference is reliable in
30
+ * arbitrary expression positions. Parameters bound to a codec whose
31
+ * `meta.db.sql.postgres.nativeType` falls in this set are emitted as plain
32
+ * `$N`; everything else (including `json`, `jsonb`, extension types like
33
+ * `vector`, and unknown user types) is emitted as `$N::<nativeType>` so the
34
+ * planner picks an unambiguous overload.
35
+ *
36
+ * `json` / `jsonb` are intentionally excluded despite being Postgres builtins:
37
+ * their operator overloads make context inference unreliable in expression
38
+ * positions (e.g. `$1 -> 'key'` is ambiguous between the two).
39
+ *
40
+ * Spellings match the on-disk `meta.db.sql.postgres.nativeType` values in
41
+ * `@prisma-next/target-postgres`'s codec definitions, not the `udt_name`
42
+ * abbreviations that ADR 205 used as illustrative shorthand. The lookup-based
43
+ * cast policy compares against these strings directly.
44
+ */
45
+ const POSTGRES_INFERRABLE_NATIVE_TYPES = new Set([
46
+ "integer",
47
+ "smallint",
48
+ "bigint",
49
+ "real",
50
+ "double precision",
51
+ "numeric",
52
+ "boolean",
53
+ "text",
54
+ "character",
55
+ "character varying",
56
+ "timestamp",
57
+ "timestamp without time zone",
58
+ "timestamp with time zone",
59
+ "time",
60
+ "timetz",
61
+ "interval",
62
+ "bit",
63
+ "bit varying"
64
+ ]);
65
+ function renderTypedParam(index, codecId, codecLookup) {
66
+ if (codecId === void 0) return `$${index}`;
67
+ const codec = codecLookup.get(codecId);
68
+ if (codec === void 0) throw new Error(`Postgres lowering: ParamRef carries codecId "${codecId}" but the assembled codec lookup has no entry for it. This usually indicates a missing extension pack in the runtime stack — register the pack that contributes this codec (e.g. \`extensionPacks: [pgvectorRuntime]\`), or use the codec directly from \`@prisma-next/target-postgres/codecs\` if it's a builtin.`);
69
+ const nativeType = codec.meta?.db?.sql?.postgres?.nativeType;
70
+ if (nativeType !== void 0 && !POSTGRES_INFERRABLE_NATIVE_TYPES.has(nativeType)) return `$${index}::${nativeType}`;
71
+ return `$${index}`;
17
72
  }
18
- const defaultCapabilities = Object.freeze({
19
- postgres: {
20
- orderBy: true,
21
- limit: true,
22
- lateral: true,
23
- jsonAgg: true,
24
- returning: true
25
- },
26
- sql: {
27
- enums: true,
28
- returning: true,
29
- defaultInInsert: true
30
- }
31
- });
32
- const parameterizedCodecs = Object.values(codecDefinitions).map((definition) => definition.codec).filter((codec$1) => codec$1.paramsSchema !== void 0).map((codec$1) => Object.freeze({
33
- codecId: codec$1.id,
34
- paramsSchema: codec$1.paramsSchema,
35
- ...ifDefined("init", codec$1.init)
36
- }));
37
- var PostgresAdapterImpl = class {
38
- familyId = "sql";
39
- targetId = "postgres";
40
- profile;
41
- codecRegistry = (() => {
42
- const registry = createCodecRegistry();
43
- for (const definition of Object.values(codecDefinitions)) registry.register(definition.codec);
44
- return registry;
45
- })();
46
- constructor(options) {
47
- this.profile = Object.freeze({
48
- id: options?.profileId ?? "postgres/default@1",
49
- target: "postgres",
50
- capabilities: defaultCapabilities,
51
- codecs: () => this.codecRegistry,
52
- readMarkerStatement: () => ({
53
- sql: "select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta from prisma_contract.marker where id = $1",
54
- params: [1]
55
- })
56
- });
57
- }
58
- parameterizedCodecs() {
59
- return parameterizedCodecs;
60
- }
61
- lower(ast, context) {
62
- const collectedParamRefs = ast.collectParamRefs();
63
- const paramIndexMap = /* @__PURE__ */ new Map();
64
- const params = [];
65
- for (const ref of collectedParamRefs) {
66
- if (paramIndexMap.has(ref)) continue;
67
- paramIndexMap.set(ref, params.length + 1);
68
- params.push(ref.value);
69
- }
70
- let sql;
71
- const node = ast;
72
- switch (node.kind) {
73
- case "select":
74
- sql = renderSelect(node, context.contract, paramIndexMap);
75
- break;
76
- case "insert":
77
- sql = renderInsert(node, context.contract, paramIndexMap);
78
- break;
79
- case "update":
80
- sql = renderUpdate(node, context.contract, paramIndexMap);
81
- break;
82
- case "delete":
83
- sql = renderDelete(node, context.contract, paramIndexMap);
84
- break;
85
- default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
86
- }
87
- return Object.freeze({
88
- profileId: this.profile.id,
89
- body: Object.freeze({
90
- sql,
91
- params
92
- })
93
- });
73
+ /**
74
+ * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
75
+ *
76
+ * Shared between the runtime (`PostgresAdapterImpl.lower`) and control
77
+ * (`PostgresControlAdapter.lower`) entrypoints so emit-time and run-time
78
+ * paths produce byte-identical output for the same AST.
79
+ */
80
+ function renderLoweredSql(ast, contract, codecLookup) {
81
+ const orderedRefs = collectOrderedParamRefs(ast);
82
+ const indexMap = /* @__PURE__ */ new Map();
83
+ const params = orderedRefs.map((ref, i) => {
84
+ indexMap.set(ref, i + 1);
85
+ return ref.value;
86
+ });
87
+ const pim = {
88
+ indexMap,
89
+ codecLookup
90
+ };
91
+ const node = ast;
92
+ let sql;
93
+ switch (node.kind) {
94
+ case "select":
95
+ sql = renderSelect(node, contract, pim);
96
+ break;
97
+ case "insert":
98
+ sql = renderInsert(node, contract, pim);
99
+ break;
100
+ case "update":
101
+ sql = renderUpdate(node, contract, pim);
102
+ break;
103
+ case "delete":
104
+ sql = renderDelete(node, contract, pim);
105
+ break;
106
+ default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
94
107
  }
95
- };
108
+ return Object.freeze({
109
+ sql,
110
+ params: Object.freeze(params)
111
+ });
112
+ }
96
113
  function renderSelect(ast, contract, pim) {
97
114
  return [
98
115
  `SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(ast.projection, contract, pim)}`,
@@ -115,6 +132,16 @@ function renderProjection(projection, contract, pim) {
115
132
  return `${renderExpr(item.expr, contract, pim)} AS ${alias}`;
116
133
  }).join(", ");
117
134
  }
135
+ function renderReturning(items, contract, pim) {
136
+ return items.map((item) => {
137
+ if (item.expr.kind === "column-ref") {
138
+ const rendered = renderColumn(item.expr);
139
+ return item.expr.column === item.alias ? rendered : `${rendered} AS ${quoteIdentifier(item.alias)}`;
140
+ }
141
+ if (item.expr.kind === "literal") return `${renderLiteral(item.expr)} AS ${quoteIdentifier(item.alias)}`;
142
+ return `${renderExpr(item.expr, contract, pim)} AS ${quoteIdentifier(item.alias)}`;
143
+ }).join(", ");
144
+ }
118
145
  function renderDistinctPrefix(distinct, distinctOn, contract, pim) {
119
146
  if (distinctOn && distinctOn.length > 0) return `DISTINCT ON (${distinctOn.map((expr) => renderExpr(expr, contract, pim)).join(", ")}) `;
120
147
  if (distinct) return "DISTINCT ";
@@ -144,9 +171,40 @@ function renderWhere(expr, contract, pim) {
144
171
  }
145
172
  function renderNullCheck(expr, contract, pim) {
146
173
  const rendered = renderExpr(expr.expr, contract, pim);
147
- const renderedExpr = expr.expr.kind === "operation" || expr.expr.kind === "subquery" ? `(${rendered})` : rendered;
174
+ const renderedExpr = isAtomicExpressionKind(expr.expr.kind) ? rendered : `(${rendered})`;
148
175
  return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;
149
176
  }
177
+ /**
178
+ * Atomic expression kinds whose rendered SQL is already self-delimited
179
+ * (a column reference, parameter, literal, function call, aggregate, etc.)
180
+ * and therefore does not need surrounding parentheses when used as the
181
+ * left operand of a postfix predicate like `IS NULL` or `IS NOT NULL`,
182
+ * or as either operand of a binary infix operator.
183
+ *
184
+ * Anything not in this set is treated as composite (binary, AND/OR/NOT,
185
+ * EXISTS, nested IS NULL, subqueries, operation templates) and gets
186
+ * wrapped to preserve grouping.
187
+ */
188
+ function isAtomicExpressionKind(kind) {
189
+ switch (kind) {
190
+ case "column-ref":
191
+ case "identifier-ref":
192
+ case "param-ref":
193
+ case "literal":
194
+ case "aggregate":
195
+ case "json-object":
196
+ case "json-array-agg":
197
+ case "list": return true;
198
+ case "subquery":
199
+ case "operation":
200
+ case "binary":
201
+ case "and":
202
+ case "or":
203
+ case "exists":
204
+ case "null-check":
205
+ case "not": return false;
206
+ }
207
+ }
150
208
  function renderBinary(expr, contract, pim) {
151
209
  if (expr.right.kind === "list" && expr.right.values.length === 0) {
152
210
  if (expr.op === "in") return "FALSE";
@@ -159,7 +217,7 @@ function renderBinary(expr, contract, pim) {
159
217
  let right;
160
218
  switch (rightNode.kind) {
161
219
  case "list":
162
- right = renderListLiteral(rightNode, pim);
220
+ right = renderListLiteral(rightNode, contract, pim);
163
221
  break;
164
222
  case "literal":
165
223
  right = renderLiteral(rightNode);
@@ -186,12 +244,12 @@ function renderBinary(expr, contract, pim) {
186
244
  notIn: "NOT IN"
187
245
  }[expr.op]} ${right}`;
188
246
  }
189
- function renderListLiteral(expr, pim) {
247
+ function renderListLiteral(expr, contract, pim) {
190
248
  if (expr.values.length === 0) return "(NULL)";
191
249
  return `(${expr.values.map((v) => {
192
250
  if (v.kind === "param-ref") return renderParamRef(v, pim);
193
251
  if (v.kind === "literal") return renderLiteral(v);
194
- return renderExpr(v, void 0, pim);
252
+ return renderExpr(v, contract, pim);
195
253
  }).join(", ")})`;
196
254
  }
197
255
  function renderColumn(ref) {
@@ -241,14 +299,14 @@ function renderExpr(expr, contract, pim) {
241
299
  case "not": return `NOT (${renderExpr(node.expr, contract, pim)})`;
242
300
  case "param-ref": return renderParamRef(node, pim);
243
301
  case "literal": return renderLiteral(node);
244
- case "list": return renderListLiteral(node, pim);
302
+ case "list": return renderListLiteral(node, contract, pim);
245
303
  default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
246
304
  }
247
305
  }
248
306
  function renderParamRef(ref, pim) {
249
- const index = pim?.get(ref);
307
+ const index = pim.indexMap.get(ref);
250
308
  if (index === void 0) throw new Error("ParamRef not found in index map");
251
- return renderTypedParam(index, ref.codecId);
309
+ return renderTypedParam(index, ref.codecId, pim.codecLookup);
252
310
  }
253
311
  function renderLiteral(expr) {
254
312
  if (typeof expr.value === "string") return `'${escapeLiteral(expr.value)}'`;
@@ -267,10 +325,12 @@ function renderOperation(expr, contract, pim) {
267
325
  const args = expr.args.map((arg) => {
268
326
  return renderExpr(arg, contract, pim);
269
327
  });
270
- let result = expr.lowering.template;
271
- result = result.replace(/\{\{self\}\}/g, self);
272
- for (let i = 0; i < args.length; i++) result = result.replace(new RegExp(`\\{\\{arg${i}\\}\\}`, "g"), args[i] ?? "");
273
- return result;
328
+ return expr.lowering.template.replace(/\{\{self\}\}|\{\{arg(\d+)\}\}/g, (token, argIndex) => {
329
+ if (token === "{{self}}") return self;
330
+ const arg = args[Number(argIndex)];
331
+ if (arg === void 0) throw new Error(`Operation lowering template for "${expr.method}" referenced missing argument {{arg${argIndex}}}; template has ${args.length} arg(s)`);
332
+ return arg;
333
+ });
274
334
  }
275
335
  function renderJoin(join, contract, pim) {
276
336
  return `${join.joinType.toUpperCase()} JOIN ${join.lateral ? "LATERAL " : ""}${renderSource(join.source, contract, pim)} ON ${renderJoinOn(join.on, contract, pim)}`;
@@ -288,7 +348,9 @@ function getInsertColumnOrder(rows, contract, tableName) {
288
348
  orderedColumns.push(column);
289
349
  }
290
350
  if (orderedColumns.length > 0) return orderedColumns;
291
- return Object.keys(contract.storage.tables[tableName]?.columns ?? {});
351
+ const table = contract.storage.tables[tableName];
352
+ if (!table) throw new Error(`INSERT target table not found in contract storage: ${tableName}`);
353
+ return Object.keys(table.columns);
292
354
  }
293
355
  function renderInsertValue(value, pim) {
294
356
  if (!value || value.kind === "default-value") return "DEFAULT";
@@ -325,7 +387,9 @@ function renderInsert(ast, contract, pim) {
325
387
  switch (action.kind) {
326
388
  case "do-nothing": return ` ON CONFLICT (${conflictColumns.join(", ")}) DO NOTHING`;
327
389
  case "do-update-set": {
328
- const updates = Object.entries(action.set).map(([colName, value]) => {
390
+ const updateEntries = Object.entries(action.set);
391
+ if (updateEntries.length === 0) throw new Error("INSERT onConflict do-update-set requires at least one assignment");
392
+ const updates = updateEntries.map(([colName, value]) => {
329
393
  const target = quoteIdentifier(colName);
330
394
  if (value.kind === "param-ref") return `${target} = ${renderParamRef(value, pim)}`;
331
395
  return `${target} = ${renderColumn(value)}`;
@@ -334,11 +398,13 @@ function renderInsert(ast, contract, pim) {
334
398
  }
335
399
  default: throw new Error(`Unsupported onConflict action: ${action.kind}`);
336
400
  }
337
- })() : ""}${ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(", ")}` : ""}`;
401
+ })() : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
338
402
  }
339
403
  function renderUpdate(ast, contract, pim) {
340
404
  const table = quoteIdentifier(ast.table.name);
341
- const setClauses = Object.entries(ast.set).map(([col, val]) => {
405
+ const setEntries = Object.entries(ast.set);
406
+ if (setEntries.length === 0) throw new Error("UPDATE requires at least one SET assignment");
407
+ const setClauses = setEntries.map(([col, val]) => {
342
408
  const column = quoteIdentifier(col);
343
409
  let value;
344
410
  switch (val.kind) {
@@ -353,16 +419,13 @@ function renderUpdate(ast, contract, pim) {
353
419
  return `${column} = ${value}`;
354
420
  });
355
421
  const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : "";
356
- const returningClause = ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(", ")}` : "";
422
+ const returningClause = ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : "";
357
423
  return `UPDATE ${table} SET ${setClauses.join(", ")}${whereClause}${returningClause}`;
358
424
  }
359
425
  function renderDelete(ast, contract, pim) {
360
- return `DELETE FROM ${quoteIdentifier(ast.table.name)}${ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : ""}${ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(", ")}` : ""}`;
361
- }
362
- function createPostgresAdapter(options) {
363
- return Object.freeze(new PostgresAdapterImpl(options));
426
+ return `DELETE FROM ${quoteIdentifier(ast.table.name)}${ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : ""}${ast.returning?.length ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}` : ""}`;
364
427
  }
365
428
 
366
429
  //#endregion
367
- export { createPostgresAdapter as t };
368
- //# sourceMappingURL=adapter-Du9Hr9Rl.mjs.map
430
+ export { createPostgresBuiltinCodecLookup as n, renderLoweredSql as t };
431
+ //# sourceMappingURL=sql-renderer-DLwYpnxz.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-renderer-DLwYpnxz.mjs","names":["POSTGRES_INFERRABLE_NATIVE_TYPES: ReadonlySet<string>","params: unknown[]","pim: ParamIndexMap","sql: string","right: string","orderedColumns: string[]","value: string"],"sources":["../src/core/codec-lookup.ts","../src/core/sql-renderer.ts"],"sourcesContent":["import type { Codec, CodecLookup } from '@prisma-next/framework-components/codec';\nimport { codecDefinitions } from '@prisma-next/target-postgres/codecs';\n\n/**\n * Build a {@link CodecLookup} populated with the Postgres-builtin codec\n * definitions only.\n *\n * This is the default lookup used by `createPostgresAdapter()` and\n * `new PostgresControlAdapter()` when called without a stack-derived lookup\n * (e.g. from tests, or one-off scripts that don't compose a full stack).\n *\n * Extension codecs (e.g. `pg/vector@1` from `@prisma-next/extension-pgvector`)\n * are intentionally NOT included here: a bare adapter cannot see extensions.\n * Stack-composed paths (`SqlControlAdapterDescriptor.create(stack)` /\n * `SqlRuntimeAdapterDescriptor.create(stack)`) supply the broader,\n * extension-inclusive lookup at construction time.\n */\nexport function createPostgresBuiltinCodecLookup(): CodecLookup {\n const byId = new Map<string, Codec>();\n for (const definition of Object.values(codecDefinitions)) {\n byId.set(definition.codec.id, definition.codec);\n }\n return { get: (id) => byId.get(id) };\n}\n","import type { CodecLookup } from '@prisma-next/framework-components/codec';\nimport {\n type AggregateExpr,\n type AnyExpression,\n type AnyFromSource,\n type AnyQueryAst,\n type BinaryExpr,\n type ColumnRef,\n collectOrderedParamRefs,\n type DeleteAst,\n type InsertAst,\n type InsertValue,\n type JoinAst,\n type JoinOnExpr,\n type JsonArrayAggExpr,\n type JsonObjectExpr,\n type ListExpression,\n LiteralExpr,\n type NullCheckExpr,\n type OperationExpr,\n type OrderByItem,\n type ParamRef,\n type ProjectionItem,\n type SelectAst,\n type Codec as SqlCodec,\n type SubqueryExpr,\n type UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-postgres/sql-utils';\nimport type { PostgresContract } from './types';\n\n/**\n * Postgres native types whose unknown-OID parameter inference is reliable in\n * arbitrary expression positions. Parameters bound to a codec whose\n * `meta.db.sql.postgres.nativeType` falls in this set are emitted as plain\n * `$N`; everything else (including `json`, `jsonb`, extension types like\n * `vector`, and unknown user types) is emitted as `$N::<nativeType>` so the\n * planner picks an unambiguous overload.\n *\n * `json` / `jsonb` are intentionally excluded despite being Postgres builtins:\n * their operator overloads make context inference unreliable in expression\n * positions (e.g. `$1 -> 'key'` is ambiguous between the two).\n *\n * Spellings match the on-disk `meta.db.sql.postgres.nativeType` values in\n * `@prisma-next/target-postgres`'s codec definitions, not the `udt_name`\n * abbreviations that ADR 205 used as illustrative shorthand. The lookup-based\n * cast policy compares against these strings directly.\n */\nconst POSTGRES_INFERRABLE_NATIVE_TYPES: ReadonlySet<string> = new Set([\n // Numeric\n 'integer',\n 'smallint',\n 'bigint',\n 'real',\n 'double precision',\n 'numeric',\n // Boolean\n 'boolean',\n // Strings\n 'text',\n 'character',\n 'character varying',\n // Temporal\n 'timestamp',\n 'timestamp without time zone',\n 'timestamp with time zone',\n 'time',\n 'timetz',\n 'interval',\n // Bit strings\n 'bit',\n 'bit varying',\n]);\n\nfunction renderTypedParam(\n index: number,\n codecId: string | undefined,\n codecLookup: CodecLookup,\n): string {\n if (codecId === undefined) {\n return `$${index}`;\n }\n // SQL codecs extend the framework `Codec` base with an optional\n // `meta: CodecMeta`; the framework `CodecLookup.get` returns the base type,\n // so we narrow to `SqlCodec` to read `meta`. Every codec actually\n // registered into a SQL codec lookup conforms to `SqlCodec`.\n const codec = codecLookup.get(codecId) as SqlCodec | undefined;\n if (codec === undefined) {\n throw new Error(\n `Postgres lowering: ParamRef carries codecId \"${codecId}\" but the ` +\n 'assembled codec lookup has no entry for it. This usually indicates ' +\n 'a missing extension pack in the runtime stack — register the pack ' +\n 'that contributes this codec (e.g. `extensionPacks: [pgvectorRuntime]`), ' +\n 'or use the codec directly from `@prisma-next/target-postgres/codecs` ' +\n \"if it's a builtin.\",\n );\n }\n const nativeType = codec.meta?.db?.sql?.postgres?.nativeType;\n if (nativeType !== undefined && !POSTGRES_INFERRABLE_NATIVE_TYPES.has(nativeType)) {\n return `$${index}::${nativeType}`;\n }\n return `$${index}`;\n}\n\n/**\n * Per-render carrier threaded through every helper. Bundles the param-index\n * map (for `$N` numbering) and the assembled-stack `codecLookup` (for\n * cast policy at the `renderTypedParam` chokepoint). Carrying both on a\n * single value keeps helper signatures stable.\n */\ninterface ParamIndexMap {\n readonly indexMap: Map<ParamRef, number>;\n readonly codecLookup: CodecLookup;\n}\n\n/**\n * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.\n *\n * Shared between the runtime (`PostgresAdapterImpl.lower`) and control\n * (`PostgresControlAdapter.lower`) entrypoints so emit-time and run-time\n * paths produce byte-identical output for the same AST.\n */\nexport function renderLoweredSql(\n ast: AnyQueryAst,\n contract: PostgresContract,\n codecLookup: CodecLookup,\n): { readonly sql: string; readonly params: readonly unknown[] } {\n const orderedRefs = collectOrderedParamRefs(ast);\n const indexMap = new Map<ParamRef, number>();\n const params: unknown[] = orderedRefs.map((ref, i) => {\n indexMap.set(ref, i + 1);\n return ref.value;\n });\n const pim: ParamIndexMap = { indexMap, codecLookup };\n\n const node = ast;\n let sql: string;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract, pim);\n break;\n case 'insert':\n sql = renderInsert(node, contract, pim);\n break;\n case 'update':\n sql = renderUpdate(node, contract, pim);\n break;\n case 'delete':\n sql = renderDelete(node, contract, pim);\n break;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported AST node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n\n return Object.freeze({ sql, params: Object.freeze(params) });\n}\n\nfunction renderSelect(ast: SelectAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const selectClause = `SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(\n ast.projection,\n contract,\n pim,\n )}`;\n const fromClause = `FROM ${renderSource(ast.from, contract, pim)}`;\n\n const joinsClause = ast.joins?.length\n ? ast.joins.map((join) => renderJoin(join, contract, pim)).join(' ')\n : '';\n\n const whereClause = ast.where ? `WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const groupByClause = ast.groupBy?.length\n ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract, pim)).join(', ')}`\n : '';\n const havingClause = ast.having ? `HAVING ${renderWhere(ast.having, contract, pim)}` : '';\n const orderClause = ast.orderBy?.length\n ? `ORDER BY ${ast.orderBy\n .map((order) => {\n const expr = renderExpr(order.expr, contract, pim);\n return `${expr} ${order.dir.toUpperCase()}`;\n })\n .join(', ')}`\n : '';\n const limitClause = typeof ast.limit === 'number' ? `LIMIT ${ast.limit}` : '';\n const offsetClause = typeof ast.offset === 'number' ? `OFFSET ${ast.offset}` : '';\n\n const clauses = [\n selectClause,\n fromClause,\n joinsClause,\n whereClause,\n groupByClause,\n havingClause,\n orderClause,\n limitClause,\n offsetClause,\n ]\n .filter((part) => part.length > 0)\n .join(' ');\n return clauses.trim();\n}\n\nfunction renderProjection(\n projection: ReadonlyArray<ProjectionItem>,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n return projection\n .map((item) => {\n const alias = quoteIdentifier(item.alias);\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${alias}`;\n }\n return `${renderExpr(item.expr, contract, pim)} AS ${alias}`;\n })\n .join(', ');\n}\n\nfunction renderReturning(\n items: ReadonlyArray<ProjectionItem>,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n return items\n .map((item) => {\n if (item.expr.kind === 'column-ref') {\n const rendered = renderColumn(item.expr);\n return item.expr.column === item.alias\n ? rendered\n : `${rendered} AS ${quoteIdentifier(item.alias)}`;\n }\n if (item.expr.kind === 'literal') {\n return `${renderLiteral(item.expr)} AS ${quoteIdentifier(item.alias)}`;\n }\n return `${renderExpr(item.expr, contract, pim)} AS ${quoteIdentifier(item.alias)}`;\n })\n .join(', ');\n}\n\nfunction renderDistinctPrefix(\n distinct: true | undefined,\n distinctOn: ReadonlyArray<AnyExpression> | undefined,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n if (distinctOn && distinctOn.length > 0) {\n const rendered = distinctOn.map((expr) => renderExpr(expr, contract, pim)).join(', ');\n return `DISTINCT ON (${rendered}) `;\n }\n if (distinct) {\n return 'DISTINCT ';\n }\n return '';\n}\n\nfunction renderSource(\n source: AnyFromSource,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const node = source;\n switch (node.kind) {\n case 'table-source': {\n const table = quoteIdentifier(node.name);\n if (!node.alias) {\n return table;\n }\n return `${table} AS ${quoteIdentifier(node.alias)}`;\n }\n case 'derived-table-source':\n return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported source node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction assertScalarSubquery(query: SelectAst): void {\n if (query.projection.length !== 1) {\n throw new Error('Subquery expressions must project exactly one column');\n }\n}\n\nfunction renderSubqueryExpr(\n expr: SubqueryExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n assertScalarSubquery(expr.query);\n return `(${renderSelect(expr.query, contract, pim)})`;\n}\n\nfunction renderWhere(expr: AnyExpression, contract: PostgresContract, pim: ParamIndexMap): string {\n return renderExpr(expr, contract, pim);\n}\n\nfunction renderNullCheck(\n expr: NullCheckExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const rendered = renderExpr(expr.expr, contract, pim);\n const renderedExpr = isAtomicExpressionKind(expr.expr.kind) ? rendered : `(${rendered})`;\n return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\n\n/**\n * Atomic expression kinds whose rendered SQL is already self-delimited\n * (a column reference, parameter, literal, function call, aggregate, etc.)\n * and therefore does not need surrounding parentheses when used as the\n * left operand of a postfix predicate like `IS NULL` or `IS NOT NULL`,\n * or as either operand of a binary infix operator.\n *\n * Anything not in this set is treated as composite (binary, AND/OR/NOT,\n * EXISTS, nested IS NULL, subqueries, operation templates) and gets\n * wrapped to preserve grouping.\n */\nfunction isAtomicExpressionKind(kind: AnyExpression['kind']): boolean {\n switch (kind) {\n case 'column-ref':\n case 'identifier-ref':\n case 'param-ref':\n case 'literal':\n case 'aggregate':\n case 'json-object':\n case 'json-array-agg':\n case 'list':\n return true;\n case 'subquery':\n case 'operation':\n case 'binary':\n case 'and':\n case 'or':\n case 'exists':\n case 'null-check':\n case 'not':\n return false;\n }\n}\n\nfunction renderBinary(expr: BinaryExpr, contract: PostgresContract, pim: ParamIndexMap): string {\n if (expr.right.kind === 'list' && expr.right.values.length === 0) {\n if (expr.op === 'in') {\n return 'FALSE';\n }\n if (expr.op === 'notIn') {\n return 'TRUE';\n }\n }\n\n const leftExpr = expr.left;\n const left = renderExpr(leftExpr, contract, pim);\n const leftRendered =\n leftExpr.kind === 'operation' || leftExpr.kind === 'subquery' ? `(${left})` : left;\n\n const rightNode = expr.right;\n let right: string;\n switch (rightNode.kind) {\n case 'list':\n right = renderListLiteral(rightNode, contract, pim);\n break;\n case 'literal':\n right = renderLiteral(rightNode);\n break;\n case 'column-ref':\n right = renderColumn(rightNode);\n break;\n case 'param-ref':\n right = renderParamRef(rightNode, pim);\n break;\n default:\n right = renderExpr(rightNode, contract, pim);\n break;\n }\n\n const operatorMap: Record<BinaryExpr['op'], string> = {\n eq: '=',\n neq: '!=',\n gt: '>',\n lt: '<',\n gte: '>=',\n lte: '<=',\n like: 'LIKE',\n in: 'IN',\n notIn: 'NOT IN',\n };\n\n return `${leftRendered} ${operatorMap[expr.op]} ${right}`;\n}\n\nfunction renderListLiteral(\n expr: ListExpression,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n if (expr.values.length === 0) {\n return '(NULL)';\n }\n const values = expr.values\n .map((v) => {\n if (v.kind === 'param-ref') return renderParamRef(v, pim);\n if (v.kind === 'literal') return renderLiteral(v);\n return renderExpr(v, contract, pim);\n })\n .join(', ');\n return `(${values})`;\n}\n\nfunction renderColumn(ref: ColumnRef): string {\n if (ref.table === 'excluded') {\n return `excluded.${quoteIdentifier(ref.column)}`;\n }\n return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\n\nfunction renderAggregateExpr(\n expr: AggregateExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const fn = expr.fn.toUpperCase();\n if (!expr.expr) {\n return `${fn}(*)`;\n }\n return `${fn}(${renderExpr(expr.expr, contract, pim)})`;\n}\n\nfunction renderJsonObjectExpr(\n expr: JsonObjectExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const args = expr.entries\n .flatMap((entry): [string, string] => {\n const key = `'${escapeLiteral(entry.key)}'`;\n if (entry.value.kind === 'literal') {\n return [key, renderLiteral(entry.value)];\n }\n return [key, renderExpr(entry.value, contract, pim)];\n })\n .join(', ');\n return `json_build_object(${args})`;\n}\n\nfunction renderOrderByItems(\n items: ReadonlyArray<OrderByItem>,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n return items\n .map((item) => `${renderExpr(item.expr, contract, pim)} ${item.dir.toUpperCase()}`)\n .join(', ');\n}\n\nfunction renderJsonArrayAggExpr(\n expr: JsonArrayAggExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const aggregateOrderBy =\n expr.orderBy && expr.orderBy.length > 0\n ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}`\n : '';\n const aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;\n if (expr.onEmpty === 'emptyArray') {\n return `coalesce(${aggregated}, json_build_array())`;\n }\n return aggregated;\n}\n\nfunction renderExpr(expr: AnyExpression, contract: PostgresContract, pim: ParamIndexMap): string {\n const node = expr;\n switch (node.kind) {\n case 'column-ref':\n return renderColumn(node);\n case 'identifier-ref':\n return quoteIdentifier(node.name);\n case 'operation':\n return renderOperation(node, contract, pim);\n case 'subquery':\n return renderSubqueryExpr(node, contract, pim);\n case 'aggregate':\n return renderAggregateExpr(node, contract, pim);\n case 'json-object':\n return renderJsonObjectExpr(node, contract, pim);\n case 'json-array-agg':\n return renderJsonArrayAggExpr(node, contract, pim);\n case 'binary':\n return renderBinary(node, contract, pim);\n case 'and':\n if (node.exprs.length === 0) {\n return 'TRUE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(' AND ')})`;\n case 'or':\n if (node.exprs.length === 0) {\n return 'FALSE';\n }\n return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(' OR ')})`;\n case 'exists': {\n const notKeyword = node.notExists ? 'NOT ' : '';\n const subquery = renderSelect(node.subquery, contract, pim);\n return `${notKeyword}EXISTS (${subquery})`;\n }\n case 'null-check':\n return renderNullCheck(node, contract, pim);\n case 'not':\n return `NOT (${renderExpr(node.expr, contract, pim)})`;\n case 'param-ref':\n return renderParamRef(node, pim);\n case 'literal':\n return renderLiteral(node);\n case 'list':\n return renderListLiteral(node, contract, pim);\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported expression node kind: ${(node satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction renderParamRef(ref: ParamRef, pim: ParamIndexMap): string {\n const index = pim.indexMap.get(ref);\n if (index === undefined) {\n throw new Error('ParamRef not found in index map');\n }\n return renderTypedParam(index, ref.codecId, pim.codecLookup);\n}\n\nfunction renderLiteral(expr: LiteralExpr): string {\n if (typeof expr.value === 'string') {\n return `'${escapeLiteral(expr.value)}'`;\n }\n if (typeof expr.value === 'number' || typeof expr.value === 'boolean') {\n return String(expr.value);\n }\n if (typeof expr.value === 'bigint') {\n return String(expr.value);\n }\n if (expr.value === null) {\n return 'NULL';\n }\n if (expr.value === undefined) {\n return 'NULL';\n }\n if (expr.value instanceof Date) {\n return `'${escapeLiteral(expr.value.toISOString())}'`;\n }\n if (Array.isArray(expr.value)) {\n return `ARRAY[${expr.value.map((v: unknown) => renderLiteral(new LiteralExpr(v))).join(', ')}]`;\n }\n const json = JSON.stringify(expr.value);\n if (json === undefined) {\n return 'NULL';\n }\n return `'${escapeLiteral(json)}'`;\n}\n\nfunction renderOperation(\n expr: OperationExpr,\n contract: PostgresContract,\n pim: ParamIndexMap,\n): string {\n const self = renderExpr(expr.self, contract, pim);\n const args = expr.args.map((arg) => {\n return renderExpr(arg, contract, pim);\n });\n\n // Resolve `{{self}}` and `{{argN}}` from the original template in a single\n // pass. Doing this with sequential `String.prototype.replace` calls is\n // unsafe: a substituted fragment can itself contain text that matches a\n // later token (e.g. an arg literal containing the substring `{{arg1}}`),\n // and the next iteration would corrupt it. A single regex callback never\n // re-scans already-substituted output.\n return expr.lowering.template.replace(\n /\\{\\{self\\}\\}|\\{\\{arg(\\d+)\\}\\}/g,\n (token, argIndex: string | undefined) => {\n if (token === '{{self}}') {\n return self;\n }\n const arg = args[Number(argIndex)];\n if (arg === undefined) {\n throw new Error(\n `Operation lowering template for \"${expr.method}\" referenced missing argument {{arg${argIndex}}}; template has ${args.length} arg(s)`,\n );\n }\n return arg;\n },\n );\n}\n\nfunction renderJoin(join: JoinAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const joinType = join.joinType.toUpperCase();\n const lateral = join.lateral ? 'LATERAL ' : '';\n const source = renderSource(join.source, contract, pim);\n const onClause = renderJoinOn(join.on, contract, pim);\n return `${joinType} JOIN ${lateral}${source} ON ${onClause}`;\n}\n\nfunction renderJoinOn(on: JoinOnExpr, contract: PostgresContract, pim: ParamIndexMap): string {\n if (on.kind === 'eq-col-join-on') {\n const left = renderColumn(on.left);\n const right = renderColumn(on.right);\n return `${left} = ${right}`;\n }\n return renderWhere(on, contract, pim);\n}\n\nfunction getInsertColumnOrder(\n rows: ReadonlyArray<Record<string, InsertValue>>,\n contract: PostgresContract,\n tableName: string,\n): string[] {\n const orderedColumns: string[] = [];\n const seenColumns = new Set<string>();\n\n for (const row of rows) {\n for (const column of Object.keys(row)) {\n if (seenColumns.has(column)) {\n continue;\n }\n seenColumns.add(column);\n orderedColumns.push(column);\n }\n }\n\n if (orderedColumns.length > 0) {\n return orderedColumns;\n }\n\n const table = contract.storage.tables[tableName];\n if (!table) {\n throw new Error(`INSERT target table not found in contract storage: ${tableName}`);\n }\n return Object.keys(table.columns);\n}\n\nfunction renderInsertValue(value: InsertValue | undefined, pim: ParamIndexMap): string {\n if (!value || value.kind === 'default-value') {\n return 'DEFAULT';\n }\n\n switch (value.kind) {\n case 'param-ref':\n return renderParamRef(value, pim);\n case 'column-ref':\n return renderColumn(value);\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported value node in INSERT: ${(value satisfies never as { kind: string }).kind}`,\n );\n }\n}\n\nfunction renderInsert(ast: InsertAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const rows = ast.rows;\n if (rows.length === 0) {\n throw new Error('INSERT requires at least one row');\n }\n const hasExplicitValues = rows.some((row) => Object.keys(row).length > 0);\n const insertClause = (() => {\n if (!hasExplicitValues) {\n if (rows.length === 1) {\n return `INSERT INTO ${table} DEFAULT VALUES`;\n }\n\n const defaultColumns = getInsertColumnOrder(rows, contract, ast.table.name);\n if (defaultColumns.length === 0) {\n return `INSERT INTO ${table} VALUES ${rows.map(() => '()').join(', ')}`;\n }\n\n const quotedColumns = defaultColumns.map((column) => quoteIdentifier(column));\n const defaultRow = `(${defaultColumns.map(() => 'DEFAULT').join(', ')})`;\n return `INSERT INTO ${table} (${quotedColumns.join(', ')}) VALUES ${rows\n .map(() => defaultRow)\n .join(', ')}`;\n }\n\n const columnOrder = getInsertColumnOrder(rows, contract, ast.table.name);\n const columns = columnOrder.map((column) => quoteIdentifier(column));\n const values = rows\n .map((row) => {\n const renderedRow = columnOrder.map((column) => renderInsertValue(row[column], pim));\n return `(${renderedRow.join(', ')})`;\n })\n .join(', ');\n\n return `INSERT INTO ${table} (${columns.join(', ')}) VALUES ${values}`;\n })();\n const onConflictClause = ast.onConflict\n ? (() => {\n const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n if (conflictColumns.length === 0) {\n throw new Error('INSERT onConflict requires at least one conflict column');\n }\n\n const action = ast.onConflict.action;\n switch (action.kind) {\n case 'do-nothing':\n return ` ON CONFLICT (${conflictColumns.join(', ')}) DO NOTHING`;\n case 'do-update-set': {\n const updateEntries = Object.entries(action.set);\n if (updateEntries.length === 0) {\n throw new Error('INSERT onConflict do-update-set requires at least one assignment');\n }\n const updates = updateEntries.map(([colName, value]) => {\n const target = quoteIdentifier(colName);\n if (value.kind === 'param-ref') {\n return `${target} = ${renderParamRef(value, pim)}`;\n }\n return `${target} = ${renderColumn(value)}`;\n });\n return ` ON CONFLICT (${conflictColumns.join(', ')}) DO UPDATE SET ${updates.join(', ')}`;\n }\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported onConflict action: ${(action satisfies never as { kind: string }).kind}`,\n );\n }\n })()\n : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}`\n : '';\n\n return `${insertClause}${onConflictClause}${returningClause}`;\n}\n\nfunction renderUpdate(ast: UpdateAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const setEntries = Object.entries(ast.set);\n if (setEntries.length === 0) {\n throw new Error('UPDATE requires at least one SET assignment');\n }\n const setClauses = setEntries.map(([col, val]) => {\n const column = quoteIdentifier(col);\n let value: string;\n switch (val.kind) {\n case 'param-ref':\n value = renderParamRef(val, pim);\n break;\n case 'column-ref':\n value = renderColumn(val);\n break;\n // v8 ignore next 4\n default:\n throw new Error(\n `Unsupported value node in UPDATE: ${(val satisfies never as { kind: string }).kind}`,\n );\n }\n return `${column} = ${value}`;\n });\n\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}`\n : '';\n\n return `UPDATE ${table} SET ${setClauses.join(', ')}${whereClause}${returningClause}`;\n}\n\nfunction renderDelete(ast: DeleteAst, contract: PostgresContract, pim: ParamIndexMap): string {\n const table = quoteIdentifier(ast.table.name);\n const whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : '';\n const returningClause = ast.returning?.length\n ? ` RETURNING ${renderReturning(ast.returning, contract, pim)}`\n : '';\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n"],"mappings":"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"}
@@ -1,10 +1,21 @@
1
1
  import { BinaryExpr, ColumnRef, DefaultValueExpr, Direction, LoweredStatement, ParamRef, SelectAst } from "@prisma-next/sql-relational-core/ast";
2
2
  import { Contract } from "@prisma-next/contract/types";
3
+ import { CodecLookup } from "@prisma-next/framework-components/codec";
3
4
  import { SqlStorage, StorageColumn, StorageTable } from "@prisma-next/sql-contract/types";
4
5
 
5
6
  //#region src/core/types.d.ts
6
7
  interface PostgresAdapterOptions {
7
8
  readonly profileId?: string;
9
+ /**
10
+ * Codec lookup used by the SQL renderer to resolve per-codec metadata at
11
+ * lower-time. Defaults to a Postgres-builtins-only lookup when omitted —
12
+ * see {@link createPostgresBuiltinCodecLookup} in `./codec-lookup`.
13
+ *
14
+ * Stack-aware callers (`SqlRuntimeAdapterDescriptor.create(stack)` /
15
+ * `SqlControlAdapterDescriptor.create(stack)`) supply the assembled stack
16
+ * lookup so extension codecs are visible to the renderer.
17
+ */
18
+ readonly codecLookup?: CodecLookup;
8
19
  }
9
20
  type PostgresContract = Contract<SqlStorage> & {
10
21
  readonly target: 'postgres';
@@ -17,4 +28,4 @@ interface OrderClause {
17
28
  type PostgresLoweredStatement = LoweredStatement;
18
29
  //#endregion
19
30
  export { OrderClause as a, PostgresContract as c, StorageColumn as d, StorageTable as f, Expr as i, PostgresLoweredStatement as l, ColumnRef as n, ParamRef as o, Direction as r, PostgresAdapterOptions as s, BinaryExpr as t, SelectAst as u };
20
- //# sourceMappingURL=types-TyL62f9Y.d.mts.map
31
+ //# sourceMappingURL=types-tLtmYqCO.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types-tLtmYqCO.d.mts","names":[],"sources":["../src/core/types.ts"],"sourcesContent":[],"mappings":";;;;;;UAoBiB,sBAAA;;EAAA;AAcjB;AAEA;;;;;AAEA;AAKA;yBAZyB;;KAGb,gBAAA,GAAmB,SAAS;;;KAE5B,IAAA,GAAO,YAAY,WAAW;UAEzB,WAAA;iBACA;gBACD;;KAGJ,wBAAA,GAA2B"}
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as OrderClause, c as PostgresContract, d as StorageColumn, f as StorageTable, i as Expr, l as PostgresLoweredStatement, n as ColumnRef, o as ParamRef, r as Direction, s as PostgresAdapterOptions, t as BinaryExpr, u as SelectAst } from "./types-TyL62f9Y.mjs";
1
+ import { a as OrderClause, c as PostgresContract, d as StorageColumn, f as StorageTable, i as Expr, l as PostgresLoweredStatement, n as ColumnRef, o as ParamRef, r as Direction, s as PostgresAdapterOptions, t as BinaryExpr, u as SelectAst } from "./types-tLtmYqCO.mjs";
2
2
  export { type BinaryExpr, type ColumnRef, type Direction, type Expr, type OrderClause, type ParamRef, type PostgresAdapterOptions, type PostgresContract, type PostgresLoweredStatement, type SelectAst, type StorageColumn, type StorageTable };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/adapter-postgres",
3
- "version": "0.4.1",
3
+ "version": "0.4.3",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -8,33 +8,37 @@
8
8
  "src"
9
9
  ],
10
10
  "dependencies": {
11
- "ajv": "^8.18.0",
12
11
  "arktype": "^2.0.0",
13
- "@prisma-next/contract": "0.4.1",
14
- "@prisma-next/contract-authoring": "0.4.1",
15
- "@prisma-next/sql-contract": "0.4.1",
16
- "@prisma-next/family-sql": "0.4.1",
17
- "@prisma-next/framework-components": "0.4.1",
18
- "@prisma-next/sql-contract-psl": "0.4.1",
19
- "@prisma-next/sql-operations": "0.4.1",
20
- "@prisma-next/sql-contract-ts": "0.4.1",
21
- "@prisma-next/sql-relational-core": "0.4.1",
22
- "@prisma-next/ids": "0.4.1",
23
- "@prisma-next/sql-runtime": "0.4.1",
24
- "@prisma-next/sql-schema-ir": "0.4.1",
25
- "@prisma-next/utils": "0.4.1"
12
+ "@prisma-next/contract": "0.4.3",
13
+ "@prisma-next/contract-authoring": "0.4.3",
14
+ "@prisma-next/family-sql": "0.4.3",
15
+ "@prisma-next/framework-components": "0.4.3",
16
+ "@prisma-next/ids": "0.4.3",
17
+ "@prisma-next/sql-contract": "0.4.3",
18
+ "@prisma-next/sql-contract-psl": "0.4.3",
19
+ "@prisma-next/sql-contract-ts": "0.4.3",
20
+ "@prisma-next/sql-operations": "0.4.3",
21
+ "@prisma-next/sql-relational-core": "0.4.3",
22
+ "@prisma-next/target-postgres": "0.4.3",
23
+ "@prisma-next/sql-runtime": "0.4.3",
24
+ "@prisma-next/sql-schema-ir": "0.4.3",
25
+ "@prisma-next/utils": "0.4.3"
26
26
  },
27
27
  "devDependencies": {
28
+ "pathe": "^2.0.3",
28
29
  "tsdown": "0.18.4",
29
30
  "typescript": "5.9.3",
30
31
  "vitest": "4.0.17",
32
+ "@prisma-next/cli": "0.4.3",
33
+ "@prisma-next/driver-postgres": "0.4.3",
34
+ "@prisma-next/errors": "0.4.3",
35
+ "@prisma-next/extension-pgvector": "0.4.3",
36
+ "@prisma-next/tsconfig": "0.0.0",
31
37
  "@prisma-next/test-utils": "0.0.1",
32
- "@prisma-next/tsdown": "0.0.0",
33
- "@prisma-next/tsconfig": "0.0.0"
38
+ "@prisma-next/tsdown": "0.0.0"
34
39
  },
35
40
  "exports": {
36
41
  "./adapter": "./dist/adapter.mjs",
37
- "./codec-types": "./dist/codec-types.mjs",
38
42
  "./column-types": "./dist/column-types.mjs",
39
43
  "./control": "./dist/control.mjs",
40
44
  "./operation-types": "./dist/operation-types.mjs",