@prisma-next/adapter-postgres 0.4.1 → 0.5.0-dev.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 (48) hide show
  1. package/dist/adapter-hNElNHo4.mjs +60 -0
  2. package/dist/adapter-hNElNHo4.mjs.map +1 -0
  3. package/dist/adapter.d.mts +2 -8
  4. package/dist/adapter.d.mts.map +1 -1
  5. package/dist/adapter.mjs +1 -1
  6. package/dist/column-types.mjs +1 -1
  7. package/dist/column-types.mjs.map +1 -1
  8. package/dist/control.d.mts +3 -70
  9. package/dist/control.d.mts.map +1 -1
  10. package/dist/control.mjs +19 -160
  11. package/dist/control.mjs.map +1 -1
  12. package/dist/{descriptor-meta-BB9XPAFi.mjs → descriptor-meta-RTDzyrae.mjs} +7 -7
  13. package/dist/descriptor-meta-RTDzyrae.mjs.map +1 -0
  14. package/dist/runtime.d.mts +1 -1
  15. package/dist/runtime.mjs +7 -7
  16. package/dist/runtime.mjs.map +1 -1
  17. package/dist/{adapter-Du9Hr9Rl.mjs → sql-renderer-pEaSP82_.mjs} +102 -100
  18. package/dist/sql-renderer-pEaSP82_.mjs.map +1 -0
  19. package/dist/{types-TyL62f9Y.d.mts → types-CfRPdAk8.d.mts} +1 -1
  20. package/dist/{types-TyL62f9Y.d.mts.map → types-CfRPdAk8.d.mts.map} +1 -1
  21. package/dist/types.d.mts +1 -1
  22. package/package.json +21 -16
  23. package/src/core/adapter.ts +4 -625
  24. package/src/core/control-adapter.ts +21 -47
  25. package/src/core/descriptor-meta.ts +5 -5
  26. package/src/core/enum-control-hooks.ts +7 -2
  27. package/src/core/json-schema-validator.ts +2 -1
  28. package/src/core/sql-renderer.ts +710 -0
  29. package/src/exports/column-types.ts +1 -1
  30. package/src/exports/control.ts +9 -4
  31. package/src/exports/runtime.ts +3 -3
  32. package/dist/adapter-Du9Hr9Rl.mjs.map +0 -1
  33. package/dist/codec-ids-5g4Gwrgm.mjs +0 -29
  34. package/dist/codec-ids-5g4Gwrgm.mjs.map +0 -1
  35. package/dist/codec-types.d.mts +0 -107
  36. package/dist/codec-types.d.mts.map +0 -1
  37. package/dist/codec-types.mjs +0 -3
  38. package/dist/codecs-DiPlMi3-.mjs +0 -385
  39. package/dist/codecs-DiPlMi3-.mjs.map +0 -1
  40. package/dist/descriptor-meta-BB9XPAFi.mjs.map +0 -1
  41. package/dist/sql-utils-DkUJyZmA.mjs +0 -78
  42. package/dist/sql-utils-DkUJyZmA.mjs.map +0 -1
  43. package/src/core/codec-ids.ts +0 -30
  44. package/src/core/codecs.ts +0 -645
  45. package/src/core/default-normalizer.ts +0 -145
  46. package/src/core/json-schema-type-expression.ts +0 -131
  47. package/src/core/sql-utils.ts +0 -111
  48. package/src/exports/codec-types.ts +0 -44
@@ -1,11 +1,17 @@
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 } from "@prisma-next/sql-relational-core/ast";
2
+ import { PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID } from "@prisma-next/target-postgres/codec-ids";
3
+ import { escapeLiteral, quoteIdentifier } from "@prisma-next/target-postgres/sql-utils";
6
4
 
7
- //#region src/core/adapter.ts
5
+ //#region src/core/sql-renderer.ts
8
6
  const VECTOR_CODEC_ID = "pg/vector@1";
