@prisma-next/target-postgres 0.4.1 → 0.4.2

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 (178) hide show
  1. package/dist/codec-ids-CojIXVf9.mjs +29 -0
  2. package/dist/codec-ids-CojIXVf9.mjs.map +1 -0
  3. package/dist/codec-ids.d.mts +28 -0
  4. package/dist/codec-ids.d.mts.map +1 -0
  5. package/dist/codec-ids.mjs +3 -0
  6. package/dist/codec-types.d.mts +42 -0
  7. package/dist/codec-types.d.mts.map +1 -0
  8. package/dist/codec-types.mjs +3 -0
  9. package/dist/codecs-BoahtY_Q.mjs +385 -0
  10. package/dist/codecs-BoahtY_Q.mjs.map +1 -0
  11. package/dist/codecs-D-F2KJqt.d.mts +299 -0
  12. package/dist/codecs-D-F2KJqt.d.mts.map +1 -0
  13. package/dist/codecs.d.mts +2 -0
  14. package/dist/codecs.mjs +3 -0
  15. package/dist/control.d.mts +1 -1
  16. package/dist/control.mjs +9 -1982
  17. package/dist/control.mjs.map +1 -1
  18. package/dist/data-transform-CxFRBIUp.d.mts +32 -0
  19. package/dist/data-transform-CxFRBIUp.d.mts.map +1 -0
  20. package/dist/data-transform-VfEGzXWt.mjs +39 -0
  21. package/dist/data-transform-VfEGzXWt.mjs.map +1 -0
  22. package/dist/data-transform.d.mts +2 -0
  23. package/dist/data-transform.mjs +3 -0
  24. package/dist/default-normalizer-DNOpRoOF.mjs +131 -0
  25. package/dist/default-normalizer-DNOpRoOF.mjs.map +1 -0
  26. package/dist/default-normalizer.d.mts +19 -0
  27. package/dist/default-normalizer.d.mts.map +1 -0
  28. package/dist/default-normalizer.mjs +3 -0
  29. package/dist/{descriptor-meta-DkvCmY98.mjs → descriptor-meta-BVoVtyp-.mjs} +1 -1
  30. package/dist/{descriptor-meta-DkvCmY98.mjs.map → descriptor-meta-BVoVtyp-.mjs.map} +1 -1
  31. package/dist/errors-AFvEPZ1R.mjs +34 -0
  32. package/dist/errors-AFvEPZ1R.mjs.map +1 -0
  33. package/dist/errors.d.mts +27 -0
  34. package/dist/errors.d.mts.map +1 -0
  35. package/dist/errors.mjs +3 -0
  36. package/dist/issue-planner-CFjB0_oO.mjs +879 -0
  37. package/dist/issue-planner-CFjB0_oO.mjs.map +1 -0
  38. package/dist/issue-planner.d.mts +85 -0
  39. package/dist/issue-planner.d.mts.map +1 -0
  40. package/dist/issue-planner.mjs +3 -0
  41. package/dist/migration.d.mts +5 -79
  42. package/dist/migration.d.mts.map +1 -1
  43. package/dist/migration.mjs +6 -428
  44. package/dist/migration.mjs.map +1 -1
  45. package/dist/native-type-normalizer-CInai_oY.mjs +38 -0
  46. package/dist/native-type-normalizer-CInai_oY.mjs.map +1 -0
  47. package/dist/native-type-normalizer.d.mts +18 -0
  48. package/dist/native-type-normalizer.d.mts.map +1 -0
  49. package/dist/native-type-normalizer.mjs +3 -0
  50. package/dist/op-factory-call-BKlruaiC.mjs +605 -0
  51. package/dist/op-factory-call-BKlruaiC.mjs.map +1 -0
  52. package/dist/op-factory-call-C3bWXKSP.d.mts +304 -0
  53. package/dist/op-factory-call-C3bWXKSP.d.mts.map +1 -0
  54. package/dist/op-factory-call.d.mts +3 -0
  55. package/dist/op-factory-call.mjs +3 -0
  56. package/dist/pack.d.mts +1 -1
  57. package/dist/pack.mjs +1 -1
  58. package/dist/planner-CLUvVhUN.mjs +98 -0
  59. package/dist/planner-CLUvVhUN.mjs.map +1 -0
  60. package/dist/planner-ddl-builders-Dxvw1LHw.mjs +132 -0
  61. package/dist/planner-ddl-builders-Dxvw1LHw.mjs.map +1 -0
  62. package/dist/planner-ddl-builders.d.mts +22 -0
  63. package/dist/planner-ddl-builders.d.mts.map +1 -0
  64. package/dist/planner-ddl-builders.mjs +3 -0
  65. package/dist/planner-identity-values-Dju-o5GF.mjs +91 -0
  66. package/dist/planner-identity-values-Dju-o5GF.mjs.map +1 -0
  67. package/dist/planner-identity-values.d.mts +20 -0
  68. package/dist/planner-identity-values.d.mts.map +1 -0
  69. package/dist/planner-identity-values.mjs +3 -0
  70. package/dist/planner-produced-postgres-migration-CRRTno6Z.d.mts +20 -0
  71. package/dist/planner-produced-postgres-migration-CRRTno6Z.d.mts.map +1 -0
  72. package/dist/planner-produced-postgres-migration-DSSPq8QS.mjs +33 -0
  73. package/dist/planner-produced-postgres-migration-DSSPq8QS.mjs.map +1 -0
  74. package/dist/planner-produced-postgres-migration.d.mts +5 -0
  75. package/dist/planner-produced-postgres-migration.mjs +3 -0
  76. package/dist/planner-schema-lookup-B7lkypwn.mjs +29 -0
  77. package/dist/planner-schema-lookup-B7lkypwn.mjs.map +1 -0
  78. package/dist/planner-schema-lookup.d.mts +22 -0
  79. package/dist/planner-schema-lookup.d.mts.map +1 -0
  80. package/dist/planner-schema-lookup.mjs +3 -0
  81. package/dist/planner-sql-checks-7jkgm9TX.mjs +241 -0
  82. package/dist/planner-sql-checks-7jkgm9TX.mjs.map +1 -0
  83. package/dist/planner-sql-checks.d.mts +55 -0
  84. package/dist/planner-sql-checks.d.mts.map +1 -0
  85. package/dist/planner-sql-checks.mjs +3 -0
  86. package/dist/{planner-target-details-MXb3oeul.d.mts → planner-target-details-DH-azLu-.d.mts} +1 -1
  87. package/dist/{planner-target-details-MXb3oeul.d.mts.map → planner-target-details-DH-azLu-.d.mts.map} +1 -1
  88. package/dist/planner-target-details.d.mts +2 -0
  89. package/dist/planner-target-details.mjs +1 -0
  90. package/dist/planner.d.mts +68 -0
  91. package/dist/planner.d.mts.map +1 -0
  92. package/dist/planner.mjs +4 -0
  93. package/dist/postgres-migration-BjA3Zmts.d.mts +50 -0
  94. package/dist/postgres-migration-BjA3Zmts.d.mts.map +1 -0
  95. package/dist/postgres-migration-qtmtbONe.mjs +52 -0
  96. package/dist/postgres-migration-qtmtbONe.mjs.map +1 -0
  97. package/dist/render-ops-D6_DHdOK.mjs +8 -0
  98. package/dist/render-ops-D6_DHdOK.mjs.map +1 -0
  99. package/dist/render-ops.d.mts +11 -0
  100. package/dist/render-ops.d.mts.map +1 -0
  101. package/dist/render-ops.mjs +3 -0
  102. package/dist/render-typescript-1rF_SB4g.mjs +85 -0
  103. package/dist/render-typescript-1rF_SB4g.mjs.map +1 -0
  104. package/dist/render-typescript.d.mts +15 -0
  105. package/dist/render-typescript.d.mts.map +1 -0
  106. package/dist/render-typescript.mjs +3 -0
  107. package/dist/runtime.d.mts +15 -3
  108. package/dist/runtime.d.mts.map +1 -1
  109. package/dist/runtime.mjs +10 -1
  110. package/dist/runtime.mjs.map +1 -1
  111. package/dist/shared-Bxkt8pNO.d.mts +41 -0
  112. package/dist/shared-Bxkt8pNO.d.mts.map +1 -0
  113. package/dist/sql-utils-r-Lw535w.mjs +76 -0
  114. package/dist/sql-utils-r-Lw535w.mjs.map +1 -0
  115. package/dist/sql-utils.d.mts +59 -0
  116. package/dist/sql-utils.d.mts.map +1 -0
  117. package/dist/sql-utils.mjs +3 -0
  118. package/dist/statement-builders-BPnmt6wx.mjs +116 -0
  119. package/dist/statement-builders-BPnmt6wx.mjs.map +1 -0
  120. package/dist/statement-builders.d.mts +23 -0
  121. package/dist/statement-builders.d.mts.map +1 -0
  122. package/dist/statement-builders.mjs +3 -0
  123. package/dist/tables-BmdW_FWO.mjs +477 -0
  124. package/dist/tables-BmdW_FWO.mjs.map +1 -0
  125. package/dist/types-ClK03Ojd.d.mts +10 -0
  126. package/dist/types-ClK03Ojd.d.mts.map +1 -0
  127. package/dist/types.d.mts +2 -0
  128. package/dist/types.mjs +1 -0
  129. package/package.json +40 -20
  130. package/src/core/codec-ids.ts +30 -0
  131. package/src/core/codecs.ts +645 -0
  132. package/src/core/default-normalizer.ts +131 -0
  133. package/src/core/descriptor-meta.ts +1 -1
  134. package/src/core/errors.ts +33 -0
  135. package/src/core/json-schema-type-expression.ts +131 -0
  136. package/src/core/migrations/op-factory-call.ts +1 -5
  137. package/src/core/migrations/operations/columns.ts +1 -1
  138. package/src/core/migrations/operations/constraints.ts +1 -1
  139. package/src/core/migrations/operations/data-transform.ts +27 -21
  140. package/src/core/migrations/operations/dependencies.ts +1 -1
  141. package/src/core/migrations/operations/enums.ts +1 -1
  142. package/src/core/migrations/operations/indexes.ts +1 -1
  143. package/src/core/migrations/operations/shared.ts +1 -1
  144. package/src/core/migrations/operations/tables.ts +1 -1
  145. package/src/core/migrations/planner-ddl-builders.ts +1 -1
  146. package/src/core/migrations/planner-recipes.ts +1 -1
  147. package/src/core/migrations/planner-sql-checks.ts +1 -1
  148. package/src/core/migrations/planner.ts +2 -4
  149. package/src/core/migrations/postgres-migration.ts +54 -1
  150. package/src/core/migrations/render-typescript.ts +22 -12
  151. package/src/core/migrations/runner.ts +2 -4
  152. package/src/core/native-type-normalizer.ts +49 -0
  153. package/src/core/sql-utils.ts +104 -0
  154. package/src/exports/codec-ids.ts +1 -0
  155. package/src/exports/codec-types.ts +51 -0
  156. package/src/exports/codecs.ts +2 -0
  157. package/src/exports/data-transform.ts +1 -0
  158. package/src/exports/default-normalizer.ts +1 -0
  159. package/src/exports/errors.ts +1 -0
  160. package/src/exports/issue-planner.ts +1 -0
  161. package/src/exports/migration.ts +6 -0
  162. package/src/exports/native-type-normalizer.ts +1 -0
  163. package/src/exports/op-factory-call.ts +25 -0
  164. package/src/exports/planner-ddl-builders.ts +8 -0
  165. package/src/exports/planner-identity-values.ts +1 -0
  166. package/src/exports/planner-produced-postgres-migration.ts +1 -0
  167. package/src/exports/planner-schema-lookup.ts +6 -0
  168. package/src/exports/planner-sql-checks.ts +11 -0
  169. package/src/exports/planner-target-details.ts +1 -0
  170. package/src/exports/planner.ts +1 -0
  171. package/src/exports/render-ops.ts +1 -0
  172. package/src/exports/render-typescript.ts +1 -0
  173. package/src/exports/runtime.ts +19 -4
  174. package/src/exports/sql-utils.ts +7 -0
  175. package/src/exports/statement-builders.ts +7 -0
  176. package/src/exports/types.ts +1 -0
  177. package/dist/postgres-migration-BsHJHV9O.mjs +0 -2793
  178. package/dist/postgres-migration-BsHJHV9O.mjs.map +0 -1
