@prisma-next/target-postgres 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/{codec-ids-CTikp1if.mjs → codec-ids-BvytN2P8.mjs} +3 -3
  2. package/dist/codec-ids-BvytN2P8.mjs.map +1 -0
  3. package/dist/{codec-ids-B1vOchLE.d.mts → codec-ids-CnXu9Qy3.d.mts} +3 -3
  4. package/dist/codec-ids-CnXu9Qy3.d.mts.map +1 -0
  5. package/dist/codec-ids.d.mts +2 -2
  6. package/dist/codec-ids.mjs +2 -2
  7. package/dist/{codec-types-CnFiNML4.d.mts → codec-types-DHCkwPKE.d.mts} +3 -3
  8. package/dist/{codec-types-CnFiNML4.d.mts.map → codec-types-DHCkwPKE.d.mts.map} +1 -1
  9. package/dist/codec-types.d.mts +1 -1
  10. package/dist/{codecs-CBpEv4s5.d.mts → codecs--0A5_4Bq.d.mts} +26 -23
  11. package/dist/codecs--0A5_4Bq.d.mts.map +1 -0
  12. package/dist/codecs.d.mts +2 -2
  13. package/dist/codecs.mjs +28 -35
  14. package/dist/codecs.mjs.map +1 -1
  15. package/dist/contract-free.d.mts +163 -15
  16. package/dist/contract-free.d.mts.map +1 -1
  17. package/dist/contract-free.mjs +4 -17
  18. package/dist/contract-free.mjs.map +1 -1
  19. package/dist/control.d.mts.map +1 -1
  20. package/dist/control.mjs +21 -27
  21. package/dist/control.mjs.map +1 -1
  22. package/dist/{data-transform-D25tLeYU.mjs → data-transform-BOWpliq8.mjs} +9 -17
  23. package/dist/data-transform-BOWpliq8.mjs.map +1 -0
  24. package/dist/{data-transform-DGOqcLrf.d.mts → data-transform-DDgWdB5o.d.mts} +2 -2
  25. package/dist/data-transform-DDgWdB5o.d.mts.map +1 -0
  26. package/dist/data-transform.d.mts +1 -1
  27. package/dist/data-transform.mjs +1 -1
  28. package/dist/ddl-QDyOSeLc.mjs +251 -0
  29. package/dist/ddl-QDyOSeLc.mjs.map +1 -0
  30. package/dist/ddl.d.mts +2 -2
  31. package/dist/ddl.mjs +2 -2
  32. package/dist/descriptor-meta-CpGygXpI.mjs +140 -0
  33. package/dist/descriptor-meta-CpGygXpI.mjs.map +1 -0
  34. package/dist/{issue-planner-Br0pt1Ea.mjs → issue-planner-DL6g3CmE.mjs} +52 -366
  35. package/dist/issue-planner-DL6g3CmE.mjs.map +1 -0
  36. package/dist/issue-planner.d.mts +8 -11
  37. package/dist/issue-planner.d.mts.map +1 -1
  38. package/dist/issue-planner.mjs +1 -1
  39. package/dist/migration.d.mts +5 -92
  40. package/dist/migration.d.mts.map +1 -1
  41. package/dist/migration.mjs +4 -4
  42. package/dist/{nodes-DZk2JZG3.mjs → nodes-Bbhs2rwj.mjs} +31 -2
  43. package/dist/nodes-Bbhs2rwj.mjs.map +1 -0
  44. package/dist/{nodes-779hmCfL.d.mts → nodes-pLeLgdis.d.mts} +30 -3
  45. package/dist/nodes-pLeLgdis.d.mts.map +1 -0
  46. package/dist/{op-factory-call-D2aAUhmS.mjs → op-factory-call-D_p5vxwt.mjs} +601 -418
  47. package/dist/op-factory-call-D_p5vxwt.mjs.map +1 -0
  48. package/dist/{op-factory-call-DMA86_2D.d.mts → op-factory-call-DmQEc3XV.d.mts} +119 -72
  49. package/dist/op-factory-call-DmQEc3XV.d.mts.map +1 -0
  50. package/dist/op-factory-call.d.mts +2 -2
  51. package/dist/op-factory-call.mjs +2 -2
  52. package/dist/pack.d.mts +36 -15
  53. package/dist/pack.d.mts.map +1 -1
  54. package/dist/pack.mjs +1 -1
  55. package/dist/{planner-CAYPJObw.mjs → planner-Bs_baQax.mjs} +25 -45
  56. package/dist/planner-Bs_baQax.mjs.map +1 -0
  57. package/dist/{planner-ddl-builders-Cw2n2llW.mjs → planner-ddl-builders-B2wOwLqI.mjs} +2 -2
  58. package/dist/planner-ddl-builders-B2wOwLqI.mjs.map +1 -0
  59. package/dist/planner-ddl-builders.d.mts +4 -4
  60. package/dist/planner-ddl-builders.d.mts.map +1 -1
  61. package/dist/planner-ddl-builders.mjs +1 -1
  62. package/dist/{planner-identity-values-BIpa5p2I.mjs → planner-identity-values-CJPha2Sz.mjs} +3 -9
  63. package/dist/planner-identity-values-CJPha2Sz.mjs.map +1 -0
  64. package/dist/planner-identity-values.d.mts +1 -1
  65. package/dist/planner-identity-values.d.mts.map +1 -1
  66. package/dist/planner-identity-values.mjs +1 -1
  67. package/dist/{planner-produced-postgres-migration-NSEhWL0L.mjs → planner-produced-postgres-migration-Cji5vxUf.mjs} +6 -4
  68. package/dist/planner-produced-postgres-migration-Cji5vxUf.mjs.map +1 -0
  69. package/dist/{planner-produced-postgres-migration-B4EDvLdz.d.mts → planner-produced-postgres-migration-QqHa2C2l.d.mts} +5 -6
  70. package/dist/planner-produced-postgres-migration-QqHa2C2l.d.mts.map +1 -0
  71. package/dist/planner-produced-postgres-migration.d.mts +1 -1
  72. package/dist/planner-produced-postgres-migration.mjs +1 -1
  73. package/dist/planner-sql-checks-jqUUGyQR.mjs +152 -0
  74. package/dist/planner-sql-checks-jqUUGyQR.mjs.map +1 -0
  75. package/dist/planner-sql-checks.d.mts +3 -49
  76. package/dist/planner-sql-checks.d.mts.map +1 -1
  77. package/dist/planner-sql-checks.mjs +2 -2
  78. package/dist/{planner-type-resolution-836DExFN.mjs → planner-type-resolution-Bt2f_q-F.mjs} +1 -6
  79. package/dist/planner-type-resolution-Bt2f_q-F.mjs.map +1 -0
  80. package/dist/planner.d.mts +4 -4
  81. package/dist/planner.d.mts.map +1 -1
  82. package/dist/planner.mjs +1 -1
  83. package/dist/{postgres-contract-serializer-DYTyXjPf.mjs → postgres-contract-serializer-k3TAcPMY.mjs} +30 -37
  84. package/dist/postgres-contract-serializer-k3TAcPMY.mjs.map +1 -0
  85. package/dist/postgres-migration-B5jKrXv3.mjs +145 -0
  86. package/dist/postgres-migration-B5jKrXv3.mjs.map +1 -0
  87. package/dist/postgres-migration-Y4YBJqkS.d.mts +181 -0
  88. package/dist/postgres-migration-Y4YBJqkS.d.mts.map +1 -0
  89. package/dist/{postgres-schema-BuxCxbvB.mjs → postgres-schema-COGZ1ark.mjs} +82 -23
  90. package/dist/postgres-schema-COGZ1ark.mjs.map +1 -0
  91. package/dist/{render-ops-BpjstrKQ.mjs → render-ops-BREh1kHe.mjs} +10 -5
  92. package/dist/render-ops-BREh1kHe.mjs.map +1 -0
  93. package/dist/render-ops.d.mts +2 -2
  94. package/dist/render-ops.d.mts.map +1 -1
  95. package/dist/render-ops.mjs +1 -1
  96. package/dist/runtime.d.mts +1 -0
  97. package/dist/runtime.d.mts.map +1 -1
  98. package/dist/runtime.mjs +2 -2
  99. package/dist/table-source-BvFo7gVs.d.mts +15 -0
  100. package/dist/table-source-BvFo7gVs.d.mts.map +1 -0
  101. package/dist/types.d.mts +34 -19
  102. package/dist/types.d.mts.map +1 -1
  103. package/dist/types.mjs +2 -3
  104. package/package.json +17 -18
  105. package/src/contract-free/checks.ts +363 -0
  106. package/src/contract-free/ddl.ts +28 -1
  107. package/src/core/authoring.ts +43 -44
  108. package/src/core/codec-helpers.ts +0 -17
  109. package/src/core/codec-ids.ts +1 -1
  110. package/src/core/codec-type-map.ts +2 -2
  111. package/src/core/codecs.ts +43 -48
  112. package/src/core/ddl/nodes.ts +59 -1
  113. package/src/core/migrations/control-policy.ts +17 -47
  114. package/src/core/migrations/issue-planner.ts +34 -70
  115. package/src/core/migrations/op-factory-call.ts +486 -215
  116. package/src/core/migrations/operations/columns.ts +175 -140
  117. package/src/core/migrations/operations/constraints.ts +79 -108
  118. package/src/core/migrations/operations/data-transform.ts +15 -18
  119. package/src/core/migrations/operations/dependencies.ts +16 -14
  120. package/src/core/migrations/operations/indexes.ts +31 -28
  121. package/src/core/migrations/operations/shared.ts +2 -2
  122. package/src/core/migrations/operations/tables.ts +13 -14
  123. package/src/core/migrations/planner-ddl-builders.ts +3 -4
  124. package/src/core/migrations/planner-identity-values.ts +4 -28
  125. package/src/core/migrations/planner-produced-postgres-migration.ts +15 -7
  126. package/src/core/migrations/planner-recipes.ts +44 -39
  127. package/src/core/migrations/planner-sql-checks.ts +3 -178
  128. package/src/core/migrations/planner-strategies.ts +76 -449
  129. package/src/core/migrations/planner-type-resolution.ts +2 -20
  130. package/src/core/migrations/planner.ts +6 -6
  131. package/src/core/migrations/postgres-migration.ts +287 -7
  132. package/src/core/migrations/render-ops.ts +26 -13
  133. package/src/core/migrations/runner.ts +26 -20
  134. package/src/core/postgres-contract-serializer.ts +37 -54
  135. package/src/core/postgres-enum-type-schema.ts +17 -0
  136. package/src/core/postgres-schema.ts +86 -46
  137. package/src/exports/codecs.ts +2 -2
  138. package/src/exports/contract-free.ts +22 -1
  139. package/src/exports/control.ts +0 -22
  140. package/src/exports/ddl.ts +4 -0
  141. package/src/exports/migration.ts +1 -29
  142. package/src/exports/op-factory-call.ts +0 -4
  143. package/src/exports/planner-sql-checks.ts +0 -7
  144. package/src/exports/types.ts +0 -1
  145. package/dist/codec-ids-B1vOchLE.d.mts.map +0 -1
  146. package/dist/codec-ids-CTikp1if.mjs.map +0 -1
  147. package/dist/codecs-CBpEv4s5.d.mts.map +0 -1
  148. package/dist/data-transform-D25tLeYU.mjs.map +0 -1
  149. package/dist/data-transform-DGOqcLrf.d.mts.map +0 -1
  150. package/dist/ddl-77SyXgFt.mjs +0 -30
  151. package/dist/ddl-77SyXgFt.mjs.map +0 -1
  152. package/dist/descriptor-meta-DKmj-IMN.mjs +0 -14
  153. package/dist/descriptor-meta-DKmj-IMN.mjs.map +0 -1
  154. package/dist/descriptor-meta-runtime-My8_s4cs.mjs +0 -130
  155. package/dist/descriptor-meta-runtime-My8_s4cs.mjs.map +0 -1
  156. package/dist/enum-planning-BCyvlFHk.mjs +0 -0
  157. package/dist/enum-planning-BCyvlFHk.mjs.map +0 -1
  158. package/dist/enum-planning.d.mts +0 -86
  159. package/dist/enum-planning.d.mts.map +0 -1
  160. package/dist/enum-planning.mjs +0 -2
  161. package/dist/issue-planner-Br0pt1Ea.mjs.map +0 -1
  162. package/dist/nodes-779hmCfL.d.mts.map +0 -1
  163. package/dist/nodes-DZk2JZG3.mjs.map +0 -1
  164. package/dist/op-factory-call-D2aAUhmS.mjs.map +0 -1
  165. package/dist/op-factory-call-DMA86_2D.d.mts.map +0 -1
  166. package/dist/planner-CAYPJObw.mjs.map +0 -1
  167. package/dist/planner-ddl-builders-Cw2n2llW.mjs.map +0 -1
  168. package/dist/planner-identity-values-BIpa5p2I.mjs.map +0 -1
  169. package/dist/planner-produced-postgres-migration-B4EDvLdz.d.mts.map +0 -1
  170. package/dist/planner-produced-postgres-migration-NSEhWL0L.mjs.map +0 -1
  171. package/dist/planner-sql-checks-DAdhnI2c.mjs +0 -272
  172. package/dist/planner-sql-checks-DAdhnI2c.mjs.map +0 -1
  173. package/dist/planner-type-resolution-836DExFN.mjs.map +0 -1
  174. package/dist/postgres-contract-serializer-DYTyXjPf.mjs.map +0 -1
  175. package/dist/postgres-enum-type-BVn63a89.d.mts +0 -72
  176. package/dist/postgres-enum-type-BVn63a89.d.mts.map +0 -1
  177. package/dist/postgres-enum-type-DPKqCBem.mjs +0 -62
  178. package/dist/postgres-enum-type-DPKqCBem.mjs.map +0 -1
  179. package/dist/postgres-migration-COore9Mz.mjs +0 -71
  180. package/dist/postgres-migration-COore9Mz.mjs.map +0 -1
  181. package/dist/postgres-migration-DZ_gLUOW.d.mts +0 -72
  182. package/dist/postgres-migration-DZ_gLUOW.d.mts.map +0 -1
  183. package/dist/postgres-schema-BuxCxbvB.mjs.map +0 -1
  184. package/dist/render-ops-BpjstrKQ.mjs.map +0 -1
  185. package/dist/shared-DarONYBZ.d.mts +0 -43
  186. package/dist/shared-DarONYBZ.d.mts.map +0 -1
  187. package/src/core/migrations/enum-planning.ts +0 -213
  188. package/src/core/migrations/operations/enums.ts +0 -114
  189. package/src/core/postgres-enum-type.ts +0 -89
  190. package/src/exports/enum-planning.ts +0 -11