7
+ /**
8
+ * Map a codec ID to its `::cast` suffix, if Postgres requires one for
9
+ * parameterized values (e.g. `$1::vector`, `$1::jsonb`).
10
+ *
11
+ * NOTE: hardcoded codec IDs here are a known wart, tracked separately by
12
+ * TML-2310 ("Move SQL param-cast metadata onto codec descriptors").
13
+ * Until that lands the cast lives on the renderer rather than the codec.
14
+ */
9
15
  function getCodecParamCast(codecId) {
10
16
  if (codecId === VECTOR_CODEC_ID) return "vector";
11
17
  if (codecId === PG_JSON_CODEC_ID) return "json";
@@ -15,84 +21,44 @@ function renderTypedParam(index, codecId) {
15
21
  const cast = getCodecParamCast(codecId);
16
22
  return cast ? `$${index}::${cast}` : `$${index}`;
17
23
  }
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
24
+ /**
25
+ * Render a SQL query AST to a Postgres-flavored `{ sql, params }` payload.
26
+ *
27
+ * Shared between the runtime (`PostgresAdapterImpl.lower`) and control
28
+ * (`PostgresControlAdapter.lower`) entrypoints so emit-time and run-time
29
+ * paths produce byte-identical output for the same AST.
30
+ */
31
+ function renderLoweredSql(ast, contract) {
32
+ const collectedParamRefs = ast.collectParamRefs();
33
+ const paramIndexMap = /* @__PURE__ */ new Map();
34
+ const params = [];
35
+ for (const ref of collectedParamRefs) {
36
+ if (paramIndexMap.has(ref)) continue;
37
+ paramIndexMap.set(ref, params.length + 1);
38
+ params.push(ref.value);
30
39
  }
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
- });
40
+ const node = ast;
41
+ let sql;
42
+ switch (node.kind) {
43
+ case "select":
44
+ sql = renderSelect(node, contract, paramIndexMap);
45
+ break;
46
+ case "insert":
47
+ sql = renderInsert(node, contract, paramIndexMap);
48
+ break;
49
+ case "update":
50
+ sql = renderUpdate(node, contract, paramIndexMap);
51
+ break;
52
+ case "delete":
53
+ sql = renderDelete(node, contract, paramIndexMap);
54
+ break;
55
+ default: throw new Error(`Unsupported AST node kind: ${node.kind}`);
94
56
  }
