@prisma-next/target-postgres 0.11.0 → 0.12.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 (112) hide show
  1. package/dist/codec-types-CRlHq7Cz.d.mts.map +1 -1
  2. package/dist/codecs-Dud5KDNk.d.mts.map +1 -1
  3. package/dist/codecs.d.mts.map +1 -1
  4. package/dist/codecs.mjs.map +1 -1
  5. package/dist/control.d.mts.map +1 -1
  6. package/dist/control.mjs +16 -39
  7. package/dist/control.mjs.map +1 -1
  8. package/dist/data-transform-CdtGUWp2.mjs.map +1 -1
  9. package/dist/data-transform-bmOKkygi.d.mts.map +1 -1
  10. package/dist/{default-normalizer-DHCsbfjc.mjs → default-normalizer-CRscvhS5.mjs} +1 -1
  11. package/dist/{default-normalizer-DHCsbfjc.mjs.map → default-normalizer-CRscvhS5.mjs.map} +1 -1
  12. package/dist/default-normalizer.d.mts.map +1 -1
  13. package/dist/default-normalizer.mjs +1 -1
  14. package/dist/descriptor-meta-DLA2xV6B.mjs.map +1 -1
  15. package/dist/enum-planning-Dz0Ye3Lb.mjs +0 -0
  16. package/dist/enum-planning-Dz0Ye3Lb.mjs.map +1 -0
  17. package/dist/enum-planning.d.mts +41 -3
  18. package/dist/enum-planning.d.mts.map +1 -1
  19. package/dist/enum-planning.mjs +2 -2
  20. package/dist/errors--zafB5_n.mjs.map +1 -1
  21. package/dist/errors.d.mts.map +1 -1
  22. package/dist/{issue-planner-OthDciOe.mjs → issue-planner-ByQhUzS4.mjs} +113 -56
  23. package/dist/issue-planner-ByQhUzS4.mjs.map +1 -0
  24. package/dist/issue-planner.d.mts.map +1 -1
  25. package/dist/issue-planner.mjs +1 -1
  26. package/dist/migration.d.mts.map +1 -1
  27. package/dist/migration.mjs +1 -1
  28. package/dist/migration.mjs.map +1 -1
  29. package/dist/{native-type-normalizer-DMikJJ1V.mjs → native-type-normalizer-ClNPq__-.mjs} +1 -1
  30. package/dist/{native-type-normalizer-DMikJJ1V.mjs.map → native-type-normalizer-ClNPq__-.mjs.map} +1 -1
  31. package/dist/native-type-normalizer.d.mts.map +1 -1
  32. package/dist/native-type-normalizer.mjs +1 -1
  33. package/dist/{op-factory-call-Bgb_ghPb.mjs → op-factory-call-B0WNg30h.mjs} +2 -2
  34. package/dist/{op-factory-call-Bgb_ghPb.mjs.map → op-factory-call-B0WNg30h.mjs.map} +1 -1
  35. package/dist/op-factory-call-Drccm_JD.d.mts.map +1 -1
  36. package/dist/op-factory-call.mjs +1 -1
  37. package/dist/pack.d.mts.map +1 -1
  38. package/dist/{planner-DZG1dsSW.mjs → planner-ClF0y0YR.mjs} +17 -25
  39. package/dist/planner-ClF0y0YR.mjs.map +1 -0
  40. package/dist/{planner-ddl-builders-DYMuN0w1.mjs → planner-ddl-builders-BxRCSn_b.mjs} +3 -3
  41. package/dist/{planner-ddl-builders-DYMuN0w1.mjs.map → planner-ddl-builders-BxRCSn_b.mjs.map} +1 -1
  42. package/dist/planner-ddl-builders.d.mts.map +1 -1
  43. package/dist/planner-ddl-builders.mjs +1 -1
  44. package/dist/planner-identity-values-ojX-6cPV.mjs.map +1 -1
  45. package/dist/planner-identity-values.d.mts.map +1 -1
  46. package/dist/{planner-produced-postgres-migration-TJWH2m_x.mjs → planner-produced-postgres-migration-N1yqYg20.mjs} +3 -5
  47. package/dist/planner-produced-postgres-migration-N1yqYg20.mjs.map +1 -0
  48. package/dist/planner-produced-postgres-migration-p-VKkCia.d.mts.map +1 -1
  49. package/dist/planner-produced-postgres-migration.mjs +1 -1
  50. package/dist/planner-schema-lookup-BGyukuzG.mjs.map +1 -1
  51. package/dist/planner-schema-lookup.d.mts.map +1 -1
  52. package/dist/{planner-sql-checks-K-mTBJDi.mjs → planner-sql-checks-D3H-xOO1.mjs} +3 -3
  53. package/dist/{planner-sql-checks-K-mTBJDi.mjs.map → planner-sql-checks-D3H-xOO1.mjs.map} +1 -1
  54. package/dist/planner-sql-checks.d.mts.map +1 -1
  55. package/dist/planner-sql-checks.mjs +1 -1
  56. package/dist/planner-target-details-CIj61DUj.d.mts.map +1 -1
  57. package/dist/planner.d.mts +1 -6
  58. package/dist/planner.d.mts.map +1 -1
  59. package/dist/planner.mjs +1 -1
  60. package/dist/{postgres-contract-serializer-CrET5Ov0.mjs → postgres-contract-serializer-YJvjKrmo.mjs} +11 -11
  61. package/dist/postgres-contract-serializer-YJvjKrmo.mjs.map +1 -0
  62. package/dist/postgres-enum-type-CNhPTDhy.d.mts.map +1 -1
  63. package/dist/postgres-enum-type-DS-KLVRH.mjs.map +1 -1
  64. package/dist/postgres-migration-uADmx0dW.mjs.map +1 -1
  65. package/dist/{postgres-schema-CK82EuWq.mjs → postgres-schema-Bm7vjlOv.mjs} +14 -21
  66. package/dist/postgres-schema-Bm7vjlOv.mjs.map +1 -0
  67. package/dist/render-ops-BC2PtCkj.mjs.map +1 -1
  68. package/dist/render-ops.d.mts.map +1 -1
  69. package/dist/{render-typescript-CI1wbgUc.mjs → render-typescript-CPk7hhWH.mjs} +2 -3
  70. package/dist/render-typescript-CPk7hhWH.mjs.map +1 -0
  71. package/dist/render-typescript.d.mts +0 -1
  72. package/dist/render-typescript.d.mts.map +1 -1
  73. package/dist/render-typescript.mjs +1 -1
  74. package/dist/runtime.d.mts.map +1 -1
  75. package/dist/runtime.mjs +1 -1
  76. package/dist/runtime.mjs.map +1 -1
  77. package/dist/shared-ByhSooBS.d.mts.map +1 -1
  78. package/dist/{sql-utils-BewXAnsG.mjs → sql-utils-B_ruBD-M.mjs} +1 -1
  79. package/dist/{sql-utils-BewXAnsG.mjs.map → sql-utils-B_ruBD-M.mjs.map} +1 -1
  80. package/dist/sql-utils.d.mts.map +1 -1
  81. package/dist/sql-utils.mjs +1 -1
  82. package/dist/statement-builders-vImtdfmM.mjs.map +1 -1
  83. package/dist/statement-builders.d.mts +1 -1
  84. package/dist/statement-builders.d.mts.map +1 -1
  85. package/dist/{tables-CWxZgD0H.mjs → tables-Dcb2q9zV.mjs} +3 -3
  86. package/dist/{tables-CWxZgD0H.mjs.map → tables-Dcb2q9zV.mjs.map} +1 -1
  87. package/dist/types-D-XIpzHA.d.mts.map +1 -1
  88. package/dist/types.d.mts +12 -16
  89. package/dist/types.d.mts.map +1 -1
  90. package/dist/types.mjs +1 -1
  91. package/package.json +29 -18
  92. package/src/core/migrations/enum-planning.ts +134 -14
  93. package/src/core/migrations/issue-planner.ts +20 -11
  94. package/src/core/migrations/planner-produced-postgres-migration.ts +0 -2
  95. package/src/core/migrations/planner-strategies.ts +141 -43
  96. package/src/core/migrations/planner.ts +9 -21
  97. package/src/core/migrations/render-typescript.ts +1 -5
  98. package/src/core/migrations/runner.ts +20 -61
  99. package/src/core/migrations/statement-builders.ts +1 -1
  100. package/src/core/migrations/verify-postgres-namespaces.ts +6 -6
  101. package/src/core/postgres-contract-serializer.ts +16 -16
  102. package/src/core/postgres-schema.ts +14 -24
  103. package/src/exports/control.ts +16 -0
  104. package/src/exports/enum-planning.ts +5 -0
  105. package/dist/enum-planning-Bqp96iIw.mjs +0 -63
  106. package/dist/enum-planning-Bqp96iIw.mjs.map +0 -1
  107. package/dist/issue-planner-OthDciOe.mjs.map +0 -1
  108. package/dist/planner-DZG1dsSW.mjs.map +0 -1
  109. package/dist/planner-produced-postgres-migration-TJWH2m_x.mjs.map +0 -1
  110. package/dist/postgres-contract-serializer-CrET5Ov0.mjs.map +0 -1
  111. package/dist/postgres-schema-CK82EuWq.mjs.map +0 -1
  112. package/dist/render-typescript-CI1wbgUc.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"statement-builders.d.mts","names":[],"sources":["../src/core/migrations/statement-builders.ts"],"mappings":";;;UAIiB,YAAA;EAAA,SACN,GAAA;EAAA,SACA,MAAA;AAAA;AAAA,cAGE,mCAAA,EAAqC,YAAA;;AAAlD;;;;;AAcA;;;cAAa,0BAAA,EAA4B,YAAA;AAAA,cAe5B,0BAAA,EAA4B,YAAA;AAAA,UAexB,gBAAA;EAFhB;;;;AAED;;;;;EAFC,SAYU,KAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;EAAA,SACA,gBAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,GAAO,MAAA;EAOP;;;AAGX;;;EAHW,SAAA,UAAA;AAAA;AAAA,iBAGK,0BAAA,CAA2B,KAAA,EAAO,gBAAA;EAAA,SACvC,MAAA,EAAQ,YAAA;EAAA,SACR,MAAA,EAAQ,YAAA;AAAA"}
