@prisma-next/target-postgres 0.15.0-dev.2 → 0.15.0-dev.21

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 (125) hide show
  1. package/dist/{authoring-BtsOWgI3.mjs → authoring-34L18kA1.mjs} +18 -8
  2. package/dist/authoring-34L18kA1.mjs.map +1 -0
  3. package/dist/{codec-ids-CI144z7g.d.mts → codec-ids-CGmnXDxH.d.mts} +3 -2
  4. package/dist/codec-ids-CGmnXDxH.d.mts.map +1 -0
  5. package/dist/{codec-ids-B10ZZHzw.mjs → codec-ids-D3G8K0YM.mjs} +3 -2
  6. package/dist/codec-ids-D3G8K0YM.mjs.map +1 -0
  7. package/dist/codec-ids.d.mts +2 -2
  8. package/dist/codec-ids.mjs +2 -2
  9. package/dist/{codec-types-CTfT4U4O.d.mts → codec-types-CTlPXzZ9.d.mts} +2 -2
  10. package/dist/{codec-types-CTfT4U4O.d.mts.map → codec-types-CTlPXzZ9.d.mts.map} +1 -1
  11. package/dist/codec-types.d.mts +1 -1
  12. package/dist/{codecs-D7W9O0Xx.d.mts → codecs-B-76qSBx.d.mts} +35 -6
  13. package/dist/codecs-B-76qSBx.d.mts.map +1 -0
  14. package/dist/{codecs-DRbb26Or.mjs → codecs-TCsGgW-Y.mjs} +77 -5
  15. package/dist/codecs-TCsGgW-Y.mjs.map +1 -0
  16. package/dist/codecs.d.mts +2 -2
  17. package/dist/codecs.mjs +2 -2
  18. package/dist/contract-free.mjs +3 -3
  19. package/dist/{control-policy-1Tcf7Tyu.mjs → control-policy-42vVVpTL.mjs} +43 -74
  20. package/dist/control-policy-42vVVpTL.mjs.map +1 -0
  21. package/dist/control.d.mts.map +1 -1
  22. package/dist/control.mjs +64 -14
  23. package/dist/control.mjs.map +1 -1
  24. package/dist/{ddl-GTTOvjx_.mjs → ddl-DHXKzQ99.mjs} +3 -3
  25. package/dist/{ddl-GTTOvjx_.mjs.map → ddl-DHXKzQ99.mjs.map} +1 -1
  26. package/dist/default-normalizer-B9ZUiyUE.mjs +264 -0
  27. package/dist/default-normalizer-B9ZUiyUE.mjs.map +1 -0
  28. package/dist/default-normalizer.d.mts +14 -1
  29. package/dist/default-normalizer.d.mts.map +1 -1
  30. package/dist/default-normalizer.mjs +2 -248
  31. package/dist/{descriptor-meta-CFQKLXl_.mjs → descriptor-meta-qubYaxQA.mjs} +9 -4
  32. package/dist/descriptor-meta-qubYaxQA.mjs.map +1 -0
  33. package/dist/{diff-database-schema-Bfgshz4v.mjs → diff-database-schema-CrYO0j4_.mjs} +92 -26
  34. package/dist/diff-database-schema-CrYO0j4_.mjs.map +1 -0
  35. package/dist/diff-database-schema.d.mts +3 -12
  36. package/dist/diff-database-schema.d.mts.map +1 -1
  37. package/dist/diff-database-schema.mjs +1 -1
  38. package/dist/issue-planner.d.mts +1 -1
  39. package/dist/issue-planner.d.mts.map +1 -1
  40. package/dist/issue-planner.mjs +1 -1
  41. package/dist/migration.d.mts +2 -2
  42. package/dist/migration.mjs +2 -2
  43. package/dist/{op-factory-call-Bn9zDx4_.d.mts → op-factory-call-CvH0JeBW.d.mts} +7 -4
  44. package/dist/op-factory-call-CvH0JeBW.d.mts.map +1 -0
  45. package/dist/{op-factory-call-C38NzvQD.mjs → op-factory-call-rCP7TXTh.mjs} +35 -14
  46. package/dist/op-factory-call-rCP7TXTh.mjs.map +1 -0
  47. package/dist/op-factory-call.d.mts +2 -2
  48. package/dist/op-factory-call.mjs +2 -2
  49. package/dist/pack.d.mts +120 -3
  50. package/dist/pack.d.mts.map +1 -1
  51. package/dist/pack.mjs +1 -1
  52. package/dist/{planner-BvUu6b9C.mjs → planner-Bj7MTEeR.mjs} +13 -13
  53. package/dist/planner-Bj7MTEeR.mjs.map +1 -0
  54. package/dist/{planner-produced-postgres-migration-D7y-PEHK.mjs → planner-produced-postgres-migration-iHdZVN5i.mjs} +2 -2
  55. package/dist/{planner-produced-postgres-migration-D7y-PEHK.mjs.map → planner-produced-postgres-migration-iHdZVN5i.mjs.map} +1 -1
  56. package/dist/{planner-produced-postgres-migration-BEY1T0Xm.d.mts → planner-produced-postgres-migration-k33bb9Sm.d.mts} +2 -2
  57. package/dist/{planner-produced-postgres-migration-BEY1T0Xm.d.mts.map → planner-produced-postgres-migration-k33bb9Sm.d.mts.map} +1 -1
  58. package/dist/planner-produced-postgres-migration.d.mts +1 -1
  59. package/dist/planner-produced-postgres-migration.mjs +1 -1
  60. package/dist/{planner-sql-checks-zqNfs2XZ.mjs → planner-sql-checks-BuB877wH.mjs} +2 -2
  61. package/dist/{planner-sql-checks-zqNfs2XZ.mjs.map → planner-sql-checks-BuB877wH.mjs.map} +1 -1
  62. package/dist/planner-sql-checks.mjs +1 -1
  63. package/dist/planner.d.mts +2 -2
  64. package/dist/planner.d.mts.map +1 -1
  65. package/dist/planner.mjs +2 -2
  66. package/dist/{postgres-contract-view-DM8sN1Ot.mjs → postgres-contract-view-DebHMqGR.mjs} +4 -4
  67. package/dist/{postgres-contract-view-DM8sN1Ot.mjs.map → postgres-contract-view-DebHMqGR.mjs.map} +1 -1
  68. package/dist/{postgres-database-schema-node-CJv5bfbs.d.mts → postgres-database-schema-node-DJOTywwQ.d.mts} +11 -2
  69. package/dist/postgres-database-schema-node-DJOTywwQ.d.mts.map +1 -0
  70. package/dist/{postgres-migration-arMSWU9b.mjs → postgres-migration-fxgsblW1.mjs} +19 -3
  71. package/dist/postgres-migration-fxgsblW1.mjs.map +1 -0
  72. package/dist/{postgres-migration-DbckK1su.d.mts → postgres-migration-ulfqRGA1.d.mts} +27 -2
  73. package/dist/postgres-migration-ulfqRGA1.d.mts.map +1 -0
  74. package/dist/{postgres-role-schema-node-Cm-j0ZGM.mjs → postgres-role-schema-node-bg32e7I-.mjs} +3 -2
  75. package/dist/postgres-role-schema-node-bg32e7I-.mjs.map +1 -0
  76. package/dist/{postgres-schema-Cm4DtiGA.mjs → postgres-schema-CewLYHB7.mjs} +2 -2
  77. package/dist/{postgres-schema-Cm4DtiGA.mjs.map → postgres-schema-CewLYHB7.mjs.map} +1 -1
  78. package/dist/{resolve-ddl-schema-XyBaaenM.mjs → resolve-ddl-schema-D0wi_P9Q.mjs} +2 -2
  79. package/dist/{resolve-ddl-schema-XyBaaenM.mjs.map → resolve-ddl-schema-D0wi_P9Q.mjs.map} +1 -1
  80. package/dist/runtime.mjs +1 -1
  81. package/dist/schema-ir-annotations.mjs +1 -1
  82. package/dist/schema-node-kinds-CrYzCR1i.d.mts +30 -0
  83. package/dist/schema-node-kinds-CrYzCR1i.d.mts.map +1 -0
  84. package/dist/types.d.mts +3 -2
  85. package/dist/types.mjs +4 -4
  86. package/package.json +20 -20
  87. package/src/core/authoring.ts +18 -5
  88. package/src/core/codec-helpers.ts +53 -1
  89. package/src/core/codec-ids.ts +1 -0
  90. package/src/core/codecs.ts +56 -3
  91. package/src/core/default-normalizer.ts +22 -0
  92. package/src/core/descriptor-meta.ts +2 -0
  93. package/src/core/index-types.ts +15 -0
  94. package/src/core/migrations/contract-to-postgres-database-schema-node.ts +99 -19
  95. package/src/core/migrations/control-policy.ts +4 -3
  96. package/src/core/migrations/diff-database-schema.ts +6 -3
  97. package/src/core/migrations/issue-planner.ts +41 -80
  98. package/src/core/migrations/op-factory-call.ts +38 -14
  99. package/src/core/migrations/planner-strategies.ts +5 -4
  100. package/src/core/migrations/planner.ts +5 -4
  101. package/src/core/migrations/postgres-migration.ts +60 -0
  102. package/src/core/migrations/verify-postgres-namespaces.ts +0 -1
  103. package/src/core/psl-infer/infer-psl-contract.ts +130 -12
  104. package/src/core/schema-ir/postgres-policy-schema-node.ts +12 -2
  105. package/src/exports/codecs.ts +2 -0
  106. package/src/exports/control.ts +2 -0
  107. package/src/exports/default-normalizer.ts +1 -1
  108. package/src/exports/op-factory-call.ts +5 -0
  109. package/src/exports/types.ts +1 -0
  110. package/dist/authoring-BtsOWgI3.mjs.map +0 -1
  111. package/dist/codec-ids-B10ZZHzw.mjs.map +0 -1
  112. package/dist/codec-ids-CI144z7g.d.mts.map +0 -1
  113. package/dist/codecs-D7W9O0Xx.d.mts.map +0 -1
  114. package/dist/codecs-DRbb26Or.mjs.map +0 -1
  115. package/dist/control-policy-1Tcf7Tyu.mjs.map +0 -1
  116. package/dist/default-normalizer.mjs.map +0 -1
  117. package/dist/descriptor-meta-CFQKLXl_.mjs.map +0 -1
  118. package/dist/diff-database-schema-Bfgshz4v.mjs.map +0 -1
  119. package/dist/op-factory-call-Bn9zDx4_.d.mts.map +0 -1
  120. package/dist/op-factory-call-C38NzvQD.mjs.map +0 -1
  121. package/dist/planner-BvUu6b9C.mjs.map +0 -1
  122. package/dist/postgres-database-schema-node-CJv5bfbs.d.mts.map +0 -1
  123. package/dist/postgres-migration-DbckK1su.d.mts.map +0 -1
  124. package/dist/postgres-migration-arMSWU9b.mjs.map +0 -1
  125. package/dist/postgres-role-schema-node-Cm-j0ZGM.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"codecs-DRbb26Or.mjs","names":["arktype"],"sources":["../src/core/codec-helpers.ts","../src/core/codecs.ts"],"sourcesContent":["/**\n * Shared encode/decode/render constants for the Postgres target codecs.\n *\n * The codec implementations live in `codecs.ts` (TML-2357). This file retains the conversion helpers + emit-path type renderers that the codec methods compose with — keeping a single source of truth for non-trivial conversions while the codec methods provide the framework-required `Promise<…>` boundary.\n *\n * Trivial identity passthroughs are inlined directly in the codec methods; only conversions with shape (custom JSON round-trip, decode normalisation, parameterised renderers) live here.\n */\n\nimport type { JsonValue } from '@prisma-next/contract/types';\n\nexport function renderLength(\n typeName: string,\n typeParams: Record<string, unknown>,\n): string | undefined {\n const length = typeParams['length'];\n if (length === undefined) {\n return undefined;\n }\n if (typeof length !== 'number' || !Number.isFinite(length) || !Number.isInteger(length)) {\n throw new Error(\n `renderOutputType: expected integer \"length\" in typeParams for ${typeName}, got ${String(length)}`,\n );\n }\n return `${typeName}<${length}>`;\n}\n\nexport function renderPrecision(typeName: string, typeParams: Record<string, unknown>): string {\n const precision = typeParams['precision'];\n if (precision === undefined) {\n return typeName;\n }\n if (\n typeof precision !== 'number' ||\n !Number.isFinite(precision) ||\n !Number.isInteger(precision)\n ) {\n throw new Error(\n `renderOutputType: expected integer \"precision\" in typeParams for ${typeName}, got ${String(precision)}`,\n );\n }\n return `${typeName}<${precision}>`;\n}\n\nexport const pgNumericDecode = (wire: string | number): string => {\n if (typeof wire === 'number') return String(wire);\n return wire;\n};\n\nexport const pgNumericRenderOutputType = (typeParams: {\n readonly precision: number;\n readonly scale?: number;\n}): string | undefined => {\n const precision = typeParams.precision;\n if (precision === undefined) return undefined;\n if (\n typeof precision !== 'number' ||\n !Number.isFinite(precision) ||\n !Number.isInteger(precision)\n ) {\n throw new Error(\n `renderOutputType: expected integer \"precision\" in typeParams for Numeric, got ${String(precision)}`,\n );\n }\n const scale = typeParams.scale;\n if (scale === undefined) return `Numeric<${precision}>`;\n if (typeof scale !== 'number' || !Number.isFinite(scale) || !Number.isInteger(scale)) {\n throw new Error(\n `renderOutputType: expected integer \"scale\" in typeParams for Numeric, got ${String(scale)}`,\n );\n }\n return `Numeric<${precision}, ${scale}>`;\n};\n\nconst ISO_8601_TIMESTAMP = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?$/;\nconst ISO_8601_TIMESTAMPTZ =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\nexport const pgTimestampEncodeJson = (value: Date): JsonValue => value.toISOString().slice(0, -1);\nexport const pgTimestampDecodeJson = (json: JsonValue): Date => {\n if (typeof json !== 'string') {\n throw new Error(`Expected ISO date string for pg/timestamp@1, got ${typeof json}`);\n }\n if (!ISO_8601_TIMESTAMP.test(json)) {\n throw new Error(`Invalid ISO date string for pg/timestamp@1: ${json}`);\n }\n const date = new Date(`${json}Z`);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ISO date string for pg/timestamp@1: ${json}`);\n }\n return date;\n};\n\nexport const pgTimestamptzEncodeJson = (value: Date): JsonValue =>\n value.toISOString().replace(/Z$/, '+00:00');\nexport const pgTimestamptzDecodeJson = (json: JsonValue): Date => {\n if (typeof json !== 'string') {\n throw new Error(`Expected ISO date string for pg/timestamptz@1, got ${typeof json}`);\n }\n if (!ISO_8601_TIMESTAMPTZ.test(json)) {\n throw new Error(`Invalid ISO date string for pg/timestamptz@1: ${json}`);\n }\n const date = new Date(json);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ISO date string for pg/timestamptz@1: ${json}`);\n }\n return date;\n};\n\nexport const pgIntervalDecode = (wire: string | Record<string, unknown>): string => {\n if (typeof wire === 'string') return wire;\n return JSON.stringify(wire);\n};\n\nexport const pgByteaEncodeJson = (value: Uint8Array): JsonValue =>\n `\\\\x${Buffer.from(value).toString('hex')}`;\n\nexport const pgByteaDecodeJson = (value: JsonValue): Uint8Array => {\n if (typeof value !== 'string' || !value.startsWith('\\\\x')) {\n throw new Error(`Expected Postgres bytea hex text to start with \"\\\\x\"`);\n }\n\n const hex = value.slice(2);\n if (hex.length % 2 !== 0) {\n throw new Error(`Invalid Postgres bytea hex text length: ${hex.length}`);\n }\n\n const bytes = new Uint8Array(hex.length / 2);\n for (let offset = 0; offset < hex.length; offset += 2) {\n const pair = hex.slice(offset, offset + 2);\n if (!/^[0-9a-fA-F]{2}$/.test(pair)) {\n throw new Error(`Invalid Postgres bytea hex pair \"${pair}\" at offset ${offset}`);\n }\n bytes[offset / 2] = Number.parseInt(pair, 16);\n }\n return bytes;\n};\n\nexport const pgJsonEncode = (value: string | JsonValue): string => JSON.stringify(value);\nexport const pgJsonDecode = (wire: string | JsonValue): JsonValue =>\n typeof wire === 'string' ? JSON.parse(wire) : wire;\n\nexport const pgJsonbEncode = (value: string | JsonValue): string => JSON.stringify(value);\nexport const pgJsonbDecode = (wire: string | JsonValue): JsonValue =>\n typeof wire === 'string' ? JSON.parse(wire) : wire;\n","/**\n * Native Postgres target codecs (TML-2357). Mirrors the SQL base codec form in `packages/2-sql/4-lanes/relational-core/src/ast/sql-codecs.ts`.\n *\n * Each codec ships as three artifacts:\n *\n * 1. A `PgXCodec` class extending {@link CodecImpl} that wraps the module-level encode/decode/encodeJson/decodeJson constants exported from `codec-helpers.ts` (the single source of truth for non-trivial runtime conversions; trivial identity passthroughs are inlined). 2. A `PgXDescriptor` class extending {@link CodecDescriptorImpl} declaring the codec id, traits, target types, params schema, meta, and (where applicable)\n * the emit-path `renderOutputType`. 3. A per-codec column helper (`pgXColumn`) that calls `descriptor.factory(...)` directly and packages the result into a framework `ColumnSpec` via the framework {@link column} packager. The helper is tied to its descriptor with `satisfies ColumnHelperFor` (and `ColumnHelperForStrict` where the resolved codec type is well-defined).\n *\n * After TML-2357 this is the canonical source of Postgres codec metadata and runtime behaviour — the legacy `mkCodec` / `defineCodec` carriers (and the parallel `byScalar`/`codecDescriptorDefinitions`/ `codecDescriptorList` collection exports) retired with the deletion sweep.\n *\n * Audit (parameterized codecs): every parameterized codec in this file is **parameter-stateless** — the params (`length`, `precision`, `precision`+`scale`, `values`) only inform the emit-path `renderOutputType` renderer or stay as JSON metadata. None of the runtime encode/decode/encodeJson/decodeJson conversions thread params into their behavior, so each `factory(_params)` returns a fresh codec constructed solely from\n * `this` (the descriptor).\n */\n\nimport type { JsonValue } from '@prisma-next/contract/types';\nimport {\n type AnyCodecDescriptor,\n type CodecCallContext,\n CodecDescriptorImpl,\n CodecImpl,\n type CodecInstanceContext,\n type CodecMeta,\n type ColumnHelperFor,\n type ColumnHelperForStrict,\n column,\n renderTsLiteral,\n voidParamsSchema,\n} from '@prisma-next/framework-components/codec';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n SqlCharCodec,\n SqlFloatCodec,\n SqlIntCodec,\n SqlVarcharCodec,\n sqlCharDescriptor,\n sqlFloatDescriptor,\n sqlIntDescriptor,\n sqlTextDescriptor,\n sqlTimestampDescriptor,\n sqlVarcharDescriptor,\n} from '@prisma-next/sql-relational-core/ast';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type as arktype } from 'arktype';\nimport {\n pgByteaDecodeJson,\n pgByteaEncodeJson,\n pgIntervalDecode,\n pgJsonbDecode,\n pgJsonbEncode,\n pgJsonDecode,\n pgJsonEncode,\n pgNumericDecode,\n pgNumericRenderOutputType,\n pgTimestampDecodeJson,\n pgTimestampEncodeJson,\n pgTimestamptzDecodeJson,\n pgTimestamptzEncodeJson,\n renderLength,\n renderPrecision,\n} from './codec-helpers';\nimport {\n PG_BIT_CODEC_ID,\n PG_BOOL_CODEC_ID,\n PG_BYTEA_CODEC_ID,\n PG_CHAR_CODEC_ID,\n PG_ENUM_CODEC_ID,\n PG_FLOAT_CODEC_ID,\n PG_FLOAT4_CODEC_ID,\n PG_FLOAT8_CODEC_ID,\n PG_INET_CODEC_ID,\n PG_INT_CODEC_ID,\n PG_INT2_CODEC_ID,\n PG_INT4_CODEC_ID,\n PG_INT8_CODEC_ID,\n PG_INTERVAL_CODEC_ID,\n PG_JSON_CODEC_ID,\n PG_JSONB_CODEC_ID,\n PG_NUMERIC_CODEC_ID,\n PG_TEXT_ARRAY_CODEC_ID,\n PG_TEXT_CODEC_ID,\n PG_TIME_CODEC_ID,\n PG_TIMESTAMP_CODEC_ID,\n PG_TIMESTAMPTZ_CODEC_ID,\n PG_TIMETZ_CODEC_ID,\n PG_UUID_CODEC_ID,\n PG_VARBIT_CODEC_ID,\n PG_VARCHAR_CODEC_ID,\n} from './codec-ids';\nimport { DEFAULT_NAMESPACE_ID } from './namespace-ids';\nimport { PostgresNativeEnum } from './postgres-native-enum';\n\ntype LengthParams = { readonly length?: number };\ntype PrecisionParams = { readonly precision?: number };\ntype NumericParams = { readonly precision: number; readonly scale?: number };\n\nconst lengthParamsSchema = arktype({\n 'length?': 'number.integer > 0',\n}) satisfies StandardSchemaV1<LengthParams>;\n\nconst numericParamsSchema = arktype({\n precision: 'number.integer > 0 & number.integer <= 1000',\n 'scale?': 'number.integer >= 0',\n}) satisfies StandardSchemaV1<NumericParams>;\n\nconst precisionParamsSchema = arktype({\n 'precision?': 'number.integer >= 0 & number.integer <= 6',\n}) satisfies StandardSchemaV1<PrecisionParams>;\n\nconst PG_TEXT_META = { db: { sql: { postgres: { nativeType: 'text' } } } } as const;\nconst PG_TEXT_ARRAY_META = { db: { sql: { postgres: { nativeType: 'text[]' } } } } as const;\nconst PG_INT4_META = { db: { sql: { postgres: { nativeType: 'integer' } } } } as const;\nconst PG_INT2_META = { db: { sql: { postgres: { nativeType: 'smallint' } } } } as const;\nconst PG_INT8_META = { db: { sql: { postgres: { nativeType: 'bigint' } } } } as const;\nconst PG_FLOAT4_META = { db: { sql: { postgres: { nativeType: 'real' } } } } as const;\nconst PG_FLOAT8_META = { db: { sql: { postgres: { nativeType: 'double precision' } } } } as const;\nconst PG_NUMERIC_META = { db: { sql: { postgres: { nativeType: 'numeric' } } } } as const;\nconst PG_TIMESTAMP_META = {\n db: { sql: { postgres: { nativeType: 'timestamp without time zone' } } },\n} as const;\nconst PG_TIMESTAMPTZ_META = {\n db: { sql: { postgres: { nativeType: 'timestamp with time zone' } } },\n} as const;\nconst PG_TIME_META = { db: { sql: { postgres: { nativeType: 'time' } } } } as const;\nconst PG_TIMETZ_META = { db: { sql: { postgres: { nativeType: 'timetz' } } } } as const;\nconst PG_BOOL_META = { db: { sql: { postgres: { nativeType: 'boolean' } } } } as const;\nconst PG_BIT_META = { db: { sql: { postgres: { nativeType: 'bit' } } } } as const;\nconst PG_VARBIT_META = { db: { sql: { postgres: { nativeType: 'bit varying' } } } } as const;\nconst PG_BYTEA_META = { db: { sql: { postgres: { nativeType: 'bytea' } } } } as const;\nconst PG_INTERVAL_META = { db: { sql: { postgres: { nativeType: 'interval' } } } } as const;\nconst PG_JSON_META = { db: { sql: { postgres: { nativeType: 'json' } } } } as const;\nconst PG_JSONB_META = { db: { sql: { postgres: { nativeType: 'jsonb' } } } } as const;\n\nexport class PgTextCodec extends CodecImpl<\n typeof PG_TEXT_CODEC_ID,\n readonly ['equality', 'order', 'textual'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgTextDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_TEXT_CODEC_ID;\n override readonly traits = ['equality', 'order', 'textual'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly meta = PG_TEXT_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgTextCodec {\n return () => new PgTextCodec(this);\n }\n}\n\nexport const pgTextDescriptor = new PgTextDescriptor();\n\nexport const pgTextColumn = () =>\n column(pgTextDescriptor.factory(), pgTextDescriptor.codecId, undefined, 'text');\n\npgTextColumn satisfies ColumnHelperFor<PgTextDescriptor>;\npgTextColumn satisfies ColumnHelperForStrict<PgTextDescriptor>;\n\n/**\n * Codec for a `pg.enum(Ref)` column bound to a native Postgres enum type.\n * Text passthrough, identical to `pg/text@1` — encode/decode do not carry the\n * enum's member values; membership is enforced by the native type itself, not\n * by this codec. `renderValueLiteral` renders a member value as its TS\n * literal, which is what drives the column's typed value-union (via\n * `renderValueSetType` reading the column's `valueSet` ref) — the codec\n * itself carries no params of its own; typing comes entirely from the\n * column's value-set, not from `pg/enum@1`.\n *\n * A distinct codec id (rather than reusing `pg/text@1` on a plain text\n * column) keeps native-enum columns independently identifiable — from a\n * column's `codecId` alone, without also inspecting `nativeType` — which\n * the managed (DDL) phase needs to target `CREATE TYPE`/`ALTER TYPE`\n * operations at exactly the columns that use one.\n */\nexport class PgEnumCodec extends CodecImpl<\n typeof PG_ENUM_CODEC_ID,\n readonly ['equality', 'order', 'textual'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return blindCast<\n string,\n 'text codec: a native-enum member value is stored as its wire string form'\n >(json);\n }\n}\n\ntype PgEnumParams = { readonly typeName: string };\n\nconst pgEnumParamsSchema = arktype({\n typeName: 'string',\n}) satisfies StandardSchemaV1<PgEnumParams>;\n\nfunction isJsonObject(\n value: JsonValue | undefined,\n): value is { readonly [key: string]: JsonValue } {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport class PgEnumDescriptor extends CodecDescriptorImpl<PgEnumParams> {\n override readonly codecId = PG_ENUM_CODEC_ID;\n override readonly traits = ['equality', 'order', 'textual'] as const;\n override readonly targetTypes = ['text'] as const;\n override readonly meta = PG_TEXT_META;\n override readonly paramsSchema = pgEnumParamsSchema satisfies StandardSchemaV1<PgEnumParams>;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override metaFor(typeParams: JsonValue | undefined): CodecMeta | undefined {\n if (!isJsonObject(typeParams)) return this.meta;\n const typeName = typeParams['typeName'];\n return typeof typeName === 'string'\n ? { db: { sql: { postgres: { nativeType: typeName } } } }\n : this.meta;\n }\n override factory(_params: PgEnumParams): (ctx: CodecInstanceContext) => PgEnumCodec {\n return () => new PgEnumCodec(this);\n }\n\n /**\n * Authoring-time hook a `pg.enum(<ref>)` type constructor calls once it has\n * resolved its ref argument to the referenced `native_enum` entity:\n * produces this codec's per-column `typeParams` and native type from the\n * entity's bare type name. Schema-qualification (`auth.aal_level` for a\n * named non-default schema) is not this hook's concern — the field's\n * namespace isn't known at this call site for every authoring path (the TS\n * builder resolves a column before it knows its model's namespace), so it is\n * applied later, at contract construction, by {@link qualifyNativeType} via\n * the target's `authoring.qualifyColumnType` hook. `nativeType` mirrors\n * `typeParams.typeName` — the same value {@link metaFor} derives at render\n * time — so the column's declared native type and the render-time cast\n * agree. Returns `undefined` if `entity` is not a `PostgresNativeEnum` (a\n * contributor bug, not a user-schema error — the caller decides how to\n * report it).\n */\n columnFromEntity(\n entity: object,\n ): { readonly typeParams: PgEnumParams; readonly nativeType: string } | undefined {\n if (!PostgresNativeEnum.is(entity)) return undefined;\n return { typeParams: { typeName: entity.typeName }, nativeType: entity.typeName };\n }\n\n /**\n * Schema-qualifies this native enum type's name for the namespace the\n * consuming column lives in: `${namespaceId}.${typeName}` for a named\n * non-default schema, bare for the target's default schema (`public`) or\n * the late-bound unbound sentinel (whose schema `search_path` resolves at\n * runtime). Postgres's `format_type()` reports the bare name for a\n * public-schema type, so a public column's declared native type must stay\n * bare to match. Owned here because the codec owns its native type.\n */\n qualifyNativeType(typeName: string, namespaceId: string): string {\n return namespaceId === DEFAULT_NAMESPACE_ID || namespaceId === UNBOUND_NAMESPACE_ID\n ? typeName\n : `${namespaceId}.${typeName}`;\n }\n}\n\nexport const pgEnumDescriptor = new PgEnumDescriptor();\n\n/**\n * Contract-construction-time column-type qualifier the Postgres target\n * contributes through `authoring.qualifyColumnType`.\n * `buildSqlContractFromDefinition` calls this for every column as it is\n * constructed, passing the column's bare type info and its owning\n * `namespaceId`; a native-enum column (`pg/enum@1`) gets its type name\n * schema-qualified for that namespace (via\n * {@link PgEnumDescriptor.qualifyNativeType}), keeping `nativeType` and\n * `typeParams.typeName` in sync. Every other codec passes through unchanged.\n * Both the PSL `pg.enum(Ref)` path and the TS `pg.enum(handle)` path route\n * through here — the dispatch keys off the codec id, not authoring surface.\n */\nexport function postgresQualifyColumnType(\n input: {\n readonly codecId: string;\n readonly nativeType: string;\n readonly typeParams?: Record<string, unknown>;\n },\n namespaceId: string,\n): { readonly nativeType: string; readonly typeParams?: Record<string, unknown> } {\n if (input.codecId !== PG_ENUM_CODEC_ID) return input;\n const bareTypeName = input.typeParams?.['typeName'];\n if (typeof bareTypeName !== 'string') return input;\n const qualified = pgEnumDescriptor.qualifyNativeType(bareTypeName, namespaceId);\n return { nativeType: qualified, typeParams: { ...input.typeParams, typeName: qualified } };\n}\n\n/**\n * Postgres `text[]` codec. Encode is an identity pass-through: the pg wire\n * driver serialises a JS `string[]` to a Postgres array literal under the\n * `$N::text[]` cast the renderer emits from this codec's `text[]` native type,\n * and decode reads it back as a JS array. Used by the control plane to write\n * the marker's `invariants` column. Not a user-facing scalar — it is not part\n * of the authorable `CodecTypes` surface, only the runtime codec registry.\n */\nexport class PgTextArrayCodec extends CodecImpl<\n typeof PG_TEXT_ARRAY_CODEC_ID,\n readonly ['equality'],\n readonly string[],\n readonly string[]\n> {\n async encode(value: readonly string[], _ctx: CodecCallContext): Promise<readonly string[]> {\n return value;\n }\n async decode(wire: readonly string[], _ctx: CodecCallContext): Promise<readonly string[]> {\n return wire;\n }\n encodeJson(value: readonly string[]): JsonValue {\n return [...value];\n }\n decodeJson(json: JsonValue): readonly string[] {\n return Array.isArray(json) ? json.map((entry) => String(entry)) : [];\n }\n}\n\nexport class PgTextArrayDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_TEXT_ARRAY_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['text[]'] as const;\n override readonly meta = PG_TEXT_ARRAY_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgTextArrayCodec {\n return () => new PgTextArrayCodec(this);\n }\n}\n\nexport const pgTextArrayDescriptor = new PgTextArrayDescriptor();\n\nexport class PgInt4Codec extends CodecImpl<\n typeof PG_INT4_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class PgInt4Descriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_INT4_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['int4'] as const;\n override readonly meta = PG_INT4_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgInt4Codec {\n return () => new PgInt4Codec(this);\n }\n}\n\nexport const pgInt4Descriptor = new PgInt4Descriptor();\n\nexport const pgInt4Column = () =>\n column(pgInt4Descriptor.factory(), pgInt4Descriptor.codecId, undefined, 'int4');\n\npgInt4Column satisfies ColumnHelperFor<PgInt4Descriptor>;\npgInt4Column satisfies ColumnHelperForStrict<PgInt4Descriptor>;\n\nexport class PgInt2Codec extends CodecImpl<\n typeof PG_INT2_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class PgInt2Descriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_INT2_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['int2'] as const;\n override readonly meta = PG_INT2_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgInt2Codec {\n return () => new PgInt2Codec(this);\n }\n}\n\nexport const pgInt2Descriptor = new PgInt2Descriptor();\n\nexport const pgInt2Column = () =>\n column(pgInt2Descriptor.factory(), pgInt2Descriptor.codecId, undefined, 'int2');\n\npgInt2Column satisfies ColumnHelperFor<PgInt2Descriptor>;\npgInt2Column satisfies ColumnHelperForStrict<PgInt2Descriptor>;\n\nexport class PgInt8Codec extends CodecImpl<\n typeof PG_INT8_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class PgInt8Descriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_INT8_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['int8'] as const;\n override readonly meta = PG_INT8_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgInt8Codec {\n return () => new PgInt8Codec(this);\n }\n}\n\nexport const pgInt8Descriptor = new PgInt8Descriptor();\n\nexport const pgInt8Column = () =>\n column(pgInt8Descriptor.factory(), pgInt8Descriptor.codecId, undefined, 'int8');\n\npgInt8Column satisfies ColumnHelperFor<PgInt8Descriptor>;\npgInt8Column satisfies ColumnHelperForStrict<PgInt8Descriptor>;\n\nexport class PgFloat4Codec extends CodecImpl<\n typeof PG_FLOAT4_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class PgFloat4Descriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_FLOAT4_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['float4'] as const;\n override readonly meta = PG_FLOAT4_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgFloat4Codec {\n return () => new PgFloat4Codec(this);\n }\n}\n\nexport const pgFloat4Descriptor = new PgFloat4Descriptor();\n\nexport const pgFloat4Column = () =>\n column(pgFloat4Descriptor.factory(), pgFloat4Descriptor.codecId, undefined, 'float4');\n\npgFloat4Column satisfies ColumnHelperFor<PgFloat4Descriptor>;\npgFloat4Column satisfies ColumnHelperForStrict<PgFloat4Descriptor>;\n\nexport class PgFloat8Codec extends CodecImpl<\n typeof PG_FLOAT8_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n number,\n number\n> {\n async encode(value: number, _ctx: CodecCallContext): Promise<number> {\n return value;\n }\n async decode(wire: number, _ctx: CodecCallContext): Promise<number> {\n return wire;\n }\n encodeJson(value: number): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): number {\n return json as number;\n }\n}\n\nexport class PgFloat8Descriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_FLOAT8_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['float8'] as const;\n override readonly meta = PG_FLOAT8_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgFloat8Codec {\n return () => new PgFloat8Codec(this);\n }\n}\n\nexport const pgFloat8Descriptor = new PgFloat8Descriptor();\n\nexport const pgFloat8Column = () =>\n column(pgFloat8Descriptor.factory(), pgFloat8Descriptor.codecId, undefined, 'float8');\n\npgFloat8Column satisfies ColumnHelperFor<PgFloat8Descriptor>;\npgFloat8Column satisfies ColumnHelperForStrict<PgFloat8Descriptor>;\n\nexport class PgBoolCodec extends CodecImpl<\n typeof PG_BOOL_CODEC_ID,\n readonly ['equality', 'boolean'],\n boolean,\n boolean\n> {\n async encode(value: boolean, _ctx: CodecCallContext): Promise<boolean> {\n return value;\n }\n async decode(wire: boolean, _ctx: CodecCallContext): Promise<boolean> {\n return wire;\n }\n encodeJson(value: boolean): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): boolean {\n return json as boolean;\n }\n}\n\nexport class PgBoolDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_BOOL_CODEC_ID;\n override readonly traits = ['equality', 'boolean'] as const;\n override readonly targetTypes = ['bool'] as const;\n override readonly meta = PG_BOOL_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => PgBoolCodec {\n return () => new PgBoolCodec(this);\n }\n}\n\nexport const pgBoolDescriptor = new PgBoolDescriptor();\n\nexport const pgBoolColumn = () =>\n column(pgBoolDescriptor.factory(), pgBoolDescriptor.codecId, undefined, 'bool');\n\npgBoolColumn satisfies ColumnHelperFor<PgBoolDescriptor>;\npgBoolColumn satisfies ColumnHelperForStrict<PgBoolDescriptor>;\n\nexport class PgNumericCodec extends CodecImpl<\n typeof PG_NUMERIC_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n string | number,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string | number, _ctx: CodecCallContext): Promise<string> {\n return pgNumericDecode(wire);\n }\n encodeJson(value: string): JsonValue {\n const number = Number(value);\n if (!Number.isFinite(number)) {\n throw new TypeError('pg/numeric@1 database JSON value must be a finite number');\n }\n return number;\n }\n decodeJson(json: JsonValue): string {\n if (typeof json !== 'number') {\n throw new TypeError('pg/numeric@1 database JSON value must be a number');\n }\n return pgNumericDecode(json);\n }\n}\n\nexport class PgNumericDescriptor extends CodecDescriptorImpl<NumericParams> {\n override readonly codecId = PG_NUMERIC_CODEC_ID;\n override readonly traits = ['equality', 'order', 'numeric'] as const;\n override readonly targetTypes = ['numeric', 'decimal'] as const;\n override readonly meta = PG_NUMERIC_META;\n override readonly paramsSchema = numericParamsSchema satisfies StandardSchemaV1<NumericParams>;\n override renderOutputType(params: NumericParams): string | undefined {\n return pgNumericRenderOutputType(params);\n }\n override factory(_params: NumericParams): (ctx: CodecInstanceContext) => PgNumericCodec {\n return () => new PgNumericCodec(this);\n }\n}\n\nexport const pgNumericDescriptor = new PgNumericDescriptor();\n\nexport const pgNumericColumn = (params: NumericParams) =>\n column(pgNumericDescriptor.factory(params), pgNumericDescriptor.codecId, params, 'numeric');\n\npgNumericColumn satisfies ColumnHelperFor<PgNumericDescriptor>;\npgNumericColumn satisfies ColumnHelperForStrict<PgNumericDescriptor>;\n\nexport class PgTimestampCodec extends CodecImpl<\n typeof PG_TIMESTAMP_CODEC_ID,\n readonly ['equality', 'order'],\n Date,\n Date\n> {\n async encode(value: Date, _ctx: CodecCallContext): Promise<Date> {\n return value;\n }\n async decode(wire: Date, _ctx: CodecCallContext): Promise<Date> {\n return wire;\n }\n encodeJson(value: Date): JsonValue {\n return pgTimestampEncodeJson(value);\n }\n decodeJson(json: JsonValue): Date {\n return pgTimestampDecodeJson(json);\n }\n}\n\nexport class PgTimestampDescriptor extends CodecDescriptorImpl<PrecisionParams> {\n override readonly codecId = PG_TIMESTAMP_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['timestamp'] as const;\n override readonly meta = PG_TIMESTAMP_META;\n override readonly paramsSchema =\n precisionParamsSchema satisfies StandardSchemaV1<PrecisionParams>;\n override renderOutputType(params: PrecisionParams): string | undefined {\n return renderPrecision('Timestamp', params as Record<string, unknown>);\n }\n override factory(_params: PrecisionParams): (ctx: CodecInstanceContext) => PgTimestampCodec {\n return () => new PgTimestampCodec(this);\n }\n}\n\nexport const pgTimestampDescriptor = new PgTimestampDescriptor();\n\nexport const pgTimestampColumn = (params: PrecisionParams = {}) =>\n column(pgTimestampDescriptor.factory(params), pgTimestampDescriptor.codecId, params, 'timestamp');\n\npgTimestampColumn satisfies ColumnHelperFor<PgTimestampDescriptor>;\npgTimestampColumn satisfies ColumnHelperForStrict<PgTimestampDescriptor>;\n\nexport class PgTimestamptzCodec extends CodecImpl<\n typeof PG_TIMESTAMPTZ_CODEC_ID,\n readonly ['equality', 'order'],\n Date,\n Date\n> {\n async encode(value: Date, _ctx: CodecCallContext): Promise<Date> {\n return value;\n }\n async decode(wire: Date, _ctx: CodecCallContext): Promise<Date> {\n return wire;\n }\n encodeJson(value: Date): JsonValue {\n return pgTimestamptzEncodeJson(value);\n }\n decodeJson(json: JsonValue): Date {\n return pgTimestamptzDecodeJson(json);\n }\n}\n\nexport class PgTimestamptzDescriptor extends CodecDescriptorImpl<PrecisionParams> {\n override readonly codecId = PG_TIMESTAMPTZ_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['timestamptz'] as const;\n override readonly meta = PG_TIMESTAMPTZ_META;\n override readonly paramsSchema =\n precisionParamsSchema satisfies StandardSchemaV1<PrecisionParams>;\n override renderOutputType(params: PrecisionParams): string | undefined {\n return renderPrecision('Timestamptz', params as Record<string, unknown>);\n }\n override factory(_params: PrecisionParams): (ctx: CodecInstanceContext) => PgTimestamptzCodec {\n return () => new PgTimestamptzCodec(this);\n }\n}\n\nexport const pgTimestamptzDescriptor = new PgTimestamptzDescriptor();\n\nexport const pgTimestamptzColumn = (params: PrecisionParams = {}) =>\n column(\n pgTimestamptzDescriptor.factory(params),\n pgTimestamptzDescriptor.codecId,\n params,\n 'timestamptz',\n );\n\npgTimestamptzColumn satisfies ColumnHelperFor<PgTimestamptzDescriptor>;\npgTimestamptzColumn satisfies ColumnHelperForStrict<PgTimestamptzDescriptor>;\n\nexport class PgTimeCodec extends CodecImpl<\n typeof PG_TIME_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgTimeDescriptor extends CodecDescriptorImpl<PrecisionParams> {\n override readonly codecId = PG_TIME_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['time'] as const;\n override readonly meta = PG_TIME_META;\n override readonly paramsSchema =\n precisionParamsSchema satisfies StandardSchemaV1<PrecisionParams>;\n override renderOutputType(params: PrecisionParams): string | undefined {\n return renderPrecision('Time', params as Record<string, unknown>);\n }\n override factory(_params: PrecisionParams): (ctx: CodecInstanceContext) => PgTimeCodec {\n return () => new PgTimeCodec(this);\n }\n}\n\nexport const pgTimeDescriptor = new PgTimeDescriptor();\n\nexport const pgTimeColumn = (params: PrecisionParams = {}) =>\n column(pgTimeDescriptor.factory(params), pgTimeDescriptor.codecId, params, 'time');\n\npgTimeColumn satisfies ColumnHelperFor<PgTimeDescriptor>;\npgTimeColumn satisfies ColumnHelperForStrict<PgTimeDescriptor>;\n\nexport class PgTimetzCodec extends CodecImpl<\n typeof PG_TIMETZ_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgTimetzDescriptor extends CodecDescriptorImpl<PrecisionParams> {\n override readonly codecId = PG_TIMETZ_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['timetz'] as const;\n override readonly meta = PG_TIMETZ_META;\n override readonly paramsSchema =\n precisionParamsSchema satisfies StandardSchemaV1<PrecisionParams>;\n override renderOutputType(params: PrecisionParams): string | undefined {\n return renderPrecision('Timetz', params as Record<string, unknown>);\n }\n override factory(_params: PrecisionParams): (ctx: CodecInstanceContext) => PgTimetzCodec {\n return () => new PgTimetzCodec(this);\n }\n}\n\nexport const pgTimetzDescriptor = new PgTimetzDescriptor();\n\nexport const pgTimetzColumn = (params: PrecisionParams = {}) =>\n column(pgTimetzDescriptor.factory(params), pgTimetzDescriptor.codecId, params, 'timetz');\n\npgTimetzColumn satisfies ColumnHelperFor<PgTimetzDescriptor>;\npgTimetzColumn satisfies ColumnHelperForStrict<PgTimetzDescriptor>;\n\nexport class PgBitCodec extends CodecImpl<\n typeof PG_BIT_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgBitDescriptor extends CodecDescriptorImpl<LengthParams> {\n override readonly codecId = PG_BIT_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['bit'] as const;\n override readonly meta = PG_BIT_META;\n override readonly paramsSchema = lengthParamsSchema satisfies StandardSchemaV1<LengthParams>;\n override renderOutputType(params: LengthParams): string | undefined {\n return renderLength('Bit', params as Record<string, unknown>);\n }\n override factory(_params: LengthParams): (ctx: CodecInstanceContext) => PgBitCodec {\n return () => new PgBitCodec(this);\n }\n}\n\nexport const pgBitDescriptor = new PgBitDescriptor();\n\nexport const pgBitColumn = (params: LengthParams = {}) =>\n column(pgBitDescriptor.factory(params), pgBitDescriptor.codecId, params, 'bit');\n\npgBitColumn satisfies ColumnHelperFor<PgBitDescriptor>;\npgBitColumn satisfies ColumnHelperForStrict<PgBitDescriptor>;\n\nexport class PgVarbitCodec extends CodecImpl<\n typeof PG_VARBIT_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgVarbitDescriptor extends CodecDescriptorImpl<LengthParams> {\n override readonly codecId = PG_VARBIT_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['bit varying'] as const;\n override readonly meta = PG_VARBIT_META;\n override readonly paramsSchema = lengthParamsSchema satisfies StandardSchemaV1<LengthParams>;\n override renderOutputType(params: LengthParams): string | undefined {\n return renderLength('VarBit', params as Record<string, unknown>);\n }\n override factory(_params: LengthParams): (ctx: CodecInstanceContext) => PgVarbitCodec {\n return () => new PgVarbitCodec(this);\n }\n}\n\nexport const pgVarbitDescriptor = new PgVarbitDescriptor();\n\nexport const pgVarbitColumn = (params: LengthParams = {}) =>\n column(pgVarbitDescriptor.factory(params), pgVarbitDescriptor.codecId, params, 'bit varying');\n\npgVarbitColumn satisfies ColumnHelperFor<PgVarbitDescriptor>;\npgVarbitColumn satisfies ColumnHelperForStrict<PgVarbitDescriptor>;\n\nexport class PgByteaCodec extends CodecImpl<\n typeof PG_BYTEA_CODEC_ID,\n readonly ['equality'],\n Uint8Array,\n Uint8Array\n> {\n async encode(value: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n return value;\n }\n async decode(wire: Uint8Array, _ctx: CodecCallContext): Promise<Uint8Array> {\n // Postgres node drivers commonly return Buffer instances (which extend Uint8Array) — normalize to a plain Uint8Array view so engine-agnostic consumers don't accidentally observe Buffer-specific APIs.\n return wire instanceof Uint8Array && wire.constructor === Uint8Array\n ? wire\n : new Uint8Array(wire.buffer, wire.byteOffset, wire.byteLength);\n }\n encodeJson(value: Uint8Array): JsonValue {\n return pgByteaEncodeJson(value);\n }\n decodeJson(json: JsonValue): Uint8Array {\n return pgByteaDecodeJson(json);\n }\n}\n\nexport class PgByteaDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_BYTEA_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['bytea'] as const;\n override readonly meta = PG_BYTEA_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgByteaCodec {\n return () => new PgByteaCodec(this);\n }\n}\n\nexport const pgByteaDescriptor = new PgByteaDescriptor();\n\nexport const pgByteaColumn = () =>\n column(pgByteaDescriptor.factory(), pgByteaDescriptor.codecId, undefined, 'bytea');\n\npgByteaColumn satisfies ColumnHelperFor<PgByteaDescriptor>;\npgByteaColumn satisfies ColumnHelperForStrict<PgByteaDescriptor>;\n\nconst PG_UUID_META = { db: { sql: { postgres: { nativeType: 'uuid' } } } } as const;\n\nexport class PgUuidCodec extends CodecImpl<\n typeof PG_UUID_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return blindCast<string, 'uuid columns serialize to JSON as their wire string form'>(json);\n }\n}\n\nexport class PgUuidDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_UUID_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['uuid'] as const;\n override readonly meta = PG_UUID_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgUuidCodec {\n return () => new PgUuidCodec(this);\n }\n}\n\nexport const pgUuidDescriptor = new PgUuidDescriptor();\n\nexport const pgUuidColumn = () =>\n column(pgUuidDescriptor.factory(), pgUuidDescriptor.codecId, undefined, 'uuid');\n\npgUuidColumn satisfies ColumnHelperFor<PgUuidDescriptor>;\npgUuidColumn satisfies ColumnHelperForStrict<PgUuidDescriptor>;\n\nconst PG_INET_META = { db: { sql: { postgres: { nativeType: 'inet' } } } } as const;\n\nexport class PgInetCodec extends CodecImpl<\n typeof PG_INET_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string, _ctx: CodecCallContext): Promise<string> {\n return wire;\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return blindCast<string, 'inet columns serialize to JSON as their wire string form'>(json);\n }\n}\n\nexport class PgInetDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_INET_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['inet'] as const;\n override readonly meta = PG_INET_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgInetCodec {\n return () => new PgInetCodec(this);\n }\n}\n\nexport const pgInetDescriptor = new PgInetDescriptor();\n\nexport const pgInetColumn = () =>\n column(pgInetDescriptor.factory(), pgInetDescriptor.codecId, undefined, 'inet');\n\npgInetColumn satisfies ColumnHelperFor<PgInetDescriptor>;\npgInetColumn satisfies ColumnHelperForStrict<PgInetDescriptor>;\n\nexport class PgIntervalCodec extends CodecImpl<\n typeof PG_INTERVAL_CODEC_ID,\n readonly ['equality', 'order'],\n string | Record<string, unknown>,\n string\n> {\n async encode(value: string, _ctx: CodecCallContext): Promise<string> {\n return value;\n }\n async decode(wire: string | Record<string, unknown>, _ctx: CodecCallContext): Promise<string> {\n return pgIntervalDecode(wire);\n }\n encodeJson(value: string): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): string {\n return json as string;\n }\n}\n\nexport class PgIntervalDescriptor extends CodecDescriptorImpl<PrecisionParams> {\n override readonly codecId = PG_INTERVAL_CODEC_ID;\n override readonly traits = ['equality', 'order'] as const;\n override readonly targetTypes = ['interval'] as const;\n override readonly meta = PG_INTERVAL_META;\n override readonly paramsSchema =\n precisionParamsSchema satisfies StandardSchemaV1<PrecisionParams>;\n override renderOutputType(params: PrecisionParams): string | undefined {\n return renderPrecision('Interval', params as Record<string, unknown>);\n }\n override factory(_params: PrecisionParams): (ctx: CodecInstanceContext) => PgIntervalCodec {\n return () => new PgIntervalCodec(this);\n }\n}\n\nexport const pgIntervalDescriptor = new PgIntervalDescriptor();\n\nexport const pgIntervalColumn = (params: PrecisionParams = {}) =>\n column(pgIntervalDescriptor.factory(params), pgIntervalDescriptor.codecId, params, 'interval');\n\npgIntervalColumn satisfies ColumnHelperFor<PgIntervalDescriptor>;\npgIntervalColumn satisfies ColumnHelperForStrict<PgIntervalDescriptor>;\n\nexport class PgJsonCodec extends CodecImpl<\n typeof PG_JSON_CODEC_ID,\n readonly [],\n string | JsonValue,\n JsonValue\n> {\n async encode(value: JsonValue, _ctx: CodecCallContext): Promise<string> {\n return pgJsonEncode(value);\n }\n async decode(wire: string | JsonValue, _ctx: CodecCallContext): Promise<JsonValue> {\n return pgJsonDecode(wire);\n }\n encodeJson(value: JsonValue): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): JsonValue {\n return json;\n }\n}\n\nexport class PgJsonDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_JSON_CODEC_ID;\n override readonly traits = [] as const;\n override readonly targetTypes = ['json'] as const;\n override readonly meta = PG_JSON_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgJsonCodec {\n return () => new PgJsonCodec(this);\n }\n}\n\nexport const pgJsonDescriptor = new PgJsonDescriptor();\n\nexport const pgJsonColumn = () =>\n column(pgJsonDescriptor.factory(), pgJsonDescriptor.codecId, undefined, 'json');\n\npgJsonColumn satisfies ColumnHelperFor<PgJsonDescriptor>;\npgJsonColumn satisfies ColumnHelperForStrict<PgJsonDescriptor>;\n\nexport class PgJsonbCodec extends CodecImpl<\n typeof PG_JSONB_CODEC_ID,\n readonly ['equality'],\n string | JsonValue,\n JsonValue\n> {\n async encode(value: JsonValue, _ctx: CodecCallContext): Promise<string> {\n return pgJsonbEncode(value);\n }\n async decode(wire: string | JsonValue, _ctx: CodecCallContext): Promise<JsonValue> {\n return pgJsonbDecode(wire);\n }\n encodeJson(value: JsonValue): JsonValue {\n return value;\n }\n decodeJson(json: JsonValue): JsonValue {\n return json;\n }\n}\n\nexport class PgJsonbDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_JSONB_CODEC_ID;\n override readonly traits = ['equality'] as const;\n override readonly targetTypes = ['jsonb'] as const;\n override readonly meta = PG_JSONB_META;\n override readonly paramsSchema: StandardSchemaV1<void> = voidParamsSchema;\n override factory(): (ctx: CodecInstanceContext) => PgJsonbCodec {\n return () => new PgJsonbCodec(this);\n }\n}\n\nexport const pgJsonbDescriptor = new PgJsonbDescriptor();\n\nexport const pgJsonbColumn = () =>\n column(pgJsonbDescriptor.factory(), pgJsonbDescriptor.codecId, undefined, 'jsonb');\n\npgJsonbColumn satisfies ColumnHelperFor<PgJsonbDescriptor>;\npgJsonbColumn satisfies ColumnHelperForStrict<PgJsonbDescriptor>;\n\n// `meta`. The factories instantiate the SQL-base codec class (`SqlCharCodec` etc.) passing `this` (the pg-alias descriptor) so `codec.id` resolves to the pg-alias codec id via `CodecImpl`'s `descriptor.codecId` proxy. ---------------------------------------------------------------------------\n\nconst PG_CHAR_META = { db: { sql: { postgres: { nativeType: 'character' } } } } as const;\nconst PG_VARCHAR_META = {\n db: { sql: { postgres: { nativeType: 'character varying' } } },\n} as const;\nconst PG_INT_META = { db: { sql: { postgres: { nativeType: 'integer' } } } } as const;\nconst PG_FLOAT_META = { db: { sql: { postgres: { nativeType: 'double precision' } } } } as const;\n\nexport class PgCharDescriptor extends CodecDescriptorImpl<LengthParams> {\n override readonly codecId = PG_CHAR_CODEC_ID;\n override readonly targetTypes = ['character'] as const;\n override readonly meta = PG_CHAR_META;\n override readonly traits = sqlCharDescriptor.traits;\n override readonly paramsSchema = sqlCharDescriptor.paramsSchema;\n override renderOutputType(params: LengthParams): string | undefined {\n return sqlCharDescriptor.renderOutputType(params);\n }\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(_params: LengthParams): (ctx: CodecInstanceContext) => SqlCharCodec {\n return () => new SqlCharCodec(this);\n }\n}\n\nexport const pgCharDescriptor = new PgCharDescriptor();\n\nexport const pgCharColumn = (params: LengthParams = {}) =>\n column(pgCharDescriptor.factory(params), pgCharDescriptor.codecId, params, 'character');\n\npgCharColumn satisfies ColumnHelperFor<PgCharDescriptor>;\n\nexport class PgVarcharDescriptor extends CodecDescriptorImpl<LengthParams> {\n override readonly codecId = PG_VARCHAR_CODEC_ID;\n override readonly targetTypes = ['character varying'] as const;\n override readonly meta = PG_VARCHAR_META;\n override readonly traits = sqlVarcharDescriptor.traits;\n override readonly paramsSchema = sqlVarcharDescriptor.paramsSchema;\n override renderOutputType(params: LengthParams): string | undefined {\n return sqlVarcharDescriptor.renderOutputType(params);\n }\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(_params: LengthParams): (ctx: CodecInstanceContext) => SqlVarcharCodec {\n return () => new SqlVarcharCodec(this);\n }\n}\n\nexport const pgVarcharDescriptor = new PgVarcharDescriptor();\n\nexport const pgVarcharColumn = (params: LengthParams = {}) =>\n column(\n pgVarcharDescriptor.factory(params),\n pgVarcharDescriptor.codecId,\n params,\n 'character varying',\n );\n\npgVarcharColumn satisfies ColumnHelperFor<PgVarcharDescriptor>;\n\nexport class PgIntDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_INT_CODEC_ID;\n override readonly targetTypes = ['int4'] as const;\n override readonly meta = PG_INT_META;\n override readonly traits = sqlIntDescriptor.traits;\n override readonly paramsSchema = sqlIntDescriptor.paramsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => SqlIntCodec {\n return () => new SqlIntCodec(this);\n }\n}\n\nexport const pgIntDescriptor = new PgIntDescriptor();\n\nexport const pgIntColumn = () =>\n column(pgIntDescriptor.factory(), pgIntDescriptor.codecId, undefined, 'int4');\n\npgIntColumn satisfies ColumnHelperFor<PgIntDescriptor>;\n\nexport class PgFloatDescriptor extends CodecDescriptorImpl<void> {\n override readonly codecId = PG_FLOAT_CODEC_ID;\n override readonly targetTypes = ['float8'] as const;\n override readonly meta = PG_FLOAT_META;\n override readonly traits = sqlFloatDescriptor.traits;\n override readonly paramsSchema = sqlFloatDescriptor.paramsSchema;\n override renderValueLiteral(value: JsonValue): string | undefined {\n return renderTsLiteral(value);\n }\n override factory(): (ctx: CodecInstanceContext) => SqlFloatCodec {\n return () => new SqlFloatCodec(this);\n }\n}\n\nexport const pgFloatDescriptor = new PgFloatDescriptor();\n\nexport const pgFloatColumn = () =>\n column(pgFloatDescriptor.factory(), pgFloatDescriptor.codecId, undefined, 'float8');\n\npgFloatColumn satisfies ColumnHelperFor<PgFloatDescriptor>;\n\n// `ExtractCodecTypes` to derive `CodecTypes`. ---------------------------------------------------------------------------\n\nexport const codecDescriptors: readonly AnyCodecDescriptor[] = [\n sqlCharDescriptor,\n sqlVarcharDescriptor,\n sqlIntDescriptor,\n sqlFloatDescriptor,\n sqlTextDescriptor,\n sqlTimestampDescriptor,\n pgTextDescriptor,\n pgEnumDescriptor,\n pgCharDescriptor,\n pgVarcharDescriptor,\n pgIntDescriptor,\n pgFloatDescriptor,\n pgInt4Descriptor,\n pgInt2Descriptor,\n pgInt8Descriptor,\n pgFloat4Descriptor,\n pgFloat8Descriptor,\n pgNumericDescriptor,\n pgTimestampDescriptor,\n pgTimestamptzDescriptor,\n pgTimeDescriptor,\n pgTimetzDescriptor,\n pgBoolDescriptor,\n pgBitDescriptor,\n pgVarbitDescriptor,\n pgByteaDescriptor,\n pgUuidDescriptor,\n pgInetDescriptor,\n pgIntervalDescriptor,\n pgJsonDescriptor,\n pgJsonbDescriptor,\n pgTextArrayDescriptor,\n];\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"control-policy-1Tcf7Tyu.mjs","names":[],"sources":["../src/core/schema-ir/node-storage-coordinate.ts","../src/core/migrations/column-ddl-rendering.ts","../src/core/migrations/planner-strategies.ts","../src/core/migrations/issue-planner.ts","../src/core/migrations/control-policy.ts"],"sourcesContent":["import type { EntityCoordinate } from '@prisma-next/framework-components/ir';\nimport type { SqlSchemaIRNode } from '@prisma-next/sql-schema-ir/types';\nimport { PostgresNativeEnumSchemaNode } from './postgres-native-enum-schema-node';\nimport { PostgresTableSchemaNode } from './postgres-table-schema-node';\nimport { postgresNodeEntityKind } from './schema-node-kinds';\n\n/**\n * The storage-`entries` coordinate `(entityKind, entityName)` a Postgres diff\n * node addresses — a table by its name, a native enum by its physical type\n * name. `undefined` for a node that is not a whole storage entity (a namespace,\n * a column, a policy). Lets ownership/subject resolution treat every entity kind\n * uniformly, the node self-describing its storage identity.\n */\nexport function postgresNodeStorageCoordinate(\n node: SqlSchemaIRNode,\n): Pick<EntityCoordinate, 'entityKind' | 'entityName'> | undefined {\n if (PostgresTableSchemaNode.is(node)) {\n const entityKind = postgresNodeEntityKind(node.nodeKind);\n return entityKind === undefined ? undefined : { entityKind, entityName: node.name };\n }\n if (PostgresNativeEnumSchemaNode.is(node)) {\n const entityKind = postgresNodeEntityKind(node.nodeKind);\n return entityKind === undefined ? undefined : { entityKind, entityName: node.typeName };\n }\n return undefined;\n}\n","import type { CodecControlHooks } from '@prisma-next/family-sql/control';\nimport type { StorageColumn } from '@prisma-next/sql-contract/types';\nimport type { DdlColumn } from '@prisma-next/sql-relational-core/ast';\nimport * as contractFree from '@prisma-next/sql-relational-core/contract-free';\nimport type { SqlColumnDefaultIR, SqlColumnIR } from '@prisma-next/sql-schema-ir/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { postgresDefaultToDdlColumnDefault } from './op-factory-call';\nimport { buildColumnDefaultSql, buildColumnTypeSql } from './planner-ddl-builders';\nimport { resolveIdentityValue } from './planner-identity-values';\nimport { buildExpectedFormatType } from './planner-sql-checks';\n\n/**\n * Reconstructs the `StorageColumn`-shaped fields the DDL builder functions\n * (`buildColumnTypeSql`, `buildExpectedFormatType`, `resolveIdentityValue`)\n * expect, from a column node's own stamped codec identity (`codecRef` /\n * `codecBaseNativeType` / `codecNamedType`, Decision 5) — never the\n * contract. The builders were written against `StorageColumn` and are\n * unchanged here; only the shape feeding them moves from the contract to\n * the node. An empty `storageTypes` catalog is passed alongside: the\n * node's fields are already resolved past any `typeRef` indirection, so no\n * live lookup is needed, and passing a non-empty catalog would risk a\n * false `typeRef` hit against an unrelated storage type.\n */\nfunction columnLike(\n column: SqlColumnIR,\n): Pick<\n StorageColumn,\n 'nativeType' | 'codecId' | 'nullable' | 'many' | 'typeParams' | 'typeRef' | 'default'\n> {\n if (column.codecRef === undefined || column.codecBaseNativeType === undefined) {\n throw new Error(\n `columnLike: expected column \"${column.name}\" carries no codec identity — the expected tree must be derived via contractToSchemaIR for planning`,\n );\n }\n return {\n nativeType: column.codecBaseNativeType,\n codecId: column.codecRef.codecId,\n nullable: column.nullable,\n // `column.many` is unset on contract-derived columns (array-ness rides\n // on the `nativeType` `[]` suffix there instead) — `codecRef.many`\n // carries it. Hand-built/introspected columns set `column.many` directly.\n ...ifDefined('many', column.many ?? column.codecRef.many),\n ...ifDefined(\n 'typeParams',\n column.codecRef.typeParams !== undefined\n ? blindCast<\n Record<string, unknown>,\n 'CodecRef.typeParams is JsonValue-shaped; the DDL builders only ever read it as the Record the contract column originally carried'\n >(column.codecRef.typeParams)\n : undefined,\n ),\n ...(column.codecNamedType ? { typeRef: '<resolved>' } : {}),\n ...ifDefined('default', column.resolvedDefault),\n };\n}\n\n/**\n * Builds the `CREATE TABLE` / `ADD COLUMN` DDL column for an expected column\n * node, resolving type rendering from the node's codec identity against the\n * codec hooks the caller holds — the same builder the pre-`plan(start, end)`\n * op-path called, so the output is byte-identical.\n */\nexport function renderColumnDdl(\n name: string,\n column: SqlColumnIR,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): DdlColumn {\n const like = columnLike(column);\n const typeSql = buildColumnTypeSql(like, codecHooks, {});\n const ddlDefault = postgresDefaultToDdlColumnDefault(like.default);\n return contractFree.col(name, typeSql, {\n ...(!column.nullable ? { notNull: true } : {}),\n ...ifDefined('default', ddlDefault),\n ...ifDefined('codecRef', column.codecRef),\n });\n}\n\n/**\n * Builds the `ALTER COLUMN … TYPE` operands for an expected column node.\n */\nexport function renderColumnAlterType(\n column: SqlColumnIR,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): { readonly qualifiedTargetType: string; readonly formatTypeExpected: string } {\n const like = columnLike(column);\n return {\n qualifiedTargetType: buildColumnTypeSql(like, codecHooks, {}, false),\n formatTypeExpected: buildExpectedFormatType(like, codecHooks, {}),\n };\n}\n\n/**\n * Resolves the identity value (monoid neutral element) SQL literal used as\n * the temporary default when adding a NOT-NULL column with no contract\n * default (`notNullAddColumnCallStrategy`'s shared-temp-default backfill).\n * `null` when the column's type has no built-in/codec-provided identity\n * value.\n */\nexport function resolveColumnTemporaryDefault(\n column: SqlColumnIR,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): string | null {\n return resolveIdentityValue(columnLike(column), codecHooks, {});\n}\n\n/**\n * The column's `SET DEFAULT` clause SQL, resolved from a column-default\n * diff node. `''` when the node carries no resolved default.\n */\nexport function renderColumnDefaultSql(defaultNode: SqlColumnDefaultIR): string {\n if (defaultNode.resolved === undefined) return '';\n return buildColumnDefaultSql(defaultNode.resolved, {\n nativeType: defaultNode.nativeTypeContext ?? '',\n ...ifDefined('many', defaultNode.many),\n });\n}\n","/**\n * Migration strategies.\n *\n * Each strategy examines the node-typed diff-issue list, consumes issues it\n * handles, and returns the `PostgresOpFactoryCall[]` to address them. The\n * issue planner runs each strategy in order and routes whatever's left\n * through `mapNodeIssueToCall`.\n *\n * The full ordered list is exported as `postgresPlannerStrategies` and is\n * used unchanged by both `migration plan` and `db update` / `db init`. The\n * two journeys differ only in `policy.allowedOperationClasses`:\n *\n * - When `'data'` is in the policy, data-safe strategies (NOT NULL backfill,\n * nullability tightening, unsafe type changes) emit\n * `DataTransformCall` placeholders that the user fills in.\n * - When `'data'` is excluded, those strategies short-circuit so the\n * downstream strategies (codec-hook type ops and temp-default backfill)\n * and `mapNodeIssueToCall` defaults emit direct DDL instead.\n *\n * Structural decisions (type/nullability drift, DDL fragments) read the diff\n * node pair and resolve column DDL from the node's `codecRef` (`column-ddl-\n * rendering.ts`). The retained subsystems — codec type-operations\n * (`storageTypePlanCallStrategy`) and the NOT-NULL temp-default deferred DDL\n * (`notNullAddColumnCallStrategy`) — keep reading the contract + codec hooks\n * via `StrategyContext`, per the slice's scope (see `diff-database-schema.ts`\n * / the slice spec).\n */\n\nimport type { Contract } from '@prisma-next/contract/types';\nimport type {\n CodecControlHooks,\n MigrationOperationPolicy,\n SqlMigrationPlanOperation,\n} from '@prisma-next/family-sql/control';\nimport { resolveValueSetValues } from '@prisma-next/family-sql/control';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { SchemaDiffIssue } from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport {\n type SqlStorage,\n StorageTable,\n type StorageTypeInstance,\n} from '@prisma-next/sql-contract/types';\nimport * as contractFree from '@prisma-next/sql-relational-core/contract-free';\nimport {\n RelationalSchemaNodeKind,\n type SqlColumnIR,\n type SqlSchemaIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { isPostgresSchema } from '../postgres-schema';\nimport {\n renderColumnAlterType,\n renderColumnDdl,\n resolveColumnTemporaryDefault,\n} from './column-ddl-rendering';\nimport { resolveNamespaceIdForDdlSchema } from './control-policy';\nimport { emissionSchemaName, issueNode, issueSchemaName, issueTableName } from './issue-planner';\nimport {\n AddCheckConstraintCall,\n AddColumnCall,\n AddNotNullColumnDirectCall,\n AddNotNullColumnWithTempDefaultCall,\n AlterColumnTypeCall,\n DataTransformCall,\n DropCheckConstraintCall,\n DropNotNullCall,\n type PostgresOpFactoryCall,\n RawSqlCall,\n SetNotNullCall,\n} from './op-factory-call';\nimport { buildSchemaLookupMap, hasForeignKey, hasUniqueConstraint } from './planner-schema-lookup';\nimport { buildTargetDetails, type PostgresPlanTargetDetails } from './planner-target-details';\n\n/**\n * Look up a storage table by its explicit namespace coordinate. Returns\n * `undefined` when the namespace has no table by that name (or no such\n * namespace exists). Callers that get `undefined` MUST treat it as an\n * explicit conflict — never silently fall back to a global default\n * schema or a name-only walk, because that footgun would resolve a\n * stale or duplicate table name to whichever namespace the iteration\n * order surfaced first (a real data-loss hazard in multi-namespace\n * contracts where two namespaces can carry the same table name).\n */\nexport function tableAt(\n storage: SqlStorage,\n namespaceId: string,\n tableName: string,\n): StorageTable | undefined {\n const ns = storage.namespaces[namespaceId];\n if (ns === undefined) return undefined;\n return ns.entries.table?.[tableName];\n}\n\n/**\n * Resolve the DDL schema name for a namespace coordinate. Postgres-aware\n * namespaces dispatch to their polymorphic `ddlSchemaName` override —\n * named schemas return their own id; the unbound singleton returns\n * `UNBOUND_NAMESPACE_ID`. Legacy single-namespace contracts whose\n * `__unbound__` slot is the framework-default `SqlUnboundNamespace`\n * (rather than the Postgres-aware `PostgresUnboundSchema`) flow the\n * coordinate through unchanged so downstream `qualifyTableName`\n * resolves polymorphically.\n */\nexport function resolveDdlSchemaForNamespace(ctx: StrategyContext, namespaceId: string): string {\n const namespace = ctx.toContract.storage.namespaces[namespaceId];\n if (isPostgresSchema(namespace)) {\n return namespace.ddlSchemaName(ctx.toContract.storage);\n }\n return namespaceId;\n}\n\n/**\n * Recovers the contract namespace id for a DDL schema name embedded in a\n * diff-issue path (`path[1]`). The strategies need the CONTRACT column/table\n * (for codec-hook reads and eligibility probes the retained subsystems still\n * run) even though the issue itself only carries the resolved DDL schema —\n * this is the reverse of `resolveDdlSchemaForNamespace`.\n */\nfunction namespaceIdForDdlSchema(ctx: StrategyContext, ddlSchemaName: string): string {\n return resolveNamespaceIdForDdlSchema(ctx.toContract, ddlSchemaName);\n}\n\n// ============================================================================\n// Strategy types\n// ============================================================================\n\n/**\n * Context passed to each migration strategy.\n *\n * Strategies read the source (`fromContract`), target (`toContract`), current\n * database state (`schema`), operation policy (`policy`), and component list\n * (`frameworkComponents`) to make planning decisions. `fromContract` is null\n * when no prior contract is available (e.g. `db update`, where the current\n * DB state is approximated via `schema`).\n */\nexport interface StrategyContext {\n readonly toContract: Contract<SqlStorage>;\n readonly fromContract: Contract<SqlStorage> | null;\n readonly schemaName: string;\n readonly codecHooks: ReadonlyMap<string, CodecControlHooks>;\n readonly storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n readonly schema: SqlSchemaIR;\n readonly policy: MigrationOperationPolicy;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}\n\n// ============================================================================\n// Call strategies (for issue planner)\n// ============================================================================\n\n/**\n * Consumes node-typed diff issues (`SchemaDiffIssue`, from the one differ —\n * `buildPostgresPlanDiff`), reading the issue's node pair for structural\n * decisions and resolving column DDL from the node's `codecRef`. The\n * retained subsystems (codec type-operations, the NOT-NULL temp-default\n * backfill) keep reading the contract via `StrategyContext`.\n */\nexport type CallMigrationStrategy = (\n issues: readonly SchemaDiffIssue[],\n context: StrategyContext,\n) =>\n | {\n kind: 'match';\n issues: readonly SchemaDiffIssue[];\n calls: readonly PostgresOpFactoryCall[];\n /**\n * `true` for strategies that emit cohesive sequential recipes whose\n * calls must stay contiguous and in the returned order — e.g.\n * `notNullBackfillCallStrategy` (addColumn → dataTransform → setNotNull).\n * Defaults to `false`, which lets `planIssues` hoist individual calls\n * into their DDL sequencing bucket.\n */\n recipe?: boolean;\n }\n | { kind: 'no_match' };\n\n/** A `not-equal` column issue whose node pair is narrowed to `SqlColumnIR`. */\nfunction columnNodePair(\n issue: SchemaDiffIssue,\n): { readonly expected: SqlColumnIR; readonly actual: SqlColumnIR } | undefined {\n const node = issueNode(issue);\n if (node === undefined || node.nodeKind !== RelationalSchemaNodeKind.column) return undefined;\n if (issue.expected === undefined || issue.actual === undefined) return undefined;\n return {\n expected: blindCast<SqlColumnIR, 'a column diff node is always a SqlColumnIR'>(issue.expected),\n actual: blindCast<SqlColumnIR, 'a column diff node is always a SqlColumnIR'>(issue.actual),\n };\n}\n\nexport const notNullBackfillCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n // `DataTransformCall` is operation class `'data'`. When the policy excludes\n // it (`db update` / `db init`), skip so `notNullAddColumnCallStrategy`\n // (temp-default backfill) or `mapNodeIssueToCall` can take the issue.\n if (!ctx.policy.allowedOperationClasses.includes('data')) return { kind: 'no_match' };\n\n const matched: SchemaDiffIssue[] = [];\n const calls: PostgresOpFactoryCall[] = [];\n\n for (const issue of issues) {\n if (issue.reason !== 'not-found') continue;\n const node = issueNode(issue);\n if (node === undefined || node.nodeKind !== RelationalSchemaNodeKind.column) continue;\n const expected = blindCast<\n SqlColumnIR,\n 'a not-found column issue always carries the expected column node'\n >(issue.expected);\n if (expected.nullable !== false || expected.resolvedDefault !== undefined) continue;\n\n const ddlSchemaName = issueSchemaName(issue);\n const tableName = issueTableName(issue);\n if (ddlSchemaName === undefined || tableName === undefined) continue;\n const schemaName = emissionSchemaName(ctx, ddlSchemaName);\n\n matched.push(issue);\n const ddl = renderColumnDdl(expected.name, expected, ctx.codecHooks);\n const nullableSpec = contractFree.col(ddl.name, ddl.type, {\n ...(ddl.codecRef !== undefined ? { codecRef: ddl.codecRef } : {}),\n });\n calls.push(\n new AddColumnCall(schemaName, tableName, nullableSpec),\n new DataTransformCall(\n `backfill-${tableName}-${expected.name}`,\n `backfill-${tableName}-${expected.name}:check`,\n `backfill-${tableName}-${expected.name}:run`,\n ),\n new SetNotNullCall(schemaName, tableName, expected.name),\n );\n }\n\n if (matched.length === 0) return { kind: 'no_match' };\n return {\n kind: 'match',\n issues: issues.filter((i) => !matched.includes(i)),\n calls,\n recipe: true,\n };\n};\n\nconst SAFE_WIDENINGS = new Set(['int2→int4', 'int2→int8', 'int4→int8', 'float4→float8']);\n\n/**\n * Handles `not-equal` column issues whose TYPE differs. `fromContract` is\n * only supplied by `migration plan` — for reconciliation (`db update` /\n * `db init`, `fromContract === null`) this strategy never fires, mirroring\n * the legacy `typeChangeCallStrategy`'s requirement of a prior contract:\n * `mapNodeIssueToCall`'s in-place ALTER covers reconciliation directly.\n *\n * A single node issue can carry BOTH type and nullability drift (Postgres\n * alters in place, so the differ emits one `not-equal` column issue where\n * the legacy coordinate walk emitted two: `type_mismatch` +\n * `nullability_mismatch`). When this strategy consumes the issue for its\n * type portion, it also emits whatever nullability delta the same node pair\n * carries — using the same construction `nullableTighteningCallStrategy` /\n * the mapper's direct dispatch would have used — so the issue is never\n * partially handled.\n */\nexport const typeChangeCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n if (ctx.fromContract === null) return { kind: 'no_match' };\n const dataAllowed = ctx.policy.allowedOperationClasses.includes('data');\n\n const matched: SchemaDiffIssue[] = [];\n const calls: PostgresOpFactoryCall[] = [];\n\n for (const issue of issues) {\n if (issue.reason !== 'not-equal') continue;\n const pair = columnNodePair(issue);\n if (pair === undefined) continue;\n const { expected, actual } = pair;\n if (!columnTypeChangedNativeOnly(expected, actual)) continue;\n\n const fromType = actual.nativeType;\n const toType = expected.nativeType;\n const isSafeWidening = SAFE_WIDENINGS.has(`${fromType}→${toType}`);\n if (!isSafeWidening && !dataAllowed) continue;\n\n const ddlSchemaName = issueSchemaName(issue);\n const tableName = issueTableName(issue);\n if (ddlSchemaName === undefined || tableName === undefined) continue;\n const schemaName = emissionSchemaName(ctx, ddlSchemaName);\n\n matched.push(issue);\n const { qualifiedTargetType, formatTypeExpected } = renderColumnAlterType(\n expected,\n ctx.codecHooks,\n );\n const alterOpts = {\n qualifiedTargetType,\n formatTypeExpected,\n rawTargetTypeForLabel: qualifiedTargetType,\n };\n if (isSafeWidening) {\n calls.push(new AlterColumnTypeCall(schemaName, tableName, expected.name, alterOpts));\n } else {\n calls.push(\n new DataTransformCall(\n `typechange-${tableName}-${expected.name}`,\n `typechange-${tableName}-${expected.name}:check`,\n `typechange-${tableName}-${expected.name}:run`,\n ),\n new AlterColumnTypeCall(schemaName, tableName, expected.name, alterOpts),\n );\n }\n\n if (expected.nullable !== actual.nullable) {\n if (expected.nullable) {\n calls.push(new DropNotNullCall(schemaName, tableName, expected.name));\n } else if (dataAllowed) {\n calls.push(\n new DataTransformCall(\n `handle-nulls-${tableName}-${expected.name}`,\n `handle-nulls-${tableName}-${expected.name}:check`,\n `handle-nulls-${tableName}-${expected.name}:run`,\n ),\n new SetNotNullCall(schemaName, tableName, expected.name),\n );\n } else {\n calls.push(new SetNotNullCall(schemaName, tableName, expected.name));\n }\n }\n }\n\n if (matched.length === 0) return { kind: 'no_match' };\n return {\n kind: 'match',\n issues: issues.filter((i) => !matched.includes(i)),\n calls,\n recipe: true,\n };\n};\n\n/**\n * Whether the raw (unresolved) native type differs — the SAME comparison\n * `typeChangeCallStrategy` always used (`fromColumn.nativeType !==\n * toColumn.nativeType`), which for the widenable numeric/float types\n * `SAFE_WIDENINGS` lists is identical to the resolved comparison\n * `columnTypeChanged` (in `issue-planner.ts`) performs.\n */\nfunction columnTypeChangedNativeOnly(expected: SqlColumnIR, actual: SqlColumnIR): boolean {\n return expected.nativeType !== actual.nativeType;\n}\n\n/**\n * Handles `not-equal` column issues whose type did NOT change but\n * nullability tightened (contract requires NOT NULL, live column is\n * nullable). A type-changed issue's nullability delta (if any) is already\n * handled by `typeChangeCallStrategy`, which runs first — this strategy\n * only ever sees issues that strategy left behind.\n */\nexport const nullableTighteningCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n // `DataTransformCall` is operation class `'data'`. When the policy excludes\n // it (`db update` / `db init`), skip so `mapNodeIssueToCall` emits a direct\n // `SET NOT NULL` instead.\n if (!ctx.policy.allowedOperationClasses.includes('data')) return { kind: 'no_match' };\n\n const matched: SchemaDiffIssue[] = [];\n const calls: PostgresOpFactoryCall[] = [];\n\n for (const issue of issues) {\n if (issue.reason !== 'not-equal') continue;\n const pair = columnNodePair(issue);\n if (pair === undefined) continue;\n const { expected, actual } = pair;\n if (columnTypeChangedNativeOnly(expected, actual)) continue; // typeChangeCallStrategy's concern\n if (expected.nullable !== false || actual.nullable !== true) continue;\n\n const ddlSchemaName = issueSchemaName(issue);\n const tableName = issueTableName(issue);\n if (ddlSchemaName === undefined || tableName === undefined) continue;\n const schemaName = emissionSchemaName(ctx, ddlSchemaName);\n\n matched.push(issue);\n calls.push(\n new DataTransformCall(\n `handle-nulls-${tableName}-${expected.name}`,\n `handle-nulls-${tableName}-${expected.name}:check`,\n `handle-nulls-${tableName}-${expected.name}:run`,\n ),\n new SetNotNullCall(schemaName, tableName, expected.name),\n );\n }\n\n if (matched.length === 0) return { kind: 'no_match' };\n return {\n kind: 'match',\n issues: issues.filter((i) => !matched.includes(i)),\n calls,\n recipe: true,\n };\n};\n\n/**\n * Collects every check constraint from a table in the contract storage.\n * Returns an empty array when the table has no checks or the table is absent.\n */\nfunction collectContractChecks(\n storage: SqlStorage,\n namespaceId: string,\n tableName: string,\n): ReadonlyArray<{ name: string; column: string; permittedValues: readonly string[] }> {\n const ns = storage.namespaces[namespaceId];\n const tableRaw = ns !== undefined ? ns.entries.table?.[tableName] : undefined;\n if (!(tableRaw instanceof StorageTable)) return [];\n const checks = tableRaw.checks;\n if (!checks || checks.length === 0) return [];\n return checks.map((c) => ({\n name: c.name,\n column: c.column,\n permittedValues: resolveValueSetValues(\n c.valueSet,\n storage,\n `check \"${c.name}\" on \"${tableName}\"`,\n ),\n }));\n}\n\n/**\n * Compares two value arrays as unordered sets.\n */\nfunction checkValueSetsEqual(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const bSet = new Set(b);\n return a.every((v) => bSet.has(v));\n}\n\n/**\n * Plans check-constraint migrations for `enumType`-authored columns.\n *\n * Walks every namespace's tables in the target contract (the check nodes'\n * resolved `permittedValues` are ultimately sourced from the same\n * contract-declared value sets, so walking the contract directly is the\n * simplest faithful port — the strategy's decisions never depend on which\n * ISSUES happen to be in the input list, only on the contract + live schema\n * shapes). For each table that carries `checks`, diffs the contract-expected\n * checks against the live schema's checks:\n *\n * - Check in contract, absent from live DB → `AddCheckConstraintCall`.\n * - Check in live DB, absent from contract → `DropCheckConstraintCall`.\n * - Check on both sides but value sets differ → `DropCheckConstraintCall`\n * then `AddCheckConstraintCall` (drop + recreate; a check predicate cannot\n * be altered in place).\n *\n * Consumes every `sql-check-constraint` issue on a table this walk handles\n * (not-found/not-expected/not-equal), leaving check issues on tables with\n * NO contract checks to `mapNodeIssueToCall`'s `not-expected` fallback.\n */\nexport const checkConstraintPlanCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n const calls: PostgresOpFactoryCall[] = [];\n const handledIssueKeys = new Set<string>();\n\n for (const [namespaceId, ns] of Object.entries(ctx.toContract.storage.namespaces)) {\n for (const tableName of Object.keys(ns.entries.table ?? {})) {\n const contractChecks = collectContractChecks(ctx.toContract.storage, namespaceId, tableName);\n if (contractChecks.length === 0) continue;\n\n const schemaTable = ctx.schema.tables[tableName];\n const liveChecks = schemaTable?.checks ?? [];\n const ddlSchema = resolveDdlSchemaForNamespace(ctx, namespaceId);\n\n for (const contractCheck of contractChecks) {\n const liveCheck = liveChecks.find((c) => c.name === contractCheck.name);\n const issueKey = `${tableName} ${contractCheck.name}`;\n if (!liveCheck) {\n calls.push(\n new AddCheckConstraintCall(\n ddlSchema,\n tableName,\n contractCheck.name,\n contractCheck.column,\n contractCheck.permittedValues,\n ),\n );\n handledIssueKeys.add(issueKey);\n } else if (!checkValueSetsEqual(contractCheck.permittedValues, liveCheck.permittedValues)) {\n calls.push(\n new DropCheckConstraintCall(ddlSchema, tableName, contractCheck.name),\n new AddCheckConstraintCall(\n ddlSchema,\n tableName,\n contractCheck.name,\n contractCheck.column,\n contractCheck.permittedValues,\n ),\n );\n handledIssueKeys.add(issueKey);\n }\n // else: values match — no op needed, still consume the issue\n else {\n handledIssueKeys.add(issueKey);\n }\n }\n\n // Emit drops for checks that are live but not in the contract.\n for (const liveCheck of liveChecks) {\n const inContract = contractChecks.some((c) => c.name === liveCheck.name);\n if (!inContract) {\n const issueKey = `${tableName} ${liveCheck.name}`;\n calls.push(new DropCheckConstraintCall(ddlSchema, tableName, liveCheck.name));\n handledIssueKeys.add(issueKey);\n }\n }\n }\n }\n\n if (calls.length === 0 && handledIssueKeys.size === 0) return { kind: 'no_match' };\n\n const remaining = issues.filter((issue) => {\n const node = issueNode(issue);\n if (node === undefined || node.nodeKind !== RelationalSchemaNodeKind.check) return true;\n const tableName = issueTableName(issue);\n if (tableName === undefined) return true;\n const checkName = blindCast<{ readonly name: string }, 'a check node always carries a name'>(\n node,\n ).name;\n return !handledIssueKeys.has(`${tableName} ${checkName}`);\n });\n\n return { kind: 'match', issues: remaining, calls };\n};\n\n/**\n * Dispatches codec-typed storage types through their codec's\n * `planTypeOperations` hook (the authoritative source for codec-driven DDL\n * such as custom type creation). Codec extension/type ops are not modeled as\n * diff nodes — this strategy drives entirely off `ctx.toContract.storage.types`\n * + codec hooks, consuming nothing from the node issue list (there is no\n * node-vocabulary equivalent of `type_missing` / `enum_values_changed`).\n */\nexport const storageTypePlanCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n const storageTypes = ctx.toContract.storage.types ?? {};\n if (Object.keys(storageTypes).length === 0) return { kind: 'no_match' };\n\n const calls: PostgresOpFactoryCall[] = [];\n\n for (const [typeName, typeInstance] of Object.entries(storageTypes).sort(([a], [b]) =>\n a.localeCompare(b),\n )) {\n const codecInstance = typeInstance as StorageTypeInstance;\n const hook = ctx.codecHooks.get(codecInstance.codecId);\n if (!hook?.planTypeOperations) continue;\n const planResult = hook.planTypeOperations({\n typeName,\n typeInstance: codecInstance,\n contract: ctx.toContract,\n schema: ctx.schema,\n schemaName: ctx.schemaName,\n policy: ctx.policy,\n });\n if (!planResult) continue;\n for (const op of planResult.operations) {\n calls.push(\n new RawSqlCall({\n ...op,\n target: {\n id: op.target.id,\n details: buildTargetDetails('type', typeName, ctx.schemaName),\n },\n } as SqlMigrationPlanOperation<PostgresPlanTargetDetails>),\n );\n }\n }\n\n if (calls.length === 0) return { kind: 'no_match' };\n return { kind: 'match', issues, calls };\n};\n\n/**\n * Handles `not-found` column issues for NOT NULL columns without a contract\n * default. Replaces the legacy `buildAddColumnItem` non-default branches.\n *\n * Two shapes:\n * - Shared-temp-default safe: emit a single atomic composite op (add\n * nullable → backfill identity value → `SET NOT NULL` → `DROP DEFAULT`).\n * The temp-default value is resolved from the column node's `codecRef`\n * (`resolveColumnTemporaryDefault`, wrapping `resolveIdentityValue`).\n * - Empty-table guarded: emit a hand-built op with a `tableIsEmptyCheck`\n * precheck so the failure message is \"table is not empty\" rather than the\n * raw PG NOT NULL violation.\n *\n * \"Normal\" not-found column cases (nullable or has a contract default) are\n * left for `mapNodeIssueToCall`'s default `AddColumnCall` emission.\n */\nexport const notNullAddColumnCallStrategy: CallMigrationStrategy = (issues, ctx) => {\n const matched: SchemaDiffIssue[] = [];\n const calls: PostgresOpFactoryCall[] = [];\n\n const schemaLookups = buildSchemaLookupMap(ctx.schema);\n\n const mutableCodecHooks = ctx.codecHooks as Map<string, CodecControlHooks>;\n const mutableStorageTypes = ctx.storageTypes as Record<string, StorageTypeInstance>;\n\n for (const issue of issues) {\n if (issue.reason !== 'not-found') continue;\n const node = issueNode(issue);\n if (node === undefined || node.nodeKind !== RelationalSchemaNodeKind.column) continue;\n const expected = blindCast<\n SqlColumnIR,\n 'a not-found column issue always carries the expected column node'\n >(issue.expected);\n if (expected.nullable !== false || expected.resolvedDefault !== undefined) continue;\n\n const ddlSchemaName = issueSchemaName(issue);\n const tableName = issueTableName(issue);\n if (ddlSchemaName === undefined || tableName === undefined) continue;\n\n const namespaceId = namespaceIdForDdlSchema(ctx, ddlSchemaName);\n const schemaName = namespaceId === UNBOUND_NAMESPACE_ID ? UNBOUND_NAMESPACE_ID : ddlSchemaName;\n const contractTable = tableAt(ctx.toContract.storage, namespaceId, tableName);\n const column = contractTable?.columns[expected.name];\n if (!contractTable || !column) continue;\n\n const schemaTable = ctx.schema.tables[tableName];\n if (!schemaTable) continue;\n\n const temporaryDefault = resolveColumnTemporaryDefault(expected, ctx.codecHooks);\n const schemaLookup = schemaLookups.get(tableName);\n const canUseSharedTempDefault =\n temporaryDefault !== null &&\n canUseSharedTemporaryDefaultStrategy({\n table: contractTable,\n schemaTable,\n schemaLookup,\n columnName: expected.name,\n });\n\n matched.push(issue);\n\n if (canUseSharedTempDefault && temporaryDefault !== null) {\n calls.push(\n new AddNotNullColumnWithTempDefaultCall({\n schemaName,\n tableName,\n columnName: expected.name,\n column,\n codecHooks: mutableCodecHooks,\n storageTypes: mutableStorageTypes,\n temporaryDefault,\n }),\n );\n continue;\n }\n\n calls.push(\n new AddNotNullColumnDirectCall(\n schemaName,\n tableName,\n expected.name,\n renderColumnDdl(expected.name, expected, ctx.codecHooks),\n ),\n );\n }\n\n if (matched.length === 0) return { kind: 'no_match' };\n return {\n kind: 'match',\n issues: issues.filter((i) => !matched.includes(i)),\n calls,\n };\n};\n\n// ============================================================================\n// Strategy helpers\n// ============================================================================\n\nfunction canUseSharedTemporaryDefaultStrategy(options: {\n readonly table: StorageTable;\n readonly schemaTable: SqlSchemaIR['tables'][string];\n readonly schemaLookup: ReturnType<typeof buildSchemaLookupMap> extends ReadonlyMap<\n string,\n infer V\n >\n ? V | undefined\n : never;\n readonly columnName: string;\n}): boolean {\n const { table, schemaTable, schemaLookup, columnName } = options;\n\n if (table.primaryKey?.columns.includes(columnName) && !schemaTable.primaryKey) {\n return false;\n }\n\n for (const unique of table.uniques) {\n if (!unique.columns.includes(columnName)) continue;\n if (!schemaLookup || !hasUniqueConstraint(schemaLookup, unique.columns)) return false;\n }\n\n for (const foreignKey of table.foreignKeys) {\n if (!foreignKey.source.columns.includes(columnName)) continue;\n if (!schemaLookup || !hasForeignKey(schemaLookup, foreignKey)) return false;\n }\n\n return true;\n}\n\n/**\n * Ordered list of Postgres planner strategies, shared by `migration plan`\n * and `db update` / `db init`. The issue planner runs each strategy in\n * order, letting it consume any issues it handles, and routes whatever's\n * left through `mapNodeIssueToCall`. Behavior diverges purely on\n * `policy.allowedOperationClasses`:\n *\n * - When `'data'` is allowed (`migration plan`), the data-safe strategies\n * (`notNullBackfillCallStrategy`, `typeChangeCallStrategy`,\n * `nullableTighteningCallStrategy`) consume their matching issues and emit\n * `DataTransformCall` placeholders or recipe ops.\n *\n * - When `'data'` is not allowed (`db update` / `db init`), the\n * placeholder-emitting strategies short-circuit to `no_match`, leaving\n * the issue for the downstream strategies (`storageTypePlanCallStrategy`,\n * `notNullAddColumnCallStrategy`) or the `mapNodeIssueToCall` default to\n * handle with direct DDL.\n *\n * Codec-typed storage type entries are dispatched through\n * `storageTypePlanCallStrategy`.\n */\nexport const postgresPlannerStrategies: readonly CallMigrationStrategy[] = [\n notNullBackfillCallStrategy,\n typeChangeCallStrategy,\n nullableTighteningCallStrategy,\n checkConstraintPlanCallStrategy,\n storageTypePlanCallStrategy,\n notNullAddColumnCallStrategy,\n];\n","/**\n * Postgres migration issue planner.\n *\n * Takes node-typed schema-diff issues (from the one differ — see\n * `buildPostgresPlanDiff` in `diff-database-schema.ts`) and emits migration\n * IR (`PostgresOpFactoryCall[]`). Strategies consume issues they recognize\n * and produce specialized call sequences (e.g. NOT NULL backfill →\n * addColumn(nullable) + dataTransform + setNotNull); remaining issues flow\n * through `mapNodeIssueToCall` for the default case.\n *\n * Structural op-render (column type/default DDL) resolves the column node's\n * `codecRef` against the codec hooks the caller holds (`column-ddl-\n * rendering.ts`) — never re-derived from the contract. The retained\n * subsystems (codec type-operations, the NOT-NULL temp-default deferred DDL,\n * control-policy disposition) still read the contract via the strategy\n * context, per the slice's scope.\n */\n\nimport type { Contract } from '@prisma-next/contract/types';\nimport type {\n CodecControlHooks,\n MigrationOperationPolicy,\n SqlPlannerConflict,\n SqlPlannerConflictLocation,\n} from '@prisma-next/family-sql/control';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { DiffableNode, SchemaDiffIssue } from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type { SqlStorage, StorageTypeInstance } from '@prisma-next/sql-contract/types';\nimport type { DdlTableConstraint } from '@prisma-next/sql-relational-core/ast';\nimport * as contractFree from '@prisma-next/sql-relational-core/contract-free';\nimport { defaultIndexName } from '@prisma-next/sql-schema-ir/naming';\nimport {\n RelationalSchemaNodeKind,\n type SqlColumnDefaultIR,\n type SqlColumnIR,\n type SqlForeignKeyIR,\n type SqlIndexIR,\n SqlSchemaIR,\n type SqlSchemaIRNode,\n type SqlUniqueIR,\n} from '@prisma-next/sql-schema-ir/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { Result } from '@prisma-next/utils/result';\nimport { notOk, ok } from '@prisma-next/utils/result';\nimport type { PostgresNamespaceSchemaNode } from '../schema-ir/postgres-namespace-schema-node';\nimport type { PostgresNativeEnumSchemaNode } from '../schema-ir/postgres-native-enum-schema-node';\nimport type { PostgresTableSchemaNode } from '../schema-ir/postgres-table-schema-node';\nimport { PostgresSchemaNodeKind } from '../schema-ir/schema-node-kinds';\nimport { quoteIdentifier } from '../sql-utils';\nimport {\n renderColumnAlterType,\n renderColumnDdl,\n renderColumnDefaultSql,\n} from './column-ddl-rendering';\nimport { resolveNamespaceIdForDdlSchema } from './control-policy';\nimport {\n AddColumnCall,\n AddForeignKeyCall,\n AddNativeEnumValueCall,\n AddPrimaryKeyCall,\n AddUniqueCall,\n AlterColumnTypeCall,\n CreateIndexCall,\n CreateNativeEnumTypeCall,\n CreateSchemaCall,\n CreateTableCall,\n DisableRowLevelSecurityCall,\n DropCheckConstraintCall,\n DropColumnCall,\n DropConstraintCall,\n DropDefaultCall,\n DropIndexCall,\n DropNativeEnumTypeCall,\n DropNotNullCall,\n DropTableCall,\n EnableRowLevelSecurityCall,\n type PostgresOpFactoryCall,\n SetDefaultCall,\n SetNotNullCall,\n} from './op-factory-call';\nimport type { ForeignKeySpec } from './operations/shared';\nimport {\n type CallMigrationStrategy,\n postgresPlannerStrategies,\n type StrategyContext,\n} from './planner-strategies';\n\nexport type { CallMigrationStrategy, StrategyContext };\n\n/**\n * Deterministic name for the element-non-null CHECK constraint on a scalar-array\n * column. Distinct `_elem_not_null` suffix avoids collision with the enum\n * value-set `_check` constraints. Re-emitting the same schema produces the same\n * name, so `pg_get_constraintdef`-based verify sees no drift.\n */\nfunction elementNonNullCheckName(tableName: string, columnName: string): string {\n return `${tableName}_${columnName}_elem_not_null`;\n}\n\n/**\n * Predicate enforcing that a scalar-array column carries no NULL element. The\n * array column itself may be NULL (container nullability is the column's NOT NULL\n * clause); `array_position` over a NULL array yields NULL, which a CHECK treats\n * as satisfied, so a nullable array column is unaffected.\n */\nfunction elementNonNullCheckExpression(columnName: string): string {\n return `array_position(${quoteIdentifier(columnName)}, NULL) IS NULL`;\n}\n\n// ============================================================================\n// Conflict helpers\n// ============================================================================\n\nfunction issueConflict(\n kind: SqlPlannerConflict['kind'],\n summary: string,\n location?: SqlPlannerConflict['location'],\n): SqlPlannerConflict {\n return {\n kind,\n summary,\n why: 'Use `migration new` to author a custom migration for this change.',\n ...(location ? { location } : {}),\n };\n}\n\nexport interface IssuePlannerValue {\n readonly calls: readonly PostgresOpFactoryCall[];\n}\n\n/**\n * Classifies calls into dependency order categories for correct DDL sequencing.\n */\ntype CallCategory =\n | 'dep'\n | 'drop'\n | 'table'\n | 'rlsEnable'\n | 'rlsPolicy'\n | 'column'\n | 'alter'\n | 'primaryKey'\n | 'unique'\n | 'index'\n | 'foreignKey';\n\n/**\n * Classifies calls into DDL sequencing buckets. The order matches the\n * legacy walk-schema planner's emission order so `db init` and `db update`\n * produce byte-identical plans for the shared shape (deps → drops → tables\n * → columns → alters → PKs → uniques → indexes → FKs).\n */\nfunction classifyCall(call: PostgresOpFactoryCall): CallCategory {\n switch (call.factoryName) {\n case 'createExtension':\n case 'createSchema':\n case 'createNativeEnumType':\n case 'addNativeEnumValue':\n return 'dep';\n case 'dropTable':\n case 'dropNativeEnumType':\n case 'dropColumn':\n case 'dropConstraint':\n case 'dropCheckConstraint':\n case 'dropIndex':\n case 'dropDefault':\n return 'drop';\n case 'addCheckConstraint':\n return 'unique'; // after uniques, before indexes\n case 'createTable':\n return 'table';\n case 'enableRowLevelSecurity':\n case 'disableRowLevelSecurity':\n return 'rlsEnable';\n case 'createRlsPolicy':\n return 'rlsPolicy';\n case 'dropRlsPolicy':\n return 'drop';\n case 'addColumn':\n return 'column';\n case 'alterColumnType':\n case 'setNotNull':\n case 'dropNotNull':\n case 'setDefault':\n return 'alter';\n case 'addPrimaryKey':\n return 'primaryKey';\n case 'addUnique':\n return 'unique';\n case 'createIndex':\n return 'index';\n case 'addForeignKey':\n return 'foreignKey';\n case 'rawSql': {\n // Type ops lifted through `RawSqlCall` by `storageTypePlanCallStrategy`\n // to preserve the codec-emitted label and precheck/postcheck.\n // Classification falls back to inspecting the underlying op's target\n // details (`objectType: 'type'`).\n const op = (\n call as {\n op?: {\n target?: { details?: { objectType?: string } };\n };\n }\n ).op;\n const objectType = op?.target?.details?.objectType;\n if (objectType === 'type') return 'dep';\n return 'alter';\n }\n default:\n return 'alter';\n }\n}\n\n// When no policy is explicitly supplied (test-only path; production callers\n// always pass one), allow every class so strategies that gate on\n// `'data'` (data-safe placeholders) still fire — the test is treated as\n// trusted. Filtering of actual emitted calls only runs when a policy was\n// explicitly provided (see `policyProvided` below).\nconst DEFAULT_POLICY: MigrationOperationPolicy = {\n allowedOperationClasses: ['additive', 'widening', 'destructive', 'data'],\n};\n\nfunction emptySchemaIR(): SqlSchemaIR {\n return new SqlSchemaIR({ tables: {} });\n}\n\nfunction conflictKindForCall(call: PostgresOpFactoryCall): SqlPlannerConflict['kind'] {\n switch (call.factoryName) {\n case 'alterColumnType':\n return 'typeMismatch';\n case 'setNotNull':\n case 'dropNotNull':\n return 'nullabilityConflict';\n case 'addForeignKey':\n case 'dropConstraint':\n return 'foreignKeyConflict';\n case 'createIndex':\n case 'dropIndex':\n return 'indexIncompatible';\n default:\n return 'missingButNonAdditive';\n }\n}\n\nfunction locationForCall(call: PostgresOpFactoryCall): SqlPlannerConflict['location'] | undefined {\n // Most Postgres call classes expose `tableName`/`columnName`/`indexName`/\n // `constraintName` as readonly fields. We avoid `toOp()` here because a\n // `DataTransformCall` intentionally throws from `toOp`.\n const anyCall = call as unknown as {\n tableName?: string;\n columnName?: string;\n indexName?: string;\n constraintName?: string;\n typeName?: string;\n };\n const location: {\n entityKind?: string;\n entityName?: string;\n column?: string;\n index?: string;\n constraint?: string;\n } = {};\n if (anyCall.tableName) {\n location.entityKind = 'table';\n location.entityName = anyCall.tableName;\n } else if (anyCall.typeName) {\n location.entityKind = 'native_enum';\n location.entityName = anyCall.typeName;\n }\n if (anyCall.columnName) location.column = anyCall.columnName;\n if (anyCall.indexName) location.index = anyCall.indexName;\n if (anyCall.constraintName) location.constraint = anyCall.constraintName;\n return Object.keys(location).length > 0 ? (location as SqlPlannerConflictLocation) : undefined;\n}\n\nfunction conflictForDisallowedCall(\n call: PostgresOpFactoryCall,\n allowed: readonly string[],\n): SqlPlannerConflict {\n const summary = `Operation \"${call.label}\" requires class \"${call.operationClass}\", but policy allows only: ${allowed.join(', ')}`;\n const location = locationForCall(call);\n return {\n kind: conflictKindForCall(call),\n summary,\n why: 'Use `migration new` to author a custom migration for this change.',\n ...(location ? { location } : {}),\n };\n}\n\n// ============================================================================\n// Node-based issue planner\n// ============================================================================\n//\n// Consumes node-typed `SchemaDiffIssue`s (from the one differ —\n// `buildPostgresPlanDiff`) and reads the diff node each issue carries\n// (`issue.expected` / `issue.actual`). Column DDL (type/default SQL) resolves\n// from the column node's `codecRef` against the codec hooks the caller holds\n// (`column-ddl-rendering.ts`), never the contract. The retained subsystems —\n// codec type-operations, field-lifecycle hooks, the NOT-NULL temp-default\n// deferred DDL, control-policy disposition — keep the contract via the\n// strategy context, per the slice's scope.\n\n/** The diff node an issue concerns — expected when present, else the actual (extra) node. */\nexport function issueNode(issue: SchemaDiffIssue): SqlSchemaIRNode | undefined {\n const node = issue.expected ?? issue.actual;\n if (node === undefined) return undefined;\n return blindCast<\n SqlSchemaIRNode,\n 'every node in a Postgres schema diff tree is a SqlSchemaIRNode; nodeKind is its required discriminant'\n >(node);\n}\n\n/** DDL schema segment of a table-or-descendant issue path: `[database, ddlSchema, table, …]`. */\nexport function issueSchemaName(issue: SchemaDiffIssue): string | undefined {\n return issue.path[1];\n}\n\n/** Table segment of a table-or-descendant issue path: `[database, ddlSchema, table, …]`. */\nexport function issueTableName(issue: SchemaDiffIssue): string | undefined {\n return issue.path[2];\n}\n\n/** Column name embedded in a column/default issue path segment (`column:<name>`). */\nexport function issueColumnName(issue: SchemaDiffIssue): string | undefined {\n const segment = issue.path[3];\n if (segment === undefined || !segment.startsWith('column:')) return undefined;\n return segment.slice('column:'.length);\n}\n\n/**\n * The DDL schema name to use when EMITTING an op against `ddlSchemaName` (the\n * diff tree's resolved physical schema, `issueSchemaName(issue)`). The\n * unbound namespace's diff-tree identity resolves to `public` (a concrete\n * physical default the differ needs in order to compare its tree against\n * introspection — `resolveDdlSchemaForNamespaceStorage`), but DDL EMISSION\n * must stay unqualified so the live connection's `search_path` resolves it\n * at runtime (`boundSchema`). Recovers the logical namespace id via the\n * contract and substitutes the unbound sentinel back in when it resolves\n * there; every other namespace's `ddlSchemaName` already agrees between the\n * two resolution paths, so it passes through unchanged.\n */\nexport function emissionSchemaName(ctx: StrategyContext, ddlSchemaName: string): string {\n const namespaceId = resolveNamespaceIdForDdlSchema(ctx.toContract, ddlSchemaName);\n return namespaceId === UNBOUND_NAMESPACE_ID ? UNBOUND_NAMESPACE_ID : ddlSchemaName;\n}\n\n/**\n * Whether a column node is a scalar-array (`many: true`) column. The family\n * converter (`contractToSchemaIR`'s `convertColumn`) never stamps `many` on\n * the derived node — array-ness is folded into the `[]` suffix on\n * `nativeType` instead — so the node-derived check reads the suffix; `.many`\n * is still checked first for nodes a caller stamps directly (e.g. hand-built\n * test fixtures, or an adapter that populates it at introspection).\n */\nfunction isManyColumn(column: SqlColumnIR): boolean {\n return column.many === true || column.nativeType.endsWith('[]');\n}\n\n/** Whether the expected/actual native type (resolved, or raw+many fallback) differs — mirrors `SqlColumnIR.isEqualTo`'s type comparison. */\nexport function columnTypeChanged(expected: SqlColumnIR, actual: SqlColumnIR): boolean {\n if (expected.resolvedNativeType !== undefined && actual.resolvedNativeType !== undefined) {\n return expected.resolvedNativeType !== actual.resolvedNativeType;\n }\n return (\n expected.nativeType !== actual.nativeType || Boolean(expected.many) !== Boolean(actual.many)\n );\n}\n\n// ----------------------------------------------------------------------------\n// Node-keyed issue ordering (re-keys ISSUE_KIND_ORDER on nodeKind + reason)\n// ----------------------------------------------------------------------------\n\n/**\n * Re-keys the legacy `ISSUE_KIND_ORDER` on `(nodeKind, reason)`, numbers\n * preserved so the dependency intent stays legible. Final emission order is\n * fixed downstream by `classifyCall` bucketing (dep → drop → table → column →\n * recipe → alter → primaryKey → unique → index → foreignKey), so this only\n * breaks ties within a bucket.\n */\nexport function nodeIssueOrder(issue: SchemaDiffIssue): number {\n const node = issueNode(issue);\n if (node === undefined) return 99;\n switch (node.nodeKind) {\n case PostgresSchemaNodeKind.namespace:\n return 1;\n case PostgresSchemaNodeKind.nativeEnum:\n // Creates order right after namespace creates within the 'dep' bucket\n // (CREATE SCHEMA before CREATE TYPE); drops order after table drops\n // within the 'drop' bucket (DROP TYPE only after its dependents left).\n return issue.reason === 'not-expected' ? 17 : 2;\n case RelationalSchemaNodeKind.foreignKey:\n return issue.reason === 'not-expected' ? 10 : 60;\n case RelationalSchemaNodeKind.unique:\n return issue.reason === 'not-expected' ? 11 : 51;\n case RelationalSchemaNodeKind.primaryKey:\n return issue.reason === 'not-expected' ? 12 : 50;\n case RelationalSchemaNodeKind.index:\n return issue.reason === 'not-expected' ? 13 : 52;\n case RelationalSchemaNodeKind.columnDefault:\n if (issue.reason === 'not-expected') return 14;\n return issue.reason === 'not-found' ? 42 : 43;\n case RelationalSchemaNodeKind.column:\n if (issue.reason === 'not-expected') return 15;\n return issue.reason === 'not-found' ? 30 : 40;\n case PostgresSchemaNodeKind.table:\n return issue.reason === 'not-expected' ? 16 : 20;\n case RelationalSchemaNodeKind.check:\n if (issue.reason === 'not-found') return 53;\n return issue.reason === 'not-expected' ? 55 : 54;\n default:\n return 99;\n }\n}\n\n/** Deterministic tiebreak within an order bucket: the diff path already encodes schema → table → child. */\nexport function nodeIssueKey(issue: SchemaDiffIssue): string {\n return issue.path.join(' ');\n}\n\n// ----------------------------------------------------------------------------\n// Subtree coalescing (the planner's responsibility per the differ's contract)\n// ----------------------------------------------------------------------------\n\n/**\n * The generic differ is total: a missing/extra table (or column) emits an\n * issue for itself AND for every node in its subtree. `CreateTable`/`DropTable`\n * and `AddColumn`/`DropColumn` already account for the whole subtree, so the\n * nested issues are redundant — coalescing drops any issue whose path is a\n * strict descendant of a `not-found`/`not-expected` issue's path. Run over the\n * relational subset ONLY (policy issues and synthesized namespace issues are\n * handled on their own paths, never coalesced against tables).\n */\nexport function coalesceSubtreeIssues<TNode extends DiffableNode = DiffableNode>(\n issues: readonly SchemaDiffIssue<TNode>[],\n): readonly SchemaDiffIssue<TNode>[] {\n const collapsingPaths = issues\n .filter((issue) => issue.reason === 'not-found' || issue.reason === 'not-expected')\n .map((issue) => issue.path);\n if (collapsingPaths.length === 0) return issues;\n return issues.filter(\n (issue) => !collapsingPaths.some((ancestor) => isStrictDescendantPath(issue.path, ancestor)),\n );\n}\n\nfunction isStrictDescendantPath(path: readonly string[], ancestor: readonly string[]): boolean {\n if (path.length <= ancestor.length) return false;\n for (let i = 0; i < ancestor.length; i += 1) {\n if (path[i] !== ancestor[i]) return false;\n }\n return true;\n}\n\n// ----------------------------------------------------------------------------\n// Node → call construction\n// ----------------------------------------------------------------------------\n\nfunction fkSpecFromNode(fk: SqlForeignKeyIR, tableName: string): ForeignKeySpec {\n const name = fk.name ?? `${tableName}_${fk.columns.join('_')}_fkey`;\n return {\n name,\n columns: [...fk.columns],\n references: {\n // The raw target namespace coordinate, matching the retired coordinate\n // path's `references.schema: fk.target.namespaceId` (the FK node stamps\n // it verbatim). The op renderer qualifies the REFERENCES clause from it.\n schema: fk.referencedSchema ?? '',\n table: fk.referencedTable,\n columns: [...fk.referencedColumns],\n },\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n };\n}\n\n/**\n * Builds the `CreateTable` + child `CreateIndex` / `AddForeignKey` / `AddUnique`\n * calls for a newly-expected table, reading only the table node's children. The\n * PK and element-non-null CHECKs go inline as table constraints; indexes\n * (declared + FK-backing, already merged and ordered at derivation) and the\n * FK / unique constraints are separate calls (re-bucketed downstream). Every\n * column's DDL is resolved from its `codecRef` via `renderColumnDdl`.\n */\nfunction buildCreateTableCallsFromNode(\n schemaName: string,\n ddlSchemaName: string,\n table: PostgresTableSchemaNode,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): PostgresOpFactoryCall[] {\n const ddlColumns = Object.values(table.columns).map((c) =>\n renderColumnDdl(c.name, c, codecHooks),\n );\n const primaryKeyConstraints: DdlTableConstraint[] = table.primaryKey\n ? [\n contractFree.primaryKey([...table.primaryKey.columns], {\n ...ifDefined('name', table.primaryKey.name),\n }),\n ]\n : [];\n const elementNonNullChecks: DdlTableConstraint[] = Object.values(table.columns)\n .filter((c) => isManyColumn(c))\n .map((c) =>\n contractFree.checkExpression(\n elementNonNullCheckName(table.name, c.name),\n elementNonNullCheckExpression(c.name),\n ),\n );\n const allTableConstraints = [...primaryKeyConstraints, ...elementNonNullChecks];\n const calls: PostgresOpFactoryCall[] = [\n new CreateTableCall(\n schemaName,\n table.name,\n ddlColumns,\n allTableConstraints.length > 0 ? allTableConstraints : undefined,\n ),\n ];\n for (const index of table.indexes) {\n const indexName = index.name ?? defaultIndexName(table.name, index.columns);\n const extras: { type?: string; options?: Record<string, unknown> } = {};\n if (index.type !== undefined) extras.type = index.type;\n if (index.options !== undefined) extras.options = index.options;\n calls.push(new CreateIndexCall(schemaName, table.name, indexName, [...index.columns], extras));\n }\n for (const fk of table.foreignKeys) {\n calls.push(new AddForeignKeyCall(schemaName, table.name, fkSpecFromNode(fk, table.name)));\n }\n for (const unique of table.uniques) {\n const constraintName = unique.name ?? `${table.name}_${unique.columns.join('_')}_key`;\n calls.push(new AddUniqueCall(schemaName, table.name, constraintName, [...unique.columns]));\n }\n // Marker-driven: a newly-created table that is RLS-controlled enables RLS\n // as part of its creation bundle. The policy set never decides this. The\n // resolved schema (not the emission sentinel) binds into the op's\n // relrowsecurity checks.\n if (table.rlsEnabled) {\n calls.push(new EnableRowLevelSecurityCall(ddlSchemaName, table.name));\n }\n return calls;\n}\n\nfunction nodeConflict(kind: SqlPlannerConflict['kind'], message: string): SqlPlannerConflict {\n return issueConflict(kind, message);\n}\n\n/**\n * True when `actualMembers` (the live database's ordered members) is a\n * strict, order-preserving prefix of `expectedMembers` (the contract's) —\n * the database already carries every contract member, in declaration\n * order, and the contract declares at least one member the database still\n * lacks. Any other relationship — a renamed value, a removed value, a\n * reordering, or the database holding members the contract lacks — is not\n * a suffix append.\n */\nfunction isNativeEnumSuffixAppend(\n actualMembers: readonly string[],\n expectedMembers: readonly string[],\n): boolean {\n if (actualMembers.length >= expectedMembers.length) return false;\n return actualMembers.every((member, index) => member === expectedMembers[index]);\n}\n\n/** Operator-worded refusal for a native-enum member change beyond a suffix append (design ruling — tests match this verbatim). */\nfunction nativeEnumMemberChangeRefusal(options: {\n readonly ddlSchemaName: string;\n readonly typeName: string;\n readonly expectedMembers: readonly string[];\n readonly actualMembers: readonly string[];\n}): string {\n return (\n `Native enum type \"${options.ddlSchemaName}\".\"${options.typeName}\" changed beyond appending new values ` +\n `(contract declares [${options.expectedMembers.join(', ')}], database has [${options.actualMembers.join(', ')}]). ` +\n \"Prisma Next does not modify a native enum's existing values (rename, removal, reorder) — \" +\n 'see https://pris.ly/d/postgres-native-enums. Author the change manually with `migration new`.'\n );\n}\n\n/**\n * Managed native-enum issue -> op lowering. A missing declared type creates\n * it; an unclaimed live type drops it (ownership-scoped upstream by\n * `retainUnownedExtras`, destructiveness gated by the operation-class\n * policy); a paired member-value mismatch lowers to one `ALTER TYPE ... ADD\n * VALUE` per appended member when the database's members are a strict,\n * order-preserving prefix of the contract's — any other change (rename,\n * removal, reorder, or the database holding members the contract lacks) is\n * refused with a NAMED diagnostic, never a silent no-op and never a\n * drop-and-recreate.\n */\nfunction mapNativeEnumNodeIssue(\n issue: SchemaDiffIssue,\n ctx: StrategyContext,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n const ddlSchemaName = issueSchemaName(issue);\n if (ddlSchemaName === undefined) {\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `Enum issue has no schema in its path: ${issue.path.join('/')}`,\n ),\n );\n }\n const schemaName = emissionSchemaName(ctx, ddlSchemaName);\n if (issue.reason === 'not-found') {\n const expected = blindCast<\n PostgresNativeEnumSchemaNode,\n 'a not-found native-enum issue always carries the expected PostgresNativeEnumSchemaNode'\n >(issue.expected);\n return ok([new CreateNativeEnumTypeCall(schemaName, expected.typeName, expected.members)]);\n }\n if (issue.reason === 'not-expected') {\n const actual = blindCast<\n PostgresNativeEnumSchemaNode,\n 'a not-expected native-enum issue always carries the actual PostgresNativeEnumSchemaNode'\n >(issue.actual);\n return ok([new DropNativeEnumTypeCall(schemaName, actual.typeName)]);\n }\n const expected = blindCast<\n PostgresNativeEnumSchemaNode,\n 'a not-equal native-enum issue carries both sides; the expected node names the type'\n >(issue.expected);\n const actual = blindCast<\n PostgresNativeEnumSchemaNode,\n 'a not-equal native-enum issue carries both sides'\n >(issue.actual);\n if (isNativeEnumSuffixAppend(actual.members, expected.members)) {\n const appendedValues = expected.members.slice(actual.members.length);\n return ok(\n appendedValues.map(\n (value) => new AddNativeEnumValueCall(schemaName, expected.typeName, value),\n ),\n );\n }\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n nativeEnumMemberChangeRefusal({\n ddlSchemaName,\n typeName: expected.typeName,\n expectedMembers: expected.members,\n actualMembers: actual.members,\n }),\n ),\n );\n}\n\nfunction mapTableNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n // The diff tree's RESOLVED physical schema. Enablement ops bind it into\n // their `pg_class`/`pg_namespace` checks (the emission sentinel would\n // never match a live nspname), mirroring the schema the retired\n // policy-half enable resolved via `resolveDdlSchemaForNamespaceStorage`.\n ddlSchemaName: string,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const table = blindCast<\n PostgresTableSchemaNode,\n 'a not-found table issue always carries the expected PostgresTableSchemaNode'\n >(issue.expected);\n return ok(buildCreateTableCallsFromNode(schemaName, ddlSchemaName, table, codecHooks));\n }\n if (issue.reason === 'not-expected') {\n const table = blindCast<\n PostgresTableSchemaNode,\n 'a not-expected table issue always carries the actual PostgresTableSchemaNode'\n >(issue.actual);\n return ok([new DropTableCall(schemaName, table.name)]);\n }\n // A paired table `not-equal` means enablement drift TODAY, because\n // `isEqualTo` compares only name + `rlsEnabled`. Key on the actual\n // expected-vs-actual `rlsEnabled` delta rather than assuming it: emit ENABLE\n // when it flipped on, DISABLE when it flipped off, and fail loud when\n // `rlsEnabled` matches on both sides — that means a second table attribute\n // drifted into `isEqualTo` and this mapper does not yet handle it. The\n // expected side is authoritative (marker-driven, never the policy set).\n const expected = blindCast<\n PostgresTableSchemaNode,\n 'a not-equal table issue always carries the expected PostgresTableSchemaNode'\n >(issue.expected);\n const actual = blindCast<\n PostgresTableSchemaNode,\n 'a not-equal table issue always carries the actual PostgresTableSchemaNode'\n >(issue.actual);\n if (expected.rlsEnabled && !actual.rlsEnabled) {\n return ok([new EnableRowLevelSecurityCall(ddlSchemaName, expected.name)]);\n }\n if (!expected.rlsEnabled && actual.rlsEnabled) {\n return ok([new DisableRowLevelSecurityCall(ddlSchemaName, expected.name)]);\n }\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `unhandled table-attribute drift on \"${expected.name}\": table not-equal with no rlsEnabled delta (a second table attribute drifted)`,\n ),\n );\n}\n\nfunction mapColumnNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n codecHooks: ReadonlyMap<string, CodecControlHooks>,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const column = blindCast<\n SqlColumnIR,\n 'a not-found column issue always carries the expected column node'\n >(issue.expected);\n return ok([\n new AddColumnCall(schemaName, tableName, renderColumnDdl(column.name, column, codecHooks)),\n ]);\n }\n if (issue.reason === 'not-expected') {\n const column = blindCast<\n SqlColumnIR,\n 'a not-expected column issue always carries the actual column node'\n >(issue.actual);\n return ok([new DropColumnCall(schemaName, tableName, column.name)]);\n }\n // not-equal: Postgres alters in place — type drift and/or nullability drift.\n const expected = blindCast<\n SqlColumnIR,\n 'a not-equal column issue always carries the expected column node'\n >(issue.expected);\n const actual = blindCast<\n SqlColumnIR,\n 'a not-equal column issue always carries the actual column node'\n >(issue.actual);\n const calls: PostgresOpFactoryCall[] = [];\n if (columnTypeChanged(expected, actual)) {\n const { qualifiedTargetType, formatTypeExpected } = renderColumnAlterType(expected, codecHooks);\n calls.push(\n new AlterColumnTypeCall(schemaName, tableName, expected.name, {\n qualifiedTargetType,\n formatTypeExpected,\n rawTargetTypeForLabel: qualifiedTargetType,\n }),\n );\n }\n if (expected.nullable !== actual.nullable) {\n calls.push(\n expected.nullable\n ? new DropNotNullCall(schemaName, tableName, expected.name)\n : new SetNotNullCall(schemaName, tableName, expected.name),\n );\n }\n return ok(calls);\n}\n\nfunction mapColumnDefaultNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n columnName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-expected') {\n return ok([new DropDefaultCall(schemaName, tableName, columnName)]);\n }\n // not-found (SET DEFAULT, additive) or not-equal (SET DEFAULT, widening).\n if (issue.expected === undefined) return ok([]);\n const defaultNode = blindCast<\n SqlColumnDefaultIR,\n 'a not-found/not-equal column-default issue always carries the expected default node'\n >(issue.expected);\n const defaultSql = renderColumnDefaultSql(defaultNode);\n if (!defaultSql) return ok([]);\n return ok([\n new SetDefaultCall(\n schemaName,\n tableName,\n columnName,\n defaultSql,\n issue.reason === 'not-equal' ? 'widening' : 'additive',\n ),\n ]);\n}\n\nfunction mapPrimaryKeyNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const pk = blindCast<\n { readonly columns: readonly string[]; readonly name?: string },\n 'a not-found primary-key issue always carries the expected PrimaryKey node'\n >(issue.expected);\n const constraintName = pk.name ?? `${tableName}_pkey`;\n return ok([new AddPrimaryKeyCall(schemaName, tableName, constraintName, [...pk.columns])]);\n }\n if (issue.reason === 'not-expected') {\n const pk = blindCast<\n { readonly name?: string },\n 'a not-expected primary-key issue always carries the actual PrimaryKey node'\n >(issue.actual);\n return ok([\n new DropConstraintCall(schemaName, tableName, pk.name ?? `${tableName}_pkey`, 'primaryKey'),\n ]);\n }\n return notOk(nodeConflict('indexIncompatible', issue.path.join('/')));\n}\n\nfunction mapForeignKeyNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const fk = blindCast<\n SqlForeignKeyIR,\n 'a not-found foreign-key issue always carries the expected foreign-key node'\n >(issue.expected);\n return ok([new AddForeignKeyCall(schemaName, tableName, fkSpecFromNode(fk, tableName))]);\n }\n if (issue.reason === 'not-expected') {\n const fk = blindCast<\n SqlForeignKeyIR,\n 'a not-expected foreign-key issue always carries the actual foreign-key node'\n >(issue.actual);\n const name = fk.name ?? `${tableName}_${fk.columns.join('_')}_fkey`;\n return ok([new DropConstraintCall(schemaName, tableName, name, 'foreignKey')]);\n }\n return notOk(nodeConflict('foreignKeyConflict', issue.path.join('/')));\n}\n\nfunction mapUniqueNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const unique = blindCast<\n SqlUniqueIR,\n 'a not-found unique issue always carries the expected unique node'\n >(issue.expected);\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_key`;\n return ok([new AddUniqueCall(schemaName, tableName, name, [...unique.columns])]);\n }\n if (issue.reason === 'not-expected') {\n const unique = blindCast<\n SqlUniqueIR,\n 'a not-expected unique issue always carries the actual unique node'\n >(issue.actual);\n const name = unique.name ?? `${tableName}_${unique.columns.join('_')}_key`;\n return ok([new DropConstraintCall(schemaName, tableName, name, 'unique')]);\n }\n return notOk(nodeConflict('indexIncompatible', issue.path.join('/')));\n}\n\nfunction mapIndexNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n if (issue.reason === 'not-found') {\n const index = blindCast<\n SqlIndexIR,\n 'a not-found index issue always carries the expected index node'\n >(issue.expected);\n const indexName = index.name ?? defaultIndexName(tableName, index.columns);\n const extras: { type?: string; options?: Record<string, unknown> } = {};\n if (index.type !== undefined) extras.type = index.type;\n if (index.options !== undefined) extras.options = index.options;\n return ok([new CreateIndexCall(schemaName, tableName, indexName, [...index.columns], extras)]);\n }\n if (issue.reason === 'not-expected') {\n const index = blindCast<\n SqlIndexIR,\n 'a not-expected index issue always carries the actual index node'\n >(issue.actual);\n const indexName = index.name ?? defaultIndexName(tableName, index.columns);\n return ok([new DropIndexCall(schemaName, tableName, indexName)]);\n }\n return notOk(nodeConflict('indexIncompatible', issue.path.join('/')));\n}\n\nfunction mapCheckNodeIssue(\n issue: SchemaDiffIssue,\n schemaName: string,\n tableName: string,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n // check_removed (extra live check not in contract) is the only check drift\n // the default mapper handles directly; check_missing / check_mismatch are\n // consumed by `checkConstraintPlanCallStrategy` (drop+recreate), so reaching\n // here for them means the strategy did not run — a conflict.\n if (issue.reason === 'not-expected') {\n const check = blindCast<\n { readonly name: string },\n 'a not-expected check issue always carries the actual check node'\n >(issue.actual);\n return ok([new DropCheckConstraintCall(schemaName, tableName, check.name)]);\n }\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `Check constraint drift on \"${tableName}\" — handled by checkConstraintPlanCallStrategy: ${issue.path.join('/')}`,\n ),\n );\n}\n\n/**\n * Maps one node-typed diff issue to its migration call(s), dispatching on the\n * node's `nodeKind` + `issue.reason`, reading nodes and resolving column DDL\n * from `codecRef` via `column-ddl-rendering.ts`.\n */\nexport function mapNodeIssueToCall(\n issue: SchemaDiffIssue,\n ctx: StrategyContext,\n): Result<readonly PostgresOpFactoryCall[], SqlPlannerConflict> {\n const node = issueNode(issue);\n if (node === undefined) {\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `Issue carries neither an expected nor an actual node: ${issue.path.join('/')}`,\n ),\n );\n }\n if (node.nodeKind === PostgresSchemaNodeKind.namespace) {\n if (issue.reason !== 'not-found') {\n return notOk(\n nodeConflict('unsupportedOperation', `Unexpected namespace drift: ${issue.path.join('/')}`),\n );\n }\n const namespace = blindCast<\n PostgresNamespaceSchemaNode,\n 'a namespace-presence issue always carries a PostgresNamespaceSchemaNode'\n >(issue.expected);\n return ok([new CreateSchemaCall(namespace.schemaName)]);\n }\n\n if (node.nodeKind === PostgresSchemaNodeKind.nativeEnum) {\n return mapNativeEnumNodeIssue(issue, ctx);\n }\n\n const ddlSchemaName = issueSchemaName(issue);\n const tableName = issueTableName(issue);\n if (ddlSchemaName === undefined || tableName === undefined) {\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `Issue has no schema/table in its path: ${issue.path.join('/')}`,\n ),\n );\n }\n const schemaName = emissionSchemaName(ctx, ddlSchemaName);\n\n switch (node.nodeKind) {\n case PostgresSchemaNodeKind.table:\n return mapTableNodeIssue(issue, schemaName, ddlSchemaName, ctx.codecHooks);\n case RelationalSchemaNodeKind.column:\n return mapColumnNodeIssue(issue, schemaName, tableName, ctx.codecHooks);\n case RelationalSchemaNodeKind.columnDefault: {\n const columnName = issueColumnName(issue);\n if (columnName === undefined) {\n return notOk(\n nodeConflict(\n 'unsupportedOperation',\n `Default issue has no column in its path: ${issue.path.join('/')}`,\n ),\n );\n }\n return mapColumnDefaultNodeIssue(issue, schemaName, tableName, columnName);\n }\n case RelationalSchemaNodeKind.primaryKey:\n return mapPrimaryKeyNodeIssue(issue, schemaName, tableName);\n case RelationalSchemaNodeKind.foreignKey:\n return mapForeignKeyNodeIssue(issue, schemaName, tableName);\n case RelationalSchemaNodeKind.unique:\n return mapUniqueNodeIssue(issue, schemaName, tableName);\n case RelationalSchemaNodeKind.index:\n return mapIndexNodeIssue(issue, schemaName, tableName);\n case RelationalSchemaNodeKind.check:\n return mapCheckNodeIssue(issue, schemaName, tableName);\n default:\n return notOk(nodeConflict('unsupportedOperation', `Unhandled node kind: ${node.nodeKind}`));\n }\n}\n\nexport interface IssuePlannerOptions {\n readonly issues: readonly SchemaDiffIssue[];\n readonly toContract: Contract<SqlStorage>;\n readonly fromContract: Contract<SqlStorage> | null;\n readonly schemaName: string;\n readonly codecHooks: ReadonlyMap<string, CodecControlHooks>;\n readonly storageTypes: Readonly<Record<string, StorageTypeInstance>>;\n /**\n * Current database schema IR. Strategies read this to detect whether a\n * structure already exists (e.g. `buildSchemaLookupMap` for shared-temp-\n * default safety, extension dependency checks). Defaults to an empty schema\n * when omitted so the planner can still run over \"fresh DB\" contract\n * snapshots.\n */\n readonly schema?: SqlSchemaIR;\n /**\n * Operation-class policy. `planIssues` filters calls whose `operationClass`\n * is not in `policy.allowedOperationClasses` and surfaces them as conflicts\n * instead of emitting disallowed DDL. Defaults to additive-only.\n */\n readonly policy?: MigrationOperationPolicy;\n /**\n * Framework components participating in this composition. Available to\n * future strategies that may consult component metadata at plan time.\n */\n readonly frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n readonly strategies?: readonly CallMigrationStrategy[];\n}\n\n/**\n * Runs the ordered strategy list over the node-typed diff issues, maps\n * leftover issues via {@link mapNodeIssueToCall}, applies operation-class\n * policy gating, and buckets calls into the fixed DDL emission order (dep →\n * drop → table → column → recipe → alter → primaryKey → unique → index →\n * foreignKey).\n */\nexport function planIssues(\n options: IssuePlannerOptions,\n): Result<IssuePlannerValue, readonly SqlPlannerConflict[]> {\n const policyProvided = options.policy !== undefined;\n const policy = options.policy ?? DEFAULT_POLICY;\n const schema = options.schema ?? emptySchemaIR();\n const frameworkComponents = options.frameworkComponents ?? [];\n\n const context: StrategyContext = {\n toContract: options.toContract,\n fromContract: options.fromContract,\n schemaName: options.schemaName,\n codecHooks: options.codecHooks,\n storageTypes: options.storageTypes,\n schema,\n policy,\n frameworkComponents,\n };\n\n const strategies = options.strategies ?? postgresPlannerStrategies;\n\n let remaining = options.issues;\n const recipeCalls: PostgresOpFactoryCall[] = [];\n const bucketablePatternCalls: PostgresOpFactoryCall[] = [];\n\n for (const strategy of strategies) {\n const result = strategy(remaining, context);\n if (result.kind === 'match') {\n remaining = result.issues;\n if (result.recipe) {\n recipeCalls.push(...result.calls);\n } else {\n bucketablePatternCalls.push(...result.calls);\n }\n }\n }\n\n const sorted = [...remaining].sort((a, b) => {\n const kindDelta = nodeIssueOrder(a) - nodeIssueOrder(b);\n if (kindDelta !== 0) return kindDelta;\n const keyA = nodeIssueKey(a);\n const keyB = nodeIssueKey(b);\n return keyA < keyB ? -1 : keyA > keyB ? 1 : 0;\n });\n\n const defaultCalls: PostgresOpFactoryCall[] = [];\n const conflicts: SqlPlannerConflict[] = [];\n\n for (const issue of sorted) {\n const result = mapNodeIssueToCall(issue, context);\n if (result.ok) {\n defaultCalls.push(...result.value);\n } else {\n conflicts.push(result.failure);\n }\n }\n\n const allowed = policy.allowedOperationClasses;\n let gatedDefault = defaultCalls;\n let gatedRecipe = recipeCalls;\n let gatedBucketable = bucketablePatternCalls;\n if (policyProvided) {\n const keepIfAllowed = (bucket: PostgresOpFactoryCall[]) => (call: PostgresOpFactoryCall) => {\n if (allowed.includes(call.operationClass)) {\n bucket.push(call);\n return;\n }\n conflicts.push(conflictForDisallowedCall(call, allowed));\n };\n const gatedDefaultBucket: PostgresOpFactoryCall[] = [];\n const gatedRecipeBucket: PostgresOpFactoryCall[] = [];\n const gatedBucketableBucket: PostgresOpFactoryCall[] = [];\n defaultCalls.forEach(keepIfAllowed(gatedDefaultBucket));\n recipeCalls.forEach(keepIfAllowed(gatedRecipeBucket));\n bucketablePatternCalls.forEach(keepIfAllowed(gatedBucketableBucket));\n gatedDefault = gatedDefaultBucket;\n gatedRecipe = gatedRecipeBucket;\n gatedBucketable = gatedBucketableBucket;\n }\n\n if (conflicts.length > 0) {\n return notOk(conflicts);\n }\n\n const combinedBucketable = [...gatedDefault, ...gatedBucketable];\n const byCategory = (cat: CallCategory) =>\n combinedBucketable.filter((c) => classifyCall(c) === cat);\n\n const calls: PostgresOpFactoryCall[] = [\n ...byCategory('dep'),\n ...byCategory('drop'),\n ...byCategory('table'),\n ...byCategory('column'),\n ...gatedRecipe,\n ...byCategory('alter'),\n ...byCategory('primaryKey'),\n ...byCategory('unique'),\n ...byCategory('index'),\n ...byCategory('foreignKey'),\n // Enablement changes run after all relational DDL (the table must exist)\n // and before the policy calls the planner appends after `planIssues` —\n // the same position the retired imperative enable-on-first-policy used.\n ...byCategory('rlsEnable'),\n ];\n\n return ok({ calls });\n}\n","import type { Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport type {\n ControlPolicySubject,\n SqlPlannerConflict,\n SuppressionRecord,\n} from '@prisma-next/family-sql/control';\nimport type { SchemaDiffIssue } from '@prisma-next/framework-components/control';\nimport { entityAt, UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type { SqlStorage, StorageTable } from '@prisma-next/sql-contract/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { type PostgresRole, ROLE_DEFAULT_CONTROL_POLICY } from '../postgres-role';\nimport { isPostgresSchema } from '../postgres-schema';\nimport { postgresNodeStorageCoordinate } from '../schema-ir/node-storage-coordinate';\nimport type { PostgresNamespaceSchemaNode } from '../schema-ir/postgres-namespace-schema-node';\nimport { PostgresTableSchemaNode } from '../schema-ir/postgres-table-schema-node';\nimport type { SqlSchemaDiffNode } from '../schema-ir/schema-node-kinds';\nimport { PostgresSchemaNodeKind } from '../schema-ir/schema-node-kinds';\nimport { issueColumnName } from './issue-planner';\nimport type { PostgresOpFactoryCall } from './op-factory-call';\n\n/**\n * Factory calls that create a whole, previously-absent top-level storage\n * object. Used to decide whether `tolerated` permits a call (it only allows\n * creating absent objects, never modifying existing ones).\n *\n * Deliberately an explicit, closed set rather than a `factoryName`\n * create/alter/drop classification: it answers exactly one yes/no question\n * and is fail-closed. Any call not listed here — including future or\n * extension-contributed factories — is treated as NOT object-creation, so it\n * is suppressed under `tolerated` rather than permissively emitted.\n *\n * Lists the creation factories that actually reach the call-side resolver\n * (`resolvePostgresCallControlPolicySubject`) — today only RLS policy\n * creation, from `planPostgresSchemaDiff`. Every other whole-object create\n * (table, schema, native enum, and RLS enablement) is constructed inside\n * `planIssues` and graded on the node side by\n * `resolvePostgresNodeIssueCreationFactoryName`, so none of them are listed\n * here.\n */\nconst OBJECT_CREATION_FACTORIES: ReadonlySet<string> = new Set<string>(['createRlsPolicy']);\n\nfunction createsNewTopLevelObject(call: PostgresOpFactoryCall): boolean {\n return OBJECT_CREATION_FACTORIES.has(call.factoryName);\n}\n\nfunction ddlSchemaNameForNamespace(contract: Contract<SqlStorage>, namespaceId: string): string {\n const namespace = contract.storage.namespaces[namespaceId];\n return isPostgresSchema(namespace) ? namespace.ddlSchemaName(contract.storage) : namespaceId;\n}\n\n/**\n * Resolve the namespace a declared storage entity lives in by walking every\n * namespace for one whose `entries` map actually contains the coordinate —\n * a table by its name, a native enum by its physical type name (see\n * {@link postgresNodeStorageCoordinate}). When `ddlSchemaName` is given, the\n * match must also land in that DDL schema (disambiguates same-named entities\n * declared under different namespaces); when omitted, the first namespace\n * that declares the entity wins. Falls back to {@link UNBOUND_NAMESPACE_ID}\n * when no namespace declares it — e.g. an extra/dropped entity the contract\n * doesn't claim at all.\n */\nfunction resolveNamespaceIdForEntity(\n contract: Contract<SqlStorage>,\n coordinate: { readonly entityKind: string; readonly entityName: string },\n ddlSchemaName: string | undefined,\n): string {\n for (const namespaceId of Object.keys(contract.storage.namespaces)) {\n const entity = entityAt(contract.storage, { namespaceId, ...coordinate });\n if (!entity) continue;\n if (\n ddlSchemaName === undefined ||\n ddlSchemaNameForNamespace(contract, namespaceId) === ddlSchemaName\n ) {\n return namespaceId;\n }\n }\n return UNBOUND_NAMESPACE_ID;\n}\n\nfunction resolveNamespaceIdForTable(\n contract: Contract<SqlStorage>,\n tableName: string,\n ddlSchemaName: string | undefined,\n): string {\n return resolveNamespaceIdForEntity(\n contract,\n { entityKind: 'table', entityName: tableName },\n ddlSchemaName,\n );\n}\n\nexport function resolveNamespaceIdForDdlSchema(\n contract: Contract<SqlStorage>,\n ddlSchemaName: string,\n): string {\n for (const namespaceId of Object.keys(contract.storage.namespaces)) {\n const ns = contract.storage.namespaces[namespaceId];\n if (isPostgresSchema(ns) && ns.ddlSchemaName(contract.storage) === ddlSchemaName) {\n return namespaceId;\n }\n if (namespaceId === ddlSchemaName) {\n return namespaceId;\n }\n }\n return UNBOUND_NAMESPACE_ID;\n}\n\ninterface PostgresCallFields {\n readonly schemaName?: string;\n readonly tableName?: string;\n readonly columnName?: string;\n}\n\nfunction postgresCallFields(call: PostgresOpFactoryCall): PostgresCallFields {\n return {\n ...ifDefined('schemaName', 'schemaName' in call ? call.schemaName : undefined),\n ...ifDefined('tableName', 'tableName' in call ? call.tableName : undefined),\n ...ifDefined('columnName', 'columnName' in call ? call.columnName : undefined),\n };\n}\n\nfunction formatSuppressionSubjectLabel(\n subject: ControlPolicySubject | undefined,\n contract: Contract<SqlStorage>,\n): string {\n if (subject === undefined) return 'unknown';\n const ddlSchema = ddlSchemaNameForNamespace(contract, subject.namespaceId);\n if (subject.entityKind !== undefined && subject.entityName !== undefined) {\n return `${subject.entityKind} \"${ddlSchema}.${subject.entityName}\"`;\n }\n return `namespace \"${ddlSchema}\"`;\n}\n\nfunction postgresSuppressionSummary(\n subjectLabel: string,\n subject: ControlPolicySubject | undefined,\n policy: string,\n): string {\n const namespace = subject?.namespaceId ?? 'unknown';\n const declared = subject?.explicitNodeControlPolicy;\n if (policy === 'external' && declared === 'managed') {\n return `control policy suppressed: ${subjectLabel} — namespace '${namespace}' has effective control 'external' but declared 'managed'`;\n }\n const declaredSuffix = declared ? ` but declared '${declared}'` : '';\n return `control policy suppressed: ${subjectLabel} — namespace '${namespace}' has effective control '${policy}'${declaredSuffix}`;\n}\n\n/**\n * Render one family {@link SuppressionRecord} into a target `SqlPlannerConflict`.\n * The family decides *that* a subject is suppressed and hands over the raw\n * coordinate + policy; the label, message, and location are rendered here,\n * driven entirely by the subject's own `(entityKind, entityName)` coordinate\n * — no target-owned table-vs-enum vocabulary.\n */\nexport function renderPostgresSuppression(\n record: SuppressionRecord,\n contract: Contract<SqlStorage>,\n): SqlPlannerConflict {\n const subject = record.subject;\n const subjectLabel = formatSuppressionSubjectLabel(subject, contract);\n return {\n kind: 'controlPolicySuppressedCall',\n summary: postgresSuppressionSummary(subjectLabel, subject, record.policy),\n location: {\n ...ifDefined('namespaceId', subject?.namespaceId),\n ...ifDefined('entityKind', subject?.entityKind),\n ...ifDefined('entityName', subject?.entityName),\n ...ifDefined('column', subject?.column),\n },\n meta: {\n controlPolicy: record.policy,\n ...ifDefined('factoryName', record.factoryName),\n ...ifDefined('declaredControlPolicy', subject?.explicitNodeControlPolicy),\n },\n };\n}\n\nexport function resolvePostgresCallControlPolicySubject(\n call: PostgresOpFactoryCall,\n contract: Contract<SqlStorage>,\n): ControlPolicySubject | undefined {\n const callFields = postgresCallFields(call);\n const createsNewObject = createsNewTopLevelObject(call);\n\n if (call.factoryName === 'createSchema' && callFields.schemaName) {\n return {\n namespaceId: resolveNamespaceIdForDdlSchema(contract, callFields.schemaName),\n createsNewObject,\n };\n }\n\n if (callFields.tableName) {\n const namespaceId = resolveNamespaceIdForTable(\n contract,\n callFields.tableName,\n callFields.schemaName,\n );\n const tableControlPolicy = entityAt<StorageTable>(contract.storage, {\n namespaceId,\n entityKind: 'table',\n entityName: callFields.tableName,\n })?.control;\n return {\n namespaceId,\n entityKind: 'table',\n entityName: callFields.tableName,\n ...ifDefined('column', callFields.columnName),\n ...ifDefined('explicitNodeControlPolicy', tableControlPolicy),\n createsNewObject,\n };\n }\n\n if (callFields.schemaName) {\n return {\n namespaceId: resolveNamespaceIdForDdlSchema(contract, callFields.schemaName),\n createsNewObject,\n };\n }\n\n return undefined;\n}\n\n/**\n * Node kinds whose *absence* is the creation of a whole, top-level Postgres\n * object: a namespace, a table, or a native enum. Used by\n * {@link resolvePostgresNodeIssueCreationFactoryName} to decide whether a\n * `tolerated` subject permits the issue to flow into the planner\n * (create-if-absent) and to seed the suppressed-subject warning's\n * `factoryName` when the planner is skipped. RLS policy creation is not\n * listed here — policy issues never reach this issue-based partition (they\n * are routed to `planPostgresSchemaDiff` and gated via the call-based\n * {@link resolvePostgresCallControlPolicySubject} instead).\n */\nconst POSTGRES_NODE_CREATION_FACTORY: Readonly<Record<string, string>> = Object.freeze({\n [PostgresSchemaNodeKind.namespace]: 'createSchema',\n [PostgresSchemaNodeKind.table]: 'createTable',\n [PostgresSchemaNodeKind.nativeEnum]: 'createNativeEnumType',\n});\n\n/**\n * A table `not-equal` issue whose `rlsEnabled` flips OFF→ON (expected on,\n * actual off) is enablement toward `ENABLE ROW LEVEL SECURITY`. It is\n * creation-class on the node side because `isEnablementCreationIssue` and\n * {@link resolvePostgresNodeIssueCreationFactoryName} treat this OFF→ON delta\n * as a creation: enabling RLS establishes the fail-closed guard the declared\n * policy set attaches to, the same grant `tolerated` extends to creating the\n * policies themselves. The opposite direction (`DISABLE`) is a modification\n * and stays managed-only. Keying on the actual delta (not just the expected\n * bit) keeps this correct if a second table attribute ever joins\n * `isEqualTo`: a not-equal with no `rlsEnabled` delta is not enablement, so\n * it is not admitted as creation-class here.\n */\nfunction isEnablementCreationIssue(issue: SchemaDiffIssue<SqlSchemaDiffNode>): boolean {\n if (issue.reason !== 'not-equal') return false;\n const { expected, actual } = issue;\n return (\n expected !== undefined &&\n actual !== undefined &&\n PostgresTableSchemaNode.is(expected) &&\n PostgresTableSchemaNode.is(actual) &&\n expected.rlsEnabled === true &&\n actual.rlsEnabled === false\n );\n}\n\nexport function resolvePostgresNodeIssueCreationFactoryName(\n issue: SchemaDiffIssue<SqlSchemaDiffNode>,\n): string | undefined {\n if (isEnablementCreationIssue(issue)) {\n return 'enableRowLevelSecurity';\n }\n if (issue.reason !== 'not-found') return undefined;\n const node = issue.expected ?? issue.actual;\n if (node === undefined) return undefined;\n return POSTGRES_NODE_CREATION_FACTORY[node.nodeKind];\n}\n\n/**\n * Resolves the control-policy subject for a node-typed {@link SchemaDiffIssue}\n * (the issue-side mirror of `resolvePostgresCallControlPolicySubject`).\n * Storage entities resolve off their node coordinate; a sub-entity issue\n * resolves off the enclosing table read from the issue path; an unclaimed\n * extra falls back to the unbound coordinate. A role always resolves\n * `'external'` — roles are referenced, never owned.\n */\nexport function resolvePostgresNodeIssueControlPolicySubject(\n issue: SchemaDiffIssue<SqlSchemaDiffNode>,\n contract: Contract<SqlStorage>,\n): ControlPolicySubject | undefined {\n const node = issue.expected ?? issue.actual;\n if (node === undefined) return undefined;\n\n if (node.nodeKind === PostgresSchemaNodeKind.namespace) {\n const namespaceNode = blindCast<\n PostgresNamespaceSchemaNode,\n 'a postgres-namespace diff node is always a PostgresNamespaceSchemaNode'\n >(node);\n return {\n namespaceId: resolveNamespaceIdForDdlSchema(contract, namespaceNode.schemaName),\n createsNewObject: issue.reason === 'not-found',\n };\n }\n\n if (node.nodeKind === PostgresSchemaNodeKind.role) {\n const roleName = issue.path[1];\n const roleEntity =\n roleName === undefined\n ? undefined\n : entityAt<PostgresRole>(contract.storage, {\n namespaceId: UNBOUND_NAMESPACE_ID,\n entityKind: 'role',\n entityName: roleName,\n });\n return {\n namespaceId: UNBOUND_NAMESPACE_ID,\n explicitNodeControlPolicy: roleEntity?.control ?? ROLE_DEFAULT_CONTROL_POLICY,\n createsNewObject: false,\n };\n }\n\n const coordinate = postgresNodeStorageCoordinate(node);\n if (coordinate !== undefined) {\n const namespaceId = resolveNamespaceIdForEntity(contract, coordinate, issue.path[1]);\n const entityControl = entityAt<{ readonly control?: ControlPolicy }>(contract.storage, {\n namespaceId,\n ...coordinate,\n })?.control;\n return {\n namespaceId,\n ...coordinate,\n ...ifDefined('column', issueColumnName(issue)),\n ...ifDefined('explicitNodeControlPolicy', entityControl),\n createsNewObject: resolvePostgresNodeIssueCreationFactoryName(issue) !== undefined,\n };\n }\n\n const tableName = issue.path[2];\n if (tableName === undefined) return undefined;\n const ddlSchemaName = issue.path[1];\n const namespaceId = resolveNamespaceIdForTable(contract, tableName, ddlSchemaName);\n const table = entityAt<StorageTable>(contract.storage, {\n namespaceId,\n entityKind: 'table',\n entityName: tableName,\n });\n\n return {\n namespaceId,\n entityKind: 'table',\n entityName: tableName,\n ...ifDefined('column', issueColumnName(issue)),\n ...ifDefined('explicitNodeControlPolicy', table?.control),\n createsNewObject: resolvePostgresNodeIssueCreationFactoryName(issue) !== undefined,\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"default-normalizer.mjs","names":[],"sources":["../src/core/default-normalizer.ts"],"sourcesContent":["import type { ColumnDefault, JsonValue } from '@prisma-next/contract/types';\n\n/**\n * Pre-compiled regex patterns for performance.\n * These are compiled once at module load time rather than on each function call.\n */\nconst NEXTVAL_PATTERN = /^nextval\\s*\\(/i;\nconst NOW_FUNCTION_PATTERN = /^(now\\s*\\(\\s*\\)|CURRENT_TIMESTAMP)$/i;\nconst CLOCK_TIMESTAMP_PATTERN = /^clock_timestamp\\s*\\(\\s*\\)$/i;\nconst TIMESTAMP_CAST_SUFFIX = /::timestamp(?:tz|\\s+(?:with|without)\\s+time\\s+zone)?$/i;\nconst TEXT_CAST_SUFFIX = /::text$/i;\nconst NOW_LITERAL_PATTERN = /^'now'$/i;\nconst UUID_PATTERN = /^gen_random_uuid\\s*\\(\\s*\\)$/i;\nconst UUID_OSSP_PATTERN = /^uuid_generate_v4\\s*\\(\\s*\\)$/i;\nconst NULL_PATTERN = /^NULL(?:::.+)?$/i;\nconst TRUE_PATTERN = /^true$/i;\nconst FALSE_PATTERN = /^false$/i;\nconst NUMERIC_PATTERN = /^-?\\d+(\\.\\d+)?$/;\nconst STRING_LITERAL_PATTERN = /^'((?:[^']|'')*)'(?:::(?:\"[^\"]+\"|[\\w\\s]+)(?:\\(\\d+\\))?)?$/;\n\n/**\n * Matches a Postgres array literal default of the form `'{...}'::elemtype[]`.\n * The literal body is captured in group 1; the cast (including `[]`) is optional.\n * Examples: `'{}'::text[]`, `'{1,2}'::integer[]`, `'{}'`\n */\nconst ARRAY_LITERAL_PATTERN = /^'(\\{.*\\})'(?:::.+\\[\\])?$/;\n\n/**\n * Returns the canonical expression for a timestamp default function, or undefined\n * if the expression is not a recognized timestamp default.\n *\n * Keeps now()/CURRENT_TIMESTAMP and clock_timestamp() distinct:\n * - now(), CURRENT_TIMESTAMP, ('now'::text)::timestamp... → 'now()'\n * - clock_timestamp(), clock_timestamp()::timestamptz → 'clock_timestamp()'\n *\n * These are semantically different in Postgres: now() returns the transaction\n * start time (constant within a transaction), while clock_timestamp() returns\n * the actual wall-clock time (can differ across rows in a single INSERT).\n */\nfunction canonicalizeTimestampDefault(expr: string): string | undefined {\n if (NOW_FUNCTION_PATTERN.test(expr)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(expr)) return 'clock_timestamp()';\n\n if (!TIMESTAMP_CAST_SUFFIX.test(expr)) return undefined;\n\n let inner = expr.replace(TIMESTAMP_CAST_SUFFIX, '').trim();\n\n if (inner.startsWith('(') && inner.endsWith(')')) {\n inner = inner.slice(1, -1).trim();\n }\n\n if (NOW_FUNCTION_PATTERN.test(inner)) return 'now()';\n if (CLOCK_TIMESTAMP_PATTERN.test(inner)) return 'clock_timestamp()';\n\n inner = inner.replace(TEXT_CAST_SUFFIX, '').trim();\n if (NOW_LITERAL_PATTERN.test(inner)) return 'now()';\n\n return undefined;\n}\n\ntype ArrayElementToken = { readonly value: string; readonly quoted: boolean };\n\n/**\n * Splits a Postgres array literal body (without the enclosing braces) into its\n * element tokens, honouring quoting. A comma only separates elements when it is\n * outside double quotes; inside a quoted element a doubled quote (`\"\"`) or a\n * backslash-escaped quote (`\\\"`) is a literal quote, and a backslash escapes the\n * next character. Returns undefined if the body is malformed (e.g. an unbalanced\n * quote).\n */\nfunction splitArrayElements(inner: string): readonly ArrayElementToken[] | undefined {\n const tokens: ArrayElementToken[] = [];\n let current = '';\n let inQuotes = false;\n let quoted = false;\n\n for (let i = 0; i < inner.length; i++) {\n const char = inner[i];\n if (inQuotes) {\n if (char === '\\\\') {\n const next = inner[i + 1];\n if (next === undefined) return undefined;\n current += next;\n i++;\n continue;\n }\n if (char === '\"') {\n if (inner[i + 1] === '\"') {\n current += '\"';\n i++;\n continue;\n }\n inQuotes = false;\n continue;\n }\n current += char;\n continue;\n }\n if (char === '\"') {\n inQuotes = true;\n quoted = true;\n continue;\n }\n if (char === ',') {\n tokens.push({ value: current, quoted });\n current = '';\n quoted = false;\n continue;\n }\n current += char;\n }\n\n if (inQuotes) return undefined;\n tokens.push({ value: current, quoted });\n return tokens;\n}\n\n/**\n * Parses a Postgres array literal body (`{...}`) into a JS array of primitives.\n * Returns undefined if the body cannot be reliably parsed.\n *\n * Handles:\n * - `{}` → `[]`\n * - `{elem1,elem2,...}` → `[elem1, elem2, ...]` with numeric and string element coercion\n * - quoted elements that contain commas, doubled/escaped quotes, and the literal\n * strings `NULL`/`true`/`false` (a quoted token is always a string)\n */\nfunction parseArrayLiteralBody(body: string): readonly JsonValue[] | undefined {\n const inner = body.slice(1, -1).trim();\n if (inner === '') return [];\n const tokens = splitArrayElements(inner);\n if (tokens === undefined) return undefined;\n const result: JsonValue[] = [];\n for (const token of tokens) {\n if (token.quoted) {\n // A quoted token is always a string — `\"NULL\"`, `\"true\"`, `\"1\"` are the\n // literal text, never the keyword/number.\n result.push(token.value);\n continue;\n }\n const el = token.value.trim();\n if (el.toUpperCase() === 'NULL') {\n result.push(null);\n continue;\n }\n if (el === 'true') {\n result.push(true);\n continue;\n }\n if (el === 'false') {\n result.push(false);\n continue;\n }\n if (NUMERIC_PATTERN.test(el)) {\n result.push(Number(el));\n continue;\n }\n return undefined;\n }\n return result;\n}\n\n/**\n * Parses a raw Postgres column default expression into a normalized ColumnDefault.\n * This enables semantic comparison between contract defaults and introspected schema defaults.\n *\n * Used by the migration diff layer to normalize raw database defaults during comparison,\n * keeping the introspection layer focused on faithful data capture.\n *\n * @param rawDefault - Raw default expression from information_schema.columns.column_default\n * @param nativeType - Native column type, used for type-aware parsing (array, bigint, JSON)\n * @returns Normalized ColumnDefault or undefined if the expression cannot be parsed\n */\nexport function parsePostgresDefault(\n rawDefault: string,\n nativeType?: string,\n): ColumnDefault | undefined {\n const trimmed = rawDefault.trim();\n const normalizedType = nativeType?.toLowerCase();\n const isBigInt = normalizedType === 'bigint' || normalizedType === 'int8';\n const isArrayType = normalizedType?.endsWith('[]') ?? false;\n\n if (NEXTVAL_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'autoincrement()' };\n }\n\n if (isArrayType) {\n const arrayMatch = trimmed.match(ARRAY_LITERAL_PATTERN);\n if (arrayMatch?.[1] !== undefined) {\n const parsed = parseArrayLiteralBody(arrayMatch[1]);\n if (parsed !== undefined) {\n return { kind: 'literal', value: parsed };\n }\n }\n }\n\n const canonicalTimestamp = canonicalizeTimestampDefault(trimmed);\n if (canonicalTimestamp) {\n return { kind: 'function', expression: canonicalTimestamp };\n }\n\n if (UUID_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'gen_random_uuid()' };\n }\n\n if (UUID_OSSP_PATTERN.test(trimmed)) {\n return { kind: 'function', expression: 'gen_random_uuid()' };\n }\n\n if (NULL_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: null };\n }\n\n if (TRUE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: true };\n }\n if (FALSE_PATTERN.test(trimmed)) {\n return { kind: 'literal', value: false };\n }\n\n if (NUMERIC_PATTERN.test(trimmed)) {\n const num = Number(trimmed);\n if (!Number.isFinite(num)) return undefined;\n if (isBigInt && !Number.isSafeInteger(num)) {\n return { kind: 'literal', value: trimmed };\n }\n return { kind: 'literal', value: num };\n }\n\n const stringMatch = trimmed.match(STRING_LITERAL_PATTERN);\n if (stringMatch?.[1] !== undefined) {\n const unescaped = stringMatch[1].replace(/''/g, \"'\");\n if (normalizedType === 'json' || normalizedType === 'jsonb') {\n try {\n return { kind: 'literal', value: JSON.parse(unescaped) };\n } catch {\n // Keep legacy behavior for malformed/non-JSON string content.\n }\n }\n if (isBigInt && NUMERIC_PATTERN.test(unescaped)) {\n const num = Number(unescaped);\n if (Number.isSafeInteger(num)) {\n return { kind: 'literal', value: num };\n }\n return { kind: 'literal', value: unescaped };\n }\n return { kind: 'literal', value: unescaped };\n }\n\n return { kind: 'function', expression: trimmed };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"descriptor-meta-CFQKLXl_.mjs","names":[],"sources":["../src/core/descriptor-meta.ts"],"sourcesContent":["import type { CodecTypes } from '../exports/codec-types';\nimport {\n postgresAuthoringEntityTypes,\n postgresAuthoringFieldPresets,\n postgresAuthoringModelAttributes,\n postgresAuthoringPslBlockDescriptors,\n postgresAuthoringTypes,\n postgresLowerEntityHandles,\n} from './authoring';\nimport { postgresQualifyColumnType } from './codecs';\nimport { postgresTargetDescriptorMetaRuntime } from './descriptor-meta-runtime';\nimport { DEFAULT_NAMESPACE_ID } from './namespace-ids';\nimport { postgresCreateNamespace } from './postgres-schema';\n\nconst postgresTargetDescriptorMetaBase = {\n ...postgresTargetDescriptorMetaRuntime,\n defaultNamespaceId: DEFAULT_NAMESPACE_ID,\n authoring: {\n type: postgresAuthoringTypes,\n field: postgresAuthoringFieldPresets,\n entityTypes: postgresAuthoringEntityTypes,\n pslBlockDescriptors: postgresAuthoringPslBlockDescriptors,\n modelAttributes: postgresAuthoringModelAttributes,\n createNamespace: postgresCreateNamespace,\n qualifyColumnType: postgresQualifyColumnType,\n lowerEntityHandles: postgresLowerEntityHandles,\n },\n} as const;\n\nexport const postgresTargetDescriptorMeta: typeof postgresTargetDescriptorMetaBase & {\n readonly __codecTypes?: CodecTypes;\n} = postgresTargetDescriptorMetaBase;\n"],"mappings":";;;;;AA6BA,MAAa,+BAET;CAhBF,GAAG;CACH,oBAAoB;CACpB,WAAW;EACT,MAAM;EACN,OAAO;EACP,aAAa;EACb,qBAAqB;EACrB,iBAAiB;EACjB,iBAAiB;EACjB,mBAAmB;EACnB,oBAAoB;CACtB;AAKE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff-database-schema-Bfgshz4v.mjs","names":[],"sources":["../src/core/migrations/contract-to-postgres-database-schema-node.ts","../src/core/migrations/diff-database-schema.ts"],"sourcesContent":["import type { ContractToSchemaIROptions } from '@prisma-next/family-sql/control';\nimport { contractNamespaceToSchemaIR } from '@prisma-next/family-sql/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport { SqlForeignKeyIR } from '@prisma-next/sql-schema-ir/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { PostgresRlsPolicy } from '../postgres-rls-policy';\nimport type { PostgresContract } from '../postgres-schema';\nimport { isPostgresSchema } from '../postgres-schema';\nimport { PostgresDatabaseSchemaNode } from '../schema-ir/postgres-database-schema-node';\nimport { PostgresNamespaceSchemaNode } from '../schema-ir/postgres-namespace-schema-node';\nimport { PostgresNativeEnumSchemaNode } from '../schema-ir/postgres-native-enum-schema-node';\nimport { PostgresPolicySchemaNode } from '../schema-ir/postgres-policy-schema-node';\nimport { PostgresRoleSchemaNode } from '../schema-ir/postgres-role-schema-node';\nimport { PostgresTableSchemaNode } from '../schema-ir/postgres-table-schema-node';\nimport { resolveDdlSchemaForNamespaceStorage } from './resolve-ddl-schema';\n\nfunction toPolicyNode(policy: PostgresRlsPolicy, namespaceId: string): PostgresPolicySchemaNode {\n return new PostgresPolicySchemaNode({\n name: policy.name,\n prefix: policy.prefix,\n tableName: policy.tableName,\n namespaceId,\n operation: policy.operation,\n roles: [...policy.roles],\n ...ifDefined('using', policy.using),\n ...ifDefined('withCheck', policy.withCheck),\n permissive: policy.permissive,\n });\n}\n\n/**\n * Projects a Postgres contract into the expected schema-diff tree: a\n * `PostgresDatabaseSchemaNode` root holding one `PostgresNamespaceSchemaNode`\n * per Postgres namespace, each holding its `PostgresTableSchemaNode`s with\n * their `PostgresPolicySchemaNode`s, plus the database roles on the root.\n *\n * Not a duplicate of the family's `contractToSchemaIR`: that builds a flat,\n * single `{ tables }` map (and throws on cross-namespace name collisions, with\n * no RLS/role concept) for SQLite's single-schema world. This is the\n * Postgres-specific *tree* shape — multi-schema, RLS-policy-aware, role-aware.\n * It reuses the family's per-namespace table conversion (`contractNamespaceToSchemaIR`)\n * for column/FK/index building and only adds the Postgres tree/policy/role shape.\n *\n * Tables are grouped by their owning namespace (resolved DDL schema name) so\n * the tree mirrors Postgres's object hierarchy. The DDL schema name is\n * resolved once per namespace.\n *\n * A policy that references a table absent from its namespace is a malformed\n * contract — the loop throws rather than fabricating a stub table.\n */\nexport function contractToPostgresDatabaseSchemaNode(\n contract: PostgresContract | null,\n options: ContractToSchemaIROptions,\n): PostgresDatabaseSchemaNode {\n if (contract === null) {\n return new PostgresDatabaseSchemaNode({\n namespaces: {},\n roles: [],\n existingSchemas: [],\n pgVersion: '',\n });\n }\n\n const namespaces: Record<string, PostgresNamespaceSchemaNode> = {};\n const roles: PostgresRoleSchemaNode[] = [];\n const ownedSchemas: string[] = [];\n\n for (const ns of Object.values(contract.storage.namespaces)) {\n if (!isPostgresSchema(ns)) continue;\n\n // Role entries are root-level diff subjects: they hoist to the database\n // root from every slot and never count toward whether a namespace\n // materializes a schema node.\n for (const role of Object.values(ns.role)) {\n roles.push(new PostgresRoleSchemaNode({ name: role.name, namespaceId: role.namespaceId }));\n }\n\n // The unbound slot resolves its DDL schema to 'public', so it\n // materializes a schema node exactly when it has non-role content — a\n // late-binding contract keeps today's behavior (the slot carries the\n // tables), while a roles-only unbound slot alongside named namespaces\n // contributes only root roles and no node (which would otherwise be a\n // spurious empty 'public' node, clobbering a real bound 'public'\n // namespace's node keyed by the same resolved schema name).\n if (ns.id === UNBOUND_NAMESPACE_ID) {\n const hasNonRoleContent = Object.entries(ns.entries).some(\n ([entriesKey, slot]) => entriesKey !== 'role' && Object.keys(slot).length > 0,\n );\n if (!hasNonRoleContent) continue;\n }\n\n const ddlSchema = resolveDdlSchemaForNamespaceStorage(contract.storage, ns.id);\n ownedSchemas.push(ddlSchema);\n\n // Convert only THIS namespace's tables (passing the full storage for\n // type/value-set/enum resolution that spans namespaces), so the same table\n // name can exist in two schemas without colliding in a bare-keyed record.\n const sqlTables = contractNamespaceToSchemaIR(contract.storage, ns.id, options).tables;\n\n const policiesByTable = new Map<string, PostgresPolicySchemaNode[]>();\n for (const policy of Object.values(ns.policy)) {\n const list = policiesByTable.get(policy.tableName) ?? [];\n list.push(toPolicyNode(policy, ddlSchema));\n policiesByTable.set(policy.tableName, list);\n }\n\n const tables: Record<string, PostgresTableSchemaNode> = {};\n for (const tableName of Object.keys(ns.table)) {\n const sqlTable = sqlTables[tableName];\n if (sqlTable === undefined) continue;\n // The family conversion stamps `referencedSchema` only for bound FK\n // targets; an absent value means the FK targets the unbound namespace.\n // Postgres restores its own coordinate for that slot (the unbound\n // singleton's id) so the raw coordinate keeps qualifying REFERENCES\n // clauses, and resolves the real live DDL schema — introspected FKs\n // already carry the live schema, so this is what lets an expected FK\n // pair (by diff-node id) with its introspected counterpart.\n const foreignKeys = sqlTable.foreignKeys.map(\n (fk) =>\n new SqlForeignKeyIR({\n columns: fk.columns,\n referencedTable: fk.referencedTable,\n referencedColumns: fk.referencedColumns,\n referencedSchema: fk.referencedSchema ?? UNBOUND_NAMESPACE_ID,\n ...ifDefined('name', fk.name),\n ...ifDefined('onDelete', fk.onDelete),\n ...ifDefined('onUpdate', fk.onUpdate),\n ...ifDefined('annotations', fk.annotations),\n resolvedReferencedNamespace: resolveDdlSchemaForNamespaceStorage(\n contract.storage,\n fk.referencedSchema ?? UNBOUND_NAMESPACE_ID,\n ),\n }),\n );\n tables[tableName] = new PostgresTableSchemaNode({\n name: sqlTable.name,\n columns: sqlTable.columns,\n foreignKeys,\n uniques: sqlTable.uniques,\n indexes: sqlTable.indexes,\n ...ifDefined('primaryKey', sqlTable.primaryKey),\n ...ifDefined('annotations', sqlTable.annotations),\n ...ifDefined('checks', sqlTable.checks),\n policies: policiesByTable.get(tableName) ?? [],\n // Marker-driven, never derived from the policy set: the `rls` entry\n // is the single authored source of enablement.\n rlsEnabled: Object.hasOwn(ns.rls, tableName),\n });\n }\n\n for (const [tableName, tablePolicies] of policiesByTable) {\n if (!(tableName in tables)) {\n const policyName = tablePolicies[0]?.name ?? '(unknown)';\n throw new Error(\n `contract-to-postgres-database-schema-node: policy \"${policyName}\" references table \"${tableName}\" not present in namespace \"${ddlSchema}\"`,\n );\n }\n if (!Object.hasOwn(ns.rls, tableName)) {\n const policyPrefix = tablePolicies[0]?.prefix ?? '(unknown)';\n throw new Error(\n `contract-to-postgres-database-schema-node: policy \"${policyPrefix}\" targets table \"${tableName}\" in namespace \"${ddlSchema}\", which is not RLS-controlled. Mark the model with @@rls (entries.rls[\"${tableName}\"]) or remove the policy.`,\n );\n }\n }\n\n const nativeEnums = Object.values(ns.entries.native_enum ?? {}).map(\n (entity) =>\n new PostgresNativeEnumSchemaNode({\n typeName: entity.typeName,\n namespaceId: ddlSchema,\n members: entity.members,\n ...ifDefined('control', entity.control),\n }),\n );\n\n namespaces[ddlSchema] = new PostgresNamespaceSchemaNode({\n schemaName: ddlSchema,\n tables,\n nativeEnums,\n });\n }\n\n return new PostgresDatabaseSchemaNode({\n namespaces,\n roles,\n existingSchemas: ownedSchemas,\n pgVersion: '',\n });\n}\n","import type { Contract, ControlPolicy } from '@prisma-next/contract/types';\nimport type { SqlSchemaDiffResult } from '@prisma-next/family-sql/control';\nimport { buildNativeTypeExpander } from '@prisma-next/family-sql/control';\nimport { classifyDiffSubjectGranularity } from '@prisma-next/family-sql/diff';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type { DiffableNode, SchemaDiffIssue } from '@prisma-next/framework-components/control';\nimport { diffSchemas } from '@prisma-next/framework-components/control';\nimport { UNBOUND_NAMESPACE_ID } from '@prisma-next/framework-components/ir';\nimport type { SqlStorage } from '@prisma-next/sql-contract/types';\nimport type { SqlSchemaIRNode } from '@prisma-next/sql-schema-ir/types';\nimport { blindCast } from '@prisma-next/utils/casts';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { PostgresContract } from '../postgres-schema';\nimport { PostgresDatabaseSchemaNode } from '../schema-ir/postgres-database-schema-node';\nimport { PostgresNamespaceSchemaNode } from '../schema-ir/postgres-namespace-schema-node';\nimport {\n postgresDiffSubjectGranularity,\n type SqlSchemaDiffNode,\n} from '../schema-ir/schema-node-kinds';\nimport { contractToPostgresDatabaseSchemaNode } from './contract-to-postgres-database-schema-node';\nimport { resolvePostgresNodeIssueControlPolicySubject } from './control-policy';\n\n/**\n * Whether a diff issue's subject node is cluster-scoped — it carries its own\n * `namespaceId` field (only role and policy diff nodes do) and that\n * coordinate is the unbound sentinel, meaning the node is not owned by any\n * schema/namespace. A role node is always cluster-scoped (roles are\n * cluster-level objects); a policy node's `namespaceId` is always its\n * table's resolved DDL schema, never the sentinel. Namespace-ownership\n * scoping (which compares `issue.path[1]` against the set of DDL schemas\n * the contract owns) makes no sense for a cluster-scoped subject — its path\n * segment at that index is the object's own name, not a schema name — so\n * such an issue bypasses that scoping entirely.\n */\nfunction isClusterScopedIssue(issue: SchemaDiffIssue): boolean {\n const node = issue.expected ?? issue.actual;\n return node !== undefined && nodeNamespaceId(node) === UNBOUND_NAMESPACE_ID;\n}\n\nfunction nodeNamespaceId(node: DiffableNode): string | undefined {\n if (!Object.hasOwn(node, 'namespaceId')) return undefined;\n return blindCast<\n { namespaceId: string },\n 'presence of an own namespaceId field was just checked via Object.hasOwn'\n >(node).namespaceId;\n}\n\nfunction ownedSchemaNames(expected: PostgresDatabaseSchemaNode): ReadonlySet<string> {\n const policyNamespaces = Object.values(expected.namespaces).flatMap((ns) =>\n Object.values(ns.tables).flatMap((t) => t.policies.map((p) => p.namespaceId)),\n );\n return new Set([...policyNamespaces, ...expected.existingSchemas]);\n}\n\n/**\n * Drops contract namespaces that declare no tables from the verdict-diff\n * expected tree and the relational owned-schema set. The legacy relational\n * walk skipped a table-less namespace (e.g. an enums-only schema) before\n * pairing, so neither its DDL schema's absence nor that schema's live\n * relational contents ever reached the verdict — the pruned tree\n * reproduces that. The prune loses no expected policies: policies attach\n * to tables, so a table-less namespace carries none (the projection\n * throws on a policy referencing an absent table). Live policies in a\n * pruned schema remain governed via the full owned set (see\n * {@link diffPostgresSchema}).\n */\nfunction pruneTableLessNamespaces(\n expected: PostgresDatabaseSchemaNode,\n): PostgresDatabaseSchemaNode {\n const namespaces = Object.fromEntries(\n Object.entries(expected.namespaces).filter(([, ns]) => Object.keys(ns.tables).length > 0),\n );\n return new PostgresDatabaseSchemaNode({\n namespaces,\n roles: [...expected.roles],\n existingSchemas: expected.existingSchemas.filter((s) => namespaces[s] !== undefined),\n pgVersion: expected.pgVersion,\n });\n}\n\n/**\n * Resolves a verdict-diff issue's subject's declared control policy directly\n * from the contract, by delegating to the same node-typed resolver\n * ({@link resolvePostgresNodeIssueControlPolicySubject}) the planner uses to\n * gate DDL calls. `undefined` when the issue resolves to no contract subject.\n *\n * A role issue resolves through that same resolver to `external`\n * unconditionally (see its role branch), regardless of the contract's own\n * default policy: a role is referenced by the contract but not owned, and\n * `external`'s existing semantics — a missing declared subject still fails,\n * every extra is suppressed — are exactly the wanted asymmetric grading for\n * a cluster object the framework does not own.\n */\nfunction resolveControlPolicy(\n issue: SchemaDiffIssue,\n contract: Contract<SqlStorage>,\n): ControlPolicy | undefined {\n const nodeIssue = blindCast<\n SchemaDiffIssue<SqlSchemaDiffNode>,\n 'every node in a Postgres schema diff tree is a SqlSchemaDiffNode'\n >(issue);\n return resolvePostgresNodeIssueControlPolicySubject(nodeIssue, contract)\n ?.explicitNodeControlPolicy;\n}\n\n/**\n * The Postgres full-tree node diff for the family verify verdict: derive\n * the expected tree (resolved leaf values, expander threaded, FK schemas\n * resolved, table-less namespaces pruned), run the generic\n * differ over the trees as derived, and scope out `not-expected` findings under namespaces the\n * contract does not own. Ownership scoping bypasses cluster-scoped subjects\n * (roles today), mirroring the legacy decomposition: relational extras check\n * the PRUNED owned set (the legacy\n * per-namespace walk never visited a table-less namespace, so its live\n * relational contents are invisible), while `structural` extras (RLS\n * policies) check the FULL owned set (the legacy policy diff governed\n * every contract schema regardless of tables — RLS governance does not\n * shrink because a namespace declares no tables). The codec `verifyType`\n * hooks run once per contract namespace with tables against that\n * namespace's paired actual node (the hooks read namespace-scoped state\n * such as `nativeEnums`).\n */\nexport function diffPostgresSchema(input: {\n readonly contract: Contract<SqlStorage>;\n readonly schema: SqlSchemaIRNode;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}): SqlSchemaDiffResult {\n const postgresContract = blindCast<\n PostgresContract,\n 'diffPostgresSchema is only called with a postgres contract'\n >(input.contract);\n PostgresDatabaseSchemaNode.assert(input.schema);\n const actual = input.schema;\n const expandNativeType = buildNativeTypeExpander(input.frameworkComponents);\n const fullExpected = contractToPostgresDatabaseSchemaNode(postgresContract, {\n annotationNamespace: 'pg',\n ...ifDefined('expandNativeType', expandNativeType),\n });\n const expected = pruneTableLessNamespaces(fullExpected);\n const relationalOwned = ownedSchemaNames(expected);\n const structuralOwned = ownedSchemaNames(fullExpected);\n const issues = diffSchemas(expected, actual).filter((issue) => {\n if (issue.reason !== 'not-expected') return true;\n if (isClusterScopedIssue(issue)) return true;\n const granularity = classifyDiffSubjectGranularity(issue, postgresDiffSubjectGranularity);\n const namespaceSegment = issue.path[1];\n if (namespaceSegment === undefined) return true;\n const owned = granularity === 'structural' ? structuralOwned : relationalOwned;\n return owned.has(namespaceSegment);\n });\n const namespacePairs = Object.values(expected.namespaces).map((ns) => ({\n actual: actual.namespaces[ns.schemaName],\n }));\n return {\n issues,\n resolveControlPolicy: (issue) => resolveControlPolicy(issue, postgresContract),\n namespacePairs,\n };\n}\n\n/**\n * Adds an empty namespace node to the actual tree for every expected namespace\n * absent from it. The relational plan diff pairs on namespace: a contract\n * namespace whose live schema does not exist yet must surface each of its\n * tables as `not-found` (→ `CREATE TABLE`), NOT as a single namespace\n * `not-found` that subtree-coalescing would collapse (leaving `CREATE SCHEMA`\n * with no tables). Padding makes the namespaces pair, so only table/column/\n * policy drift surfaces; `CREATE SCHEMA` comes separately from the synthesized\n * namespace-presence stitch (`verifyPostgresNamespacePresence`), never from the\n * tree diff — matching the retired per-namespace-paired relational walk, which\n * paired a missing schema against an empty namespace node.\n */\nfunction padActualNamespaces(\n expected: PostgresDatabaseSchemaNode,\n actual: PostgresDatabaseSchemaNode,\n): PostgresDatabaseSchemaNode {\n const namespaces: Record<string, PostgresNamespaceSchemaNode> = { ...actual.namespaces };\n let padded = false;\n for (const schemaName of Object.keys(expected.namespaces)) {\n if (namespaces[schemaName] === undefined) {\n namespaces[schemaName] = new PostgresNamespaceSchemaNode({\n schemaName,\n tables: {},\n });\n padded = true;\n }\n }\n if (!padded) return actual;\n return new PostgresDatabaseSchemaNode({\n namespaces,\n roles: [...actual.roles],\n existingSchemas: [...actual.existingSchemas],\n pgVersion: actual.pgVersion,\n });\n}\n\nexport interface PostgresPlanDiff {\n /** The desired (\"end\") tree — resolved leaf values (incl. `codecRef`) on every column, table-less namespaces pruned. */\n readonly expected: PostgresDatabaseSchemaNode;\n /** The live (\"start\") tree, padded with empty namespaces so a missing schema's tables pair. */\n readonly actual: PostgresDatabaseSchemaNode;\n /** The one node diff over the two trees: relational + policy drift, cluster-scope-aware ownership filtered. */\n readonly issues: readonly SchemaDiffIssue<SqlSchemaDiffNode>[];\n}\n\n/**\n * The Postgres planner's diff input: the SAME tree-building\n * `diffPostgresSchema` uses (expander threaded, FK schemas resolved,\n * table-less namespaces pruned, cluster-scope-aware ownership filter) plus\n * actual namespace padding (so a missing\n * schema's tables surface as `not-found` instead of a swallowed namespace\n * `not-found`). One differ drives both verify and plan; this is the\n * plan-side derivation. The single issue list covers tables / columns /\n * constraints / indexes / defaults AND policies — the caller splits it\n * (relational → `mapNodeIssueToCall`; policy → RLS ops) and stitches in\n * `CREATE SCHEMA` separately.\n */\nexport function buildPostgresPlanDiff(input: {\n readonly contract: Contract<SqlStorage>;\n readonly actualSchema: SqlSchemaIRNode;\n readonly frameworkComponents: ReadonlyArray<TargetBoundComponentDescriptor<'sql', string>>;\n}): PostgresPlanDiff {\n const postgresContract = blindCast<\n PostgresContract,\n 'buildPostgresPlanDiff is only called with a postgres contract'\n >(input.contract);\n PostgresDatabaseSchemaNode.assert(input.actualSchema);\n const actual = input.actualSchema;\n const expandNativeType = buildNativeTypeExpander(input.frameworkComponents);\n const projectionOptions = {\n annotationNamespace: 'pg',\n ...ifDefined('expandNativeType', expandNativeType),\n };\n const fullExpected = contractToPostgresDatabaseSchemaNode(postgresContract, projectionOptions);\n const expected = pruneTableLessNamespaces(fullExpected);\n const paddedActual = padActualNamespaces(expected, actual);\n const relationalOwned = ownedSchemaNames(expected);\n const structuralOwned = ownedSchemaNames(fullExpected);\n const issues = blindCast<\n readonly SchemaDiffIssue<SqlSchemaDiffNode>[],\n 'both trees are PostgresDatabaseSchemaNodes, so every diff-issue node is a SqlSchemaDiffNode'\n >(diffSchemas(expected, paddedActual)).filter((issue) => {\n if (issue.reason !== 'not-expected') return true;\n if (isClusterScopedIssue(issue)) return true;\n const granularity = classifyDiffSubjectGranularity(issue, postgresDiffSubjectGranularity);\n const namespaceSegment = issue.path[1];\n if (namespaceSegment === undefined) return true;\n const owned = granularity === 'structural' ? structuralOwned : relationalOwned;\n return owned.has(namespaceSegment);\n });\n return { expected, actual: paddedActual, issues };\n}\n"],"mappings":"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"}