@prisma-next/target-postgres 0.12.0-dev.9 → 0.13.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/{codec-ids-DliyCWPY.d.mts → codec-ids-B1vOchLE.d.mts} +3 -2
  2. package/dist/codec-ids-B1vOchLE.d.mts.map +1 -0
  3. package/dist/{codec-ids-C5qzBqus.mjs → codec-ids-CTikp1if.mjs} +3 -2
  4. package/dist/codec-ids-CTikp1if.mjs.map +1 -0
  5. package/dist/codec-ids.d.mts +2 -2
  6. package/dist/codec-ids.mjs +2 -2
  7. package/dist/{codec-types-BF1DXTPs.d.mts → codec-types-CnFiNML4.d.mts} +8 -9
  8. package/dist/codec-types-CnFiNML4.d.mts.map +1 -0
  9. package/dist/codec-types.d.mts +2 -2
  10. package/dist/{codecs-DuP3d9Au.d.mts → codecs-CBpEv4s5.d.mts} +33 -35
  11. package/dist/codecs-CBpEv4s5.d.mts.map +1 -0
  12. package/dist/codecs.d.mts +1 -1
  13. package/dist/codecs.mjs +37 -2
  14. package/dist/codecs.mjs.map +1 -1
  15. package/dist/contract-free.d.mts +80 -0
  16. package/dist/contract-free.d.mts.map +1 -0
  17. package/dist/contract-free.mjs +117 -0
  18. package/dist/contract-free.mjs.map +1 -0
  19. package/dist/control.d.mts +1 -1
  20. package/dist/control.d.mts.map +1 -1
  21. package/dist/control.mjs +66 -40
  22. package/dist/control.mjs.map +1 -1
  23. package/dist/{data-transform-CRkv2T_U.mjs → data-transform-D25tLeYU.mjs} +1 -1
  24. package/dist/{data-transform-CRkv2T_U.mjs.map → data-transform-D25tLeYU.mjs.map} +1 -1
  25. package/dist/{data-transform-CAPmAdxS.d.mts → data-transform-DGOqcLrf.d.mts} +2 -2
  26. package/dist/{data-transform-CAPmAdxS.d.mts.map → data-transform-DGOqcLrf.d.mts.map} +1 -1
  27. package/dist/data-transform.d.mts +1 -1
  28. package/dist/data-transform.mjs +1 -1
  29. package/dist/ddl-77SyXgFt.mjs +30 -0
  30. package/dist/ddl-77SyXgFt.mjs.map +1 -0
  31. package/dist/ddl.d.mts +2 -0
  32. package/dist/ddl.mjs +2 -0
  33. package/dist/{default-normalizer-DaAhmzBV.mjs → default-normalizer-DyyCHQWs.mjs} +1 -1
  34. package/dist/{default-normalizer-DaAhmzBV.mjs.map → default-normalizer-DyyCHQWs.mjs.map} +1 -1
  35. package/dist/default-normalizer.mjs +1 -1
  36. package/dist/{descriptor-meta-Uu8QaClr.mjs → descriptor-meta-DKmj-IMN.mjs} +3 -2
  37. package/dist/descriptor-meta-DKmj-IMN.mjs.map +1 -0
  38. package/dist/{descriptor-meta-runtime-DMRX39kp.mjs → descriptor-meta-runtime-My8_s4cs.mjs} +2 -2
  39. package/dist/{descriptor-meta-runtime-DMRX39kp.mjs.map → descriptor-meta-runtime-My8_s4cs.mjs.map} +1 -1
  40. package/dist/{enum-planning-DRA9LaMU.mjs → enum-planning-BCyvlFHk.mjs} +0 -0
  41. package/dist/{enum-planning-DRA9LaMU.mjs.map → enum-planning-BCyvlFHk.mjs.map} +1 -1
  42. package/dist/enum-planning.d.mts +1 -1
  43. package/dist/enum-planning.mjs +1 -1
  44. package/dist/{errors-BbnITmAD.mjs → errors-CUk87ByX.mjs} +1 -1
  45. package/dist/{errors-BbnITmAD.mjs.map → errors-CUk87ByX.mjs.map} +1 -1
  46. package/dist/errors.d.mts.map +1 -1
  47. package/dist/errors.mjs +1 -1
  48. package/dist/{issue-planner-BtaL6OfW.mjs → issue-planner-Br0pt1Ea.mjs} +130 -28
  49. package/dist/issue-planner-Br0pt1Ea.mjs.map +1 -0
  50. package/dist/issue-planner.d.mts +1 -1
  51. package/dist/issue-planner.d.mts.map +1 -1
  52. package/dist/issue-planner.mjs +1 -1
  53. package/dist/migration.d.mts +7 -8
  54. package/dist/migration.d.mts.map +1 -1
  55. package/dist/migration.mjs +5 -4
  56. package/dist/migration.mjs.map +1 -1
  57. package/dist/{native-type-normalizer-BNEQ9VDs.mjs → native-type-normalizer-Bc9XJzWC.mjs} +1 -1
  58. package/dist/{native-type-normalizer-BNEQ9VDs.mjs.map → native-type-normalizer-Bc9XJzWC.mjs.map} +1 -1
  59. package/dist/native-type-normalizer.mjs +1 -1
  60. package/dist/nodes-779hmCfL.d.mts +40 -0
  61. package/dist/nodes-779hmCfL.d.mts.map +1 -0
  62. package/dist/nodes-DZk2JZG3.mjs +47 -0
  63. package/dist/nodes-DZk2JZG3.mjs.map +1 -0
  64. package/dist/op-factory-call-D2aAUhmS.mjs +1307 -0
  65. package/dist/op-factory-call-D2aAUhmS.mjs.map +1 -0
  66. package/dist/{op-factory-call-CDlImOF_.d.mts → op-factory-call-DMA86_2D.d.mts} +39 -14
  67. package/dist/op-factory-call-DMA86_2D.d.mts.map +1 -0
  68. package/dist/op-factory-call.d.mts +2 -2
  69. package/dist/op-factory-call.mjs +2 -2
  70. package/dist/pack.d.mts +5 -6
  71. package/dist/pack.d.mts.map +1 -1
  72. package/dist/pack.mjs +1 -1
  73. package/dist/planner-CAYPJObw.mjs +344 -0
  74. package/dist/planner-CAYPJObw.mjs.map +1 -0
  75. package/dist/{planner-ddl-builders-BNMfSE9r.mjs → planner-ddl-builders-Cw2n2llW.mjs} +7 -30
  76. package/dist/planner-ddl-builders-Cw2n2llW.mjs.map +1 -0
  77. package/dist/planner-ddl-builders.d.mts +6 -7
  78. package/dist/planner-ddl-builders.d.mts.map +1 -1
  79. package/dist/planner-ddl-builders.mjs +2 -2
  80. package/dist/{planner-identity-values-nhVj0hp-.mjs → planner-identity-values-BIpa5p2I.mjs} +1 -1
  81. package/dist/{planner-identity-values-nhVj0hp-.mjs.map → planner-identity-values-BIpa5p2I.mjs.map} +1 -1
  82. package/dist/planner-identity-values.mjs +1 -1
  83. package/dist/{planner-produced-postgres-migration-D02NOhVQ.d.mts → planner-produced-postgres-migration-B4EDvLdz.d.mts} +5 -4
  84. package/dist/planner-produced-postgres-migration-B4EDvLdz.d.mts.map +1 -0
  85. package/dist/{planner-produced-postgres-migration-D_nsXbhl.mjs → planner-produced-postgres-migration-NSEhWL0L.mjs} +8 -6
  86. package/dist/planner-produced-postgres-migration-NSEhWL0L.mjs.map +1 -0
  87. package/dist/planner-produced-postgres-migration.d.mts +1 -1
  88. package/dist/planner-produced-postgres-migration.mjs +1 -1
  89. package/dist/{planner-schema-lookup-CGxxYfnD.mjs → planner-schema-lookup-CiVaAQP-.mjs} +1 -1
  90. package/dist/{planner-schema-lookup-CGxxYfnD.mjs.map → planner-schema-lookup-CiVaAQP-.mjs.map} +1 -1
  91. package/dist/planner-schema-lookup.mjs +1 -1
  92. package/dist/{planner-sql-checks-CfEiTXoQ.mjs → planner-sql-checks-DAdhnI2c.mjs} +41 -30
  93. package/dist/planner-sql-checks-DAdhnI2c.mjs.map +1 -0
  94. package/dist/planner-sql-checks.d.mts.map +1 -1
  95. package/dist/planner-sql-checks.mjs +1 -1
  96. package/dist/{planner-target-details-a_wuOiYf.d.mts → planner-target-details-CIY6tLeo.d.mts} +2 -2
  97. package/dist/planner-target-details-CIY6tLeo.d.mts.map +1 -0
  98. package/dist/planner-target-details.d.mts +2 -2
  99. package/dist/planner-type-resolution-836DExFN.mjs +20 -0
  100. package/dist/planner-type-resolution-836DExFN.mjs.map +1 -0
  101. package/dist/planner.d.mts +7 -3
  102. package/dist/planner.d.mts.map +1 -1
  103. package/dist/planner.mjs +1 -1
  104. package/dist/{postgres-contract-serializer-BnOboPWs.mjs → postgres-contract-serializer-DYTyXjPf.mjs} +33 -24
  105. package/dist/postgres-contract-serializer-DYTyXjPf.mjs.map +1 -0
  106. package/dist/{postgres-enum-type-CSzsvXrO.d.mts → postgres-enum-type-BVn63a89.d.mts} +1 -1
  107. package/dist/{postgres-enum-type-CSzsvXrO.d.mts.map → postgres-enum-type-BVn63a89.d.mts.map} +1 -1
  108. package/dist/{postgres-enum-type-BMgyxNyy.mjs → postgres-enum-type-DPKqCBem.mjs} +1 -1
  109. package/dist/{postgres-enum-type-BMgyxNyy.mjs.map → postgres-enum-type-DPKqCBem.mjs.map} +1 -1
  110. package/dist/{postgres-migration-BatbEvU6.mjs → postgres-migration-COore9Mz.mjs} +23 -3
  111. package/dist/postgres-migration-COore9Mz.mjs.map +1 -0
  112. package/dist/{postgres-migration-DRY8V-bQ.d.mts → postgres-migration-DZ_gLUOW.d.mts} +25 -3
  113. package/dist/postgres-migration-DZ_gLUOW.d.mts.map +1 -0
  114. package/dist/{postgres-schema-BxAuNFX0.mjs → postgres-schema-BuxCxbvB.mjs} +29 -14
  115. package/dist/postgres-schema-BuxCxbvB.mjs.map +1 -0
  116. package/dist/{render-ops-XhICjX_P.mjs → render-ops-BpjstrKQ.mjs} +4 -3
  117. package/dist/{render-ops-XhICjX_P.mjs.map → render-ops-BpjstrKQ.mjs.map} +1 -1
  118. package/dist/render-ops.d.mts +3 -2
  119. package/dist/render-ops.d.mts.map +1 -1
  120. package/dist/render-ops.mjs +1 -1
  121. package/dist/{render-typescript-K125n-RZ.mjs → render-typescript-KMgosran.mjs} +5 -2
  122. package/dist/render-typescript-KMgosran.mjs.map +1 -0
  123. package/dist/render-typescript.mjs +1 -1
  124. package/dist/runtime.d.mts.map +1 -1
  125. package/dist/runtime.mjs +2 -2
  126. package/dist/{shared-Do_a5ymU.d.mts → shared-DarONYBZ.d.mts} +5 -5
  127. package/dist/{shared-Do_a5ymU.d.mts.map → shared-DarONYBZ.d.mts.map} +1 -1
  128. package/dist/{sql-utils-CggjWNij.mjs → sql-utils-DcfMz4MQ.mjs} +1 -1
  129. package/dist/{sql-utils-CggjWNij.mjs.map → sql-utils-DcfMz4MQ.mjs.map} +1 -1
  130. package/dist/sql-utils.mjs +1 -1
  131. package/dist/{types-O40IcFV9.d.mts → types-BDKkx8MA.d.mts} +1 -1
  132. package/dist/types-BDKkx8MA.d.mts.map +1 -0
  133. package/dist/types.d.mts +16 -11
  134. package/dist/types.d.mts.map +1 -1
  135. package/dist/types.mjs +2 -2
  136. package/package.json +21 -20
  137. package/src/contract-free/columns.ts +49 -0
  138. package/src/contract-free/control-bootstrap.ts +55 -0
  139. package/src/contract-free/ddl.ts +37 -0
  140. package/src/core/ast/table-source.ts +23 -0
  141. package/src/core/codec-ids.ts +1 -0
  142. package/src/core/codecs.ts +44 -0
  143. package/src/core/ddl/nodes.ts +72 -0
  144. package/src/core/descriptor-meta.ts +1 -0
  145. package/src/core/migrations/control-policy.ts +234 -0
  146. package/src/core/migrations/issue-planner.ts +81 -13
  147. package/src/core/migrations/op-factory-call.ts +289 -46
  148. package/src/core/migrations/operations/constraints.ts +79 -10
  149. package/src/core/migrations/operations/dependencies.ts +0 -17
  150. package/src/core/migrations/operations/shared.ts +3 -3
  151. package/src/core/migrations/operations/tables.ts +1 -39
  152. package/src/core/migrations/planner-ddl-builders.ts +7 -48
  153. package/src/core/migrations/planner-produced-postgres-migration.ts +11 -6
  154. package/src/core/migrations/planner-sql-checks.ts +9 -9
  155. package/src/core/migrations/planner-strategies.ts +149 -11
  156. package/src/core/migrations/planner-target-details.ts +2 -1
  157. package/src/core/migrations/planner.ts +66 -8
  158. package/src/core/migrations/postgres-migration.ts +41 -0
  159. package/src/core/migrations/render-ops.ts +7 -2
  160. package/src/core/migrations/render-typescript.ts +5 -1
  161. package/src/core/migrations/runner.ts +78 -50
  162. package/src/core/postgres-contract-serializer.ts +52 -46
  163. package/src/core/postgres-schema.ts +43 -25
  164. package/src/exports/contract-free.ts +7 -0
  165. package/src/exports/control.ts +6 -8
  166. package/src/exports/ddl.ts +7 -0
  167. package/src/exports/migration.ts +11 -2
  168. package/src/exports/op-factory-call.ts +2 -0
  169. package/src/exports/planner-ddl-builders.ts +0 -1
  170. package/dist/codec-ids-C5qzBqus.mjs.map +0 -1
  171. package/dist/codec-ids-DliyCWPY.d.mts.map +0 -1
  172. package/dist/codec-types-BF1DXTPs.d.mts.map +0 -1
  173. package/dist/codecs-DuP3d9Au.d.mts.map +0 -1
  174. package/dist/descriptor-meta-Uu8QaClr.mjs.map +0 -1
  175. package/dist/issue-planner-BtaL6OfW.mjs.map +0 -1
  176. package/dist/op-factory-call-CDlImOF_.d.mts.map +0 -1
  177. package/dist/op-factory-call-ewOd5q6L.mjs +0 -625
  178. package/dist/op-factory-call-ewOd5q6L.mjs.map +0 -1
  179. package/dist/planner-Bjz5pnLa.mjs +0 -177
  180. package/dist/planner-Bjz5pnLa.mjs.map +0 -1
  181. package/dist/planner-ddl-builders-BNMfSE9r.mjs.map +0 -1
  182. package/dist/planner-produced-postgres-migration-D02NOhVQ.d.mts.map +0 -1
  183. package/dist/planner-produced-postgres-migration-D_nsXbhl.mjs.map +0 -1
  184. package/dist/planner-sql-checks-CfEiTXoQ.mjs.map +0 -1
  185. package/dist/planner-target-details-a_wuOiYf.d.mts.map +0 -1
  186. package/dist/postgres-contract-serializer-BnOboPWs.mjs.map +0 -1
  187. package/dist/postgres-migration-BatbEvU6.mjs.map +0 -1
  188. package/dist/postgres-migration-DRY8V-bQ.d.mts.map +0 -1
  189. package/dist/postgres-schema-BxAuNFX0.mjs.map +0 -1
  190. package/dist/render-typescript-K125n-RZ.mjs.map +0 -1
  191. package/dist/statement-builders-DVI5IVAa.mjs +0 -131
  192. package/dist/statement-builders-DVI5IVAa.mjs.map +0 -1
  193. package/dist/statement-builders.d.mts +0 -51
  194. package/dist/statement-builders.d.mts.map +0 -1
  195. package/dist/statement-builders.mjs +0 -2
  196. package/dist/tables-DoA39Yqo.mjs +0 -516
  197. package/dist/tables-DoA39Yqo.mjs.map +0 -1
  198. package/dist/types-O40IcFV9.d.mts.map +0 -1
  199. package/src/core/migrations/statement-builders.ts +0 -183
  200. package/src/exports/statement-builders.ts +0 -8
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-builders-DVI5IVAa.mjs","names":["APP_SPACE_ID"],"sources":["../src/core/migrations/statement-builders.ts"],"sourcesContent":["import { APP_SPACE_ID } from '@prisma-next/framework-components/control';\n\nexport { APP_SPACE_ID };\n\nexport interface SqlStatement {\n readonly sql: string;\n readonly params: readonly unknown[];\n}\n\nexport const ensurePrismaContractSchemaStatement: SqlStatement = {\n sql: 'create schema if not exists prisma_contract',\n params: [],\n};\n\n/**\n * Schema for `prisma_contract.marker`. The `space text` primary key\n * supports one row per loaded contract space (`'app'`,\n * `'<extension-id>'`, …); on a brand-new database `CREATE TABLE IF NOT\n * EXISTS` produces this shape directly. The migration runner detects\n * pre-1.0 single-row markers (no `space` column) at boot and fails with\n * a structured `LEGACY_MARKER_SHAPE` error rather than auto-migrating —\n * see `specs/framework-mechanism.spec.md § 2`.\n */\nexport const ensureMarkerTableStatement: SqlStatement = {\n sql: `create table if not exists prisma_contract.marker (\n space text not null primary key default '${APP_SPACE_ID}',\n core_hash text not null,\n profile_hash text not null,\n contract_json jsonb,\n canonical_version int,\n updated_at timestamptz not null default now(),\n app_tag text,\n meta jsonb not null default '{}',\n invariants text[] not null default '{}'\n )`,\n params: [],\n};\n\nexport const ensureLedgerTableStatement: SqlStatement = {\n sql: `create table if not exists prisma_contract.ledger (\n id bigserial primary key,\n created_at timestamptz not null default now(),\n origin_core_hash text,\n origin_profile_hash text,\n destination_core_hash text not null,\n destination_profile_hash text,\n contract_json_before jsonb,\n contract_json_after jsonb,\n operations jsonb not null\n )`,\n params: [],\n};\n\nexport interface MergeMarkerInput {\n /**\n * Logical space identifier for this marker row. Required at every\n * call site so the type system surfaces every place that needs to\n * thread the value (rather than letting an `?? APP_SPACE_ID`\n * fall-through silently collapse per-space markers onto the\n * `'app'` row). App-plan callers pass {@link APP_SPACE_ID}\n * (`'app'`); per-extension callers (planner / runner / verifier\n * extensions over contract spaces) pass the extension's space id.\n */\n readonly space: string;\n readonly storageHash: string;\n readonly profileHash: string;\n readonly contractJson?: unknown;\n readonly canonicalVersion?: number | null;\n readonly appTag?: string | null;\n readonly meta?: Record<string, unknown>;\n /**\n * Invariants to merge into `marker.invariants`. INSERT writes them as\n * the initial value (callers are expected to pass a sorted, deduped\n * array). UPDATE merges them with the existing column server-side via\n * a single atomic SQL expression.\n */\n readonly invariants: readonly string[];\n}\n\nexport function buildMergeMarkerStatements(input: MergeMarkerInput): {\n readonly insert: SqlStatement;\n readonly update: SqlStatement;\n} {\n const params: readonly unknown[] = [\n input.space,\n input.storageHash,\n input.profileHash,\n jsonParam(input.contractJson),\n input.canonicalVersion ?? null,\n input.appTag ?? null,\n jsonParam(input.meta ?? {}),\n input.invariants,\n ];\n\n return {\n insert: {\n sql: `insert into prisma_contract.marker (\n space,\n core_hash,\n profile_hash,\n contract_json,\n canonical_version,\n updated_at,\n app_tag,\n meta,\n invariants\n ) values (\n $1,\n $2,\n $3,\n $4::jsonb,\n $5,\n now(),\n $6,\n $7::jsonb,\n $8::text[]\n )`,\n params,\n },\n update: {\n // `invariants = array(select distinct unnest(invariants || $8::text[]) order by 1)`\n // reads the current column value under the UPDATE's row lock, unions\n // with the incoming array, dedupes, and sorts ascending — single\n // statement, atomic, no read-then-write window.\n sql: `update prisma_contract.marker set\n core_hash = $2,\n profile_hash = $3,\n contract_json = $4::jsonb,\n canonical_version = $5,\n updated_at = now(),\n app_tag = $6,\n meta = $7::jsonb,\n invariants = array(select distinct unnest(invariants || $8::text[]) order by 1)\n where space = $1`,\n params,\n },\n };\n}\n\nexport interface LedgerInsertInput {\n readonly originStorageHash?: string | null;\n readonly originProfileHash?: string | null;\n readonly destinationStorageHash: string;\n readonly destinationProfileHash?: string | null;\n readonly contractJsonBefore?: unknown;\n readonly contractJsonAfter?: unknown;\n readonly operations: unknown;\n}\n\nexport function buildLedgerInsertStatement(input: LedgerInsertInput): SqlStatement {\n return {\n sql: `insert into prisma_contract.ledger (\n origin_core_hash,\n origin_profile_hash,\n destination_core_hash,\n destination_profile_hash,\n contract_json_before,\n contract_json_after,\n operations\n ) values (\n $1,\n $2,\n $3,\n $4,\n $5::jsonb,\n $6::jsonb,\n $7::jsonb\n )`,\n params: [\n input.originStorageHash ?? null,\n input.originProfileHash ?? null,\n input.destinationStorageHash,\n input.destinationProfileHash ?? null,\n jsonParam(input.contractJsonBefore),\n jsonParam(input.contractJsonAfter),\n jsonParam(input.operations),\n ],\n };\n}\n\nfunction jsonParam(value: unknown): string {\n return JSON.stringify(value ?? null);\n}\n"],"mappings":";;AASA,MAAa,sCAAoD;CAC/D,KAAK;CACL,QAAQ,CAAC;AACX;;;;;;;;;;AAWA,MAAa,6BAA2C;CACtD,KAAK;+CACwCA,eAAa;;;;;;;;;;CAU1D,QAAQ,CAAC;AACX;AAEA,MAAa,6BAA2C;CACtD,KAAK;;;;;;;;;;;CAWL,QAAQ,CAAC;AACX;AA4BA,SAAgB,2BAA2B,OAGzC;CACA,MAAM,SAA6B;EACjC,MAAM;EACN,MAAM;EACN,MAAM;EACN,UAAU,MAAM,YAAY;EAC5B,MAAM,oBAAoB;EAC1B,MAAM,UAAU;EAChB,UAAU,MAAM,QAAQ,CAAC,CAAC;EAC1B,MAAM;CACR;CAEA,OAAO;EACL,QAAQ;GACN,KAAK;;;;;;;;;;;;;;;;;;;;;GAqBL;EACF;EACA,QAAQ;GAKN,KAAK;;;;;;;;;;GAUL;EACF;CACF;AACF;AAYA,SAAgB,2BAA2B,OAAwC;CACjF,OAAO;EACL,KAAK;;;;;;;;;;;;;;;;;EAiBL,QAAQ;GACN,MAAM,qBAAqB;GAC3B,MAAM,qBAAqB;GAC3B,MAAM;GACN,MAAM,0BAA0B;GAChC,UAAU,MAAM,kBAAkB;GAClC,UAAU,MAAM,iBAAiB;GACjC,UAAU,MAAM,UAAU;EAC5B;CACF;AACF;AAEA,SAAS,UAAU,OAAwB;CACzC,OAAO,KAAK,UAAU,SAAS,IAAI;AACrC"}
@@ -1,51 +0,0 @@
1
- import { APP_SPACE_ID } from "@prisma-next/framework-components/control";
2
-
3
- //#region src/core/migrations/statement-builders.d.ts
4
- interface SqlStatement {
5
- readonly sql: string;
6
- readonly params: readonly unknown[];
7
- }
8
- declare const ensurePrismaContractSchemaStatement: SqlStatement;
9
- /**
10
- * Schema for `prisma_contract.marker`. The `space text` primary key
11
- * supports one row per loaded contract space (`'app'`,
12
- * `'<extension-id>'`, …); on a brand-new database `CREATE TABLE IF NOT
13
- * EXISTS` produces this shape directly. The migration runner detects
14
- * pre-1.0 single-row markers (no `space` column) at boot and fails with
15
- * a structured `LEGACY_MARKER_SHAPE` error rather than auto-migrating —
16
- * see `specs/framework-mechanism.spec.md § 2`.
17
- */
18
- declare const ensureMarkerTableStatement: SqlStatement;
19
- declare const ensureLedgerTableStatement: SqlStatement;
20
- interface MergeMarkerInput {
21
- /**
22
- * Logical space identifier for this marker row. Required at every
23
- * call site so the type system surfaces every place that needs to
24
- * thread the value (rather than letting an `?? APP_SPACE_ID`
25
- * fall-through silently collapse per-space markers onto the
26
- * `'app'` row). App-plan callers pass {@link APP_SPACE_ID}
27
- * (`'app'`); per-extension callers (planner / runner / verifier
28
- * extensions over contract spaces) pass the extension's space id.
29
- */
30
- readonly space: string;
31
- readonly storageHash: string;
32
- readonly profileHash: string;
33
- readonly contractJson?: unknown;
34
- readonly canonicalVersion?: number | null;
35
- readonly appTag?: string | null;
36
- readonly meta?: Record<string, unknown>;
37
- /**
38
- * Invariants to merge into `marker.invariants`. INSERT writes them as
39
- * the initial value (callers are expected to pass a sorted, deduped
40
- * array). UPDATE merges them with the existing column server-side via
41
- * a single atomic SQL expression.
42
- */
43
- readonly invariants: readonly string[];
44
- }
45
- declare function buildMergeMarkerStatements(input: MergeMarkerInput): {
46
- readonly insert: SqlStatement;
47
- readonly update: SqlStatement;
48
- };
49
- //#endregion
50
- export { APP_SPACE_ID, type SqlStatement, buildMergeMarkerStatements, ensureLedgerTableStatement, ensureMarkerTableStatement, ensurePrismaContractSchemaStatement };
51
- //# sourceMappingURL=statement-builders.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statement-builders.d.mts","names":[],"sources":["../src/core/migrations/statement-builders.ts"],"mappings":";;;UAIiB,YAAA;EAAA,SACN,GAAA;EAAA,SACA,MAAM;AAAA;AAAA,cAGJ,mCAAA,EAAqC,YAGjD;AANgB;AAGjB;;;;AAGC;AAWD;;;AAjBiB,cAiBJ,0BAAA,EAA4B,YAaxC;AAAA,cAEY,0BAAA,EAA4B,YAaxC;AAAA,UAEgB,gBAAA;EAFhB;;;AAAA;AAED;;;;;EAFC,SAYU,KAAA;EAAA,SACA,WAAA;EAAA,SACA,WAAA;EAAA,SACA,YAAA;EAAA,SACA,gBAAA;EAAA,SACA,MAAA;EAAA,SACA,IAAA,GAAO,MAAM;EAOb;;AAAU;AAGrB;;;EAHW,SAAA,UAAA;AAAA;AAAA,iBAGK,0BAAA,CAA2B,KAAA,EAAO,gBAAA;EAAA,SACvC,MAAA,EAAQ,YAAA;EAAA,SACR,MAAA,EAAQ,YAAA;AAAA"}
@@ -1,2 +0,0 @@
1
- import { a as ensureMarkerTableStatement, i as ensureLedgerTableStatement, o as ensurePrismaContractSchemaStatement, r as buildMergeMarkerStatements, t as APP_SPACE_ID } from "./statement-builders-DVI5IVAa.mjs";
2
- export { APP_SPACE_ID, buildMergeMarkerStatements, ensureLedgerTableStatement, ensureMarkerTableStatement, ensurePrismaContractSchemaStatement };
@@ -1,516 +0,0 @@
1
- import { i as quoteIdentifier, n as escapeLiteral, r as qualifyName } from "./sql-utils-CggjWNij.mjs";
2
- import { a as columnNullabilityCheck, c as qualifyTableName, d as toRegclassLiteral, n as columnDefaultExistsCheck, o as columnTypeCheck, r as columnExistsCheck, s as constraintExistsCheck } from "./planner-sql-checks-CfEiTXoQ.mjs";
3
- import { ifDefined } from "@prisma-next/utils/defined";
4
- //#region src/core/migrations/operations/shared.ts
5
- function step(description, sql) {
6
- return {
7
- description,
8
- sql
9
- };
10
- }
11
- function targetDetails(objectType, name, schema, table) {
12
- return {
13
- id: "postgres",
14
- details: {
15
- schema,
16
- objectType,
17
- name,
18
- ...ifDefined("table", table)
19
- }
20
- };
21
- }
22
- function renderColumnDefinition(column) {
23
- return [
24
- quoteIdentifier(column.name),
25
- column.typeSql,
26
- column.defaultSql,
27
- column.nullable ? "" : "NOT NULL"
28
- ].filter(Boolean).join(" ");
29
- }
30
- //#endregion
31
- //#region src/core/migrations/operations/columns.ts
32
- function addColumn(schemaName, tableName, column) {
33
- const addSql = [
34
- `ALTER TABLE ${qualifyTableName(schemaName, tableName)}`,
35
- `ADD COLUMN ${quoteIdentifier(column.name)} ${column.typeSql}`,
36
- column.defaultSql,
37
- column.nullable ? "" : "NOT NULL"
38
- ].filter(Boolean).join(" ");
39
- return {
40
- id: `column.${tableName}.${column.name}`,
41
- label: `Add column "${column.name}" to "${tableName}"`,
42
- operationClass: "additive",
43
- target: targetDetails("column", column.name, schemaName, tableName),
44
- precheck: [step(`ensure column "${column.name}" is missing`, columnExistsCheck({
45
- schema: schemaName,
46
- table: tableName,
47
- column: column.name,
48
- exists: false
49
- }))],
50
- execute: [step(`add column "${column.name}"`, addSql)],
51
- postcheck: [step(`verify column "${column.name}" exists`, columnExistsCheck({
52
- schema: schemaName,
53
- table: tableName,
54
- column: column.name
55
- }))]
56
- };
57
- }
58
- function dropColumn(schemaName, tableName, columnName) {
59
- const qualified = qualifyTableName(schemaName, tableName);
60
- return {
61
- id: `dropColumn.${tableName}.${columnName}`,
62
- label: `Drop column "${columnName}" from "${tableName}"`,
63
- operationClass: "destructive",
64
- target: targetDetails("column", columnName, schemaName, tableName),
65
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
66
- schema: schemaName,
67
- table: tableName,
68
- column: columnName
69
- }))],
70
- execute: [step(`drop column "${columnName}"`, `ALTER TABLE ${qualified} DROP COLUMN ${quoteIdentifier(columnName)}`)],
71
- postcheck: [step(`verify column "${columnName}" does not exist`, columnExistsCheck({
72
- schema: schemaName,
73
- table: tableName,
74
- column: columnName,
75
- exists: false
76
- }))]
77
- };
78
- }
79
- /**
80
- * `qualifiedTargetType` is the new column type as it appears in the
81
- * `ALTER COLUMN TYPE` clause (schema-qualified for user-defined types, raw
82
- * native name for built-ins). `formatTypeExpected` is the unqualified
83
- * `format_type` form used in the postcheck. `rawTargetTypeForLabel` is the
84
- * string appearing in the human-readable label (typically `toType` when
85
- * explicit, else the column's native type).
86
- */
87
- function alterColumnType(schemaName, tableName, columnName, options) {
88
- const qualified = qualifyTableName(schemaName, tableName);
89
- const usingClause = options.using ? ` USING ${options.using}` : ` USING ${quoteIdentifier(columnName)}::${options.qualifiedTargetType}`;
90
- return {
91
- id: `alterType.${tableName}.${columnName}`,
92
- label: `Alter type of "${tableName}"."${columnName}" to ${options.rawTargetTypeForLabel}`,
93
- operationClass: "destructive",
94
- target: targetDetails("column", columnName, schemaName, tableName),
95
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
96
- schema: schemaName,
97
- table: tableName,
98
- column: columnName
99
- }))],
100
- execute: [step(`alter type of "${columnName}"`, `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} TYPE ${options.qualifiedTargetType}${usingClause}`)],
101
- postcheck: [step(`verify column "${columnName}" has type "${options.formatTypeExpected}"`, columnTypeCheck({
102
- schema: schemaName,
103
- table: tableName,
104
- column: columnName,
105
- expectedType: options.formatTypeExpected
106
- }))],
107
- meta: { warning: "TABLE_REWRITE" }
108
- };
109
- }
110
- function setNotNull(schemaName, tableName, columnName) {
111
- const qualified = qualifyTableName(schemaName, tableName);
112
- return {
113
- id: `alterNullability.setNotNull.${tableName}.${columnName}`,
114
- label: `Set NOT NULL on "${tableName}"."${columnName}"`,
115
- operationClass: "destructive",
116
- target: targetDetails("column", columnName, schemaName, tableName),
117
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
118
- schema: schemaName,
119
- table: tableName,
120
- column: columnName
121
- })), step(`ensure no NULL values in "${columnName}"`, `SELECT NOT EXISTS (SELECT 1 FROM ${qualified} WHERE ${quoteIdentifier(columnName)} IS NULL)`)],
122
- execute: [step(`set NOT NULL on "${columnName}"`, `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET NOT NULL`)],
123
- postcheck: [step(`verify column "${columnName}" is NOT NULL`, columnNullabilityCheck({
124
- schema: schemaName,
125
- table: tableName,
126
- column: columnName,
127
- nullable: false
128
- }))]
129
- };
130
- }
131
- function dropNotNull(schemaName, tableName, columnName) {
132
- const qualified = qualifyTableName(schemaName, tableName);
133
- return {
134
- id: `alterNullability.dropNotNull.${tableName}.${columnName}`,
135
- label: `Drop NOT NULL on "${tableName}"."${columnName}"`,
136
- operationClass: "widening",
137
- target: targetDetails("column", columnName, schemaName, tableName),
138
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
139
- schema: schemaName,
140
- table: tableName,
141
- column: columnName
142
- }))],
143
- execute: [step(`drop NOT NULL on "${columnName}"`, `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP NOT NULL`)],
144
- postcheck: [step(`verify column "${columnName}" is nullable`, columnNullabilityCheck({
145
- schema: schemaName,
146
- table: tableName,
147
- column: columnName,
148
- nullable: true
149
- }))]
150
- };
151
- }
152
- /**
153
- * `defaultSql` is the full `DEFAULT …` clause as produced by
154
- * `buildColumnDefaultSql` — e.g. `"DEFAULT 42"`,
155
- * `"DEFAULT (CURRENT_TIMESTAMP)"`, or `"DEFAULT nextval('seq'::regclass)"`.
156
- *
157
- * `operationClass` defaults to `'additive'` (setting a default on a column
158
- * that currently has none). The reconciliation planner passes `'widening'`
159
- * when the column already has a different default — policy enforcement
160
- * treats that as a widening change rather than an additive one.
161
- */
162
- function setDefault(schemaName, tableName, columnName, defaultSql, operationClass = "additive") {
163
- const qualified = qualifyTableName(schemaName, tableName);
164
- return {
165
- id: `setDefault.${tableName}.${columnName}`,
166
- label: `Set default on "${tableName}"."${columnName}"`,
167
- operationClass,
168
- target: targetDetails("column", columnName, schemaName, tableName),
169
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
170
- schema: schemaName,
171
- table: tableName,
172
- column: columnName
173
- }))],
174
- execute: [step(`set default on "${columnName}"`, `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} SET ${defaultSql}`)],
175
- postcheck: [step(`verify column "${columnName}" has a default`, columnDefaultExistsCheck({
176
- schema: schemaName,
177
- table: tableName,
178
- column: columnName,
179
- exists: true
180
- }))]
181
- };
182
- }
183
- function dropDefault(schemaName, tableName, columnName) {
184
- const qualified = qualifyTableName(schemaName, tableName);
185
- return {
186
- id: `dropDefault.${tableName}.${columnName}`,
187
- label: `Drop default on "${tableName}"."${columnName}"`,
188
- operationClass: "destructive",
189
- target: targetDetails("column", columnName, schemaName, tableName),
190
- precheck: [step(`ensure column "${columnName}" exists`, columnExistsCheck({
191
- schema: schemaName,
192
- table: tableName,
193
- column: columnName
194
- }))],
195
- execute: [step(`drop default on "${columnName}"`, `ALTER TABLE ${qualified} ALTER COLUMN ${quoteIdentifier(columnName)} DROP DEFAULT`)],
196
- postcheck: [step(`verify column "${columnName}" has no default`, columnDefaultExistsCheck({
197
- schema: schemaName,
198
- table: tableName,
199
- column: columnName,
200
- exists: false
201
- }))]
202
- };
203
- }
204
- //#endregion
205
- //#region src/core/migrations/operations/constraints.ts
206
- const REFERENTIAL_ACTION_SQL = {
207
- noAction: "NO ACTION",
208
- restrict: "RESTRICT",
209
- cascade: "CASCADE",
210
- setNull: "SET NULL",
211
- setDefault: "SET DEFAULT"
212
- };
213
- function renderForeignKeySql(schemaName, tableName, fk) {
214
- let sql = `ALTER TABLE ${qualifyTableName(schemaName, tableName)}
215
- ADD CONSTRAINT ${quoteIdentifier(fk.name)}
216
- FOREIGN KEY (${fk.columns.map(quoteIdentifier).join(", ")})
217
- REFERENCES ${qualifyTableName(fk.references.schema, fk.references.table)} (${fk.references.columns.map(quoteIdentifier).join(", ")})`;
218
- if (fk.onDelete !== void 0) {
219
- const action = REFERENTIAL_ACTION_SQL[fk.onDelete];
220
- if (!action) throw new Error(`Unknown referential action for onDelete: ${String(fk.onDelete)}`);
221
- sql += `\nON DELETE ${action}`;
222
- }
223
- if (fk.onUpdate !== void 0) {
224
- const action = REFERENTIAL_ACTION_SQL[fk.onUpdate];
225
- if (!action) throw new Error(`Unknown referential action for onUpdate: ${String(fk.onUpdate)}`);
226
- sql += `\nON UPDATE ${action}`;
227
- }
228
- return sql;
229
- }
230
- function addPrimaryKey(schemaName, tableName, constraintName, columns) {
231
- const qualified = qualifyTableName(schemaName, tableName);
232
- const columnList = columns.map(quoteIdentifier).join(", ");
233
- return {
234
- id: `primaryKey.${tableName}.${constraintName}`,
235
- label: `Add primary key on "${tableName}"`,
236
- operationClass: "additive",
237
- target: targetDetails("primaryKey", constraintName, schemaName, tableName),
238
- precheck: [step(`ensure primary key "${constraintName}" does not exist`, constraintExistsCheck({
239
- constraintName,
240
- schema: schemaName,
241
- table: tableName,
242
- exists: false
243
- }))],
244
- execute: [step(`add primary key "${constraintName}"`, `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} PRIMARY KEY (${columnList})`)],
245
- postcheck: [step(`verify primary key "${constraintName}" exists`, constraintExistsCheck({
246
- constraintName,
247
- schema: schemaName,
248
- table: tableName
249
- }))]
250
- };
251
- }
252
- function addUnique(schemaName, tableName, constraintName, columns) {
253
- const qualified = qualifyTableName(schemaName, tableName);
254
- const columnList = columns.map(quoteIdentifier).join(", ");
255
- return {
256
- id: `unique.${tableName}.${constraintName}`,
257
- label: `Add unique constraint on "${tableName}" (${columns.join(", ")})`,
258
- operationClass: "additive",
259
- target: targetDetails("unique", constraintName, schemaName, tableName),
260
- precheck: [step(`ensure constraint "${constraintName}" does not exist`, constraintExistsCheck({
261
- constraintName,
262
- schema: schemaName,
263
- table: tableName,
264
- exists: false
265
- }))],
266
- execute: [step(`add unique constraint "${constraintName}"`, `ALTER TABLE ${qualified} ADD CONSTRAINT ${quoteIdentifier(constraintName)} UNIQUE (${columnList})`)],
267
- postcheck: [step(`verify constraint "${constraintName}" exists`, constraintExistsCheck({
268
- constraintName,
269
- schema: schemaName,
270
- table: tableName
271
- }))]
272
- };
273
- }
274
- function addForeignKey(schemaName, tableName, fk) {
275
- return {
276
- id: `foreignKey.${tableName}.${fk.name}`,
277
- label: `Add foreign key "${fk.name}" on "${tableName}"`,
278
- operationClass: "additive",
279
- target: targetDetails("foreignKey", fk.name, schemaName, tableName),
280
- precheck: [step(`ensure FK "${fk.name}" does not exist`, constraintExistsCheck({
281
- constraintName: fk.name,
282
- schema: schemaName,
283
- table: tableName,
284
- exists: false
285
- }))],
286
- execute: [step(`add FK "${fk.name}"`, renderForeignKeySql(schemaName, tableName, fk))],
287
- postcheck: [step(`verify FK "${fk.name}" exists`, constraintExistsCheck({
288
- constraintName: fk.name,
289
- schema: schemaName,
290
- table: tableName
291
- }))]
292
- };
293
- }
294
- /**
295
- * `kind` feeds the operation's `target.details.objectType`. Descriptor-flow
296
- * does not carry kind information in its drop-constraint descriptor, so the
297
- * default is `'unique'`. The reconciliation planner passes the correct kind
298
- * (`'foreignKey'`, `'primaryKey'`, or `'unique'`) based on the `SchemaIssue`
299
- * that produced the drop.
300
- */
301
- function dropConstraint(schemaName, tableName, constraintName, kind = "unique") {
302
- const qualified = qualifyTableName(schemaName, tableName);
303
- return {
304
- id: `dropConstraint.${tableName}.${constraintName}`,
305
- label: `Drop constraint "${constraintName}" on "${tableName}"`,
306
- operationClass: "destructive",
307
- target: targetDetails(kind, constraintName, schemaName, tableName),
308
- precheck: [step(`ensure constraint "${constraintName}" exists`, constraintExistsCheck({
309
- constraintName,
310
- schema: schemaName,
311
- table: tableName
312
- }))],
313
- execute: [step(`drop constraint "${constraintName}"`, `ALTER TABLE ${qualified} DROP CONSTRAINT ${quoteIdentifier(constraintName)}`)],
314
- postcheck: [step(`verify constraint "${constraintName}" does not exist`, constraintExistsCheck({
315
- constraintName,
316
- schema: schemaName,
317
- table: tableName,
318
- exists: false
319
- }))]
320
- };
321
- }
322
- //#endregion
323
- //#region src/core/migrations/operations/dependencies.ts
324
- function createExtension(extensionName) {
325
- return {
326
- id: `extension.${extensionName}`,
327
- label: `Create extension "${extensionName}"`,
328
- operationClass: "additive",
329
- target: { id: "postgres" },
330
- precheck: [],
331
- execute: [step(`Create extension "${extensionName}"`, `CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(extensionName)}`)],
332
- postcheck: []
333
- };
334
- }
335
- /**
336
- * Install a Postgres extension as the baseline op for an extension-pack
337
- * contract space. Layered on top of {@link createExtension}: stamps an
338
- * `invariantId` (required so the per-space marker records the install),
339
- * scopes the op `id` under a caller-chosen namespace (e.g. `pgvector.`),
340
- * and emits pre- and postcheck SQL probing `pg_extension`. The richer
341
- * shape lets the runner's idempotency probe skip the install on re-run
342
- * (postcheck-pre-satisfied) without firing the precheck.
343
- *
344
- * Use this for hand-rolled baseline migrations in contract-space
345
- * extension packages (e.g. `extension-pgvector`, `extension-paradedb`);
346
- * use the bare {@link createExtension} for planner-emitted ops where the
347
- * caller already controls idempotency through the surrounding plan.
348
- */
349
- function installExtension(options) {
350
- const { extensionName, invariantId, id } = options;
351
- return {
352
- id,
353
- label: options.label ?? `Enable extension "${extensionName}"`,
354
- operationClass: "additive",
355
- invariantId,
356
- target: {
357
- id: "postgres",
358
- details: {
359
- schema: "public",
360
- objectType: "dependency",
361
- name: extensionName
362
- }
363
- },
364
- precheck: [step(`verify extension "${extensionName}" is not already enabled`, `SELECT NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`)],
365
- execute: [step(`create extension "${extensionName}"`, `CREATE EXTENSION IF NOT EXISTS ${extensionName}`)],
366
- postcheck: [step(`confirm extension "${extensionName}" is enabled`, `SELECT EXISTS (SELECT 1 FROM pg_extension WHERE extname = '${extensionName}')`)]
367
- };
368
- }
369
- function createSchema(schemaName) {
370
- return {
371
- id: `schema.${schemaName}`,
372
- label: `Create schema "${schemaName}"`,
373
- operationClass: "additive",
374
- target: { id: "postgres" },
375
- precheck: [],
376
- execute: [step(`Create schema "${schemaName}"`, `CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(schemaName)}`)],
377
- postcheck: []
378
- };
379
- }
380
- //#endregion
381
- //#region src/core/migrations/operations/enums.ts
382
- function enumTypeExistsCheck(schemaName, nativeType, exists = true) {
383
- return `SELECT ${exists ? "EXISTS" : "NOT EXISTS"} (
384
- SELECT 1
385
- FROM pg_type t
386
- JOIN pg_namespace n ON t.typnamespace = n.oid
387
- WHERE n.nspname = '${escapeLiteral(schemaName)}'
388
- AND t.typname = '${escapeLiteral(nativeType)}'
389
- )`;
390
- }
391
- function createEnumType(schemaName, typeName, values, nativeType = typeName) {
392
- const qualifiedType = qualifyName(schemaName, nativeType);
393
- const literalValues = values.map((v) => `'${escapeLiteral(v)}'`).join(", ");
394
- return {
395
- id: `type.${typeName}`,
396
- label: `Create enum type "${typeName}"`,
397
- operationClass: "additive",
398
- target: targetDetails("type", typeName, schemaName),
399
- precheck: [step(`ensure type "${nativeType}" does not exist`, enumTypeExistsCheck(schemaName, nativeType, false))],
400
- execute: [step(`create enum type "${typeName}"`, `CREATE TYPE ${qualifiedType} AS ENUM (${literalValues})`)],
401
- postcheck: [step(`verify type "${nativeType}" exists`, enumTypeExistsCheck(schemaName, nativeType))]
402
- };
403
- }
404
- /**
405
- * `typeName` is the contract-facing type name (used for id/label).
406
- * `nativeType` is the Postgres type name to mutate (may differ for external types).
407
- */
408
- function addEnumValues(schemaName, typeName, nativeType, values) {
409
- const qualifiedType = qualifyName(schemaName, nativeType);
410
- return {
411
- id: `type.${typeName}.addValues`,
412
- label: `Add values to enum type "${typeName}": ${values.join(", ")}`,
413
- operationClass: "additive",
414
- target: targetDetails("type", typeName, schemaName),
415
- precheck: [step(`ensure type "${nativeType}" exists`, enumTypeExistsCheck(schemaName, nativeType))],
416
- execute: values.map((value) => step(`add value '${value}' to enum "${nativeType}"`, `ALTER TYPE ${qualifiedType} ADD VALUE '${escapeLiteral(value)}'`)),
417
- postcheck: [step(`verify type "${nativeType}" exists`, enumTypeExistsCheck(schemaName, nativeType))]
418
- };
419
- }
420
- function dropEnumType(schemaName, typeName) {
421
- const qualified = qualifyName(schemaName, typeName);
422
- return {
423
- id: `type.${typeName}.drop`,
424
- label: `Drop enum type "${typeName}"`,
425
- operationClass: "destructive",
426
- target: targetDetails("type", typeName, schemaName),
427
- precheck: [step(`ensure type "${typeName}" exists`, enumTypeExistsCheck(schemaName, typeName))],
428
- execute: [step(`drop enum type "${typeName}"`, `DROP TYPE ${qualified}`)],
429
- postcheck: [step(`verify type "${typeName}" removed`, enumTypeExistsCheck(schemaName, typeName, false))]
430
- };
431
- }
432
- function renameType(schemaName, fromName, toName) {
433
- const qualifiedFrom = qualifyName(schemaName, fromName);
434
- return {
435
- id: `type.${fromName}.rename`,
436
- label: `Rename type "${fromName}" to "${toName}"`,
437
- operationClass: "destructive",
438
- target: targetDetails("type", fromName, schemaName),
439
- precheck: [step(`ensure type "${fromName}" exists`, enumTypeExistsCheck(schemaName, fromName)), step(`ensure type "${toName}" does not already exist`, enumTypeExistsCheck(schemaName, toName, false))],
440
- execute: [step(`rename type "${fromName}" to "${toName}"`, `ALTER TYPE ${qualifiedFrom} RENAME TO ${quoteIdentifier(toName)}`)],
441
- postcheck: [step(`verify type "${toName}" exists`, enumTypeExistsCheck(schemaName, toName))]
442
- };
443
- }
444
- //#endregion
445
- //#region src/core/migrations/operations/indexes.ts
446
- function renderIndexOptionValue(key, value) {
447
- if (typeof value === "string") return `'${escapeLiteral(value)}'`;
448
- if (typeof value === "number" && Number.isFinite(value)) return String(value);
449
- if (typeof value === "boolean") return value ? "true" : "false";
450
- throw new Error(`Index option "${key}" must be a string, finite number, or boolean; got ${typeof value}`);
451
- }
452
- function renderIndexOptions(options) {
453
- return Object.entries(options).map(([key, value]) => `${quoteIdentifier(key)} = ${renderIndexOptionValue(key, value)}`).join(", ");
454
- }
455
- function createIndex(schemaName, tableName, indexName, columns, extras) {
456
- const qualified = qualifyTableName(schemaName, tableName);
457
- const columnList = columns.map(quoteIdentifier).join(", ");
458
- const using = extras?.type ? ` USING ${quoteIdentifier(extras.type)}` : "";
459
- const options = extras?.options;
460
- const withClause = options && Object.keys(options).length > 0 ? ` WITH (${renderIndexOptions(options)})` : "";
461
- return {
462
- id: `index.${tableName}.${indexName}`,
463
- label: `Create index "${indexName}" on "${tableName}"`,
464
- operationClass: "additive",
465
- target: targetDetails("index", indexName, schemaName, tableName),
466
- precheck: [step(`ensure index "${indexName}" does not exist`, `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`)],
467
- execute: [step(`create index "${indexName}"`, `CREATE INDEX ${quoteIdentifier(indexName)} ON ${qualified}${using} (${columnList})${withClause}`)],
468
- postcheck: [step(`verify index "${indexName}" exists`, `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`)]
469
- };
470
- }
471
- function dropIndex(schemaName, tableName, indexName) {
472
- return {
473
- id: `dropIndex.${tableName}.${indexName}`,
474
- label: `Drop index "${indexName}"`,
475
- operationClass: "destructive",
476
- target: targetDetails("index", indexName, schemaName, tableName),
477
- precheck: [step(`ensure index "${indexName}" exists`, `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NOT NULL`)],
478
- execute: [step(`drop index "${indexName}"`, `DROP INDEX ${qualifyTableName(schemaName, indexName)}`)],
479
- postcheck: [step(`verify index "${indexName}" does not exist`, `SELECT to_regclass(${toRegclassLiteral(schemaName, indexName)}) IS NULL`)]
480
- };
481
- }
482
- //#endregion
483
- //#region src/core/migrations/operations/tables.ts
484
- function createTable(schemaName, tableName, columns, primaryKey) {
485
- const qualified = qualifyTableName(schemaName, tableName);
486
- const columnDefs = columns.map(renderColumnDefinition);
487
- const constraintDefs = [];
488
- if (primaryKey) constraintDefs.push(`PRIMARY KEY (${primaryKey.columns.map(quoteIdentifier).join(", ")})`);
489
- const createSql = `CREATE TABLE ${qualified} (\n ${[...columnDefs, ...constraintDefs].join(",\n ")}\n)`;
490
- return {
491
- id: `table.${tableName}`,
492
- label: `Create table "${tableName}"`,
493
- summary: `Creates table "${tableName}"`,
494
- operationClass: "additive",
495
- target: targetDetails("table", tableName, schemaName),
496
- precheck: [step(`ensure table "${tableName}" does not exist`, `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`)],
497
- execute: [step(`create table "${tableName}"`, createSql)],
498
- postcheck: [step(`verify table "${tableName}" exists`, `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`)]
499
- };
500
- }
501
- function dropTable(schemaName, tableName) {
502
- const qualified = qualifyTableName(schemaName, tableName);
503
- return {
504
- id: `dropTable.${tableName}`,
505
- label: `Drop table "${tableName}"`,
506
- operationClass: "destructive",
507
- target: targetDetails("table", tableName, schemaName),
508
- precheck: [step(`ensure table "${tableName}" exists`, `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NOT NULL`)],
509
- execute: [step(`drop table "${tableName}"`, `DROP TABLE ${qualified}`)],
510
- postcheck: [step(`verify table "${tableName}" does not exist`, `SELECT to_regclass(${toRegclassLiteral(schemaName, tableName)}) IS NULL`)]
511
- };
512
- }
513
- //#endregion
514
- export { setNotNull as S, alterColumnType as _, addEnumValues as a, dropNotNull as b, renameType as c, installExtension as d, addForeignKey as f, addColumn as g, dropConstraint as h, dropIndex as i, createExtension as l, addUnique as m, dropTable as n, createEnumType as o, addPrimaryKey as p, createIndex as r, dropEnumType as s, createTable as t, createSchema as u, dropColumn as v, setDefault as x, dropDefault as y };
515
-
516
- //# sourceMappingURL=tables-DoA39Yqo.mjs.map