95
- };
57
+ return Object.freeze({
58
+ sql,
59
+ params: Object.freeze(params)
60
+ });
61
+ }
96
62
  function renderSelect(ast, contract, pim) {
97
63
  return [
98
64
  `SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(ast.projection, contract, pim)}`,
@@ -144,9 +110,40 @@ function renderWhere(expr, contract, pim) {
144
110
  }
145
111
  function renderNullCheck(expr, contract, pim) {
146
112
  const rendered = renderExpr(expr.expr, contract, pim);
147
- const renderedExpr = expr.expr.kind === "operation" || expr.expr.kind === "subquery" ? `(${rendered})` : rendered;
113
+ const renderedExpr = isAtomicExpressionKind(expr.expr.kind) ? rendered : `(${rendered})`;
148
114
  return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;
149
115
  }
116
+ /**
117
+ * Atomic expression kinds whose rendered SQL is already self-delimited
118
+ * (a column reference, parameter, literal, function call, aggregate, etc.)
119
+ * and therefore does not need surrounding parentheses when used as the
120
+ * left operand of a postfix predicate like `IS NULL` or `IS NOT NULL`,
121
+ * or as either operand of a binary infix operator.
122
+ *
123
+ * Anything not in this set is treated as composite (binary, AND/OR/NOT,
124
+ * EXISTS, nested IS NULL, subqueries, operation templates) and gets
125
+ * wrapped to preserve grouping.
126
+ */
127
+ function isAtomicExpressionKind(kind) {
128
+ switch (kind) {
129
+ case "column-ref":
130
+ case "identifier-ref":
131
+ case "param-ref":
132
+ case "literal":
133
+ case "aggregate":
134
+ case "json-object":
135
+ case "json-array-agg":
136
+ case "list": return true;
137
+ case "subquery":
138
+ case "operation":
139
+ case "binary":
140
+ case "and":
141
+ case "or":
142
+ case "exists":
143
+ case "null-check":
144
+ case "not": return false;
145
+ }
146
+ }
150
147
  function renderBinary(expr, contract, pim) {
151
148
  if (expr.right.kind === "list" && expr.right.values.length === 0) {
152
149
  if (expr.op === "in") return "FALSE";
@@ -159,7 +156,7 @@ function renderBinary(expr, contract, pim) {
159
156
  let right;
160
157
  switch (rightNode.kind) {
161
158
  case "list":
162
- right = renderListLiteral(rightNode, pim);
159
+ right = renderListLiteral(rightNode, contract, pim);
163
160
  break;
164
161
  case "literal":
165
162
  right = renderLiteral(rightNode);
@@ -186,12 +183,12 @@ function renderBinary(expr, contract, pim) {
186
183
  notIn: "NOT IN"
187
184
  }[expr.op]} ${right}`;
188
185
  }
189
- function renderListLiteral(expr, pim) {
186
+ function renderListLiteral(expr, contract, pim) {
190
187
  if (expr.values.length === 0) return "(NULL)";
191
188
  return `(${expr.values.map((v) => {
192
189
  if (v.kind === "param-ref") return renderParamRef(v, pim);
193
190
  if (v.kind === "literal") return renderLiteral(v);
194
- return renderExpr(v, void 0, pim);
191
+ return renderExpr(v, contract, pim);
195
192
  }).join(", ")})`;
196
193
  }
197
194
  function renderColumn(ref) {
@@ -241,12 +238,12 @@ function renderExpr(expr, contract, pim) {
241
238
  case "not": return `NOT (${renderExpr(node.expr, contract, pim)})`;
242
239
  case "param-ref": return renderParamRef(node, pim);
243
240
  case "literal": return renderLiteral(node);
244
- case "list": return renderListLiteral(node, pim);
241
+ case "list": return renderListLiteral(node, contract, pim);
245
242
  default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
246
243
  }
247
244
  }
248
245
  function renderParamRef(ref, pim) {
249
- const index = pim?.get(ref);
246
+ const index = pim.get(ref);
250
247
  if (index === void 0) throw new Error("ParamRef not found in index map");
251
248
  return renderTypedParam(index, ref.codecId);
252
249
  }
@@ -267,10 +264,12 @@ function renderOperation(expr, contract, pim) {
267
264
  const args = expr.args.map((arg) => {
268
265
  return renderExpr(arg, contract, pim);
269
266
  });
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;
267
+ return expr.lowering.template.replace(/\{\{self\}\}|\{\{arg(\d+)\}\}/g, (token, argIndex) => {
268
+ if (token === "{{self}}") return self;
269
+ const arg = args[Number(argIndex)];
270
+ if (arg === void 0) throw new Error(`Operation lowering template for "${expr.method}" referenced missing argument {{arg${argIndex}}}; template has ${args.length} arg(s)`);
271
+ return arg;
272
+ });
274
273
  }
275
274
  function renderJoin(join, contract, pim) {
276
275
  return `${join.joinType.toUpperCase()} JOIN ${join.lateral ? "LATERAL " : ""}${renderSource(join.source, contract, pim)} ON ${renderJoinOn(join.on, contract, pim)}`;
@@ -288,7 +287,9 @@ function getInsertColumnOrder(rows, contract, tableName) {
288
287
  orderedColumns.push(column);
289
288
  }
290
289
  if (orderedColumns.length > 0) return orderedColumns;
291
- return Object.keys(contract.storage.tables[tableName]?.columns ?? {});
290
+ const table = contract.storage.tables[tableName];
291
+ if (!table) throw new Error(`INSERT target table not found in contract storage: ${tableName}`);
292
+ return Object.keys(table.columns);
292
293
  }
293
294
  function renderInsertValue(value, pim) {
294
295
  if (!value || value.kind === "default-value") return "DEFAULT";
@@ -325,7 +326,9 @@ function renderInsert(ast, contract, pim) {
325
326
  switch (action.kind) {
326
327
  case "do-nothing": return ` ON CONFLICT (${conflictColumns.join(", ")}) DO NOTHING`;
327
328
  case "do-update-set": {
328
- const updates = Object.entries(action.set).map(([colName, value]) => {
329
+ const updateEntries = Object.entries(action.set);
330
+ if (updateEntries.length === 0) throw new Error("INSERT onConflict do-update-set requires at least one assignment");
331
+ const updates = updateEntries.map(([colName, value]) => {
329
332
  const target = quoteIdentifier(colName);
330
333
  if (value.kind === "param-ref") return `${target} = ${renderParamRef(value, pim)}`;
331
334
  return `${target} = ${renderColumn(value)}`;
@@ -338,7 +341,9 @@ function renderInsert(ast, contract, pim) {
338
341
  }
339
342
  function renderUpdate(ast, contract, pim) {
340
343
  const table = quoteIdentifier(ast.table.name);
341
- const setClauses = Object.entries(ast.set).map(([col, val]) => {
344
+ const setEntries = Object.entries(ast.set);
345
+ if (setEntries.length === 0) throw new Error("UPDATE requires at least one SET assignment");
346
+ const setClauses = setEntries.map(([col, val]) => {
342
347
  const column = quoteIdentifier(col);
343
348
  let value;
344
349
  switch (val.kind) {
@@ -359,10 +364,7 @@ function renderUpdate(ast, contract, pim) {
359
364
  function renderDelete(ast, contract, pim) {
360
365
  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
366
  }
362
- function createPostgresAdapter(options) {
363
- return Object.freeze(new PostgresAdapterImpl(options));
364
- }
365
367
 
366
368
  //#endregion
367
- export { createPostgresAdapter as t };
368
- //# sourceMappingURL=adapter-Du9Hr9Rl.mjs.map
369
+ export { renderLoweredSql as t };
370
+ //# sourceMappingURL=sql-renderer-pEaSP82_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sql-renderer-pEaSP82_.mjs","names":["paramIndexMap: ParamIndexMap","params: unknown[]","sql: string","right: string","orderedColumns: string[]","value: string"],"sources":["../src/core/sql-renderer.ts"],"sourcesContent":["import {\n type AggregateExpr,\n type AnyExpression,\n type AnyFromSource,\n type AnyQueryAst,\n type BinaryExpr,\n type ColumnRef,\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 SubqueryExpr,\n type UpdateAst,\n} from '@prisma-next/sql-relational-core/ast';\nimport { PG_JSON_CODEC_ID, PG_JSONB_CODEC_ID } from '@prisma-next/target-postgres/codec-ids';\nimport { escapeLiteral, quoteIdentifier } from '@prisma-next/target-postgres/sql-utils';\nimport type { PostgresContract } from './types';\n\n// Mirrors `VECTOR_CODEC_ID` in `@prisma-next/extension-pgvector/core/constants`.\n// Duplicated here rather than imported because the canonical export is not\n// part of the extension's public subpath surface, and `@prisma-next/adapter-postgres`\n// does not (and should not) take a runtime dependency on the extension package\n// just for one constant. The whole `getCodecParamCast` switch is slated for\n// removal under TML-2310 (\"Move SQL param-cast metadata onto codec descriptors\"),\n// at which point this and the JSON/JSONB IDs below also disappear.\nconst VECTOR_CODEC_ID = 'pg/vector@1' as const;\n\n/**\n * Map a codec ID to its `::cast` suffix, if Postgres requires one for\n * parameterized values (e.g. `$1::vector`, `$1::jsonb`).\n *\n * NOTE: hardcoded codec IDs here are a known wart, tracked separately by\n * TML-2310 (\"Move SQL param-cast metadata onto codec descriptors\").\n * Until that lands the cast lives on the renderer rather than the codec.\n */\nfunction getCodecParamCast(codecId: string | undefined): string | undefined {\n if (codecId === VECTOR_CODEC_ID) {\n return 'vector';\n }\n if (codecId === PG_JSON_CODEC_ID) {\n return 'json';\n }\n if (codecId === PG_JSONB_CODEC_ID) {\n return 'jsonb';\n }\n return undefined;\n}\n\nfunction renderTypedParam(index: number, codecId: string | undefined): string {\n const cast = getCodecParamCast(codecId);\n return cast ? `$${index}::${cast}` : `$${index}`;\n}\n\ntype ParamIndexMap = Map<ParamRef, number>;\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): { readonly sql: string; readonly params: readonly unknown[] } {\n const collectedParamRefs = ast.collectParamRefs();\n const paramIndexMap: ParamIndexMap = new Map();\n const params: unknown[] = [];\n for (const ref of collectedParamRefs) {\n if (paramIndexMap.has(ref)) {\n continue;\n }\n paramIndexMap.set(ref, params.length + 1);\n params.push(ref.value);\n }\n\n const node = ast;\n let sql: string;\n switch (node.kind) {\n case 'select':\n sql = renderSelect(node, contract, paramIndexMap);\n break;\n case 'insert':\n sql = renderInsert(node, contract, paramIndexMap);\n break;\n case 'update':\n sql = renderUpdate(node, contract, paramIndexMap);\n break;\n case 'delete':\n sql = renderDelete(node, contract, paramIndexMap);\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 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.get(ref);\n if (index === undefined) {\n throw new Error('ParamRef not found in index map');\n }\n return renderTypedParam(index, ref.codecId);\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 ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\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 ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\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 ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(', ')}`\n : '';\n\n return `DELETE FROM ${table}${whereClause}${returningClause}`;\n}\n"],"mappings":"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"}
@@ -17,4 +17,4 @@ interface OrderClause {
17
17
  type PostgresLoweredStatement = LoweredStatement;
18
18
  //#endregion
19
19
  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
20
+ //# sourceMappingURL=types-CfRPdAk8.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-TyL62f9Y.d.mts","names":[],"sources":["../src/core/types.ts"],"sourcesContent":[],"mappings":";;;;;UAmBiB,sBAAA;;AAAjB;AAIY,KAAA,gBAAA,GAAmB,QAAS,CAAA,UAAT,CAAA,GAAA;EAEnB,SAAI,MAAA,EAAA,UAAA;CAAG;AAAY,KAAnB,IAAA,GAAO,SAAY,GAAA,QAAA,GAAW,gBAAX;AAAW,UAEzB,WAAA,CAFyB;EAAgB,SAAA,IAAA,EAGzC,SAHyC;EAEzC,SAAA,GAAA,EAED,SAFY;AAK5B;KAAY,wBAAA,GAA2B"}
1
+ {"version":3,"file":"types-CfRPdAk8.d.mts","names":[],"sources":["../src/core/types.ts"],"sourcesContent":[],"mappings":";;;;;UAmBiB,sBAAA;;AAAjB;AAIY,KAAA,gBAAA,GAAmB,QAAS,CAAA,UAAT,CAAA,GAAA;EAEnB,SAAI,MAAA,EAAA,UAAA;CAAG;AAAY,KAAnB,IAAA,GAAO,SAAY,GAAA,QAAA,GAAW,gBAAX;AAAW,UAEzB,WAAA,CAFyB;EAAgB,SAAA,IAAA,EAGzC,SAHyC;EAEzC,SAAA,GAAA,EAED,SAFY;AAK5B;KAAY,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-CfRPdAk8.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.5.0-dev.1",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -10,31 +10,36 @@
10
10
  "dependencies": {
11
11
  "ajv": "^8.18.0",
12
12
  "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"
13
+ "@prisma-next/contract": "0.5.0-dev.1",
14
+ "@prisma-next/contract-authoring": "0.5.0-dev.1",
15
+ "@prisma-next/sql-contract": "0.5.0-dev.1",
16
+ "@prisma-next/ids": "0.5.0-dev.1",
17
+ "@prisma-next/framework-components": "0.5.0-dev.1",
18
+ "@prisma-next/sql-contract-psl": "0.5.0-dev.1",
19
+ "@prisma-next/sql-operations": "0.5.0-dev.1",
20
+ "@prisma-next/sql-contract-ts": "0.5.0-dev.1",
21
+ "@prisma-next/family-sql": "0.5.0-dev.1",
22
+ "@prisma-next/sql-runtime": "0.5.0-dev.1",
23
+ "@prisma-next/sql-relational-core": "0.5.0-dev.1",
24
+ "@prisma-next/target-postgres": "0.5.0-dev.1",
25
+ "@prisma-next/sql-schema-ir": "0.5.0-dev.1",
26
+ "@prisma-next/utils": "0.5.0-dev.1"
26
27
  },
27
28
  "devDependencies": {
29
+ "pathe": "^2.0.3",
28
30
  "tsdown": "0.18.4",
29
31
  "typescript": "5.9.3",
30
32
  "vitest": "4.0.17",
31
- "@prisma-next/test-utils": "0.0.1",
33
+ "@prisma-next/cli": "0.5.0-dev.1",
34
+ "@prisma-next/driver-postgres": "0.5.0-dev.1",
35
+ "@prisma-next/errors": "0.5.0-dev.1",
36
+ "@prisma-next/extension-pgvector": "0.5.0-dev.1",
32
37
  "@prisma-next/tsdown": "0.0.0",
38
+ "@prisma-next/test-utils": "0.0.1",
33
39
  "@prisma-next/tsconfig": "0.0.0"
34
40
  },
35
41
  "exports": {
36
42
  "./adapter": "./dist/adapter.mjs",
37
- "./codec-types": "./dist/codec-types.mjs",
38
43
  "./column-types": "./dist/column-types.mjs",
39
44
  "./control": "./dist/control.mjs",
40
45
  "./operation-types": "./dist/operation-types.mjs",