@@ -1,431 +1,9 @@
1
- import { F as escapeLiteral, I as quoteIdentifier, M as codecDefinitions, N as PG_JSONB_CODEC_ID, P as PG_JSON_CODEC_ID, S as setNotNull, _ as alterColumnType, a as dropIndex, b as dropNotNull, c as dropEnumType, d as createSchema, f as addForeignKey, g as addColumn, h as dropConstraint, i as createIndex, l as renameType, m as addUnique, n as createTable, o as addEnumValues, p as addPrimaryKey, r as dropTable, s as createEnumType, t as PostgresMigration, u as createExtension, v as dropColumn, x as setDefault, y as dropDefault } from "./postgres-migration-BsHJHV9O.mjs";
2
- import { ifDefined } from "@prisma-next/utils/defined";
3
- import { LiteralExpr, createCodecRegistry } from "@prisma-next/sql-relational-core/ast";
4
- import { errorDataTransformContractMismatch, placeholder } from "@prisma-next/errors/migration";
5
- import { lowerSqlPlan } from "@prisma-next/sql-runtime";
1
+ import { _ as dropColumn, a as addEnumValues, b as setDefault, c as renameType, d as addForeignKey, f as addPrimaryKey, g as alterColumnType, h as addColumn, i as dropIndex, l as createExtension, m as dropConstraint, n as dropTable, o as createEnumType, p as addUnique, r as createIndex, s as dropEnumType, t as createTable, u as createSchema, v as dropDefault, x as setNotNull, y as dropNotNull } from "./tables-BmdW_FWO.mjs";
2
+ import { t as dataTransform } from "./data-transform-VfEGzXWt.mjs";
3
+ import { t as PostgresMigration } from "./postgres-migration-qtmtbONe.mjs";
4
+ import { placeholder } from "@prisma-next/errors/migration";
5
+ import { MigrationCLI } from "@prisma-next/cli/migration-cli";
6
6
 