1
+ {"version":3,"file":"statement-builders.d.mts","names":[],"sources":["../src/core/migrations/statement-builders.ts"],"mappings":";;;UAIiB,YAAA;EAAA,SACN,GAAA;EAAA,SACA,MAAM;AAAA;AAAA,cAGJ,mCAAA,EAAqC,YAGjD;AANgB;AAGjB;;;;AAGC;AAWD;;;AAjBiB,cAiBJ,0BAAA,EAA4B,YAaxC;AAAA,cAEY,0BAAA,EAA4B,YAaxC;AAAA,UAEgB,gBAAA;EAFhB;;;AAAA;AAED;;;;;EAFC,SAYU,KAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;EAAA,SACA,gBAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,GAAO,MAAM;EAOb;;AAAU;AAGrB;;;EAHW,SAAA,UAAA;AAAA;AAAA,iBAGK,0BAAA,CAA2B,KAAA,EAAO,gBAAA;EAAA,SACvC,MAAA,EAAQ,YAAA;EAAA,SACR,MAAA,EAAQ,YAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { i as quoteIdentifier, n as escapeLiteral, r as qualifyName } from "./sql-utils-BewXAnsG.mjs";
2
- import { a as columnNullabilityCheck, c as qualifyTableName, d as toRegclassLiteral, n as columnDefaultExistsCheck, o as columnTypeCheck, r as columnExistsCheck, s as constraintExistsCheck } from "./planner-sql-checks-K-mTBJDi.mjs";
1
+ import { i as quoteIdentifier, n as escapeLiteral, r as qualifyName } from "./sql-utils-B_ruBD-M.mjs";
2
+ import { a as columnNullabilityCheck, c as qualifyTableName, d as toRegclassLiteral, n as columnDefaultExistsCheck, o as columnTypeCheck, r as columnExistsCheck, s as constraintExistsCheck } from "./planner-sql-checks-D3H-xOO1.mjs";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  //#region src/core/migrations/operations/shared.ts
5
5
  function step(description, sql) {
@@ -513,4 +513,4 @@ function dropTable(schemaName, tableName) {
513
513
  //#endregion
514
514
  export { setNotNull as S, alterColumnType as _, addEnumValues as a, dropNotNull as b, renameType as c, installExtension as d, addForeignKey as f, addColumn as g, dropConstraint as h, dropIndex as i, createExtension as l, addUnique as m, dropTable as n, createEnumType as o, addPrimaryKey as p, createIndex as r, dropEnumType as s, createTable as t, createSchema as u, dropColumn as v, setDefault as x, dropDefault as y };
515
515
 
516
- //# sourceMappingURL=tables-CWxZgD0H.mjs.map
516
+ //# sourceMappingURL=tables-Dcb2q9zV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tables-CWxZgD0H.mjs","names":[],"sources":["../src/core/migrations/operations/shared.ts","../src/core/migrations/operations/columns.ts","../src/core/migrations/operations/constraints.ts","../src/core/migrations/operations/dependencies.ts","../src/core/migrations/operations/enums.ts","../src/core/migrations/operations/indexes.ts","../src/core/migrations/operations/tables.ts"],"sourcesContent":["import type { SqlMigrationPlanOperation } from '@prisma-next/family-sql/control';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { quoteIdentifier } from '../../sql-utils';\nimport type { OperationClass, PostgresPlanTargetDetails } from '../planner-target-details';\n\nexport type Op = SqlMigrationPlanOperation<PostgresPlanTargetDetails>;\n\n/**\n * Literal-args shape for a column definition consumed by `createTable` and\n * `addColumn`. Fully materialized: codec expansion and default rendering have\n * already happened in the wrapper.\n *\n * - `typeSql` is the column's DDL type string (e.g. `\"integer\"`, `\"SERIAL\"`,\n * `\"varchar(100)\"`), already produced by `buildColumnTypeSql` in the\n * call-factory wrapper.\n * - `defaultSql` is the full `DEFAULT …` clause (e.g. `\"DEFAULT 42\"`) or an\n * empty string when the column has no default, matching\n * `buildColumnDefaultSql`'s output.\n */\nexport interface ColumnSpec {\n readonly name: string;\n readonly typeSql: string;\n readonly defaultSql: string;\n readonly nullable: boolean;\n}\n\n/**\n * Literal-args shape for a foreign key definition. `references.schema`\n * carries the target table's namespace (schema) coordinate so the rendered\n * DDL qualifies the REFERENCES clause correctly for cross-schema FKs.\n */\nexport interface ForeignKeySpec {\n readonly name: string;\n readonly columns: readonly string[];\n readonly references: {\n readonly schema: string;\n readonly table: string;\n readonly columns: readonly string[];\n };\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n}\n\nexport function step(description: string, sql: string) {\n return { description, sql };\n}\n\nexport function targetDetails(\n objectType: OperationClass,\n name: string,\n schema: string,\n table?: string,\n): { readonly id: 'postgres'; readonly details: PostgresPlanTargetDetails } {\n return {\n id: 'postgres',\n details: { schema, objectType, name, ...ifDefined('table', table) },\n };\n}\n\nexport function renderColumnDefinition(column: ColumnSpec): string {\n const parts = [\n quoteIdentifier(column.name),\n column.typeSql,\n column.defaultSql,\n column.nullable ? '' : 'NOT NULL',\n ].filter(Boolean);\n return parts.join(' ');\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport {\n columnDefaultExistsCheck,\n columnExistsCheck,\n columnNullabilityCheck,\n columnTypeCheck,\n qualifyTableName,\n} from '../planner-sql-checks';\nimport { type ColumnSpec, type Op, step, targetDetails } from './shared';\n\nexport function addColumn(schemaName: string, tableName: string, column: ColumnSpec): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const parts = [\n `ALTER TABLE ${qualified}`,\n `ADD COLUMN ${quoteIdentifier(column.name)} ${column.typeSql}`,\n column.defaultSql,\n column.nullable ? '' : 'NOT NULL',\n ].filter(Boolean);\n const addSql = parts.join(' ');\n\n return {\n id: `column.${tableName}.${column.name}`,\n label: `Add column \"${column.name}\" to \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('column', column.name, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${column.name}\" is missing`,\n columnExistsCheck({\n schema: schemaName,\n table: tableName,\n column: column.name,\n exists: false,\n }),\n ),\n ],\n execute: [step(`add column \"${column.name}\"`, addSql)],\n postcheck: [\n step(\n `verify column \"${column.name}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: column.name }),\n ),\n ],\n };\n}\n\nexport function dropColumn(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropColumn.${tableName}.${columnName}`,\n label: `Drop column \"${columnName}\" from \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop column \"${columnName}\"`,\n `ALTER TABLE ${qualified} DROP COLUMN ${quoteIdentifier(columnName)}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" does not exist`,\n columnExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: false,\n }),\n ),\n ],\n };\n}\n\n/**\n * `qualifiedTargetType` is the new column type as it appears in the\n * `ALTER COLUMN TYPE` clause (schema-qualified for user-defined types, raw\n * native name for built-ins). `formatTypeExpected` is the unqualified\n * `format_type` form used in the postcheck. `rawTargetTypeForLabel` is the\n * string appearing in the human-readable label (typically `toType` when\n * explicit, else the column's native type).\n */\nexport function alterColumnType(\n schemaName: string,\n tableName: string,\n columnName: string,\n options: {\n readonly qualifiedTargetType: string;\n readonly formatTypeExpected: string;\n readonly rawTargetTypeForLabel: string;\n readonly using?: string;\n },\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const usingClause = options.using\n ? ` USING ${options.using}`\n : ` USING ${quoteIdentifier(columnName)}::${options.qualifiedTargetType}`;\n return {\n id: `alterType.${tableName}.${columnName}`,\n label: `Alter type of \"${tableName}\".\"${columnName}\" to ${options.rawTargetTypeForLabel}`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `alter type of \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} TYPE ${options.qualifiedTargetType}${usingClause}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has type \"${options.formatTypeExpected}\"`,\n columnTypeCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n expectedType: options.formatTypeExpected,\n }),\n ),\n ],\n meta: { warning: 'TABLE_REWRITE' },\n };\n}\n\nexport function setNotNull(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `alterNullability.setNotNull.${tableName}.${columnName}`,\n label: `Set NOT NULL on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n step(\n `ensure no NULL values in \"${columnName}\"`,\n `SELECT NOT EXISTS (SELECT 1 FROM ${qualified} WHERE ${quoteIdentifier(columnName)} IS NULL)`,\n ),\n ],\n execute: [\n step(\n `set NOT NULL on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET NOT NULL`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" is NOT NULL`,\n columnNullabilityCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n nullable: false,\n }),\n ),\n ],\n };\n}\n\nexport function dropNotNull(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `alterNullability.dropNotNull.${tableName}.${columnName}`,\n label: `Drop NOT NULL on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'widening',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop NOT NULL on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP NOT NULL`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" is nullable`,\n columnNullabilityCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n nullable: true,\n }),\n ),\n ],\n };\n}\n\n/**\n * `defaultSql` is the full `DEFAULT …` clause as produced by\n * `buildColumnDefaultSql` — e.g. `\"DEFAULT 42\"`,\n * `\"DEFAULT (CURRENT_TIMESTAMP)\"`, or `\"DEFAULT nextval('seq'::regclass)\"`.\n *\n * `operationClass` defaults to `'additive'` (setting a default on a column\n * that currently has none). The reconciliation planner passes `'widening'`\n * when the column already has a different default — policy enforcement\n * treats that as a widening change rather than an additive one.\n */\nexport function setDefault(\n schemaName: string,\n tableName: string,\n columnName: string,\n defaultSql: string,\n operationClass: 'additive' | 'widening' = 'additive',\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `setDefault.${tableName}.${columnName}`,\n label: `Set default on \"${tableName}\".\"${columnName}\"`,\n operationClass,\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `set default on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET ${defaultSql}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has a default`,\n columnDefaultExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: true,\n }),\n ),\n ],\n };\n}\n\nexport function dropDefault(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropDefault.${tableName}.${columnName}`,\n label: `Drop default on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop default on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP DEFAULT`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has no default`,\n columnDefaultExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: false,\n }),\n ),\n ],\n };\n}\n","import type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport { quoteIdentifier } from '../../sql-utils';\nimport { constraintExistsCheck, qualifyTableName } from '../planner-sql-checks';\nimport { type ForeignKeySpec, type Op, step, targetDetails } from './shared';\n\nconst REFERENTIAL_ACTION_SQL: Record<ReferentialAction, string> = {\n noAction: 'NO ACTION',\n restrict: 'RESTRICT',\n cascade: 'CASCADE',\n setNull: 'SET NULL',\n setDefault: 'SET DEFAULT',\n};\n\nfunction renderForeignKeySql(schemaName: string, tableName: string, fk: ForeignKeySpec): string {\n let sql = `ALTER TABLE ${qualifyTableName(schemaName, tableName)}\nADD CONSTRAINT ${quoteIdentifier(fk.name)}\nFOREIGN KEY (${fk.columns.map(quoteIdentifier).join(', ')})\nREFERENCES ${qualifyTableName(fk.references.schema, fk.references.table)} (${fk.references.columns\n .map(quoteIdentifier)\n .join(', ')})`;\n\n if (fk.onDelete !== undefined) {\n const action = REFERENTIAL_ACTION_SQL[fk.onDelete];\n if (!action) {\n throw new Error(`Unknown referential action for onDelete: ${String(fk.onDelete)}`);\n }\n sql += `\\nON DELETE ${action}`;\n }\n if (fk.onUpdate !== undefined) {\n const action = REFERENTIAL_ACTION_SQL[fk.onUpdate];\n if (!action) {\n throw new Error(`Unknown referential action for onUpdate: ${String(fk.onUpdate)}`);\n }\n sql += `\\nON UPDATE ${action}`;\n }\n return sql;\n}\n\nexport function addPrimaryKey(\n schemaName: string,\n tableName: string,\n constraintName: string,\n columns: readonly string[],\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n return {\n id: `primaryKey.${tableName}.${constraintName}`,\n label: `Add primary key on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('primaryKey', constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure primary key \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [\n step(\n `add primary key \"${constraintName}\"`,\n `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} PRIMARY KEY (${columnList})`,\n ),\n ],\n postcheck: [\n step(\n `verify primary key \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n };\n}\n\nexport function addUnique(\n schemaName: string,\n tableName: string,\n constraintName: string,\n columns: readonly string[],\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n return {\n id: `unique.${tableName}.${constraintName}`,\n label: `Add unique constraint on \"${tableName}\" (${columns.join(', ')})`,\n operationClass: 'additive',\n target: targetDetails('unique', constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure constraint \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [\n step(\n `add unique constraint \"${constraintName}\"`,\n `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} UNIQUE (${columnList})`,\n ),\n ],\n postcheck: [\n step(\n `verify constraint \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n };\n}\n\nexport function addForeignKey(schemaName: string, tableName: string, fk: ForeignKeySpec): Op {\n return {\n id: `foreignKey.${tableName}.${fk.name}`,\n label: `Add foreign key \"${fk.name}\" on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('foreignKey', fk.name, schemaName, tableName),\n precheck: [\n step(\n `ensure FK \"${fk.name}\" does not exist`,\n constraintExistsCheck({\n constraintName: fk.name,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [step(`add FK \"${fk.name}\"`, renderForeignKeySql(schemaName, tableName, fk))],\n postcheck: [\n step(\n `verify FK \"${fk.name}\" exists`,\n constraintExistsCheck({\n constraintName: fk.name,\n schema: schemaName,\n table: tableName,\n }),\n ),\n ],\n };\n}\n\n/**\n * `kind` feeds the operation's `target.details.objectType`. Descriptor-flow\n * does not carry kind information in its drop-constraint descriptor, so the\n * default is `'unique'`. The reconciliation planner passes the correct kind\n * (`'foreignKey'`, `'primaryKey'`, or `'unique'`) based on the `SchemaIssue`\n * that produced the drop.\n */\nexport function dropConstraint(\n schemaName: string,\n tableName: string,\n constraintName: string,\n kind: 'foreignKey' | 'unique' | 'primaryKey' = 'unique',\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropConstraint.${tableName}.${constraintName}`,\n label: `Drop constraint \"${constraintName}\" on \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails(kind, constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure constraint \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n execute: [\n step(\n `drop constraint \"${constraintName}\"`,\n `ALTER TABLE ${qualified} DROP CONSTRAINT ${quoteIdentifier(constraintName)}`,\n ),\n ],\n postcheck: [\n step(\n `verify constraint \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n };\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport { type Op, step } from './shared';\n\nexport function createExtension(extensionName: string): Op {\n return {\n id: `extension.${extensionName}`,\n label: `Create extension \"${extensionName}\"`,\n operationClass: 'additive',\n target: { id: 'postgres' },\n precheck: [],\n execute: [\n step(\n `Create extension \"${extensionName}\"`,\n `CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(extensionName)}`,\n ),\n ],\n postcheck: [],\n };\n}\n\n/**\n * Install a Postgres extension as the baseline op for an extension-pack\n * contract space. Layered on top of {@link createExtension}: stamps an\n * `invariantId` (required so the per-space marker records the install),\n * scopes the op `id` under a caller-chosen namespace (e.g. `pgvector.`),\n * and emits pre- and postcheck SQL probing `pg_extension`. The richer\n * shape lets the runner's idempotency probe skip the install on re-run\n * (postcheck-pre-satisfied) without firing the precheck.\n *\n * Use this for hand-rolled baseline migrations in contract-space\n * extension packages (e.g. `extension-pgvector`, `extension-paradedb`);\n * use the bare {@link createExtension} for planner-emitted ops where the\n * caller already controls idempotency through the surrounding plan.\n */\nexport function installExtension(options: {\n readonly extensionName: string;\n readonly invariantId: string;\n readonly id: string;\n readonly label?: string;\n}): Op {\n const { extensionName, invariantId, id } = options;\n const label = options.label ?? `Enable extension \"${extensionName}\"`;\n return {\n id,\n label,\n operationClass: 'additive',\n invariantId,\n target: {\n id: 'postgres',\n details: { schema: 'public', objectType: 'dependency', name: extensionName },\n },\n precheck: [\n step(\n `verify extension \"${extensionName}\" is not already enabled`,\n `SELECT NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`,\n ),\n ],\n execute: [\n step(\n `create extension \"${extensionName}\"`,\n `CREATE EXTENSION IF NOT EXISTS ${extensionName}`,\n ),\n ],\n postcheck: [\n step(\n `confirm extension \"${extensionName}\" is enabled`,\n `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`,\n ),\n ],\n };\n}\n\nexport function createSchema(schemaName: string): Op {\n return {\n id: `schema.${schemaName}`,\n label: `Create schema \"${schemaName}\"`,\n operationClass: 'additive',\n target: { id: 'postgres' },\n precheck: [],\n execute: [\n step(\n `Create schema \"${schemaName}\"`,\n `CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)}`,\n ),\n ],\n postcheck: [],\n };\n}\n","import { escapeLiteral, qualifyName, quoteIdentifier } from '../../sql-utils';\nimport { type Op, step, targetDetails } from './shared';\n\nfunction enumTypeExistsCheck(schemaName: string, nativeType: string, exists = true): string {\n const clause = exists ? 'EXISTS' : 'NOT EXISTS';\n return `SELECT ${clause} (\n SELECT 1\n FROM pg_type t\n JOIN pg_namespace n ON t.typnamespace = n.oid\n WHERE n.nspname = '${escapeLiteral(schemaName)}'\n AND t.typname = '${escapeLiteral(nativeType)}'\n)`;\n}\n\nexport function createEnumType(\n schemaName: string,\n typeName: string,\n values: readonly string[],\n nativeType: string = typeName,\n): Op {\n const qualifiedType = qualifyName(schemaName, nativeType);\n const literalValues = values.map((v) => `'${escapeLiteral(v)}'`).join(', ');\n return {\n id: `type.${typeName}`,\n label: `Create enum type \"${typeName}\"`,\n operationClass: 'additive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [\n step(\n `ensure type \"${nativeType}\" does not exist`,\n enumTypeExistsCheck(schemaName, nativeType, false),\n ),\n ],\n execute: [\n step(\n `create enum type \"${typeName}\"`,\n `CREATE TYPE ${qualifiedType} AS ENUM (${literalValues})`,\n ),\n ],\n postcheck: [\n step(`verify type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n };\n}\n\n/**\n * `typeName` is the contract-facing type name (used for id/label).\n * `nativeType` is the Postgres type name to mutate (may differ for external types).\n */\nexport function addEnumValues(\n schemaName: string,\n typeName: string,\n nativeType: string,\n values: readonly string[],\n): Op {\n const qualifiedType = qualifyName(schemaName, nativeType);\n return {\n id: `type.${typeName}.addValues`,\n label: `Add values to enum type \"${typeName}\": ${values.join(', ')}`,\n operationClass: 'additive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [\n step(`ensure type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n execute: values.map((value) =>\n step(\n `add value '${value}' to enum \"${nativeType}\"`,\n `ALTER TYPE ${qualifiedType} ADD VALUE '${escapeLiteral(value)}'`,\n ),\n ),\n postcheck: [\n step(`verify type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n };\n}\n\nexport function dropEnumType(schemaName: string, typeName: string): Op {\n const qualified = qualifyName(schemaName, typeName);\n return {\n id: `type.${typeName}.drop`,\n label: `Drop enum type \"${typeName}\"`,\n operationClass: 'destructive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [step(`ensure type \"${typeName}\" exists`, enumTypeExistsCheck(schemaName, typeName))],\n execute: [step(`drop enum type \"${typeName}\"`, `DROP TYPE ${qualified}`)],\n postcheck: [\n step(`verify type \"${typeName}\" removed`, enumTypeExistsCheck(schemaName, typeName, false)),\n ],\n };\n}\n\nexport function renameType(schemaName: string, fromName: string, toName: string): Op {\n const qualifiedFrom = qualifyName(schemaName, fromName);\n return {\n id: `type.${fromName}.rename`,\n label: `Rename type \"${fromName}\" to \"${toName}\"`,\n operationClass: 'destructive',\n target: targetDetails('type', fromName, schemaName),\n precheck: [\n step(`ensure type \"${fromName}\" exists`, enumTypeExistsCheck(schemaName, fromName)),\n step(\n `ensure type \"${toName}\" does not already exist`,\n enumTypeExistsCheck(schemaName, toName, false),\n ),\n ],\n execute: [\n step(\n `rename type \"${fromName}\" to \"${toName}\"`,\n `ALTER TYPE ${qualifiedFrom} RENAME TO ${quoteIdentifier(toName)}`,\n ),\n ],\n postcheck: [step(`verify type \"${toName}\" exists`, enumTypeExistsCheck(schemaName, toName))],\n };\n}\n","import { escapeLiteral, quoteIdentifier } from '../../sql-utils';\nimport { qualifyTableName, toRegclassLiteral } from '../planner-sql-checks';\nimport { type Op, step, targetDetails } from './shared';\n\nexport interface CreateIndexExtras {\n readonly type?: string;\n readonly options?: Record<string, unknown>;\n}\n\nfunction renderIndexOptionValue(key: string, value: unknown): string {\n if (typeof value === 'string') return `'${escapeLiteral(value)}'`;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n throw new Error(\n `Index option \"${key}\" must be a string, finite number, or boolean; got ${typeof value}`,\n );\n}\n\nfunction renderIndexOptions(options: Record<string, unknown>): string {\n return Object.entries(options)\n .map(([key, value]) => `${quoteIdentifier(key)} = ${renderIndexOptionValue(key, value)}`)\n .join(', ');\n}\n\nexport function createIndex(\n schemaName: string,\n tableName: string,\n indexName: string,\n columns: readonly string[],\n extras?: CreateIndexExtras,\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n const using = extras?.type ? ` USING ${quoteIdentifier(extras.type)}` : '';\n const options = extras?.options;\n const withClause =\n options && Object.keys(options).length > 0 ? ` WITH (${renderIndexOptions(options)})` : '';\n return {\n id: `index.${tableName}.${indexName}`,\n label: `Create index \"${indexName}\" on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('index', indexName, schemaName, tableName),\n precheck: [\n step(\n `ensure index \"${indexName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`,\n ),\n ],\n execute: [\n step(\n `create index \"${indexName}\"`,\n `CREATE INDEX ${quoteIdentifier(indexName)} ON ${qualified}${using} (${columnList})${withClause}`,\n ),\n ],\n postcheck: [\n step(\n `verify index \"${indexName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`,\n ),\n ],\n };\n}\n\nexport function dropIndex(schemaName: string, tableName: string, indexName: string): Op {\n return {\n id: `dropIndex.${tableName}.${indexName}`,\n label: `Drop index \"${indexName}\"`,\n operationClass: 'destructive',\n target: targetDetails('index', indexName, schemaName, tableName),\n precheck: [\n step(\n `ensure index \"${indexName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`,\n ),\n ],\n execute: [\n step(`drop index \"${indexName}\"`, `DROP INDEX ${qualifyTableName(schemaName, indexName)}`),\n ],\n postcheck: [\n step(\n `verify index \"${indexName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`,\n ),\n ],\n };\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport { qualifyTableName, toRegclassLiteral } from '../planner-sql-checks';\nimport { type ColumnSpec, type Op, renderColumnDefinition, step, targetDetails } from './shared';\n\nexport function createTable(\n schemaName: string,\n tableName: string,\n columns: ReadonlyArray<ColumnSpec>,\n primaryKey?: { readonly columns: readonly string[] },\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnDefs = columns.map(renderColumnDefinition);\n const constraintDefs: string[] = [];\n if (primaryKey) {\n constraintDefs.push(`PRIMARY KEY (${primaryKey.columns.map(quoteIdentifier).join(', ')})`);\n }\n const allDefs = [...columnDefs, ...constraintDefs];\n const createSql = `CREATE TABLE ${qualified} (\\n ${allDefs.join(',\\n ')}\\n)`;\n\n return {\n id: `table.${tableName}`,\n label: `Create table \"${tableName}\"`,\n summary: `Creates table \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('table', tableName, schemaName),\n precheck: [\n step(\n `ensure table \"${tableName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`,\n ),\n ],\n execute: [step(`create table \"${tableName}\"`, createSql)],\n postcheck: [\n step(\n `verify table \"${tableName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`,\n ),\n ],\n };\n}\n\nexport function dropTable(schemaName: string, tableName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropTable.${tableName}`,\n label: `Drop table \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails('table', tableName, schemaName),\n precheck: [\n step(\n `ensure table \"${tableName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`,\n ),\n ],\n execute: [step(`drop table \"${tableName}\"`, `DROP TABLE ${qualified}`)],\n postcheck: [\n step(\n `verify table \"${tableName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`,\n ),\n ],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tables-Dcb2q9zV.mjs","names":[],"sources":["../src/core/migrations/operations/shared.ts","../src/core/migrations/operations/columns.ts","../src/core/migrations/operations/constraints.ts","../src/core/migrations/operations/dependencies.ts","../src/core/migrations/operations/enums.ts","../src/core/migrations/operations/indexes.ts","../src/core/migrations/operations/tables.ts"],"sourcesContent":["import type { SqlMigrationPlanOperation } from '@prisma-next/family-sql/control';\nimport type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { quoteIdentifier } from '../../sql-utils';\nimport type { OperationClass, PostgresPlanTargetDetails } from '../planner-target-details';\n\nexport type Op = SqlMigrationPlanOperation<PostgresPlanTargetDetails>;\n\n/**\n * Literal-args shape for a column definition consumed by `createTable` and\n * `addColumn`. Fully materialized: codec expansion and default rendering have\n * already happened in the wrapper.\n *\n * - `typeSql` is the column's DDL type string (e.g. `\"integer\"`, `\"SERIAL\"`,\n * `\"varchar(100)\"`), already produced by `buildColumnTypeSql` in the\n * call-factory wrapper.\n * - `defaultSql` is the full `DEFAULT …` clause (e.g. `\"DEFAULT 42\"`) or an\n * empty string when the column has no default, matching\n * `buildColumnDefaultSql`'s output.\n */\nexport interface ColumnSpec {\n readonly name: string;\n readonly typeSql: string;\n readonly defaultSql: string;\n readonly nullable: boolean;\n}\n\n/**\n * Literal-args shape for a foreign key definition. `references.schema`\n * carries the target table's namespace (schema) coordinate so the rendered\n * DDL qualifies the REFERENCES clause correctly for cross-schema FKs.\n */\nexport interface ForeignKeySpec {\n readonly name: string;\n readonly columns: readonly string[];\n readonly references: {\n readonly schema: string;\n readonly table: string;\n readonly columns: readonly string[];\n };\n readonly onDelete?: ReferentialAction;\n readonly onUpdate?: ReferentialAction;\n}\n\nexport function step(description: string, sql: string) {\n return { description, sql };\n}\n\nexport function targetDetails(\n objectType: OperationClass,\n name: string,\n schema: string,\n table?: string,\n): { readonly id: 'postgres'; readonly details: PostgresPlanTargetDetails } {\n return {\n id: 'postgres',\n details: { schema, objectType, name, ...ifDefined('table', table) },\n };\n}\n\nexport function renderColumnDefinition(column: ColumnSpec): string {\n const parts = [\n quoteIdentifier(column.name),\n column.typeSql,\n column.defaultSql,\n column.nullable ? '' : 'NOT NULL',\n ].filter(Boolean);\n return parts.join(' ');\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport {\n columnDefaultExistsCheck,\n columnExistsCheck,\n columnNullabilityCheck,\n columnTypeCheck,\n qualifyTableName,\n} from '../planner-sql-checks';\nimport { type ColumnSpec, type Op, step, targetDetails } from './shared';\n\nexport function addColumn(schemaName: string, tableName: string, column: ColumnSpec): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const parts = [\n `ALTER TABLE ${qualified}`,\n `ADD COLUMN ${quoteIdentifier(column.name)} ${column.typeSql}`,\n column.defaultSql,\n column.nullable ? '' : 'NOT NULL',\n ].filter(Boolean);\n const addSql = parts.join(' ');\n\n return {\n id: `column.${tableName}.${column.name}`,\n label: `Add column \"${column.name}\" to \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('column', column.name, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${column.name}\" is missing`,\n columnExistsCheck({\n schema: schemaName,\n table: tableName,\n column: column.name,\n exists: false,\n }),\n ),\n ],\n execute: [step(`add column \"${column.name}\"`, addSql)],\n postcheck: [\n step(\n `verify column \"${column.name}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: column.name }),\n ),\n ],\n };\n}\n\nexport function dropColumn(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropColumn.${tableName}.${columnName}`,\n label: `Drop column \"${columnName}\" from \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop column \"${columnName}\"`,\n `ALTER TABLE ${qualified} DROP COLUMN ${quoteIdentifier(columnName)}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" does not exist`,\n columnExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: false,\n }),\n ),\n ],\n };\n}\n\n/**\n * `qualifiedTargetType` is the new column type as it appears in the\n * `ALTER COLUMN TYPE` clause (schema-qualified for user-defined types, raw\n * native name for built-ins). `formatTypeExpected` is the unqualified\n * `format_type` form used in the postcheck. `rawTargetTypeForLabel` is the\n * string appearing in the human-readable label (typically `toType` when\n * explicit, else the column's native type).\n */\nexport function alterColumnType(\n schemaName: string,\n tableName: string,\n columnName: string,\n options: {\n readonly qualifiedTargetType: string;\n readonly formatTypeExpected: string;\n readonly rawTargetTypeForLabel: string;\n readonly using?: string;\n },\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const usingClause = options.using\n ? ` USING ${options.using}`\n : ` USING ${quoteIdentifier(columnName)}::${options.qualifiedTargetType}`;\n return {\n id: `alterType.${tableName}.${columnName}`,\n label: `Alter type of \"${tableName}\".\"${columnName}\" to ${options.rawTargetTypeForLabel}`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `alter type of \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} TYPE ${options.qualifiedTargetType}${usingClause}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has type \"${options.formatTypeExpected}\"`,\n columnTypeCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n expectedType: options.formatTypeExpected,\n }),\n ),\n ],\n meta: { warning: 'TABLE_REWRITE' },\n };\n}\n\nexport function setNotNull(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `alterNullability.setNotNull.${tableName}.${columnName}`,\n label: `Set NOT NULL on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n step(\n `ensure no NULL values in \"${columnName}\"`,\n `SELECT NOT EXISTS (SELECT 1 FROM ${qualified} WHERE ${quoteIdentifier(columnName)} IS NULL)`,\n ),\n ],\n execute: [\n step(\n `set NOT NULL on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET NOT NULL`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" is NOT NULL`,\n columnNullabilityCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n nullable: false,\n }),\n ),\n ],\n };\n}\n\nexport function dropNotNull(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `alterNullability.dropNotNull.${tableName}.${columnName}`,\n label: `Drop NOT NULL on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'widening',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop NOT NULL on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP NOT NULL`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" is nullable`,\n columnNullabilityCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n nullable: true,\n }),\n ),\n ],\n };\n}\n\n/**\n * `defaultSql` is the full `DEFAULT …` clause as produced by\n * `buildColumnDefaultSql` — e.g. `\"DEFAULT 42\"`,\n * `\"DEFAULT (CURRENT_TIMESTAMP)\"`, or `\"DEFAULT nextval('seq'::regclass)\"`.\n *\n * `operationClass` defaults to `'additive'` (setting a default on a column\n * that currently has none). The reconciliation planner passes `'widening'`\n * when the column already has a different default — policy enforcement\n * treats that as a widening change rather than an additive one.\n */\nexport function setDefault(\n schemaName: string,\n tableName: string,\n columnName: string,\n defaultSql: string,\n operationClass: 'additive' | 'widening' = 'additive',\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `setDefault.${tableName}.${columnName}`,\n label: `Set default on \"${tableName}\".\"${columnName}\"`,\n operationClass,\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `set default on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET ${defaultSql}`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has a default`,\n columnDefaultExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: true,\n }),\n ),\n ],\n };\n}\n\nexport function dropDefault(schemaName: string, tableName: string, columnName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropDefault.${tableName}.${columnName}`,\n label: `Drop default on \"${tableName}\".\"${columnName}\"`,\n operationClass: 'destructive',\n target: targetDetails('column', columnName, schemaName, tableName),\n precheck: [\n step(\n `ensure column \"${columnName}\" exists`,\n columnExistsCheck({ schema: schemaName, table: tableName, column: columnName }),\n ),\n ],\n execute: [\n step(\n `drop default on \"${columnName}\"`,\n `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP DEFAULT`,\n ),\n ],\n postcheck: [\n step(\n `verify column \"${columnName}\" has no default`,\n columnDefaultExistsCheck({\n schema: schemaName,\n table: tableName,\n column: columnName,\n exists: false,\n }),\n ),\n ],\n };\n}\n","import type { ReferentialAction } from '@prisma-next/sql-contract/types';\nimport { quoteIdentifier } from '../../sql-utils';\nimport { constraintExistsCheck, qualifyTableName } from '../planner-sql-checks';\nimport { type ForeignKeySpec, type Op, step, targetDetails } from './shared';\n\nconst REFERENTIAL_ACTION_SQL: Record<ReferentialAction, string> = {\n noAction: 'NO ACTION',\n restrict: 'RESTRICT',\n cascade: 'CASCADE',\n setNull: 'SET NULL',\n setDefault: 'SET DEFAULT',\n};\n\nfunction renderForeignKeySql(schemaName: string, tableName: string, fk: ForeignKeySpec): string {\n let sql = `ALTER TABLE ${qualifyTableName(schemaName, tableName)}\nADD CONSTRAINT ${quoteIdentifier(fk.name)}\nFOREIGN KEY (${fk.columns.map(quoteIdentifier).join(', ')})\nREFERENCES ${qualifyTableName(fk.references.schema, fk.references.table)} (${fk.references.columns\n .map(quoteIdentifier)\n .join(', ')})`;\n\n if (fk.onDelete !== undefined) {\n const action = REFERENTIAL_ACTION_SQL[fk.onDelete];\n if (!action) {\n throw new Error(`Unknown referential action for onDelete: ${String(fk.onDelete)}`);\n }\n sql += `\\nON DELETE ${action}`;\n }\n if (fk.onUpdate !== undefined) {\n const action = REFERENTIAL_ACTION_SQL[fk.onUpdate];\n if (!action) {\n throw new Error(`Unknown referential action for onUpdate: ${String(fk.onUpdate)}`);\n }\n sql += `\\nON UPDATE ${action}`;\n }\n return sql;\n}\n\nexport function addPrimaryKey(\n schemaName: string,\n tableName: string,\n constraintName: string,\n columns: readonly string[],\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n return {\n id: `primaryKey.${tableName}.${constraintName}`,\n label: `Add primary key on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('primaryKey', constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure primary key \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [\n step(\n `add primary key \"${constraintName}\"`,\n `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} PRIMARY KEY (${columnList})`,\n ),\n ],\n postcheck: [\n step(\n `verify primary key \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n };\n}\n\nexport function addUnique(\n schemaName: string,\n tableName: string,\n constraintName: string,\n columns: readonly string[],\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n return {\n id: `unique.${tableName}.${constraintName}`,\n label: `Add unique constraint on \"${tableName}\" (${columns.join(', ')})`,\n operationClass: 'additive',\n target: targetDetails('unique', constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure constraint \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [\n step(\n `add unique constraint \"${constraintName}\"`,\n `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} UNIQUE (${columnList})`,\n ),\n ],\n postcheck: [\n step(\n `verify constraint \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n };\n}\n\nexport function addForeignKey(schemaName: string, tableName: string, fk: ForeignKeySpec): Op {\n return {\n id: `foreignKey.${tableName}.${fk.name}`,\n label: `Add foreign key \"${fk.name}\" on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('foreignKey', fk.name, schemaName, tableName),\n precheck: [\n step(\n `ensure FK \"${fk.name}\" does not exist`,\n constraintExistsCheck({\n constraintName: fk.name,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n execute: [step(`add FK \"${fk.name}\"`, renderForeignKeySql(schemaName, tableName, fk))],\n postcheck: [\n step(\n `verify FK \"${fk.name}\" exists`,\n constraintExistsCheck({\n constraintName: fk.name,\n schema: schemaName,\n table: tableName,\n }),\n ),\n ],\n };\n}\n\n/**\n * `kind` feeds the operation's `target.details.objectType`. Descriptor-flow\n * does not carry kind information in its drop-constraint descriptor, so the\n * default is `'unique'`. The reconciliation planner passes the correct kind\n * (`'foreignKey'`, `'primaryKey'`, or `'unique'`) based on the `SchemaIssue`\n * that produced the drop.\n */\nexport function dropConstraint(\n schemaName: string,\n tableName: string,\n constraintName: string,\n kind: 'foreignKey' | 'unique' | 'primaryKey' = 'unique',\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropConstraint.${tableName}.${constraintName}`,\n label: `Drop constraint \"${constraintName}\" on \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails(kind, constraintName, schemaName, tableName),\n precheck: [\n step(\n `ensure constraint \"${constraintName}\" exists`,\n constraintExistsCheck({ constraintName, schema: schemaName, table: tableName }),\n ),\n ],\n execute: [\n step(\n `drop constraint \"${constraintName}\"`,\n `ALTER TABLE ${qualified} DROP CONSTRAINT ${quoteIdentifier(constraintName)}`,\n ),\n ],\n postcheck: [\n step(\n `verify constraint \"${constraintName}\" does not exist`,\n constraintExistsCheck({\n constraintName,\n schema: schemaName,\n table: tableName,\n exists: false,\n }),\n ),\n ],\n };\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport { type Op, step } from './shared';\n\nexport function createExtension(extensionName: string): Op {\n return {\n id: `extension.${extensionName}`,\n label: `Create extension \"${extensionName}\"`,\n operationClass: 'additive',\n target: { id: 'postgres' },\n precheck: [],\n execute: [\n step(\n `Create extension \"${extensionName}\"`,\n `CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(extensionName)}`,\n ),\n ],\n postcheck: [],\n };\n}\n\n/**\n * Install a Postgres extension as the baseline op for an extension-pack\n * contract space. Layered on top of {@link createExtension}: stamps an\n * `invariantId` (required so the per-space marker records the install),\n * scopes the op `id` under a caller-chosen namespace (e.g. `pgvector.`),\n * and emits pre- and postcheck SQL probing `pg_extension`. The richer\n * shape lets the runner's idempotency probe skip the install on re-run\n * (postcheck-pre-satisfied) without firing the precheck.\n *\n * Use this for hand-rolled baseline migrations in contract-space\n * extension packages (e.g. `extension-pgvector`, `extension-paradedb`);\n * use the bare {@link createExtension} for planner-emitted ops where the\n * caller already controls idempotency through the surrounding plan.\n */\nexport function installExtension(options: {\n readonly extensionName: string;\n readonly invariantId: string;\n readonly id: string;\n readonly label?: string;\n}): Op {\n const { extensionName, invariantId, id } = options;\n const label = options.label ?? `Enable extension \"${extensionName}\"`;\n return {\n id,\n label,\n operationClass: 'additive',\n invariantId,\n target: {\n id: 'postgres',\n details: { schema: 'public', objectType: 'dependency', name: extensionName },\n },\n precheck: [\n step(\n `verify extension \"${extensionName}\" is not already enabled`,\n `SELECT NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`,\n ),\n ],\n execute: [\n step(\n `create extension \"${extensionName}\"`,\n `CREATE EXTENSION IF NOT EXISTS ${extensionName}`,\n ),\n ],\n postcheck: [\n step(\n `confirm extension \"${extensionName}\" is enabled`,\n `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`,\n ),\n ],\n };\n}\n\nexport function createSchema(schemaName: string): Op {\n return {\n id: `schema.${schemaName}`,\n label: `Create schema \"${schemaName}\"`,\n operationClass: 'additive',\n target: { id: 'postgres' },\n precheck: [],\n execute: [\n step(\n `Create schema \"${schemaName}\"`,\n `CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)}`,\n ),\n ],\n postcheck: [],\n };\n}\n","import { escapeLiteral, qualifyName, quoteIdentifier } from '../../sql-utils';\nimport { type Op, step, targetDetails } from './shared';\n\nfunction enumTypeExistsCheck(schemaName: string, nativeType: string, exists = true): string {\n const clause = exists ? 'EXISTS' : 'NOT EXISTS';\n return `SELECT ${clause} (\n SELECT 1\n FROM pg_type t\n JOIN pg_namespace n ON t.typnamespace = n.oid\n WHERE n.nspname = '${escapeLiteral(schemaName)}'\n AND t.typname = '${escapeLiteral(nativeType)}'\n)`;\n}\n\nexport function createEnumType(\n schemaName: string,\n typeName: string,\n values: readonly string[],\n nativeType: string = typeName,\n): Op {\n const qualifiedType = qualifyName(schemaName, nativeType);\n const literalValues = values.map((v) => `'${escapeLiteral(v)}'`).join(', ');\n return {\n id: `type.${typeName}`,\n label: `Create enum type \"${typeName}\"`,\n operationClass: 'additive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [\n step(\n `ensure type \"${nativeType}\" does not exist`,\n enumTypeExistsCheck(schemaName, nativeType, false),\n ),\n ],\n execute: [\n step(\n `create enum type \"${typeName}\"`,\n `CREATE TYPE ${qualifiedType} AS ENUM (${literalValues})`,\n ),\n ],\n postcheck: [\n step(`verify type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n };\n}\n\n/**\n * `typeName` is the contract-facing type name (used for id/label).\n * `nativeType` is the Postgres type name to mutate (may differ for external types).\n */\nexport function addEnumValues(\n schemaName: string,\n typeName: string,\n nativeType: string,\n values: readonly string[],\n): Op {\n const qualifiedType = qualifyName(schemaName, nativeType);\n return {\n id: `type.${typeName}.addValues`,\n label: `Add values to enum type \"${typeName}\": ${values.join(', ')}`,\n operationClass: 'additive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [\n step(`ensure type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n execute: values.map((value) =>\n step(\n `add value '${value}' to enum \"${nativeType}\"`,\n `ALTER TYPE ${qualifiedType} ADD VALUE '${escapeLiteral(value)}'`,\n ),\n ),\n postcheck: [\n step(`verify type \"${nativeType}\" exists`, enumTypeExistsCheck(schemaName, nativeType)),\n ],\n };\n}\n\nexport function dropEnumType(schemaName: string, typeName: string): Op {\n const qualified = qualifyName(schemaName, typeName);\n return {\n id: `type.${typeName}.drop`,\n label: `Drop enum type \"${typeName}\"`,\n operationClass: 'destructive',\n target: targetDetails('type', typeName, schemaName),\n precheck: [step(`ensure type \"${typeName}\" exists`, enumTypeExistsCheck(schemaName, typeName))],\n execute: [step(`drop enum type \"${typeName}\"`, `DROP TYPE ${qualified}`)],\n postcheck: [\n step(`verify type \"${typeName}\" removed`, enumTypeExistsCheck(schemaName, typeName, false)),\n ],\n };\n}\n\nexport function renameType(schemaName: string, fromName: string, toName: string): Op {\n const qualifiedFrom = qualifyName(schemaName, fromName);\n return {\n id: `type.${fromName}.rename`,\n label: `Rename type \"${fromName}\" to \"${toName}\"`,\n operationClass: 'destructive',\n target: targetDetails('type', fromName, schemaName),\n precheck: [\n step(`ensure type \"${fromName}\" exists`, enumTypeExistsCheck(schemaName, fromName)),\n step(\n `ensure type \"${toName}\" does not already exist`,\n enumTypeExistsCheck(schemaName, toName, false),\n ),\n ],\n execute: [\n step(\n `rename type \"${fromName}\" to \"${toName}\"`,\n `ALTER TYPE ${qualifiedFrom} RENAME TO ${quoteIdentifier(toName)}`,\n ),\n ],\n postcheck: [step(`verify type \"${toName}\" exists`, enumTypeExistsCheck(schemaName, toName))],\n };\n}\n","import { escapeLiteral, quoteIdentifier } from '../../sql-utils';\nimport { qualifyTableName, toRegclassLiteral } from '../planner-sql-checks';\nimport { type Op, step, targetDetails } from './shared';\n\nexport interface CreateIndexExtras {\n readonly type?: string;\n readonly options?: Record<string, unknown>;\n}\n\nfunction renderIndexOptionValue(key: string, value: unknown): string {\n if (typeof value === 'string') return `'${escapeLiteral(value)}'`;\n if (typeof value === 'number' && Number.isFinite(value)) return String(value);\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n throw new Error(\n `Index option \"${key}\" must be a string, finite number, or boolean; got ${typeof value}`,\n );\n}\n\nfunction renderIndexOptions(options: Record<string, unknown>): string {\n return Object.entries(options)\n .map(([key, value]) => `${quoteIdentifier(key)} = ${renderIndexOptionValue(key, value)}`)\n .join(', ');\n}\n\nexport function createIndex(\n schemaName: string,\n tableName: string,\n indexName: string,\n columns: readonly string[],\n extras?: CreateIndexExtras,\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnList = columns.map(quoteIdentifier).join(', ');\n const using = extras?.type ? ` USING ${quoteIdentifier(extras.type)}` : '';\n const options = extras?.options;\n const withClause =\n options && Object.keys(options).length > 0 ? ` WITH (${renderIndexOptions(options)})` : '';\n return {\n id: `index.${tableName}.${indexName}`,\n label: `Create index \"${indexName}\" on \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('index', indexName, schemaName, tableName),\n precheck: [\n step(\n `ensure index \"${indexName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`,\n ),\n ],\n execute: [\n step(\n `create index \"${indexName}\"`,\n `CREATE INDEX ${quoteIdentifier(indexName)} ON ${qualified}${using} (${columnList})${withClause}`,\n ),\n ],\n postcheck: [\n step(\n `verify index \"${indexName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`,\n ),\n ],\n };\n}\n\nexport function dropIndex(schemaName: string, tableName: string, indexName: string): Op {\n return {\n id: `dropIndex.${tableName}.${indexName}`,\n label: `Drop index \"${indexName}\"`,\n operationClass: 'destructive',\n target: targetDetails('index', indexName, schemaName, tableName),\n precheck: [\n step(\n `ensure index \"${indexName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`,\n ),\n ],\n execute: [\n step(`drop index \"${indexName}\"`, `DROP INDEX ${qualifyTableName(schemaName, indexName)}`),\n ],\n postcheck: [\n step(\n `verify index \"${indexName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`,\n ),\n ],\n };\n}\n","import { quoteIdentifier } from '../../sql-utils';\nimport { qualifyTableName, toRegclassLiteral } from '../planner-sql-checks';\nimport { type ColumnSpec, type Op, renderColumnDefinition, step, targetDetails } from './shared';\n\nexport function createTable(\n schemaName: string,\n tableName: string,\n columns: ReadonlyArray<ColumnSpec>,\n primaryKey?: { readonly columns: readonly string[] },\n): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n const columnDefs = columns.map(renderColumnDefinition);\n const constraintDefs: string[] = [];\n if (primaryKey) {\n constraintDefs.push(`PRIMARY KEY (${primaryKey.columns.map(quoteIdentifier).join(', ')})`);\n }\n const allDefs = [...columnDefs, ...constraintDefs];\n const createSql = `CREATE TABLE ${qualified} (\\n ${allDefs.join(',\\n ')}\\n)`;\n\n return {\n id: `table.${tableName}`,\n label: `Create table \"${tableName}\"`,\n summary: `Creates table \"${tableName}\"`,\n operationClass: 'additive',\n target: targetDetails('table', tableName, schemaName),\n precheck: [\n step(\n `ensure table \"${tableName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`,\n ),\n ],\n execute: [step(`create table \"${tableName}\"`, createSql)],\n postcheck: [\n step(\n `verify table \"${tableName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`,\n ),\n ],\n };\n}\n\nexport function dropTable(schemaName: string, tableName: string): Op {\n const qualified = qualifyTableName(schemaName, tableName);\n return {\n id: `dropTable.${tableName}`,\n label: `Drop table \"${tableName}\"`,\n operationClass: 'destructive',\n target: targetDetails('table', tableName, schemaName),\n precheck: [\n step(\n `ensure table \"${tableName}\" exists`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`,\n ),\n ],\n execute: [step(`drop table \"${tableName}\"`, `DROP TABLE ${qualified}`)],\n postcheck: [\n step(\n `verify table \"${tableName}\" does not exist`,\n `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`,\n ),\n ],\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types-D-XIpzHA.d.mts","names":[],"sources":["../src/core/types.ts"],"mappings":";;;KAEY,qBAAA,GACR,aAAA;EAAA,SACW,IAAA;EAAA,SAA2B,IAAA;AAAA"}
1
+ {"version":3,"file":"types-D-XIpzHA.d.mts","names":[],"sources":["../src/core/types.ts"],"mappings":";;;KAEY,qBAAA,GACR,aAAa;EAAA,SACF,IAAA;EAAA,SAA2B,IAAA;AAAA"}
package/dist/types.d.mts CHANGED
@@ -7,7 +7,7 @@ import { SqlNamespaceTablesInput, SqlStorage, StorageTable, StorageTableInput }
7
7
  interface PostgresSchemaInput {
8
8
  readonly id: string;
9
9
  readonly tables?: Record<string, StorageTable | StorageTableInput>;
10
- readonly types?: Record<string, PostgresEnumType | PostgresEnumTypeInput>;
10
+ readonly enum?: Record<string, PostgresEnumType | PostgresEnumTypeInput>;
11
11
  }
12
12
  /**
13
13
  * Postgres target `Namespace` concretion — a Postgres schema (`CREATE
@@ -34,7 +34,7 @@ declare class PostgresSchema extends NamespaceBase {
34
34
  readonly kind: 'schema';
35
35
  readonly id: string;
36
36
  readonly tables: Readonly<Record<string, StorageTable>>;
37
- readonly types: Readonly<Record<string, PostgresEnumType>>;
37
+ readonly enum: Readonly<Record<string, PostgresEnumType>>;
38
38
  constructor(input: PostgresSchemaInput);
39
39
  /**
40
40
  * The bare schema qualifier as it would appear in a rendered SQL
@@ -70,10 +70,11 @@ declare class PostgresSchema extends NamespaceBase {
70
70
  * statements that need to identify this namespace in the live
71
71
  * database (e.g. `CREATE TABLE "<ddlSchemaName>"."<table>" …`,
72
72
  * catalog filters, planner conflict lookups). Named schemas resolve
73
- * to their own id; the unbound singleton overrides this to project
74
- * to `'public'` when a sibling public namespace exists in the same
75
- * contract and falls back to the framework sentinel otherwise so
76
- * the planner can detect the missing-projection case explicitly.
73
+ * to their own id. The `PostgresUnboundSchema` singleton inherits
74
+ * this and returns `UNBOUND_NAMESPACE_ID` callers that dispatch
75
+ * through `qualifyTableName` / `toRegclassLiteral` route through the
76
+ * polymorphic `PostgresUnboundSchema` overrides and produce
77
+ * unqualified (search-path-resolved) output automatically.
77
78
  */
78
79
  ddlSchemaName(_storage: SqlStorage): string;
79
80
  }
@@ -90,6 +91,11 @@ declare class PostgresSchema extends NamespaceBase {
90
91
  * sentinel; Postgres decides what late-bound means here (the table
91
92
  * name, naked — the schema is supplied by the live connection's
92
93
  * `search_path`).
94
+ *
95
+ * `ddlSchemaName` is inherited from `PostgresSchema` and returns
96
+ * `UNBOUND_NAMESPACE_ID`. Downstream helpers (`qualifyTableName`,
97
+ * `toRegclassLiteral`) route through the polymorphic factory and
98
+ * produce unqualified output automatically.
93
99
  */
94
100
  declare class PostgresUnboundSchema extends PostgresSchema {
95
101
  static readonly instance: PostgresUnboundSchema;
@@ -97,16 +103,6 @@ declare class PostgresUnboundSchema extends PostgresSchema {
97
103
  qualifier(): string;
98
104
  qualifyTable(tableName: string): string;
99
105
  schemaSqlExpression(): string;
100
- /**
101
- * The unbound slot has no schema name of its own, so DDL emission
102
- * projects it onto a sibling when one is available: if the contract
103
- * carries a `public` namespace, the late-bound slot resolves to
104
- * `'public'` (the default Postgres landing schema); otherwise it
105
- * resolves to the framework sentinel `UNBOUND_NAMESPACE_ID` so the
106
- * planner can recognise the unprojected case and route accordingly
107
- * (e.g. emit a conflict instead of silently picking a schema).
108
- */
109
- ddlSchemaName(storage: SqlStorage): string;
110
106
  }
111
107
  /**
112
108
  * Target-supplied `Namespace` factory the Postgres target plumbs
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../src/core/postgres-schema.ts"],"mappings":";;;;;;UAciB,mBAAA;EAAA,SACN,EAAA;EAAA,SACA,MAAA,GAAS,MAAA,SAAe,YAAA,GAAe,iBAAA;EAAA,SACvC,KAAA,GAAQ,MAAA,SAAe,gBAAA,GAAmB,qBAAA;AAAA;;;;;;;;;;;;;;cAgBxC,cAAA,SAAuB,aAAA;EAhBzB;;;;;;AAgBX;EAhBW,OAwBF,OAAA,EAAS,qBAAA;EAAA,SAEC,IAAA;EAAA,SACR,EAAA;EAAA,SACA,MAAA,EAAQ,QAAA,CAAS,MAAA,SAAe,YAAA;EAAA,SAChC,KAAA,EAAO,QAAA,CAAS,MAAA,SAAe,gBAAA;cAE5B,KAAA,EAAO,mBAAA;EAFqB;;;;;EAmCxC,SAAA,CAAA;EAhD+C;;;;;;EA0D/C,YAAA,CAAa,SAAA;EA9CJ;;;;;;EAwDT,eAAA,CAAgB,IAAA;EAvDwB;;;;;;;;EAmExC,mBAAA,CAAA;EAAA;;;;;;AAiCF;;;;EAnBE,aAAA,CAAc,QAAA,EAAU,UAAA;AAAA;;;;;;;;;;;;;;;cAmBb,qBAAA,SAA8B,cAAA;EAAA,gBACzB,QAAA,EAAU,qBAAA;cAEd,KAAA,GAAQ,mBAAA;EAIX,SAAA,CAAA;EAIA,YAAA,CAAa,SAAA;EAIb,mBAAA,CAAA;;;;;;;;;;EAaA,aAAA,CAAc,OAAA,EAAS,UAAA;AAAA;;;;;;;;;;;;iBAkClB,uBAAA,CAAwB,KAAA,EAAO,uBAAA,GAA0B,cAAA"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/core/postgres-schema.ts"],"mappings":";;;;;;UAciB,mBAAA;EAAA,SACN,EAAA;EAAA,SACA,MAAA,GAAS,MAAA,SAAe,YAAA,GAAe,iBAAA;EAAA,SACvC,IAAA,GAAO,MAAA,SAAe,gBAAA,GAAmB,qBAAA;AAAA;;;;;;;;;;;;;;cAgBvC,cAAA,SAAuB,aAAA;EAhBzB;;;;;AAA8D;AAgBzE;EAhBW,OAwBF,OAAA,EAAS,qBAAA;EAAA,SAEC,IAAA;EAAA,SACR,EAAA;EAAA,SACA,MAAA,EAAQ,QAAA,CAAS,MAAA,SAAe,YAAA;EAAA,SAChC,IAAA,EAAM,QAAA,CAAS,MAAA,SAAe,gBAAA;cAE3B,KAAA,EAAO,mBAAA;EAFoB;;;;;EAmCvC,SAAA,CAAA;EAhD+C;;;;;;EA0D/C,YAAA,CAAa,SAAA;EA9CJ;;;;;;EAwDT,eAAA,CAAgB,IAAA;EAvDuB;;;;;;;;EAmEvC,mBAAA,CAAA;EAAA;;;;;AAekC;AAwBpC;;;;;EAxBE,aAAA,CAAc,QAAA,EAAU,UAAA;AAAA;;;;;;;;;;;;;AAuCI;AA+B9B;;;;;;cA9Ca,qBAAA,SAA8B,cAAA;EAAA,gBACzB,QAAA,EAAU,qBAAA;cAEd,KAAA,GAAQ,mBAAA;EAIX,SAAA,CAAA;EAIA,YAAA,CAAa,SAAA;EAIb,mBAAA,CAAA;AAAA;;;;;;;;;;;;iBA+BK,uBAAA,CAAwB,KAAA,EAAO,uBAAA,GAA0B,cAAc"}
package/dist/types.mjs CHANGED
@@ -1,3 +1,3 @@
1
1
  import { t as PostgresEnumType } from "./postgres-enum-type-DS-KLVRH.mjs";
2
- import { i as postgresCreateNamespace, n as PostgresUnboundSchema, t as PostgresSchema } from "./postgres-schema-CK82EuWq.mjs";
2
+ import { i as postgresCreateNamespace, n as PostgresUnboundSchema, t as PostgresSchema } from "./postgres-schema-Bm7vjlOv.mjs";
3
3
  export { PostgresEnumType, PostgresSchema, PostgresUnboundSchema, postgresCreateNamespace };
package/package.json CHANGED
@@ -1,36 +1,44 @@
1
1
  {
2
2
  "name": "@prisma-next/target-postgres",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "Postgres target pack for Prisma Next",
8
8
  "dependencies": {
9
- "@prisma-next/cli": "0.11.0",
10
- "@prisma-next/contract": "0.11.0",
11
- "@prisma-next/errors": "0.11.0",
12
- "@prisma-next/family-sql": "0.11.0",
13
- "@prisma-next/framework-components": "0.11.0",
14
- "@prisma-next/migration-tools": "0.11.0",
15
- "@prisma-next/ts-render": "0.11.0",
16
- "@prisma-next/sql-contract": "0.11.0",
17
- "@prisma-next/sql-errors": "0.11.0",
18
- "@prisma-next/sql-operations": "0.11.0",
19
- "@prisma-next/sql-relational-core": "0.11.0",
20
- "@prisma-next/sql-schema-ir": "0.11.0",
21
- "@prisma-next/utils": "0.11.0",
9
+ "@prisma-next/cli": "0.12.0",
10
+ "@prisma-next/contract": "0.12.0",
11
+ "@prisma-next/errors": "0.12.0",
12
+ "@prisma-next/family-sql": "0.12.0",
13
+ "@prisma-next/framework-components": "0.12.0",
14
+ "@prisma-next/migration-tools": "0.12.0",
15
+ "@prisma-next/ts-render": "0.12.0",
16
+ "@prisma-next/sql-contract": "0.12.0",
17
+ "@prisma-next/sql-errors": "0.12.0",
18
+ "@prisma-next/sql-operations": "0.12.0",
19
+ "@prisma-next/sql-relational-core": "0.12.0",
20
+ "@prisma-next/sql-schema-ir": "0.12.0",
21
+ "@prisma-next/utils": "0.12.0",
22
22
  "@standard-schema/spec": "^1.1.0",
23
23
  "arktype": "^2.2.0",
24
24
  "pathe": "^2.0.3"
25
25
  },
26
26
  "devDependencies": {
27
- "@prisma-next/test-utils": "0.11.0",
28
- "@prisma-next/tsconfig": "0.11.0",
29
- "@prisma-next/tsdown": "0.11.0",
27
+ "@prisma-next/test-utils": "0.12.0",
28
+ "@prisma-next/tsconfig": "0.12.0",
29
+ "@prisma-next/tsdown": "0.12.0",
30
30
  "tsdown": "0.22.0",
31
31
  "typescript": "5.9.3",
32
32
  "vitest": "4.1.6"
33
33
  },
34
+ "peerDependencies": {
35
+ "typescript": ">=5.9"
36
+ },
37
+ "peerDependenciesMeta": {
38
+ "typescript": {
39
+ "optional": true
40
+ }
41
+ },
34
42
  "files": [
35
43
  "dist",
36
44
  "src",
@@ -65,13 +73,16 @@
65
73
  "./types": "./dist/types.mjs",
66
74
  "./package.json": "./package.json"
67
75
  },
76
+ "engines": {
77
+ "node": ">=24"
78
+ },
68
79
  "repository": {
69
80
  "type": "git",
70
81
  "url": "https://github.com/prisma/prisma-next.git",
71
82
  "directory": "packages/3-targets/3-targets/postgres"
72
83
  },
73
84
  "prismaNext": {
74
- "minServerVersion": "14"
85
+ "minServerVersion": "17"
75
86
  },
76
87
  "scripts": {
77
88
  "build": "tsdown",
@@ -5,9 +5,138 @@
5
5
  */
6
6
 
7
7
  import { arraysEqual } from '@prisma-next/family-sql/schema-verify';
8
+ import { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';
9
+ import type { PostgresEnumStorageEntry, SqlStorage } from '@prisma-next/sql-contract/types';
8
10
  import type { SqlSchemaIR } from '@prisma-next/sql-schema-ir/types';
9
11
  import { PG_ENUM_CODEC_ID } from '../codec-ids';
10
12
  import type { PostgresEnumType } from '../postgres-enum-type';
13
+ import { isPostgresSchema } from '../postgres-schema';
14
+
15
+ /**
16
+ * Codec-typed enum entry shape stored under
17
+ * `schema.annotations.pg.storageTypes[(schemaName, nativeType)]`.
18
+ */
19
+ interface PgStorageTypeEntry {
20
+ readonly codecId?: string;
21
+ readonly typeParams?: { readonly values?: unknown };
22
+ }
23
+
24
+ /** Postgres-specific subtree on family `SqlSchemaIR.annotations`. */
25
+ export interface PostgresSchemaIrAnnotations {
26
+ readonly schema?: string;
27
+ readonly storageTypes?: Readonly<Record<string, PgStorageTypeEntry>>;
28
+ }
29
+
30
+ function readOptionalString(value: unknown): string | undefined {
31
+ return typeof value === 'string' ? value : undefined;
32
+ }
33
+
34
+ function readPgStorageTypeEntry(value: unknown): PgStorageTypeEntry | undefined {
35
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
36
+ return undefined;
37
+ }
38
+ const codecId = Reflect.get(value, 'codecId');
39
+ const typeParamsRaw = Reflect.get(value, 'typeParams');
40
+ const typeParams =
41
+ typeParamsRaw !== undefined &&
42
+ typeParamsRaw !== null &&
43
+ typeof typeParamsRaw === 'object' &&
44
+ !Array.isArray(typeParamsRaw)
45
+ ? { values: Reflect.get(typeParamsRaw, 'values') }
46
+ : undefined;
47
+ return {
48
+ ...(typeof codecId === 'string' ? { codecId } : {}),
49
+ ...(typeParams !== undefined ? { typeParams } : {}),
50
+ };
51
+ }
52
+
53
+ function readPgStorageTypesMap(
54
+ value: unknown,
55
+ ): Readonly<Record<string, PgStorageTypeEntry>> | undefined {
56
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
57
+ return undefined;
58
+ }
59
+ const entries: Record<string, PgStorageTypeEntry> = {};
60
+ for (const [key, entryValue] of Object.entries(value)) {
61
+ const entry = readPgStorageTypeEntry(entryValue);
62
+ if (entry !== undefined) {
63
+ entries[key] = entry;
64
+ }
65
+ }
66
+ return Object.keys(entries).length > 0 ? entries : undefined;
67
+ }
68
+
69
+ /**
70
+ * Reads the Postgres annotation envelope (`schema.annotations.pg`) from
71
+ * family Schema IR. `SqlAnnotations` is an open target-pack extensibility
72
+ * map (`Record<string, unknown>`); this accessor narrows the `pg` slot at
73
+ * runtime so Postgres code can read introspection fields without casts.
74
+ */
75
+ export function readPostgresSchemaIrAnnotations(schema: SqlSchemaIR): PostgresSchemaIrAnnotations {
76
+ const raw = schema.annotations?.['pg'];
77
+ if (raw === undefined || raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
78
+ return {};
79
+ }
80
+ const schemaField = readOptionalString(Reflect.get(raw, 'schema'));
81
+ const storageTypes = readPgStorageTypesMap(Reflect.get(raw, 'storageTypes'));
82
+ return {
83
+ ...(schemaField !== undefined ? { schema: schemaField } : {}),
84
+ ...(storageTypes !== undefined ? { storageTypes } : {}),
85
+ };
86
+ }
87
+
88
+ /**
89
+ * Separator for `(schemaName, nativeType)` keys in introspected
90
+ * `schema.annotations.pg.storageTypes`. NUL cannot appear in Postgres
91
+ * identifiers, so the pair is unambiguous.
92
+ */
93
+ export const ENUM_STORAGE_KEY_SEP = '\u0000';
94
+
95
+ /** Builds the schema-qualified storageTypes map key for a live Postgres enum. */
96
+ export function enumStorageCompoundKey(schemaName: string, nativeType: string): string {
97
+ return `${schemaName}${ENUM_STORAGE_KEY_SEP}${nativeType}`;
98
+ }
99
+
100
+ /**
101
+ * Resolves the live-schema name a namespace's enums are introspected under,
102
+ * for keying `readExistingEnumValues` lookups. The unbound namespace's
103
+ * `ddlSchemaName` is a planner-emit sentinel (`__unbound__`) that never names a
104
+ * real schema, so for the unbound coordinate we read the *introspected* schema
105
+ * recorded on `annotations.pg.schema` (the live `current_schema()` the adapter
106
+ * walked) — that is the schema the enum's `storageTypes` entry is keyed under.
107
+ * Named namespaces resolve to their own DDL schema, which matches the
108
+ * per-schema introspection key directly.
109
+ */
110
+ export function resolveDdlSchemaForNamespaceStorage(
111
+ storage: SqlStorage,
112
+ namespaceId: string,
113
+ schemaIr?: SqlSchemaIR,
114
+ ): string {
115
+ if (namespaceId === UNBOUND_NAMESPACE_ID) {
116
+ return (schemaIr ? readPostgresSchemaIrAnnotations(schemaIr).schema : undefined) ?? 'public';
117
+ }
118
+ const namespace = storage.namespaces[namespaceId];
119
+ if (namespace && isPostgresSchema(namespace)) {
120
+ return namespace.ddlSchemaName(storage);
121
+ }
122
+ return namespaceId;
123
+ }
124
+
125
+ /** Contract-scoped bridge for the family verifier's enum value resolver. */
126
+ export function createResolveExistingEnumValues(
127
+ storage: SqlStorage,
128
+ ): (
129
+ schema: SqlSchemaIR,
130
+ enumType: PostgresEnumStorageEntry,
131
+ namespaceId: string,
132
+ ) => readonly string[] | null {
133
+ return (schema, enumType, namespaceId) =>
134
+ readExistingEnumValues(
135
+ schema,
136
+ resolveDdlSchemaForNamespaceStorage(storage, namespaceId, schema),
137
+ enumType.nativeType,
138
+ );
139
+ }
11
140
 
12
141
  /**
13
142
  * Categorisation of how an existing enum type's values relate to the
@@ -19,7 +148,7 @@ export type EnumDiff =
19
148
  | { readonly kind: 'rebuild'; readonly removedValues: readonly string[] };
20
149
 
21
150
  /**
22
- * Reads existing enum values for `nativeType` from the
151
+ * Reads existing enum values for `(schemaName, nativeType)` from the
23
152
  * Postgres-introspected `schema.annotations.pg.storageTypes` map.
24
153
  *
25
154
  * Schema IR's `storageTypes` slots are always codec-typed
@@ -33,20 +162,11 @@ export type EnumDiff =
33
162
  */
34
163
  export function readExistingEnumValues(
35
164
  schema: SqlSchemaIR,
165
+ schemaName: string,
36
166
  nativeType: string,
37
167
  ): readonly string[] | null {
38
- const storageTypes = (schema.annotations?.['pg'] as Record<string, unknown> | undefined)?.[
39
- 'storageTypes'
40
- ] as
41
- | Record<
42
- string,
43
- {
44
- codecId?: string;
45
- typeParams?: { values?: unknown };
46
- }
47
- >
48
- | undefined;
49
- const existing = storageTypes?.[nativeType];
168
+ const storageTypes = readPostgresSchemaIrAnnotations(schema).storageTypes;
169
+ const existing = storageTypes?.[enumStorageCompoundKey(schemaName, nativeType)];
50
170
  if (!existing || existing.codecId !== PG_ENUM_CODEC_ID) {
51
171
  return null;
52
172
  }
@@ -54,7 +174,7 @@ export function readExistingEnumValues(
54
174
  if (!Array.isArray(enumValues) || !enumValues.every((v) => typeof v === 'string')) {
55
175
  return null;
56
176
  }
57
- return enumValues as readonly string[];
177
+ return enumValues;
58
178
  }
59
179
 
60
180
  /**
@@ -63,13 +63,18 @@ import {
63
63
 
64
64
  export type { CallMigrationStrategy, StrategyContext };
65
65
 
66
- function locateNamespaceTypeInStorage(storage: SqlStorage, typeName: string): unknown {
67
- for (const ns of Object.values(storage.namespaces)) {
68
- if (!('types' in ns) || ns.types == null) continue;
69
- const entry = (ns.types as Record<string, unknown>)[typeName];
70
- if (entry !== undefined) return entry;
71
- }
72
- return undefined;
66
+ /**
67
+ * Finds a type entry by explicit namespace coordinate. Reads the named
68
+ * namespace's `enum` slot directly never scans other namespaces.
69
+ */
70
+ function locateNamespaceTypeInStorage(
71
+ storage: SqlStorage,
72
+ namespaceId: string,
73
+ typeName: string,
74
+ ): unknown {
75
+ const ns = storage.namespaces[namespaceId];
76
+ if (!ns || !('enum' in ns) || ns.enum == null) return undefined;
77
+ return (ns.enum as Record<string, unknown>)[typeName];
73
78
  }
74
79
 
75
80
  // ============================================================================
@@ -596,11 +601,14 @@ function mapIssueToCall(
596
601
  case 'type_missing': {
597
602
  if (!issue.typeName)
598
603
  return notOk(issueConflict('unsupportedOperation', 'Type missing issue has no typeName'));
599
- // Enum types live in namespace.types; codec aliases live in storage.types.
600
- // Check both so the planner handles whichever slot the type is in.
604
+ // Codec aliases live in storage.types; enum types live in namespace.enum.
605
+ // Check types first; fall back to the namespace-keyed enum slot using the
606
+ // issue's namespace coordinate (populated by the verifier for enum-related
607
+ // issues per the BaseSchemaIssue.namespaceId contract).
608
+ const namespaceId = resolveNamespaceIdForIssue(issue);
601
609
  const typeInstance: unknown =
602
610
  ctx.toContract.storage.types?.[issue.typeName] ??
603
- locateNamespaceTypeInStorage(ctx.toContract.storage, issue.typeName);
611
+ locateNamespaceTypeInStorage(ctx.toContract.storage, namespaceId, issue.typeName);
604
612
  if (!typeInstance) {
605
613
  return notOk(
606
614
  issueConflict(
@@ -610,9 +618,10 @@ function mapIssueToCall(
610
618
  );
611
619
  }
612
620
  if (typeInstance instanceof PostgresEnumType) {
621
+ const ddlSchema = resolveDdlSchemaForNamespace(ctx, namespaceId);
613
622
  return ok([
614
623
  new CreateEnumTypeCall(
615
- schemaName,
624
+ ddlSchema,
616
625
  issue.typeName,
617
626
  typeInstance.values,
618
627
  typeInstance.nativeType,