@@ -17,9 +17,8 @@ import {
17
17
  import type { SqlNamespaceTablesInput, SqlStorage } from '@prisma-next/sql-contract/types';
18
18
  import { blindCast } from '@prisma-next/utils/casts';
19
19
  import type { JsonObject } from '@prisma-next/utils/json';
20
- import type { Type } from 'arktype';
21
20
  import { postgresAuthoringEntityTypes } from './authoring';
22
- import type { PostgresEnumType } from './postgres-enum-type';
21
+ import { postgresTargetDescriptorMeta } from './descriptor-meta';
23
22
  import { isPostgresSchema, PostgresSchema } from './postgres-schema';
24
23
 
25
24
  const POSTGRES_AUTHORING_CTX: AuthoringEntityContext = {
@@ -38,27 +37,21 @@ function isAuthoringEntityTypeFactoryOutput(
38
37
  }
39
38
 
40
39
  /**
41
- * Walks a pack's entity-type namespace tree and emits the maps the
42
- * family base consumes hydrators and validator-schema fragments, both
43
- * keyed by the descriptor's `discriminator`.
40
+ * Walks a pack's entity-type namespace tree and emits hydration factories
41
+ * keyed by the descriptor's `discriminator`. Used for `storage.types`
42
+ * (codec-triple hydration). Namespace entries hydration dispatches by
43
+ * entries key, not discriminator — handled by `hydrateNamespaceEntities`.
44
44
  */
45
- function collectEntityRegistryContributions(namespace: AuthoringEntityTypeNamespace): {
46
- readonly entityTypeRegistry: ReadonlyMap<string, SqlEntityHydrationFactory>;
47
- readonly validatorFragments: ReadonlyMap<string, Type<unknown>>;
48
- } {
49
- const entityTypeRegistry = new Map<string, SqlEntityHydrationFactory>();
50
- const validatorFragments = new Map<string, Type<unknown>>();
45
+ function collectStorageTypesHydrators(
46
+ namespace: AuthoringEntityTypeNamespace,
47
+ ): ReadonlyMap<string, SqlEntityHydrationFactory> {
48
+ const registry = new Map<string, SqlEntityHydrationFactory>();
51
49
  const walk = (node: AuthoringEntityTypeNamespace): void => {
52
50
  for (const value of Object.values(node)) {
53
51
  if (isAuthoringEntityTypeDescriptor(value)) {
54
52
  if (isAuthoringEntityTypeFactoryOutput(value.output)) {
55
53
  const { factory } = value.output;
56
- entityTypeRegistry.set(value.discriminator, (raw) =>
57
- factory(raw, POSTGRES_AUTHORING_CTX),
58
- );
59
- }
60
- if (value.validatorSchema !== undefined) {
61
- validatorFragments.set(value.discriminator, value.validatorSchema);
54
+ registry.set(value.discriminator, (raw) => factory(raw, POSTGRES_AUTHORING_CTX));
62
55
  }
63
56
  continue;
64
57
  }
@@ -68,15 +61,17 @@ function collectEntityRegistryContributions(namespace: AuthoringEntityTypeNamesp
68
61
  }
69
62
  };
70
63
  walk(namespace);
71
- return { entityTypeRegistry, validatorFragments };
64
+ return registry;
72
65
  }
73
66
 
74
67
  export class PostgresContractSerializer extends SqlContractSerializerBase<Contract<SqlStorage>> {
75
68
  constructor() {
76
- const { entityTypeRegistry, validatorFragments } = collectEntityRegistryContributions(
77
- postgresAuthoringEntityTypes,
78
- );
79
- super(entityTypeRegistry, validatorFragments);
69
+ const storageTypesHydrators = collectStorageTypesHydrators(postgresAuthoringEntityTypes);
70
+ super(storageTypesHydrators);
71
+ }
72
+
73
+ protected override get defaultNamespaceId(): string {
74
+ return postgresTargetDescriptorMeta.defaultNamespaceId;
80
75
  }
81
76
 
82
77
  protected override hydrateSqlNamespaceEntry(
@@ -88,40 +83,22 @@ export class PostgresContractSerializer extends SqlContractSerializerBase<Contra
88
83
  }
89
84
  const hydrated = blindCast<
90
85
  SqlNamespaceTablesInput,
91
- 'super.hydrateSqlNamespaceEntry returns the tables form when raw is not a NamespaceBase'
86
+ 'super.hydrateSqlNamespaceEntry returns SqlNamespaceTablesInput when raw is not a NamespaceBase'
92
87
  >(super.hydrateSqlNamespaceEntry(nsId, raw));
93
88
  const { id, entries } = hydrated;
94
89
 
95
- // Extract the postgres-specific `type` slot directly from raw input.
96
- // The family base handles the `table` slot; the postgres target owns `type`.
97
- const rawRecord = raw as Record<string, unknown>;
98
- const rawEntries = rawRecord['entries'];
99
- let typeSlot: Record<string, PostgresEnumType> | undefined;
100
- if (rawEntries !== null && typeof rawEntries === 'object' && !Array.isArray(rawEntries)) {
101
- const rawTypeSlot = (rawEntries as Record<string, unknown>)['type'];
102
- if (rawTypeSlot !== null && typeof rawTypeSlot === 'object' && !Array.isArray(rawTypeSlot)) {
103
- const enumFactory = this.entityTypeRegistry.get('postgres-enum');
104
- typeSlot = Object.fromEntries(
105
- Object.entries(rawTypeSlot as Record<string, unknown>).map(([name, entry]) => [
106
- name,
107
- blindCast<PostgresEnumType, 'postgres-enum factory returns PostgresEnumType'>(
108
- enumFactory !== undefined ? enumFactory(entry) : entry,
109
- ),
110
- ]),
111
- );
112
- }
113
- }
114
-
115
- const emptyTables = Object.keys(entries.table).length === 0;
116
- const emptyTypes = !typeSlot || Object.keys(typeSlot).length === 0;
117
- if (id === UNBOUND_NAMESPACE_ID && emptyTables && emptyTypes) {
90
+ const valueSetSlot = entries['valueSet'];
91
+ const hasValueSets = valueSetSlot !== undefined && Object.keys(valueSetSlot).length > 0;
92
+ const emptyTables = Object.keys(entries['table'] ?? {}).length === 0;
93
+ if (id === UNBOUND_NAMESPACE_ID && emptyTables && !hasValueSets) {
118
94
  return PostgresSchema.unbound;
119
95
  }
120
96
  return new PostgresSchema({
121
97
  id,
122
98
  entries: {
123
- table: entries.table,
124
- type: typeSlot ?? {},
99
+ ...entries,
100
+ table: entries['table'] ?? {},
101
+ ...(hasValueSets ? { valueSet: valueSetSlot } : {}),
125
102
  },
126
103
  });
127
104
  }
@@ -139,7 +116,7 @@ export class PostgresContractSerializer extends SqlContractSerializerBase<Contra
139
116
  kind: isUnboundSlot ? 'postgres-unbound-schema' : 'postgres-schema',
140
117
  entries: {
141
118
  table: Object.fromEntries(
142
- Object.entries(ns.entries.table).map(([tableName, table]) => [
119
+ Object.entries(ns.entries.table ?? {}).map(([tableName, table]) => [
143
120
  tableName,
144
121
  this.serializeJsonValue(table) as JsonObject,
145
122
  ]),
@@ -167,19 +144,25 @@ export class PostgresContractSerializer extends SqlContractSerializerBase<Contra
167
144
 
168
145
  private serializePostgresNamespace(ns: PostgresSchema, isUnboundSlot: boolean): JsonObject {
169
146
  const tablesOut: Record<string, JsonObject> = {};
170
- for (const [tableName, table] of Object.entries(ns.entries.table)) {
147
+ for (const [tableName, table] of Object.entries(ns.table)) {
171
148
  tablesOut[tableName] = this.serializeJsonValue(table) as JsonObject;
172
149
  }
173
- const typeOut: Record<string, JsonObject> = {};
174
- for (const [typeName, ty] of Object.entries(ns.entries.type)) {
175
- typeOut[typeName] = this.serializeJsonValue(ty) as JsonObject;
150
+ const valueSetEntries = ns.valueSet;
151
+ const valueSetOut: Record<string, JsonObject> = {};
152
+ if (valueSetEntries !== undefined) {
153
+ for (const [valueSetName, valueSet] of Object.entries(valueSetEntries)) {
154
+ valueSetOut[valueSetName] = blindCast<
155
+ JsonObject,
156
+ 'serializeJsonValue round-trips the value-set node through JSON, yielding a JsonObject'
157
+ >(this.serializeJsonValue(valueSet));
158
+ }
176
159
  }
177
160
  return {
178
161
  id: ns.id,
179
162
  kind: isUnboundSlot ? 'postgres-unbound-schema' : 'postgres-schema',
180
163
  entries: {
181
164
  table: tablesOut,
182
- type: typeOut,
165
+ ...(Object.keys(valueSetOut).length > 0 ? { valueSet: valueSetOut } : {}),
183
166
  },
184
167
  };
185
168
  }
@@ -0,0 +1,17 @@
1
+ import { type } from 'arktype';
2
+
3
+ const ControlPolicySchema = type("'managed' | 'tolerated' | 'external' | 'observed'");
4
+
5
+ /**
6
+ * Arktype validator for a `postgres-enum` entry under
7
+ * `storage.namespaces[id].entries.type[name]`. Registered by the Postgres
8
+ * target pack against the `'type'` entries key so the family-layer namespace
9
+ * validator accepts (and rejects) entries of this kind.
10
+ */
11
+ export const PostgresEnumTypeSchema = type({
12
+ kind: "'postgres-enum'",
13
+ 'name?': 'string',
14
+ 'nativeType?': 'string',
15
+ values: type.string.array().readonly(),
16
+ 'control?': ControlPolicySchema,
17
+ });
@@ -1,24 +1,27 @@
1
1
  import {
2
2
  freezeNode,
3
+ hydrateNamespaceEntities,
3
4
  NamespaceBase,
4
5
  UNBOUND_NAMESPACE_ID,
5
6
  } from '@prisma-next/framework-components/ir';
6
- import {
7
- type PostgresEnumStorageEntry,
8
- type SqlNamespaceTablesInput,
9
- type SqlStorage,
7
+ import { composeSqlEntityKinds } from '@prisma-next/sql-contract/entity-kinds';
8
+ import type {
9
+ SqlNamespaceEntries,
10
+ SqlNamespaceTablesInput,
11
+ SqlStorage,
10
12
  StorageTable,
11
- type StorageTableInput,
13
+ StorageValueSet,
12
14
  } from '@prisma-next/sql-contract/types';
13
- import { PostgresEnumType, type PostgresEnumTypeInput } from './postgres-enum-type';
15
+ import { type CfExpr, cfExpr } from '@prisma-next/sql-relational-core/contract-free';
16
+ import { blindCast } from '@prisma-next/utils/casts';
17
+ import { ifDefined } from '@prisma-next/utils/defined';
18
+ import { PostgresTableSource } from './ast/table-source';
19
+ import { PG_TEXT_CODEC_ID } from './codec-ids';
14
20
  import { escapeLiteral } from './sql-utils';
15
21
 
16
22
  export interface PostgresSchemaInput {
17
23
  readonly id: string;
18
- readonly entries: {
19
- readonly table: Record<string, StorageTable | StorageTableInput>;
20
- readonly type: Record<string, PostgresEnumType | PostgresEnumTypeInput>;
21
- };
24
+ readonly entries: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
22
25
  }
23
26
 
24
27
  /**
@@ -27,7 +30,7 @@ export interface PostgresSchemaInput {
27
30
  * `namespaces: Record<NamespaceId, PostgresSchema>` map populated by
28
31
  * the Postgres PSL interpreter from `namespace { … }` AST buckets.
29
32
  *
30
- * `entries` holds entity-kind slot maps (`table`, `type`). Qualifier
33
+ * `entries` holds entity-kind maps (`table`, `valueSet`). Qualifier
31
34
  * emission is the rendering seam: DDL / SQL emission asks the namespace
32
35
  * for its qualifier (`"<schema>"`) or for a qualified table name
33
36
  * (`"<schema>"."<table>"`) and consumes the result polymorphically.
@@ -47,32 +50,27 @@ export class PostgresSchema extends NamespaceBase {
47
50
 
48
51
  declare readonly kind: 'schema';
49
52
  readonly id: string;
50
- readonly entries: Readonly<{
51
- readonly table: Readonly<Record<string, StorageTable>>;
52
- readonly type: Readonly<Record<string, PostgresEnumType>>;
53
- }>;
53
+ readonly entries: SqlNamespaceEntries;
54
54
 
55
55
  constructor(input: PostgresSchemaInput) {
56
56
  super();
57
57
  this.id = input.id;
58
- this.entries = Object.freeze({
59
- table: Object.freeze(
60
- Object.fromEntries(
61
- Object.entries(input.entries.table).map(([k, v]) => [
62
- k,
63
- v instanceof StorageTable ? v : new StorageTable(v as StorageTableInput),
64
- ]),
65
- ),
66
- ),
67
- type: Object.freeze(
68
- Object.fromEntries(
69
- Object.entries(input.entries.type).map(([k, v]) => [
70
- k,
71
- v instanceof PostgresEnumType ? v : new PostgresEnumType(v as PostgresEnumTypeInput),
72
- ]),
73
- ),
74
- ),
75
- });
58
+
59
+ const dispatched = hydrateNamespaceEntities(input.entries, composeSqlEntityKinds(), 'carry');
60
+
61
+ // Drop an empty valueSet so presence signals non-emptiness.
62
+ const valueSetRaw = dispatched['valueSet'];
63
+ const withPresence =
64
+ valueSetRaw !== undefined && Object.keys(valueSetRaw).length === 0
65
+ ? { ...dispatched, valueSet: undefined }
66
+ : dispatched;
67
+
68
+ this.entries = Object.freeze(
69
+ blindCast<
70
+ SqlNamespaceEntries,
71
+ 'composeSqlEntityKinds() supplies table→StorageTable and valueSet→StorageValueSet descriptors, so this open-dict result holds exactly the typed members SqlNamespaceEntries declares; the descriptor Map erases those per-kind Node types from the return.'
72
+ >(withPresence),
73
+ );
76
74
  Object.defineProperty(this, 'kind', {
77
75
  value: 'schema',
78
76
  writable: false,
@@ -82,6 +80,14 @@ export class PostgresSchema extends NamespaceBase {
82
80
  freezeNode(this);
83
81
  }
84
82
 
83
+ get table(): Readonly<Record<string, StorageTable>> {
84
+ return this.entries.table ?? Object.freeze({});
85
+ }
86
+
87
+ get valueSet(): Readonly<Record<string, StorageValueSet>> | undefined {
88
+ return this.entries.valueSet;
89
+ }
90
+
85
91
  /**
86
92
  * The bare schema qualifier as it would appear in a rendered SQL
87
93
  * fragment (already quoted). The unbound-schema singleton overrides
@@ -123,6 +129,32 @@ export class PostgresSchema extends NamespaceBase {
123
129
  return `'${escapeLiteral(this.id)}'`;
124
130
  }
125
131
 
132
+ /**
133
+ * Typed-AST counterpart of {@link schemaSqlExpression}: the expression a
134
+ * builder-built catalog check compares `n.nspname` / `table_schema`
135
+ * against. Named schemas bind the schema name as a text parameter; the
136
+ * unbound singleton overrides this to the opaque `current_schema()`
137
+ * expression so the live connection's `search_path` decides at runtime.
138
+ */
139
+ schemaFilterExpression(): CfExpr {
140
+ return cfExpr.param(this.id, PG_TEXT_CODEC_ID);
141
+ }
142
+
143
+ /**
144
+ * Typed-AST counterpart of {@link qualifyTable}: the FROM source a
145
+ * builder-built check uses to address a user table in this namespace.
146
+ * Named schemas qualify (`"schema"."table"`); the unbound singleton
147
+ * overrides this to leave the table unqualified so `search_path`
148
+ * resolves it at runtime.
149
+ */
150
+ tableSource(tableName: string, alias?: string): PostgresTableSource {
151
+ return new PostgresTableSource({
152
+ name: tableName,
153
+ schema: this.id,
154
+ ...ifDefined('alias', alias),
155
+ });
156
+ }
157
+
126
158
  /**
127
159
  * The bare schema name a DDL planner should target when emitting
128
160
  * statements that need to identify this namespace in the live
@@ -130,9 +162,9 @@ export class PostgresSchema extends NamespaceBase {
130
162
  * catalog filters, planner conflict lookups). Named schemas resolve
131
163
  * to their own id. The `PostgresUnboundSchema` singleton inherits
132
164
  * this and returns `UNBOUND_NAMESPACE_ID` — callers that dispatch
133
- * through `qualifyTableName` / `toRegclassLiteral` route through the
134
- * polymorphic `PostgresUnboundSchema` overrides and produce
135
- * unqualified (search-path-resolved) output automatically.
165
+ * through `qualifyTableName` route through the polymorphic
166
+ * `PostgresUnboundSchema` overrides and produce unqualified
167
+ * (search-path-resolved) output automatically.
136
168
  */
137
169
  ddlSchemaName(_storage: SqlStorage): string {
138
170
  return this.id;
@@ -154,15 +186,15 @@ export class PostgresSchema extends NamespaceBase {
154
186
  * `search_path`).
155
187
  *
156
188
  * `ddlSchemaName` is inherited from `PostgresSchema` and returns
157
- * `UNBOUND_NAMESPACE_ID`. Downstream helpers (`qualifyTableName`,
158
- * `toRegclassLiteral`) route through the polymorphic factory and
159
- * produce unqualified output automatically.
189
+ * `UNBOUND_NAMESPACE_ID`. Downstream helpers such as `qualifyTableName`
190
+ * route through the polymorphic factory and produce unqualified output
191
+ * automatically.
160
192
  */
161
193
  export class PostgresUnboundSchema extends PostgresSchema {
162
194
  static readonly instance: PostgresUnboundSchema = new PostgresUnboundSchema();
163
195
 
164
196
  constructor(input?: PostgresSchemaInput) {
165
- super(input ?? { id: UNBOUND_NAMESPACE_ID, entries: { table: {}, type: {} } });
197
+ super(input ?? { id: UNBOUND_NAMESPACE_ID, entries: { table: {} } });
166
198
  }
167
199
 
168
200
  override qualifier(): string {
@@ -176,6 +208,17 @@ export class PostgresUnboundSchema extends PostgresSchema {
176
208
  override schemaSqlExpression(): string {
177
209
  return 'current_schema()';
178
210
  }
211
+
212
+ override schemaFilterExpression(): CfExpr {
213
+ return cfExpr.raw('current_schema()', { codecId: PG_TEXT_CODEC_ID, nullable: false });
214
+ }
215
+
216
+ override tableSource(tableName: string, alias?: string): PostgresTableSource {
217
+ return new PostgresTableSource({
218
+ name: tableName,
219
+ ...ifDefined('alias', alias),
220
+ });
221
+ }
179
222
  }
180
223
 
181
224
  PostgresSchema.unbound = PostgresUnboundSchema.instance;
@@ -204,15 +247,12 @@ export function isPostgresSchema(ns: unknown): ns is PostgresSchema {
204
247
  * by reference and trust the resulting `SqlStorage.namespaces` map to
205
248
  * be value-stable for a given input set.
206
249
  */
207
- export function postgresCreateNamespace(
208
- input: SqlNamespaceTablesInput,
209
- enumTypes?: Readonly<Record<string, PostgresEnumStorageEntry>>,
210
- ): PostgresSchema {
250
+ export function postgresCreateNamespace(input: SqlNamespaceTablesInput): PostgresSchema {
211
251
  const schemaInput: PostgresSchemaInput = {
212
252
  id: input.id,
213
253
  entries: {
214
- table: input.entries.table,
215
- type: (enumTypes ?? {}) as Record<string, PostgresEnumTypeInput>,
254
+ ...input.entries,
255
+ table: input.entries['table'] ?? {},
216
256
  },
217
257
  };
218
258
  if (input.id === UNBOUND_NAMESPACE_ID) {
@@ -2,7 +2,6 @@ export type {
2
2
  PgBitDescriptor,
3
3
  PgBoolDescriptor,
4
4
  PgCharDescriptor,
5
- PgEnumDescriptor,
6
5
  PgFloat4Descriptor,
7
6
  PgFloat8Descriptor,
8
7
  PgFloatDescriptor,
@@ -19,6 +18,7 @@ export type {
19
18
  PgTimestampDescriptor,
20
19
  PgTimestamptzDescriptor,
21
20
  PgTimetzDescriptor,
21
+ PgUuidDescriptor,
22
22
  PgVarbitDescriptor,
23
23
  PgVarcharDescriptor,
24
24
  } from '../core/codecs';
@@ -26,7 +26,6 @@ export {
26
26
  pgBitColumn,
27
27
  pgBoolColumn,
28
28
  pgCharColumn,
29
- pgEnumColumn,
30
29
  pgFloat4Column,
31
30
  pgFloat8Column,
32
31
  pgFloatColumn,
@@ -43,6 +42,7 @@ export {
43
42
  pgTimestampColumn,
44
43
  pgTimestamptzColumn,
45
44
  pgTimetzColumn,
45
+ pgUuidColumn,
46
46
  pgVarbitColumn,
47
47
  pgVarcharColumn,
48
48
  } from '../core/codecs';
@@ -1,7 +1,28 @@
1
+ export {
2
+ type ColumnDefaultCheckBuilder,
3
+ type ColumnExistsCheckBuilder,
4
+ type ConstraintExistsCheckBuilder,
5
+ columnDefaultAst,
6
+ columnExistsAst,
7
+ columnNullabilityAst,
8
+ columnTypeAst,
9
+ constraintExistsAst,
10
+ type ExtensionExistsCheckBuilder,
11
+ extensionExistsAst,
12
+ type IndexExistsCheckBuilder,
13
+ indexExistsAst,
14
+ noNullValuesAst,
15
+ type TableExistsCheckBuilder,
16
+ type TablePrimaryKeyCheckBuilder,
17
+ tableExistsAst,
18
+ tableIsEmptyAst,
19
+ tablePrimaryKeyAst,
20
+ toRegclass,
21
+ } from '../contract-free/checks';
1
22
  export { int4, int8, jsonb, pgTable, text, textArray, timestamptz } from '../contract-free/columns';
2
23
  export {
3
24
  buildControlTableBootstrapQueries,
4
25
  buildSignMarkerBootstrapQueries,
5
26
  } from '../contract-free/control-bootstrap';
6
- export { createSchema, createTable } from '../contract-free/ddl';
27
+ export { addColumnAction, alterTable, createSchema, createTable } from '../contract-free/ddl';
7
28
  export { PostgresTableSource } from '../core/ast/table-source';
@@ -10,10 +10,6 @@ import type {
10
10
  import type { SqlStorage, StorageColumn } from '@prisma-next/sql-contract/types';
11
11
  import { ifDefined } from '@prisma-next/utils/defined';
12
12
  import { postgresTargetDescriptorMeta } from '../core/descriptor-meta';
13
- import {
14
- enumStorageCompoundKey,
15
- resolveDdlSchemaForNamespaceStorage,
16
- } from '../core/migrations/enum-planning';
17
13
  import { createPostgresMigrationPlanner } from '../core/migrations/planner';
18
14
  import { renderDefaultLiteral } from '../core/migrations/planner-ddl-builders';
19
15
  import type { PostgresPlanTargetDetails } from '../core/migrations/planner-target-details';
@@ -34,12 +30,6 @@ function buildNativeTypeExpander(
34
30
  readonly typeParams?: Record<string, unknown>;
35
31
  }) => {
36
32
  if (!input.typeParams) return input.nativeType;
37
- // Mirror `renderExpectedNativeType` in verify-sql-schema: when a codec
38
- // has no `expandNativeType` hook (e.g. `pg/enum@1`, whose typeParams
39
- // describe the value set rather than a DDL suffix), fall back to the
40
- // bare native type rather than throwing. Throwing here would reject
41
- // every plan involving an enum-/values-typed column as soon as its
42
- // `typeRef` resolved to a `StorageTypeInstance` carrying typeParams.
43
33
  if (!input.codecId) return input.nativeType;
44
34
  const hooks = codecHooks.get(input.codecId);
45
35
  if (!hooks?.expandNativeType) return input.nativeType;
@@ -80,18 +70,6 @@ const postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresP
80
70
  annotationNamespace: 'pg',
81
71
  ...ifDefined('expandNativeType', expander),
82
72
  renderDefault: postgresRenderDefault,
83
- // Schema-qualify enum annotation keys so the projected "from" IR's
84
- // `storageTypes` match `readExistingEnumValues` on the read side
85
- // (the contract-to-contract `migration plan` path). The DDL-schema
86
- // resolution + compound-key format stay here in the target layer;
87
- // the family projector treats the returned string as opaque.
88
- // `undefined` schema IR ⇒ the unbound coordinate resolves to the
89
- // default `public` landing schema, matching the read-side fallback.
90
- resolveEnumStorageKey: (storage, namespaceId, nativeType) =>
91
- enumStorageCompoundKey(
92
- resolveDdlSchemaForNamespaceStorage(storage, namespaceId, undefined),
93
- nativeType,
94
- ),
95
73
  });
96
74
  },
97
75
  },
@@ -1,5 +1,9 @@
1
1
  export {
2
+ AddColumnAction,
3
+ type AlterTableActionVisitor,
4
+ type AnyAlterTableAction,
2
5
  type AnyPostgresDdlNode,
6
+ PostgresAlterTable,
3
7
  PostgresCreateSchema,
4
8
  PostgresCreateTable,
5
9
  PostgresDdlNode,
@@ -17,41 +17,13 @@ export {
17
17
  primaryKey,
18
18
  unique,
19
19
  } from '@prisma-next/sql-relational-core/contract-free';
20
- export {
21
- addColumn,
22
- alterColumnType,
23
- dropColumn,
24
- dropDefault,
25
- dropNotNull,
26
- setDefault,
27
- setNotNull,
28
- } from '../core/migrations/operations/columns';
29
- export {
30
- addCheckConstraint,
31
- addForeignKey,
32
- addPrimaryKey,
33
- addUnique,
34
- dropCheckConstraint,
35
- dropConstraint,
36
- } from '../core/migrations/operations/constraints';
37
20
  export {
38
21
  type DataTransformClosure,
39
22
  type DataTransformOptions,
40
23
  dataTransform,
41
24
  } from '../core/migrations/operations/data-transform';
42
- export {
43
- createExtension,
44
- installExtension,
45
- } from '../core/migrations/operations/dependencies';
46
- export {
47
- addEnumValues,
48
- createEnumType,
49
- dropEnumType,
50
- renameType,
51
- } from '../core/migrations/operations/enums';
52
- export { createIndex, dropIndex } from '../core/migrations/operations/indexes';
25
+ export { createExtension } from '../core/migrations/operations/dependencies';
53
26
  export { rawSql } from '../core/migrations/operations/raw';
54
- export { dropTable } from '../core/migrations/operations/tables';
55
27
  // Target-owned base class for migrations. Aliased to `Migration` so
56
28
  // user-edited migration.ts files (and the renderer's scaffold) read as
57
29
  // `class M extends Migration { … }` without having to thread the
@@ -1,12 +1,10 @@
1
1
  export {
2
2
  AddCheckConstraintCall,
3
3
  AddColumnCall,
4
- AddEnumValuesCall,
5
4
  AddForeignKeyCall,
6
5
  AddPrimaryKeyCall,
7
6
  AddUniqueCall,
8
7
  AlterColumnTypeCall,
9
- CreateEnumTypeCall,
10
8
  CreateExtensionCall,
11
9
  CreateIndexCall,
12
10
  CreateSchemaCall,
@@ -16,12 +14,10 @@ export {
16
14
  DropColumnCall,
17
15
  DropConstraintCall,
18
16
  DropDefaultCall,
19
- DropEnumTypeCall,
20
17
  DropIndexCall,
21
18
  DropNotNullCall,
22
19
  DropTableCall,
23
20
  RawSqlCall,
24
- RenameTypeCall,
25
21
  SetDefaultCall,
26
22
  SetNotNullCall,
27
23
  } from '../core/migrations/op-factory-call';
@@ -1,11 +1,4 @@
1
1
  export {
2
2
  buildExpectedFormatType,
3
- columnExistsCheck,
4
- columnHasNoDefaultCheck,
5
- columnNullabilityCheck,
6
- constraintExistsCheck,
7
3
  qualifyTableName,
8
- tableHasPrimaryKeyCheck,
9
- tableIsEmptyCheck,
10
- toRegclassLiteral,
11
4
  } from '../core/migrations/planner-sql-checks';
@@ -1,4 +1,3 @@
1
- export { PostgresEnumType, type PostgresEnumTypeInput } from '../core/postgres-enum-type';
2
1
  export {
3
2
  PostgresSchema,
4
3
  PostgresUnboundSchema,
@@ -1 +0,0 @@
1
- {"version":3,"file":"codec-ids-B1vOchLE.d.mts","names":[],"sources":["../src/core/codec-ids.ts"],"mappings":";;;cAQa,gBAAA;AAAA,cACA,sBAAA;AAAA,cACA,gBAAA;AAAA,cACA,gBAAA;AAAA,cACA,mBAAA;AAAA,cACA,eAAA;AAAA,cACA,gBAAA;AAAA,cACA,gBAAA;AAAA,cACA,gBAAA;AAAA,cACA,iBAAA;AAAA,cACA,kBAAA;AAAA,cACA,kBAAA;AAAA,cACA,mBAAA;AAAA,cACA,gBAAA;AAAA,cACA,eAAA;AAAA,cACA,kBAAA;AAAA,cACA,qBAAA;AAAA,cACA,uBAAA;AAAA,cACA,gBAAA;AAAA,cACA,kBAAA;AAAA,cACA,oBAAA;AAAA,cACA,gBAAA;AAAA,cACA,iBAAA;AAAA,cACA,iBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"codec-ids-CTikp1if.mjs","names":[],"sources":["../src/core/codec-ids.ts"],"sourcesContent":["export {\n SQL_CHAR_CODEC_ID,\n SQL_FLOAT_CODEC_ID,\n SQL_INT_CODEC_ID,\n SQL_TEXT_CODEC_ID,\n SQL_TIMESTAMP_CODEC_ID,\n SQL_VARCHAR_CODEC_ID,\n} from '@prisma-next/sql-relational-core/ast';\nexport const PG_TEXT_CODEC_ID = 'pg/text@1' as const;\nexport const PG_TEXT_ARRAY_CODEC_ID = 'pg/text-array@1' as const;\nexport const PG_ENUM_CODEC_ID = 'pg/enum@1' as const;\nexport const PG_CHAR_CODEC_ID = 'pg/char@1' as const;\nexport const PG_VARCHAR_CODEC_ID = 'pg/varchar@1' as const;\nexport const PG_INT_CODEC_ID = 'pg/int@1' as const;\nexport const PG_INT2_CODEC_ID = 'pg/int2@1' as const;\nexport const PG_INT4_CODEC_ID = 'pg/int4@1' as const;\nexport const PG_INT8_CODEC_ID = 'pg/int8@1' as const;\nexport const PG_FLOAT_CODEC_ID = 'pg/float@1' as const;\nexport const PG_FLOAT4_CODEC_ID = 'pg/float4@1' as const;\nexport const PG_FLOAT8_CODEC_ID = 'pg/float8@1' as const;\nexport const PG_NUMERIC_CODEC_ID = 'pg/numeric@1' as const;\nexport const PG_BOOL_CODEC_ID = 'pg/bool@1' as const;\nexport const PG_BIT_CODEC_ID = 'pg/bit@1' as const;\nexport const PG_VARBIT_CODEC_ID = 'pg/varbit@1' as const;\nexport const PG_TIMESTAMP_CODEC_ID = 'pg/timestamp@1' as const;\nexport const PG_TIMESTAMPTZ_CODEC_ID = 'pg/timestamptz@1' as const;\nexport const PG_TIME_CODEC_ID = 'pg/time@1' as const;\nexport const PG_TIMETZ_CODEC_ID = 'pg/timetz@1' as const;\nexport const PG_INTERVAL_CODEC_ID = 'pg/interval@1' as const;\nexport const PG_JSON_CODEC_ID = 'pg/json@1' as const;\nexport const PG_JSONB_CODEC_ID = 'pg/jsonb@1' as const;\nexport const PG_BYTEA_CODEC_ID = 'pg/bytea@1' as const;\n"],"mappings":";;AAQA,MAAa,mBAAmB;AAChC,MAAa,yBAAyB;AACtC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,sBAAsB;AACnC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,mBAAmB;AAChC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,oBAAoB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"codecs-CBpEv4s5.d.mts","names":[],"sources":["../src/core/codecs.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"data-transform-D25tLeYU.mjs","names":[],"sources":["../src/core/migrations/operations/data-transform.ts"],"sourcesContent":["/**\n * User-facing `dataTransform` factory for the Postgres migration authoring\n * surface. Invoked directly inside a `migration.ts` file via the\n * `PostgresMigration` instance method (`this.dataTransform(...)`), which\n * supplies the control adapter from the migration's injected stack:\n *\n * ```ts\n * import endContract from './end-contract.json' with { type: 'json' };\n *\n * class M extends Migration {\n * override get operations() {\n * return [\n * this.dataTransform(endContract, 'backfill emails', {\n * check: () => db.users.select('id').where(({ email }) => email.isNull()).limit(1),\n * run: () => db.users.update({ email: '' }).where(({ email }) => email.isNull()),\n * }),\n * ];\n * }\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 supplied control adapter to a serialized `{sql, params}`\n * payload.\n *\n * The factory then lowers the data transform to the unified migration-op\n * shape `{ precheck, execute, postcheck }`. The user's `check` plan is\n * wrapped twice with opposite truth values:\n *\n * - precheck `SELECT EXISTS (<check>) AS ok` asserts there is work to do\n * (precheck is short-circuited by the runner's pre-satisfied-skip path\n * when nothing remains to backfill).\n * - postcheck `SELECT NOT EXISTS (<check>) AS ok` asserts the work is\n * complete after the run steps execute.\n *\n * The `check` plan is therefore expected to be a **rowset query whose\n * presence of any row signals \"work remains\"** — typically `select('id')\n * .where(<violation predicate>).limit(1)`. Scalar/aggregate shapes\n * (`count(*)`, `bool_and(...)`) do not work under this contract: they\n * always return exactly one row, so `EXISTS` is always true and\n * `NOT EXISTS` is always false. (This is the same row-presence contract\n * the pre-unification runner relied on; the wrapping is just lifting it\n * into SQL.)\n *\n * Each `run` plan becomes an execute step. Because the `Step.params`\n * field threads through `driver.query(sql, params)`, the user's bound\n * values flow through the driver's parameter binder rather than being\n * inlined into the SQL text.\n *\n * The free factory remains usable standalone (tests, ad-hoc tooling,\n * non-class contexts) by passing the adapter explicitly as the fourth\n * argument.\n */\n\nimport type { Contract } from '@prisma-next/contract/types';\nimport { errorDataTransformContractMismatch } from '@prisma-next/errors/migration';\nimport type {\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n} from '@prisma-next/family-sql/control';\nimport type { SqlControlAdapter } from '@prisma-next/family-sql/control-adapter';\nimport type { SerializedQueryPlan } 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 { ifDefined } from '@prisma-next/utils/defined';\nimport type { PostgresPlanTargetDetails } from '../planner-target-details';\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 /**\n * Optional opt-in routing identity. Presence opts the transform into\n * invariant-aware routing; absence means it is path-dependent and\n * not referenceable from refs.\n */\n readonly invariantId?: string;\n /**\n * Optional pre-flight query. `undefined` means \"no check\". When\n * supplied, the closure must return a **rowset query** whose\n * presence of any row signals \"violations remain\". Conventional\n * shape: `db.<table>.select('id').where(<violation>).limit(1)`.\n * Scalar/aggregate shapes do not satisfy this contract.\n */\n readonly check?: DataTransformClosure;\n /** One or more mutation queries to execute. */\n readonly run: DataTransformClosure | readonly DataTransformClosure[];\n}\n\nexport function dataTransform<TContract extends Contract<SqlStorage>>(\n contract: TContract,\n name: string,\n options: DataTransformOptions,\n adapter: SqlControlAdapter<'postgres'>,\n): SqlMigrationPlanOperation<PostgresPlanTargetDetails> {\n const runClosures: readonly DataTransformClosure[] = Array.isArray(options.run)\n ? options.run\n : [options.run as DataTransformClosure];\n\n const checkPlan = options.check ? invokeAndLower(options.check, contract, adapter, name) : null;\n const runPlans = runClosures.map((closure) => invokeAndLower(closure, contract, adapter, name));\n\n const precheck: readonly SqlMigrationPlanOperationStep[] = checkPlan\n ? [\n {\n description: `Check ${name} has work to do`,\n sql: `SELECT EXISTS (${checkPlan.sql}) AS ok`,\n params: checkPlan.params,\n },\n ]\n : [];\n\n const execute: readonly SqlMigrationPlanOperationStep[] = runPlans.map((plan) => ({\n description: `Run ${name}`,\n sql: plan.sql,\n params: plan.params,\n }));\n\n const postcheck: readonly SqlMigrationPlanOperationStep[] = checkPlan\n ? [\n {\n description: `Verify ${name} resolved all violations`,\n sql: `SELECT NOT EXISTS (${checkPlan.sql}) AS ok`,\n params: checkPlan.params,\n },\n ]\n : [];\n\n return {\n id: `data_migration.${name}`,\n label: `Data transform: ${name}`,\n operationClass: 'data',\n ...ifDefined('invariantId', options.invariantId),\n target: { id: 'postgres' },\n precheck,\n execute,\n postcheck,\n };\n}\n\nfunction invokeAndLower(\n closure: DataTransformClosure,\n contract: Contract<SqlStorage>,\n adapter: SqlControlAdapter<'postgres'>,\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 = adapter.lower(plan.ast, { contract });\n const params = lowered.params.map((slot) => {\n if (slot.kind === 'literal') return slot.value;\n throw new Error(\n `data-transform: bind-site slot '${slot.name}' is not allowed in migration plans`,\n );\n });\n return { sql: lowered.sql, 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"],"mappings":";;;AAkGA,SAAgB,cACd,UACA,MACA,SACA,SACsD;CACtD,MAAM,cAA+C,MAAM,QAAQ,QAAQ,GAAG,IAC1E,QAAQ,MACR,CAAC,QAAQ,GAA2B;CAExC,MAAM,YAAY,QAAQ,QAAQ,eAAe,QAAQ,OAAO,UAAU,SAAS,IAAI,IAAI;CAC3F,MAAM,WAAW,YAAY,KAAK,YAAY,eAAe,SAAS,UAAU,SAAS,IAAI,CAAC;CAE9F,MAAM,WAAqD,YACvD,CACE;EACE,aAAa,SAAS,KAAK;EAC3B,KAAK,kBAAkB,UAAU,IAAI;EACrC,QAAQ,UAAU;CACpB,CACF,IACA,CAAC;CAEL,MAAM,UAAoD,SAAS,KAAK,UAAU;EAChF,aAAa,OAAO;EACpB,KAAK,KAAK;EACV,QAAQ,KAAK;CACf,EAAE;CAEF,MAAM,YAAsD,YACxD,CACE;EACE,aAAa,UAAU,KAAK;EAC5B,KAAK,sBAAsB,UAAU,IAAI;EACzC,QAAQ,UAAU;CACpB,CACF,IACA,CAAC;CAEL,OAAO;EACL,IAAI,kBAAkB;EACtB,OAAO,mBAAmB;EAC1B,gBAAgB;EAChB,GAAG,UAAU,eAAe,QAAQ,WAAW;EAC/C,QAAQ,EAAE,IAAI,WAAW;EACzB;EACA;EACA;CACF;AACF;AAEA,SAAS,eACP,SACA,UACA,SACA,MACqB;CACrB,MAAM,SAAS,QAAQ;CACvB,MAAM,OAAO,YAAY,MAAM,IAAI,OAAO,MAAM,IAAI;CACpD,sBAAsB,MAAM,UAAU,IAAI;CAC1C,MAAM,UAAU,QAAQ,MAAM,KAAK,KAAK,EAAE,SAAS,CAAC;CACpD,MAAM,SAAS,QAAQ,OAAO,KAAK,SAAS;EAC1C,IAAI,KAAK,SAAS,WAAW,OAAO,KAAK;EACzC,MAAM,IAAI,MACR,mCAAmC,KAAK,KAAK,oCAC/C;CACF,CAAC;CACD,OAAO;EAAE,KAAK,QAAQ;EAAK;CAAO;AACpC;AAEA,SAAS,YAAY,OAAoC;CACvD,OACE,OAAO,UAAU,YACjB,UAAU,QACV,WAAW,SACX,OAAQ,MAA6B,UAAU;AAEnD;AAEA,SAAS,sBACP,MACA,UACA,MACM;CACN,IAAI,KAAK,KAAK,gBAAgB,SAAS,QAAQ,aAC7C,MAAM,mCAAmC;EACvC,mBAAmB;EACnB,UAAU,SAAS,QAAQ;EAC3B,QAAQ,KAAK,KAAK;CACpB,CAAC;AAEL"}