7
- //#region ../../6-adapters/postgres/dist/adapter-Du9Hr9Rl.mjs
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";
13
- }
14
- function renderTypedParam(index, codecId) {
15
- const cast = getCodecParamCast(codecId);
16
- return cast ? `$${index}::${cast}` : `$${index}`;
17
- }
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
- });
94
- }
95
- };
96
- function renderSelect(ast, contract, pim) {
97
- return [
98
- `SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(ast.projection, contract, pim)}`,
99
- `FROM ${renderSource(ast.from, contract, pim)}`,
100
- ast.joins?.length ? ast.joins.map((join) => renderJoin(join, contract, pim)).join(" ") : "",
101
- ast.where ? `WHERE ${renderWhere(ast.where, contract, pim)}` : "",
102
- ast.groupBy?.length ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract, pim)).join(", ")}` : "",
103
- ast.having ? `HAVING ${renderWhere(ast.having, contract, pim)}` : "",
104
- ast.orderBy?.length ? `ORDER BY ${ast.orderBy.map((order) => {
105
- return `${renderExpr(order.expr, contract, pim)} ${order.dir.toUpperCase()}`;
106
- }).join(", ")}` : "",
107
- typeof ast.limit === "number" ? `LIMIT ${ast.limit}` : "",
108
- typeof ast.offset === "number" ? `OFFSET ${ast.offset}` : ""
109
- ].filter((part) => part.length > 0).join(" ").trim();
110
- }
111
- function renderProjection(projection, contract, pim) {
112
- return projection.map((item) => {
113
- const alias = quoteIdentifier(item.alias);
114
- if (item.expr.kind === "literal") return `${renderLiteral(item.expr)} AS ${alias}`;
115
- return `${renderExpr(item.expr, contract, pim)} AS ${alias}`;
116
- }).join(", ");
117
- }
118
- function renderDistinctPrefix(distinct, distinctOn, contract, pim) {
119
- if (distinctOn && distinctOn.length > 0) return `DISTINCT ON (${distinctOn.map((expr) => renderExpr(expr, contract, pim)).join(", ")}) `;
120
- if (distinct) return "DISTINCT ";
121
- return "";
122
- }
123
- function renderSource(source, contract, pim) {
124
- const node = source;
125
- switch (node.kind) {
126
- case "table-source": {
127
- const table = quoteIdentifier(node.name);
128
- if (!node.alias) return table;
129
- return `${table} AS ${quoteIdentifier(node.alias)}`;
130
- }
131
- case "derived-table-source": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;
132
- default: throw new Error(`Unsupported source node kind: ${node.kind}`);
133
- }
134
- }
135
- function assertScalarSubquery(query) {
136
- if (query.projection.length !== 1) throw new Error("Subquery expressions must project exactly one column");
137
- }
138
- function renderSubqueryExpr(expr, contract, pim) {
139
- assertScalarSubquery(expr.query);
140
- return `(${renderSelect(expr.query, contract, pim)})`;
141
- }
142
- function renderWhere(expr, contract, pim) {
143
- return renderExpr(expr, contract, pim);
144
- }
145
- function renderNullCheck(expr, contract, pim) {
146
- const rendered = renderExpr(expr.expr, contract, pim);
147
- const renderedExpr = expr.expr.kind === "operation" || expr.expr.kind === "subquery" ? `(${rendered})` : rendered;
148
- return expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;
149
- }
150
- function renderBinary(expr, contract, pim) {
151
- if (expr.right.kind === "list" && expr.right.values.length === 0) {
152
- if (expr.op === "in") return "FALSE";
153
- if (expr.op === "notIn") return "TRUE";
154
- }
155
- const leftExpr = expr.left;
156
- const left = renderExpr(leftExpr, contract, pim);
157
- const leftRendered = leftExpr.kind === "operation" || leftExpr.kind === "subquery" ? `(${left})` : left;
158
- const rightNode = expr.right;
159
- let right;
160
- switch (rightNode.kind) {
161
- case "list":
162
- right = renderListLiteral(rightNode, pim);
163
- break;
164
- case "literal":
165
- right = renderLiteral(rightNode);
166
- break;
167
- case "column-ref":
168
- right = renderColumn(rightNode);
169
- break;
170
- case "param-ref":
171
- right = renderParamRef(rightNode, pim);
172
- break;
173
- default:
174
- right = renderExpr(rightNode, contract, pim);
175
- break;
176
- }
177
- return `${leftRendered} ${{
178
- eq: "=",
179
- neq: "!=",
180
- gt: ">",
181
- lt: "<",
182
- gte: ">=",
183
- lte: "<=",
184
- like: "LIKE",
185
- in: "IN",
186
- notIn: "NOT IN"
187
- }[expr.op]} ${right}`;
188
- }
189
- function renderListLiteral(expr, pim) {
190
- if (expr.values.length === 0) return "(NULL)";
191
- return `(${expr.values.map((v) => {
192
- if (v.kind === "param-ref") return renderParamRef(v, pim);
193
- if (v.kind === "literal") return renderLiteral(v);
194
- return renderExpr(v, void 0, pim);
195
- }).join(", ")})`;
196
- }
197
- function renderColumn(ref) {
198
- if (ref.table === "excluded") return `excluded.${quoteIdentifier(ref.column)}`;
199
- return `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;
200
- }
201
- function renderAggregateExpr(expr, contract, pim) {
202
- const fn = expr.fn.toUpperCase();
203
- if (!expr.expr) return `${fn}(*)`;
204
- return `${fn}(${renderExpr(expr.expr, contract, pim)})`;
205
- }
206
- function renderJsonObjectExpr(expr, contract, pim) {
207
- return `json_build_object(${expr.entries.flatMap((entry) => {
208
- const key = `'${escapeLiteral(entry.key)}'`;
209
- if (entry.value.kind === "literal") return [key, renderLiteral(entry.value)];
210
- return [key, renderExpr(entry.value, contract, pim)];
211
- }).join(", ")})`;
212
- }
213
- function renderOrderByItems(items, contract, pim) {
214
- return items.map((item) => `${renderExpr(item.expr, contract, pim)} ${item.dir.toUpperCase()}`).join(", ");
215
- }
216
- function renderJsonArrayAggExpr(expr, contract, pim) {
217
- const aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : "";
218
- const aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;
219
- if (expr.onEmpty === "emptyArray") return `coalesce(${aggregated}, json_build_array())`;
220
- return aggregated;
221
- }
222
- function renderExpr(expr, contract, pim) {
223
- const node = expr;
224
- switch (node.kind) {
225
- case "column-ref": return renderColumn(node);
226
- case "identifier-ref": return quoteIdentifier(node.name);
227
- case "operation": return renderOperation(node, contract, pim);
228
- case "subquery": return renderSubqueryExpr(node, contract, pim);
229
- case "aggregate": return renderAggregateExpr(node, contract, pim);
230
- case "json-object": return renderJsonObjectExpr(node, contract, pim);
231
- case "json-array-agg": return renderJsonArrayAggExpr(node, contract, pim);
232
- case "binary": return renderBinary(node, contract, pim);
233
- case "and":
234
- if (node.exprs.length === 0) return "TRUE";
235
- return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(" AND ")})`;
236
- case "or":
237
- if (node.exprs.length === 0) return "FALSE";
238
- return `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(" OR ")})`;
239
- case "exists": return `${node.notExists ? "NOT " : ""}EXISTS (${renderSelect(node.subquery, contract, pim)})`;
240
- case "null-check": return renderNullCheck(node, contract, pim);
241
- case "not": return `NOT (${renderExpr(node.expr, contract, pim)})`;
242
- case "param-ref": return renderParamRef(node, pim);
243
- case "literal": return renderLiteral(node);
244
- case "list": return renderListLiteral(node, pim);
245
- default: throw new Error(`Unsupported expression node kind: ${node.kind}`);
246
- }
247
- }
248
- function renderParamRef(ref, pim) {
249
- const index = pim?.get(ref);
250
- if (index === void 0) throw new Error("ParamRef not found in index map");
251
- return renderTypedParam(index, ref.codecId);
252
- }
253
- function renderLiteral(expr) {
254
- if (typeof expr.value === "string") return `'${escapeLiteral(expr.value)}'`;
255
- if (typeof expr.value === "number" || typeof expr.value === "boolean") return String(expr.value);
256
- if (typeof expr.value === "bigint") return String(expr.value);
257
- if (expr.value === null) return "NULL";
258
- if (expr.value === void 0) return "NULL";
259
- if (expr.value instanceof Date) return `'${escapeLiteral(expr.value.toISOString())}'`;
260
- if (Array.isArray(expr.value)) return `ARRAY[${expr.value.map((v) => renderLiteral(new LiteralExpr(v))).join(", ")}]`;
261
- const json = JSON.stringify(expr.value);
262
- if (json === void 0) return "NULL";
263
- return `'${escapeLiteral(json)}'`;
264
- }
265
- function renderOperation(expr, contract, pim) {
266
- const self = renderExpr(expr.self, contract, pim);
267
- const args = expr.args.map((arg) => {
268
- return renderExpr(arg, contract, pim);
269
- });
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;
274
- }
275
- function renderJoin(join, contract, pim) {
276
- return `${join.joinType.toUpperCase()} JOIN ${join.lateral ? "LATERAL " : ""}${renderSource(join.source, contract, pim)} ON ${renderJoinOn(join.on, contract, pim)}`;
277
- }
278
- function renderJoinOn(on, contract, pim) {
279
- if (on.kind === "eq-col-join-on") return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;
280
- return renderWhere(on, contract, pim);
281
- }
282
- function getInsertColumnOrder(rows, contract, tableName) {
283
- const orderedColumns = [];
284
- const seenColumns = /* @__PURE__ */ new Set();
285
- for (const row of rows) for (const column of Object.keys(row)) {
286
- if (seenColumns.has(column)) continue;
287
- seenColumns.add(column);
288
- orderedColumns.push(column);
289
- }
290
- if (orderedColumns.length > 0) return orderedColumns;
291
- return Object.keys(contract.storage.tables[tableName]?.columns ?? {});
292
- }
293
- function renderInsertValue(value, pim) {
294
- if (!value || value.kind === "default-value") return "DEFAULT";
295
- switch (value.kind) {
296
- case "param-ref": return renderParamRef(value, pim);
297
- case "column-ref": return renderColumn(value);
298
- default: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);
299
- }
300
- }
301
- function renderInsert(ast, contract, pim) {
302
- const table = quoteIdentifier(ast.table.name);
303
- const rows = ast.rows;
304
- if (rows.length === 0) throw new Error("INSERT requires at least one row");
305
- const hasExplicitValues = rows.some((row) => Object.keys(row).length > 0);
306
- return `${(() => {
307
- if (!hasExplicitValues) {
308
- if (rows.length === 1) return `INSERT INTO ${table} DEFAULT VALUES`;
309
- const defaultColumns = getInsertColumnOrder(rows, contract, ast.table.name);
310
- if (defaultColumns.length === 0) return `INSERT INTO ${table} VALUES ${rows.map(() => "()").join(", ")}`;
311
- const quotedColumns = defaultColumns.map((column) => quoteIdentifier(column));
312
- const defaultRow = `(${defaultColumns.map(() => "DEFAULT").join(", ")})`;
313
- return `INSERT INTO ${table} (${quotedColumns.join(", ")}) VALUES ${rows.map(() => defaultRow).join(", ")}`;
314
- }
315
- const columnOrder = getInsertColumnOrder(rows, contract, ast.table.name);
316
- const columns = columnOrder.map((column) => quoteIdentifier(column));
317
- const values = rows.map((row) => {
318
- return `(${columnOrder.map((column) => renderInsertValue(row[column], pim)).join(", ")})`;
319
- }).join(", ");
320
- return `INSERT INTO ${table} (${columns.join(", ")}) VALUES ${values}`;
321
- })()}${ast.onConflict ? (() => {
322
- const conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));
323
- if (conflictColumns.length === 0) throw new Error("INSERT onConflict requires at least one conflict column");
324
- const action = ast.onConflict.action;
325
- switch (action.kind) {
326
- case "do-nothing": return ` ON CONFLICT (${conflictColumns.join(", ")}) DO NOTHING`;
327
- case "do-update-set": {
328
- const updates = Object.entries(action.set).map(([colName, value]) => {
329
- const target = quoteIdentifier(colName);
330
- if (value.kind === "param-ref") return `${target} = ${renderParamRef(value, pim)}`;
331
- return `${target} = ${renderColumn(value)}`;
332
- });
333
- return ` ON CONFLICT (${conflictColumns.join(", ")}) DO UPDATE SET ${updates.join(", ")}`;
334
- }
335
- default: throw new Error(`Unsupported onConflict action: ${action.kind}`);
336
- }
337
- })() : ""}${ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(", ")}` : ""}`;
338
- }
339
- function renderUpdate(ast, contract, pim) {
340
- const table = quoteIdentifier(ast.table.name);
341
- const setClauses = Object.entries(ast.set).map(([col, val]) => {
342
- const column = quoteIdentifier(col);
343
- let value;
344
- switch (val.kind) {
345
- case "param-ref":
346
- value = renderParamRef(val, pim);
347
- break;
348
- case "column-ref":
349
- value = renderColumn(val);
350
- break;
351
- default: throw new Error(`Unsupported value node in UPDATE: ${val.kind}`);
352
- }
353
- return `${column} = ${value}`;
354
- });
355
- 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(", ")}` : "";
357
- return `UPDATE ${table} SET ${setClauses.join(", ")}${whereClause}${returningClause}`;
358
- }
359
- 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));
364
- }
365
-
366
- //#endregion
367
- //#region src/core/migrations/operations/data-transform.ts
368
- /**
369
- * User-facing `dataTransform` factory for the Postgres migration authoring
370
- * surface. Invoked directly inside a `migration.ts` file:
371
- *
372
- * ```ts
373
- * import endContract from './end-contract.json' with { type: 'json' };
374
- * import { dataTransform } from '@prisma-next/target-postgres/migration';
375
- *
376
- * dataTransform(endContract, 'backfill emails', {
377
- * check: () => db.users.count().where(({ email }) => email.isNull()),
378
- * run: () => db.users.update({ email: '' }).where(({ email }) => email.isNull()),
379
- * });
380
- * ```
381
- *
382
- * The factory accepts lazy closures (`() => SqlQueryPlan | Buildable`),
383
- * invokes each one, asserts that its `meta.storageHash` matches the
384
- * `contract` it was handed (→ `PN-MIG-2005` on mismatch), and lowers the
385
- * plan via the Postgres adapter to a serialized `{sql, params}` payload
386
- * for `ops.json`.
387
- */
388
- /** Single shared adapter for apply/CLI; sufficient for single-threaded migration execution. */
389
- let adapterSingleton = null;
390
- function getAdapter() {
391
- if (adapterSingleton === null) adapterSingleton = createPostgresAdapter();
392
- return adapterSingleton;
393
- }
394
- function dataTransform(contract, name, options) {
395
- const adapter = getAdapter();
396
- const runClosures = Array.isArray(options.run) ? options.run : [options.run];
397
- return {
398
- id: `data_migration.${name}`,
399
- label: `Data transform: ${name}`,
400
- operationClass: "data",
401
- name,
402
- source: "migration.ts",
403
- check: options.check ? invokeAndLower(options.check, contract, adapter, name) : null,
404
- run: runClosures.map((closure) => invokeAndLower(closure, contract, adapter, name))
405
- };
406
- }
407
- function invokeAndLower(closure, contract, adapter, name) {
408
- const result = closure();
409
- const plan = isBuildable(result) ? result.build() : result;
410
- assertContractMatches(plan, contract, name);
411
- const lowered = lowerSqlPlan(adapter, contract, plan);
412
- return {
413
- sql: lowered.sql,
414
- params: lowered.params
415
- };
416
- }
417
- function isBuildable(value) {
418
- return typeof value === "object" && value !== null && "build" in value && typeof value.build === "function";
419
- }
420
- function assertContractMatches(plan, contract, name) {
421
- if (plan.meta.storageHash !== contract.storage.storageHash) throw errorDataTransformContractMismatch({
422
- dataTransformName: name,
423
- expected: contract.storage.storageHash,
424
- actual: plan.meta.storageHash
425
- });
426
- }
427
-
428
- //#endregion
429
7
  //#region src/core/migrations/operations/raw.ts
430
8
  /**
431
9
  * Identity factory for an already-materialized `SqlMigrationPlanOperation`.
@@ -442,5 +20,5 @@ function rawSql(op) {
442
20
  }
443
21
 
444
22
  //#endregion
445
- export { PostgresMigration as Migration, addColumn, addEnumValues, addForeignKey, addPrimaryKey, addUnique, alterColumnType, createEnumType, createExtension, createIndex, createSchema, createTable, dataTransform, dropColumn, dropConstraint, dropDefault, dropEnumType, dropIndex, dropNotNull, dropTable, placeholder, rawSql, renameType, setDefault, setNotNull };
23
+ export { PostgresMigration as Migration, MigrationCLI, addColumn, addEnumValues, addForeignKey, addPrimaryKey, addUnique, alterColumnType, createEnumType, createExtension, createIndex, createSchema, createTable, dataTransform, dropColumn, dropConstraint, dropDefault, dropEnumType, dropIndex, dropNotNull, dropTable, placeholder, rawSql, renameType, setDefault, setNotNull };
446
24
  //# sourceMappingURL=migration.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"migration.mjs","names":["adapterSingleton: ReturnType<typeof createPostgresAdapter> | null","runClosures: readonly DataTransformClosure[]"],"sources":["../../../6-adapters/postgres/dist/adapter-Du9Hr9Rl.mjs","../src/core/migrations/operations/data-transform.ts","../src/core/migrations/operations/raw.ts"],"sourcesContent":["import { m as PG_JSON_CODEC_ID, p as PG_JSONB_CODEC_ID } from \"./codec-ids-5g4Gwrgm.mjs\";\nimport { t as codecDefinitions } from \"./codecs-DiPlMi3-.mjs\";\nimport { i as quoteIdentifier, n as escapeLiteral } from \"./sql-utils-DkUJyZmA.mjs\";\nimport { LiteralExpr, createCodecRegistry } from \"@prisma-next/sql-relational-core/ast\";\nimport { ifDefined } from \"@prisma-next/utils/defined\";\n\n//#region src/core/adapter.ts\nconst VECTOR_CODEC_ID = \"pg/vector@1\";\nfunction getCodecParamCast(codecId) {\n\tif (codecId === VECTOR_CODEC_ID) return \"vector\";\n\tif (codecId === PG_JSON_CODEC_ID) return \"json\";\n\tif (codecId === PG_JSONB_CODEC_ID) return \"jsonb\";\n}\nfunction renderTypedParam(index, codecId) {\n\tconst cast = getCodecParamCast(codecId);\n\treturn cast ? `$${index}::${cast}` : `$${index}`;\n}\nconst defaultCapabilities = Object.freeze({\n\tpostgres: {\n\t\torderBy: true,\n\t\tlimit: true,\n\t\tlateral: true,\n\t\tjsonAgg: true,\n\t\treturning: true\n\t},\n\tsql: {\n\t\tenums: true,\n\t\treturning: true,\n\t\tdefaultInInsert: true\n\t}\n});\nconst parameterizedCodecs = Object.values(codecDefinitions).map((definition) => definition.codec).filter((codec$1) => codec$1.paramsSchema !== void 0).map((codec$1) => Object.freeze({\n\tcodecId: codec$1.id,\n\tparamsSchema: codec$1.paramsSchema,\n\t...ifDefined(\"init\", codec$1.init)\n}));\nvar PostgresAdapterImpl = class {\n\tfamilyId = \"sql\";\n\ttargetId = \"postgres\";\n\tprofile;\n\tcodecRegistry = (() => {\n\t\tconst registry = createCodecRegistry();\n\t\tfor (const definition of Object.values(codecDefinitions)) registry.register(definition.codec);\n\t\treturn registry;\n\t})();\n\tconstructor(options) {\n\t\tthis.profile = Object.freeze({\n\t\t\tid: options?.profileId ?? \"postgres/default@1\",\n\t\t\ttarget: \"postgres\",\n\t\t\tcapabilities: defaultCapabilities,\n\t\t\tcodecs: () => this.codecRegistry,\n\t\t\treadMarkerStatement: () => ({\n\t\t\t\tsql: \"select core_hash, profile_hash, contract_json, canonical_version, updated_at, app_tag, meta from prisma_contract.marker where id = $1\",\n\t\t\t\tparams: [1]\n\t\t\t})\n\t\t});\n\t}\n\tparameterizedCodecs() {\n\t\treturn parameterizedCodecs;\n\t}\n\tlower(ast, context) {\n\t\tconst collectedParamRefs = ast.collectParamRefs();\n\t\tconst paramIndexMap = /* @__PURE__ */ new Map();\n\t\tconst params = [];\n\t\tfor (const ref of collectedParamRefs) {\n\t\t\tif (paramIndexMap.has(ref)) continue;\n\t\t\tparamIndexMap.set(ref, params.length + 1);\n\t\t\tparams.push(ref.value);\n\t\t}\n\t\tlet sql;\n\t\tconst node = ast;\n\t\tswitch (node.kind) {\n\t\t\tcase \"select\":\n\t\t\t\tsql = renderSelect(node, context.contract, paramIndexMap);\n\t\t\t\tbreak;\n\t\t\tcase \"insert\":\n\t\t\t\tsql = renderInsert(node, context.contract, paramIndexMap);\n\t\t\t\tbreak;\n\t\t\tcase \"update\":\n\t\t\t\tsql = renderUpdate(node, context.contract, paramIndexMap);\n\t\t\t\tbreak;\n\t\t\tcase \"delete\":\n\t\t\t\tsql = renderDelete(node, context.contract, paramIndexMap);\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error(`Unsupported AST node kind: ${node.kind}`);\n\t\t}\n\t\treturn Object.freeze({\n\t\t\tprofileId: this.profile.id,\n\t\t\tbody: Object.freeze({\n\t\t\t\tsql,\n\t\t\t\tparams\n\t\t\t})\n\t\t});\n\t}\n};\nfunction renderSelect(ast, contract, pim) {\n\treturn [\n\t\t`SELECT ${renderDistinctPrefix(ast.distinct, ast.distinctOn, contract, pim)}${renderProjection(ast.projection, contract, pim)}`,\n\t\t`FROM ${renderSource(ast.from, contract, pim)}`,\n\t\tast.joins?.length ? ast.joins.map((join) => renderJoin(join, contract, pim)).join(\" \") : \"\",\n\t\tast.where ? `WHERE ${renderWhere(ast.where, contract, pim)}` : \"\",\n\t\tast.groupBy?.length ? `GROUP BY ${ast.groupBy.map((expr) => renderExpr(expr, contract, pim)).join(\", \")}` : \"\",\n\t\tast.having ? `HAVING ${renderWhere(ast.having, contract, pim)}` : \"\",\n\t\tast.orderBy?.length ? `ORDER BY ${ast.orderBy.map((order) => {\n\t\t\treturn `${renderExpr(order.expr, contract, pim)} ${order.dir.toUpperCase()}`;\n\t\t}).join(\", \")}` : \"\",\n\t\ttypeof ast.limit === \"number\" ? `LIMIT ${ast.limit}` : \"\",\n\t\ttypeof ast.offset === \"number\" ? `OFFSET ${ast.offset}` : \"\"\n\t].filter((part) => part.length > 0).join(\" \").trim();\n}\nfunction renderProjection(projection, contract, pim) {\n\treturn projection.map((item) => {\n\t\tconst alias = quoteIdentifier(item.alias);\n\t\tif (item.expr.kind === \"literal\") return `${renderLiteral(item.expr)} AS ${alias}`;\n\t\treturn `${renderExpr(item.expr, contract, pim)} AS ${alias}`;\n\t}).join(\", \");\n}\nfunction renderDistinctPrefix(distinct, distinctOn, contract, pim) {\n\tif (distinctOn && distinctOn.length > 0) return `DISTINCT ON (${distinctOn.map((expr) => renderExpr(expr, contract, pim)).join(\", \")}) `;\n\tif (distinct) return \"DISTINCT \";\n\treturn \"\";\n}\nfunction renderSource(source, contract, pim) {\n\tconst node = source;\n\tswitch (node.kind) {\n\t\tcase \"table-source\": {\n\t\t\tconst table = quoteIdentifier(node.name);\n\t\t\tif (!node.alias) return table;\n\t\t\treturn `${table} AS ${quoteIdentifier(node.alias)}`;\n\t\t}\n\t\tcase \"derived-table-source\": return `(${renderSelect(node.query, contract, pim)}) AS ${quoteIdentifier(node.alias)}`;\n\t\tdefault: throw new Error(`Unsupported source node kind: ${node.kind}`);\n\t}\n}\nfunction assertScalarSubquery(query) {\n\tif (query.projection.length !== 1) throw new Error(\"Subquery expressions must project exactly one column\");\n}\nfunction renderSubqueryExpr(expr, contract, pim) {\n\tassertScalarSubquery(expr.query);\n\treturn `(${renderSelect(expr.query, contract, pim)})`;\n}\nfunction renderWhere(expr, contract, pim) {\n\treturn renderExpr(expr, contract, pim);\n}\nfunction renderNullCheck(expr, contract, pim) {\n\tconst rendered = renderExpr(expr.expr, contract, pim);\n\tconst renderedExpr = expr.expr.kind === \"operation\" || expr.expr.kind === \"subquery\" ? `(${rendered})` : rendered;\n\treturn expr.isNull ? `${renderedExpr} IS NULL` : `${renderedExpr} IS NOT NULL`;\n}\nfunction renderBinary(expr, contract, pim) {\n\tif (expr.right.kind === \"list\" && expr.right.values.length === 0) {\n\t\tif (expr.op === \"in\") return \"FALSE\";\n\t\tif (expr.op === \"notIn\") return \"TRUE\";\n\t}\n\tconst leftExpr = expr.left;\n\tconst left = renderExpr(leftExpr, contract, pim);\n\tconst leftRendered = leftExpr.kind === \"operation\" || leftExpr.kind === \"subquery\" ? `(${left})` : left;\n\tconst rightNode = expr.right;\n\tlet right;\n\tswitch (rightNode.kind) {\n\t\tcase \"list\":\n\t\t\tright = renderListLiteral(rightNode, pim);\n\t\t\tbreak;\n\t\tcase \"literal\":\n\t\t\tright = renderLiteral(rightNode);\n\t\t\tbreak;\n\t\tcase \"column-ref\":\n\t\t\tright = renderColumn(rightNode);\n\t\t\tbreak;\n\t\tcase \"param-ref\":\n\t\t\tright = renderParamRef(rightNode, pim);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tright = renderExpr(rightNode, contract, pim);\n\t\t\tbreak;\n\t}\n\treturn `${leftRendered} ${{\n\t\teq: \"=\",\n\t\tneq: \"!=\",\n\t\tgt: \">\",\n\t\tlt: \"<\",\n\t\tgte: \">=\",\n\t\tlte: \"<=\",\n\t\tlike: \"LIKE\",\n\t\tin: \"IN\",\n\t\tnotIn: \"NOT IN\"\n\t}[expr.op]} ${right}`;\n}\nfunction renderListLiteral(expr, pim) {\n\tif (expr.values.length === 0) return \"(NULL)\";\n\treturn `(${expr.values.map((v) => {\n\t\tif (v.kind === \"param-ref\") return renderParamRef(v, pim);\n\t\tif (v.kind === \"literal\") return renderLiteral(v);\n\t\treturn renderExpr(v, void 0, pim);\n\t}).join(\", \")})`;\n}\nfunction renderColumn(ref) {\n\tif (ref.table === \"excluded\") return `excluded.${quoteIdentifier(ref.column)}`;\n\treturn `${quoteIdentifier(ref.table)}.${quoteIdentifier(ref.column)}`;\n}\nfunction renderAggregateExpr(expr, contract, pim) {\n\tconst fn = expr.fn.toUpperCase();\n\tif (!expr.expr) return `${fn}(*)`;\n\treturn `${fn}(${renderExpr(expr.expr, contract, pim)})`;\n}\nfunction renderJsonObjectExpr(expr, contract, pim) {\n\treturn `json_build_object(${expr.entries.flatMap((entry) => {\n\t\tconst key = `'${escapeLiteral(entry.key)}'`;\n\t\tif (entry.value.kind === \"literal\") return [key, renderLiteral(entry.value)];\n\t\treturn [key, renderExpr(entry.value, contract, pim)];\n\t}).join(\", \")})`;\n}\nfunction renderOrderByItems(items, contract, pim) {\n\treturn items.map((item) => `${renderExpr(item.expr, contract, pim)} ${item.dir.toUpperCase()}`).join(\", \");\n}\nfunction renderJsonArrayAggExpr(expr, contract, pim) {\n\tconst aggregateOrderBy = expr.orderBy && expr.orderBy.length > 0 ? ` ORDER BY ${renderOrderByItems(expr.orderBy, contract, pim)}` : \"\";\n\tconst aggregated = `json_agg(${renderExpr(expr.expr, contract, pim)}${aggregateOrderBy})`;\n\tif (expr.onEmpty === \"emptyArray\") return `coalesce(${aggregated}, json_build_array())`;\n\treturn aggregated;\n}\nfunction renderExpr(expr, contract, pim) {\n\tconst node = expr;\n\tswitch (node.kind) {\n\t\tcase \"column-ref\": return renderColumn(node);\n\t\tcase \"identifier-ref\": return quoteIdentifier(node.name);\n\t\tcase \"operation\": return renderOperation(node, contract, pim);\n\t\tcase \"subquery\": return renderSubqueryExpr(node, contract, pim);\n\t\tcase \"aggregate\": return renderAggregateExpr(node, contract, pim);\n\t\tcase \"json-object\": return renderJsonObjectExpr(node, contract, pim);\n\t\tcase \"json-array-agg\": return renderJsonArrayAggExpr(node, contract, pim);\n\t\tcase \"binary\": return renderBinary(node, contract, pim);\n\t\tcase \"and\":\n\t\t\tif (node.exprs.length === 0) return \"TRUE\";\n\t\t\treturn `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(\" AND \")})`;\n\t\tcase \"or\":\n\t\t\tif (node.exprs.length === 0) return \"FALSE\";\n\t\t\treturn `(${node.exprs.map((part) => renderExpr(part, contract, pim)).join(\" OR \")})`;\n\t\tcase \"exists\": return `${node.notExists ? \"NOT \" : \"\"}EXISTS (${renderSelect(node.subquery, contract, pim)})`;\n\t\tcase \"null-check\": return renderNullCheck(node, contract, pim);\n\t\tcase \"not\": return `NOT (${renderExpr(node.expr, contract, pim)})`;\n\t\tcase \"param-ref\": return renderParamRef(node, pim);\n\t\tcase \"literal\": return renderLiteral(node);\n\t\tcase \"list\": return renderListLiteral(node, pim);\n\t\tdefault: throw new Error(`Unsupported expression node kind: ${node.kind}`);\n\t}\n}\nfunction renderParamRef(ref, pim) {\n\tconst index = pim?.get(ref);\n\tif (index === void 0) throw new Error(\"ParamRef not found in index map\");\n\treturn renderTypedParam(index, ref.codecId);\n}\nfunction renderLiteral(expr) {\n\tif (typeof expr.value === \"string\") return `'${escapeLiteral(expr.value)}'`;\n\tif (typeof expr.value === \"number\" || typeof expr.value === \"boolean\") return String(expr.value);\n\tif (typeof expr.value === \"bigint\") return String(expr.value);\n\tif (expr.value === null) return \"NULL\";\n\tif (expr.value === void 0) return \"NULL\";\n\tif (expr.value instanceof Date) return `'${escapeLiteral(expr.value.toISOString())}'`;\n\tif (Array.isArray(expr.value)) return `ARRAY[${expr.value.map((v) => renderLiteral(new LiteralExpr(v))).join(\", \")}]`;\n\tconst json = JSON.stringify(expr.value);\n\tif (json === void 0) return \"NULL\";\n\treturn `'${escapeLiteral(json)}'`;\n}\nfunction renderOperation(expr, contract, pim) {\n\tconst self = renderExpr(expr.self, contract, pim);\n\tconst args = expr.args.map((arg) => {\n\t\treturn renderExpr(arg, contract, pim);\n\t});\n\tlet result = expr.lowering.template;\n\tresult = result.replace(/\\{\\{self\\}\\}/g, self);\n\tfor (let i = 0; i < args.length; i++) result = result.replace(new RegExp(`\\\\{\\\\{arg${i}\\\\}\\\\}`, \"g\"), args[i] ?? \"\");\n\treturn result;\n}\nfunction renderJoin(join, contract, pim) {\n\treturn `${join.joinType.toUpperCase()} JOIN ${join.lateral ? \"LATERAL \" : \"\"}${renderSource(join.source, contract, pim)} ON ${renderJoinOn(join.on, contract, pim)}`;\n}\nfunction renderJoinOn(on, contract, pim) {\n\tif (on.kind === \"eq-col-join-on\") return `${renderColumn(on.left)} = ${renderColumn(on.right)}`;\n\treturn renderWhere(on, contract, pim);\n}\nfunction getInsertColumnOrder(rows, contract, tableName) {\n\tconst orderedColumns = [];\n\tconst seenColumns = /* @__PURE__ */ new Set();\n\tfor (const row of rows) for (const column of Object.keys(row)) {\n\t\tif (seenColumns.has(column)) continue;\n\t\tseenColumns.add(column);\n\t\torderedColumns.push(column);\n\t}\n\tif (orderedColumns.length > 0) return orderedColumns;\n\treturn Object.keys(contract.storage.tables[tableName]?.columns ?? {});\n}\nfunction renderInsertValue(value, pim) {\n\tif (!value || value.kind === \"default-value\") return \"DEFAULT\";\n\tswitch (value.kind) {\n\t\tcase \"param-ref\": return renderParamRef(value, pim);\n\t\tcase \"column-ref\": return renderColumn(value);\n\t\tdefault: throw new Error(`Unsupported value node in INSERT: ${value.kind}`);\n\t}\n}\nfunction renderInsert(ast, contract, pim) {\n\tconst table = quoteIdentifier(ast.table.name);\n\tconst rows = ast.rows;\n\tif (rows.length === 0) throw new Error(\"INSERT requires at least one row\");\n\tconst hasExplicitValues = rows.some((row) => Object.keys(row).length > 0);\n\treturn `${(() => {\n\t\tif (!hasExplicitValues) {\n\t\t\tif (rows.length === 1) return `INSERT INTO ${table} DEFAULT VALUES`;\n\t\t\tconst defaultColumns = getInsertColumnOrder(rows, contract, ast.table.name);\n\t\t\tif (defaultColumns.length === 0) return `INSERT INTO ${table} VALUES ${rows.map(() => \"()\").join(\", \")}`;\n\t\t\tconst quotedColumns = defaultColumns.map((column) => quoteIdentifier(column));\n\t\t\tconst defaultRow = `(${defaultColumns.map(() => \"DEFAULT\").join(\", \")})`;\n\t\t\treturn `INSERT INTO ${table} (${quotedColumns.join(\", \")}) VALUES ${rows.map(() => defaultRow).join(\", \")}`;\n\t\t}\n\t\tconst columnOrder = getInsertColumnOrder(rows, contract, ast.table.name);\n\t\tconst columns = columnOrder.map((column) => quoteIdentifier(column));\n\t\tconst values = rows.map((row) => {\n\t\t\treturn `(${columnOrder.map((column) => renderInsertValue(row[column], pim)).join(\", \")})`;\n\t\t}).join(\", \");\n\t\treturn `INSERT INTO ${table} (${columns.join(\", \")}) VALUES ${values}`;\n\t})()}${ast.onConflict ? (() => {\n\t\tconst conflictColumns = ast.onConflict.columns.map((col) => quoteIdentifier(col.column));\n\t\tif (conflictColumns.length === 0) throw new Error(\"INSERT onConflict requires at least one conflict column\");\n\t\tconst action = ast.onConflict.action;\n\t\tswitch (action.kind) {\n\t\t\tcase \"do-nothing\": return ` ON CONFLICT (${conflictColumns.join(\", \")}) DO NOTHING`;\n\t\t\tcase \"do-update-set\": {\n\t\t\t\tconst updates = Object.entries(action.set).map(([colName, value]) => {\n\t\t\t\t\tconst target = quoteIdentifier(colName);\n\t\t\t\t\tif (value.kind === \"param-ref\") return `${target} = ${renderParamRef(value, pim)}`;\n\t\t\t\t\treturn `${target} = ${renderColumn(value)}`;\n\t\t\t\t});\n\t\t\t\treturn ` ON CONFLICT (${conflictColumns.join(\", \")}) DO UPDATE SET ${updates.join(\", \")}`;\n\t\t\t}\n\t\t\tdefault: throw new Error(`Unsupported onConflict action: ${action.kind}`);\n\t\t}\n\t})() : \"\"}${ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(\", \")}` : \"\"}`;\n}\nfunction renderUpdate(ast, contract, pim) {\n\tconst table = quoteIdentifier(ast.table.name);\n\tconst setClauses = Object.entries(ast.set).map(([col, val]) => {\n\t\tconst column = quoteIdentifier(col);\n\t\tlet value;\n\t\tswitch (val.kind) {\n\t\t\tcase \"param-ref\":\n\t\t\t\tvalue = renderParamRef(val, pim);\n\t\t\t\tbreak;\n\t\t\tcase \"column-ref\":\n\t\t\t\tvalue = renderColumn(val);\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error(`Unsupported value node in UPDATE: ${val.kind}`);\n\t\t}\n\t\treturn `${column} = ${value}`;\n\t});\n\tconst whereClause = ast.where ? ` WHERE ${renderWhere(ast.where, contract, pim)}` : \"\";\n\tconst returningClause = ast.returning?.length ? ` RETURNING ${ast.returning.map((col) => `${quoteIdentifier(col.table)}.${quoteIdentifier(col.column)}`).join(\", \")}` : \"\";\n\treturn `UPDATE ${table} SET ${setClauses.join(\", \")}${whereClause}${returningClause}`;\n}\nfunction renderDelete(ast, contract, pim) {\n\treturn `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(\", \")}` : \"\"}`;\n}\nfunction createPostgresAdapter(options) {\n\treturn Object.freeze(new PostgresAdapterImpl(options));\n}\n\n//#endregion\nexport { createPostgresAdapter as t };\n//# sourceMappingURL=adapter-Du9Hr9Rl.mjs.map","/**\n * User-facing `dataTransform` factory for the Postgres migration authoring\n * surface. Invoked directly inside a `migration.ts` file:\n *\n * ```ts\n * import endContract from './end-contract.json' with { type: 'json' };\n * import { dataTransform } from '@prisma-next/target-postgres/migration';\n *\n * dataTransform(endContract, 'backfill emails', {\n * check: () => db.users.count().where(({ email }) => email.isNull()),\n * run: () => db.users.update({ email: '' }).where(({ email }) => email.isNull()),\n * });\n * ```\n *\n * The factory accepts lazy closures (`() => SqlQueryPlan | Buildable`),\n * invokes each one, asserts that its `meta.storageHash` matches the\n * `contract` it was handed (→ `PN-MIG-2005` on mismatch), and lowers the\n * plan via the Postgres adapter to a serialized `{sql, params}` payload\n * for `ops.json`.\n */\n\nimport { createPostgresAdapter } from '@prisma-next/adapter-postgres/adapter';\nimport type { Contract } from '@prisma-next/contract/types';\nimport { errorDataTransformContractMismatch } from '@prisma-next/errors/migration';\nimport type {\n DataTransformOperation,\n SerializedQueryPlan,\n} from '@prisma-next/framework-components/control';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlQueryPlan } from '@prisma-next/sql-relational-core/plan';\nimport { lowerSqlPlan } from '@prisma-next/sql-runtime';\n\ninterface Buildable<R = unknown> {\n build(): SqlQueryPlan<R>;\n}\n\n/**\n * A single-closure producer of a SQL query plan. Shared between\n * `check` and each `run` entry.\n */\nexport type DataTransformClosure = () => SqlQueryPlan | Buildable;\n\nexport interface DataTransformOptions {\n /** Optional pre-flight query. `undefined` means \"no check\". */\n readonly check?: DataTransformClosure;\n /** One or more mutation queries to execute. */\n readonly run: DataTransformClosure | readonly DataTransformClosure[];\n}\n\n/** Single shared adapter for apply/CLI; sufficient for single-threaded migration execution. */\nlet adapterSingleton: ReturnType<typeof createPostgresAdapter> | null = null;\nfunction getAdapter(): ReturnType<typeof createPostgresAdapter> {\n if (adapterSingleton === null) {\n adapterSingleton = createPostgresAdapter();\n }\n return adapterSingleton;\n}\n\nexport function dataTransform<TContract extends Contract<SqlStorage>>(\n contract: TContract,\n name: string,\n options: DataTransformOptions,\n): DataTransformOperation {\n const adapter = getAdapter();\n const runClosures: readonly DataTransformClosure[] = Array.isArray(options.run)\n ? options.run\n : [options.run as DataTransformClosure];\n return {\n id: `data_migration.${name}`,\n label: `Data transform: ${name}`,\n operationClass: 'data',\n name,\n source: 'migration.ts',\n check: options.check ? invokeAndLower(options.check, contract, adapter, name) : null,\n run: runClosures.map((closure) => invokeAndLower(closure, contract, adapter, name)),\n };\n}\n\nfunction invokeAndLower(\n closure: DataTransformClosure,\n contract: Contract<SqlStorage>,\n adapter: ReturnType<typeof createPostgresAdapter>,\n name: string,\n): SerializedQueryPlan {\n const result = closure();\n const plan = isBuildable(result) ? result.build() : result;\n assertContractMatches(plan, contract, name);\n const lowered = lowerSqlPlan(adapter, contract, plan);\n return { sql: lowered.sql, params: lowered.params };\n}\n\nfunction isBuildable(value: unknown): value is Buildable {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'build' in value &&\n typeof (value as { build: unknown }).build === 'function'\n );\n}\n\nfunction assertContractMatches(\n plan: SqlQueryPlan,\n contract: Contract<SqlStorage>,\n name: string,\n): void {\n if (plan.meta.storageHash !== contract.storage.storageHash) {\n throw errorDataTransformContractMismatch({\n dataTransformName: name,\n expected: contract.storage.storageHash,\n actual: plan.meta.storageHash,\n });\n }\n}\n","import type { Op } from './shared';\n\n/**\n * Identity factory for an already-materialized `SqlMigrationPlanOperation`.\n *\n * The planner uses this via `liftOpToCall` to carry ops produced by SQL\n * family methods, codec control hooks, and component database dependencies\n * alongside migration IR without reverse-engineering them. Users writing\n * raw migrations can pass a full op shape directly — typically built by\n * composing SQL family helpers — to author a migration that bypasses the\n * structured call classes.\n */\nexport function rawSql(op: Op): Op {\n return op;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"migration.mjs","names":[],"sources":["../src/core/migrations/operations/raw.ts"],"sourcesContent":["import type { Op } from './shared';\n\n/**\n * Identity factory for an already-materialized `SqlMigrationPlanOperation`.\n *\n * The planner uses this via `liftOpToCall` to carry ops produced by SQL\n * family methods, codec control hooks, and component database dependencies\n * alongside migration IR without reverse-engineering them. Users writing\n * raw migrations can pass a full op shape directly — typically built by\n * composing SQL family helpers — to author a migration that bypasses the\n * structured call classes.\n */\nexport function rawSql(op: Op): Op {\n return op;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAYA,SAAgB,OAAO,IAAY;AACjC,QAAO"}
@@ -0,0 +1,38 @@
1
+ //#region src/core/native-type-normalizer.ts
2
+ /**
3
+ * Postgres native-type normalization.
4
+ *
5
+ * Lives in `target-postgres` because both the migration planner/runner (control
6
+ * plane) and the introspection adapter (control plane) need to normalize raw
7
+ * native-type strings to the same canonical form for comparison.
8
+ */
9
+ /**
10
+ * Lookup map for simple prefix-based type normalization.
11
+ *
12
+ * Using a Map for O(1) lookup instead of multiple startsWith checks.
13
+ */
14
+ const TYPE_PREFIX_MAP = new Map([
15
+ ["varchar", "character varying"],
16
+ ["bpchar", "character"],
17
+ ["varbit", "bit varying"]
18
+ ]);
19
+ /**
20
+ * Normalizes a Postgres schema native type to its canonical form for comparison.
21
+ *
22
+ * Uses a pre-computed lookup map for simple prefix replacements (O(1))
23
+ * and handles complex temporal type normalization separately.
24
+ */
25
+ function normalizeSchemaNativeType(nativeType) {
26
+ const trimmed = nativeType.trim();
27
+ for (const [prefix, replacement] of TYPE_PREFIX_MAP) if (trimmed.startsWith(prefix)) return replacement + trimmed.slice(prefix.length);
28
+ if (trimmed.includes(" with time zone")) {
29
+ if (trimmed.startsWith("timestamp")) return `timestamptz${trimmed.slice(9).replace(" with time zone", "")}`;
30
+ if (trimmed.startsWith("time")) return `timetz${trimmed.slice(4).replace(" with time zone", "")}`;
31
+ }
32
+ if (trimmed.includes(" without time zone")) return trimmed.replace(" without time zone", "");
33
+ return trimmed;
34
+ }
35
+
36
+ //#endregion
37
+ export { normalizeSchemaNativeType as t };
38
+ //# sourceMappingURL=native-type-normalizer-CInai_oY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-type-normalizer-CInai_oY.mjs","names":["TYPE_PREFIX_MAP: ReadonlyMap<string, string>"],"sources":["../src/core/native-type-normalizer.ts"],"sourcesContent":["/**\n * Postgres native-type normalization.\n *\n * Lives in `target-postgres` because both the migration planner/runner (control\n * plane) and the introspection adapter (control plane) need to normalize raw\n * native-type strings to the same canonical form for comparison.\n */\n\n/**\n * Lookup map for simple prefix-based type normalization.\n *\n * Using a Map for O(1) lookup instead of multiple startsWith checks.\n */\nconst TYPE_PREFIX_MAP: ReadonlyMap<string, string> = new Map([\n ['varchar', 'character varying'],\n ['bpchar', 'character'],\n ['varbit', 'bit varying'],\n]);\n\n/**\n * Normalizes a Postgres schema native type to its canonical form for comparison.\n *\n * Uses a pre-computed lookup map for simple prefix replacements (O(1))\n * and handles complex temporal type normalization separately.\n */\nexport function normalizeSchemaNativeType(nativeType: string): string {\n const trimmed = nativeType.trim();\n\n for (const [prefix, replacement] of TYPE_PREFIX_MAP) {\n if (trimmed.startsWith(prefix)) {\n return replacement + trimmed.slice(prefix.length);\n }\n }\n\n if (trimmed.includes(' with time zone')) {\n if (trimmed.startsWith('timestamp')) {\n return `timestamptz${trimmed.slice(9).replace(' with time zone', '')}`;\n }\n if (trimmed.startsWith('time')) {\n return `timetz${trimmed.slice(4).replace(' with time zone', '')}`;\n }\n }\n\n if (trimmed.includes(' without time zone')) {\n return trimmed.replace(' without time zone', '');\n }\n\n return trimmed;\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAMA,kBAA+C,IAAI,IAAI;CAC3D,CAAC,WAAW,oBAAoB;CAChC,CAAC,UAAU,YAAY;CACvB,CAAC,UAAU,cAAc;CAC1B,CAAC;;;;;;;AAQF,SAAgB,0BAA0B,YAA4B;CACpE,MAAM,UAAU,WAAW,MAAM;AAEjC,MAAK,MAAM,CAAC,QAAQ,gBAAgB,gBAClC,KAAI,QAAQ,WAAW,OAAO,CAC5B,QAAO,cAAc,QAAQ,MAAM,OAAO,OAAO;AAIrD,KAAI,QAAQ,SAAS,kBAAkB,EAAE;AACvC,MAAI,QAAQ,WAAW,YAAY,CACjC,QAAO,cAAc,QAAQ,MAAM,EAAE,CAAC,QAAQ,mBAAmB,GAAG;AAEtE,MAAI,QAAQ,WAAW,OAAO,CAC5B,QAAO,SAAS,QAAQ,MAAM,EAAE,CAAC,QAAQ,mBAAmB,GAAG;;AAInE,KAAI,QAAQ,SAAS,qBAAqB,CACxC,QAAO,QAAQ,QAAQ,sBAAsB,GAAG;AAGlD,QAAO"}
@@ -0,0 +1,18 @@
1
+ //#region src/core/native-type-normalizer.d.ts
2
+ /**
3
+ * Postgres native-type normalization.
4
+ *
5
+ * Lives in `target-postgres` because both the migration planner/runner (control
6
+ * plane) and the introspection adapter (control plane) need to normalize raw
7
+ * native-type strings to the same canonical form for comparison.
8
+ */
9
+ /**
10
+ * Normalizes a Postgres schema native type to its canonical form for comparison.
11
+ *
12
+ * Uses a pre-computed lookup map for simple prefix replacements (O(1))
13
+ * and handles complex temporal type normalization separately.
14
+ */
15
+ declare function normalizeSchemaNativeType(nativeType: string): string;
16
+ //#endregion
17
+ export { normalizeSchemaNativeType };
18
+ //# sourceMappingURL=native-type-normalizer.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-type-normalizer.d.mts","names":[],"sources":["../src/core/native-type-normalizer.ts"],"sourcesContent":[],"mappings":";;AAyBA;;;;;;;;;;;;iBAAgB,yBAAA"}
@@ -0,0 +1,3 @@
1
+ import { t as normalizeSchemaNativeType } from "./native-type-normalizer-CInai_oY.mjs";
2
+
3
+ export { normalizeSchemaNativeType };