@prisma-next/target-postgres 0.5.0-dev.44 → 0.5.0-dev.46

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 (53) hide show
  1. package/dist/{codec-ids-CojIXVf9.mjs → codec-ids-ckQX9Kcg.mjs} +3 -2
  2. package/dist/{codec-ids-CojIXVf9.mjs.map → codec-ids-ckQX9Kcg.mjs.map} +1 -1
  3. package/dist/codec-ids.d.mts +2 -1
  4. package/dist/codec-ids.d.mts.map +1 -1
  5. package/dist/codec-ids.mjs +2 -2
  6. package/dist/codec-types.d.mts +1 -1
  7. package/dist/codec-types.mjs +1 -1
  8. package/dist/{codecs-CE5EUsNM.d.mts → codecs-B03dFv94.d.mts} +11 -1
  9. package/dist/codecs-B03dFv94.d.mts.map +1 -0
  10. package/dist/{codecs-dzZ_dMpK.mjs → codecs-D0oXyJIH.mjs} +18 -3
  11. package/dist/codecs-D0oXyJIH.mjs.map +1 -0
  12. package/dist/codecs.d.mts +1 -1
  13. package/dist/codecs.mjs +1 -1
  14. package/dist/control.mjs +6 -56
  15. package/dist/control.mjs.map +1 -1
  16. package/dist/{data-transform-C83dy0vk.mjs → data-transform-Be_i_DBc.mjs} +22 -5
  17. package/dist/data-transform-Be_i_DBc.mjs.map +1 -0
  18. package/dist/{data-transform-D8x5m1YV.d.mts → data-transform-CrpmG4uJ.d.mts} +12 -11
  19. package/dist/data-transform-CrpmG4uJ.d.mts.map +1 -0
  20. package/dist/data-transform.d.mts +1 -1
  21. package/dist/data-transform.mjs +1 -1
  22. package/dist/issue-planner.d.mts +1 -1
  23. package/dist/migration.d.mts +2 -2
  24. package/dist/migration.mjs +2 -2
  25. package/dist/pack.d.mts +1 -1
  26. package/dist/{planner-B4ZSLHRI.mjs → planner-Cm-ZLutk.mjs} +2 -2
  27. package/dist/{planner-B4ZSLHRI.mjs.map → planner-Cm-ZLutk.mjs.map} +1 -1
  28. package/dist/{planner-produced-postgres-migration-C0GNhHGw.mjs → planner-produced-postgres-migration-Bi-RWO4-.mjs} +2 -2
  29. package/dist/{planner-produced-postgres-migration-C0GNhHGw.mjs.map → planner-produced-postgres-migration-Bi-RWO4-.mjs.map} +1 -1
  30. package/dist/{planner-produced-postgres-migration-Dw_mPMKt.d.mts → planner-produced-postgres-migration-M3EfhWSS.d.mts} +2 -2
  31. package/dist/planner-produced-postgres-migration-M3EfhWSS.d.mts.map +1 -0
  32. package/dist/planner-produced-postgres-migration.d.mts +3 -2
  33. package/dist/planner-produced-postgres-migration.mjs +1 -1
  34. package/dist/planner.d.mts +4 -3
  35. package/dist/planner.d.mts.map +1 -1
  36. package/dist/planner.mjs +1 -1
  37. package/dist/{postgres-migration-DcfWGqhe.d.mts → postgres-migration-BFjbb25b.d.mts} +4 -3
  38. package/dist/postgres-migration-BFjbb25b.d.mts.map +1 -0
  39. package/dist/{postgres-migration-EGSlO4jO.mjs → postgres-migration-BS9vQW97.mjs} +2 -2
  40. package/dist/postgres-migration-BS9vQW97.mjs.map +1 -0
  41. package/package.json +16 -16
  42. package/src/core/codec-ids.ts +1 -0
  43. package/src/core/codecs.ts +36 -0
  44. package/src/core/migrations/operations/data-transform.ts +78 -21
  45. package/src/core/migrations/postgres-migration.ts +3 -6
  46. package/src/core/migrations/runner.ts +16 -121
  47. package/dist/codecs-CE5EUsNM.d.mts.map +0 -1
  48. package/dist/codecs-dzZ_dMpK.mjs.map +0 -1
  49. package/dist/data-transform-C83dy0vk.mjs.map +0 -1
  50. package/dist/data-transform-D8x5m1YV.d.mts.map +0 -1
  51. package/dist/planner-produced-postgres-migration-Dw_mPMKt.d.mts.map +0 -1
  52. package/dist/postgres-migration-DcfWGqhe.d.mts.map +0 -1
  53. package/dist/postgres-migration-EGSlO4jO.mjs.map +0 -1
@@ -23,7 +23,8 @@ const PG_TIMETZ_CODEC_ID = "pg/timetz@1";
23
23
  const PG_INTERVAL_CODEC_ID = "pg/interval@1";
24
24
  const PG_JSON_CODEC_ID = "pg/json@1";
25
25
  const PG_JSONB_CODEC_ID = "pg/jsonb@1";
26
+ const PG_BYTEA_CODEC_ID = "pg/bytea@1";
26
27
 
27
28
  //#endregion
28
- export { SQL_CHAR_CODEC_ID as C, SQL_TIMESTAMP_CODEC_ID as D, SQL_TEXT_CODEC_ID as E, SQL_VARCHAR_CODEC_ID as O, PG_VARCHAR_CODEC_ID as S, SQL_INT_CODEC_ID as T, PG_TIMESTAMPTZ_CODEC_ID as _, PG_FLOAT4_CODEC_ID as a, PG_TIME_CODEC_ID as b, PG_INT2_CODEC_ID as c, PG_INTERVAL_CODEC_ID as d, PG_INT_CODEC_ID as f, PG_TEXT_CODEC_ID as g, PG_NUMERIC_CODEC_ID as h, PG_ENUM_CODEC_ID as i, PG_INT4_CODEC_ID as l, PG_JSON_CODEC_ID as m, PG_BOOL_CODEC_ID as n, PG_FLOAT8_CODEC_ID as o, PG_JSONB_CODEC_ID as p, PG_CHAR_CODEC_ID as r, PG_FLOAT_CODEC_ID as s, PG_BIT_CODEC_ID as t, PG_INT8_CODEC_ID as u, PG_TIMESTAMP_CODEC_ID as v, SQL_FLOAT_CODEC_ID as w, PG_VARBIT_CODEC_ID as x, PG_TIMETZ_CODEC_ID as y };
29
- //# sourceMappingURL=codec-ids-CojIXVf9.mjs.map
29
+ export { PG_VARCHAR_CODEC_ID as C, SQL_TEXT_CODEC_ID as D, SQL_INT_CODEC_ID as E, SQL_TIMESTAMP_CODEC_ID as O, PG_VARBIT_CODEC_ID as S, SQL_FLOAT_CODEC_ID as T, PG_TEXT_CODEC_ID as _, PG_ENUM_CODEC_ID as a, PG_TIMETZ_CODEC_ID as b, PG_FLOAT_CODEC_ID as c, PG_INT8_CODEC_ID as d, PG_INTERVAL_CODEC_ID as f, PG_NUMERIC_CODEC_ID as g, PG_JSON_CODEC_ID as h, PG_CHAR_CODEC_ID as i, SQL_VARCHAR_CODEC_ID as k, PG_INT2_CODEC_ID as l, PG_JSONB_CODEC_ID as m, PG_BOOL_CODEC_ID as n, PG_FLOAT4_CODEC_ID as o, PG_INT_CODEC_ID as p, PG_BYTEA_CODEC_ID as r, PG_FLOAT8_CODEC_ID as s, PG_BIT_CODEC_ID as t, PG_INT4_CODEC_ID as u, PG_TIMESTAMPTZ_CODEC_ID as v, SQL_CHAR_CODEC_ID as w, PG_TIME_CODEC_ID as x, PG_TIMESTAMP_CODEC_ID as y };
30
+ //# sourceMappingURL=codec-ids-ckQX9Kcg.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec-ids-CojIXVf9.mjs","names":[],"sources":["../src/core/codec-ids.ts"],"sourcesContent":["export {\n SQL_CHAR_CODEC_ID,\n SQL_FLOAT_CODEC_ID,\n SQL_INT_CODEC_ID,\n SQL_TEXT_CODEC_ID,\n SQL_TIMESTAMP_CODEC_ID,\n SQL_VARCHAR_CODEC_ID,\n} from '@prisma-next/sql-relational-core/ast';\nexport const PG_TEXT_CODEC_ID = 'pg/text@1' as const;\nexport const PG_ENUM_CODEC_ID = 'pg/enum@1' as const;\nexport const PG_CHAR_CODEC_ID = 'pg/char@1' as const;\nexport const PG_VARCHAR_CODEC_ID = 'pg/varchar@1' as const;\nexport const PG_INT_CODEC_ID = 'pg/int@1' as const;\nexport const PG_INT2_CODEC_ID = 'pg/int2@1' as const;\nexport const PG_INT4_CODEC_ID = 'pg/int4@1' as const;\nexport const PG_INT8_CODEC_ID = 'pg/int8@1' as const;\nexport const PG_FLOAT_CODEC_ID = 'pg/float@1' as const;\nexport const PG_FLOAT4_CODEC_ID = 'pg/float4@1' as const;\nexport const PG_FLOAT8_CODEC_ID = 'pg/float8@1' as const;\nexport const PG_NUMERIC_CODEC_ID = 'pg/numeric@1' as const;\nexport const PG_BOOL_CODEC_ID = 'pg/bool@1' as const;\nexport const PG_BIT_CODEC_ID = 'pg/bit@1' as const;\nexport const PG_VARBIT_CODEC_ID = 'pg/varbit@1' as const;\nexport const PG_TIMESTAMP_CODEC_ID = 'pg/timestamp@1' as const;\nexport const PG_TIMESTAMPTZ_CODEC_ID = 'pg/timestamptz@1' as const;\nexport const PG_TIME_CODEC_ID = 'pg/time@1' as const;\nexport const PG_TIMETZ_CODEC_ID = 'pg/timetz@1' as const;\nexport const PG_INTERVAL_CODEC_ID = 'pg/interval@1' as const;\nexport const PG_JSON_CODEC_ID = 'pg/json@1' as const;\nexport const PG_JSONB_CODEC_ID = 'pg/jsonb@1' as const;\n"],"mappings":";;;AAQA,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,sBAAsB;AACnC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,mBAAmB;AAChC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB"}
1
+ {"version":3,"file":"codec-ids-ckQX9Kcg.mjs","names":[],"sources":["../src/core/codec-ids.ts"],"sourcesContent":["export {\n SQL_CHAR_CODEC_ID,\n SQL_FLOAT_CODEC_ID,\n SQL_INT_CODEC_ID,\n SQL_TEXT_CODEC_ID,\n SQL_TIMESTAMP_CODEC_ID,\n SQL_VARCHAR_CODEC_ID,\n} from '@prisma-next/sql-relational-core/ast';\nexport const PG_TEXT_CODEC_ID = 'pg/text@1' as const;\nexport const PG_ENUM_CODEC_ID = 'pg/enum@1' as const;\nexport const PG_CHAR_CODEC_ID = 'pg/char@1' as const;\nexport const PG_VARCHAR_CODEC_ID = 'pg/varchar@1' as const;\nexport const PG_INT_CODEC_ID = 'pg/int@1' as const;\nexport const PG_INT2_CODEC_ID = 'pg/int2@1' as const;\nexport const PG_INT4_CODEC_ID = 'pg/int4@1' as const;\nexport const PG_INT8_CODEC_ID = 'pg/int8@1' as const;\nexport const PG_FLOAT_CODEC_ID = 'pg/float@1' as const;\nexport const PG_FLOAT4_CODEC_ID = 'pg/float4@1' as const;\nexport const PG_FLOAT8_CODEC_ID = 'pg/float8@1' as const;\nexport const PG_NUMERIC_CODEC_ID = 'pg/numeric@1' as const;\nexport const PG_BOOL_CODEC_ID = 'pg/bool@1' as const;\nexport const PG_BIT_CODEC_ID = 'pg/bit@1' as const;\nexport const PG_VARBIT_CODEC_ID = 'pg/varbit@1' as const;\nexport const PG_TIMESTAMP_CODEC_ID = 'pg/timestamp@1' as const;\nexport const PG_TIMESTAMPTZ_CODEC_ID = 'pg/timestamptz@1' as const;\nexport const PG_TIME_CODEC_ID = 'pg/time@1' as const;\nexport const PG_TIMETZ_CODEC_ID = 'pg/timetz@1' as const;\nexport const PG_INTERVAL_CODEC_ID = 'pg/interval@1' as const;\nexport const PG_JSON_CODEC_ID = 'pg/json@1' as const;\nexport const PG_JSONB_CODEC_ID = 'pg/jsonb@1' as const;\nexport const PG_BYTEA_CODEC_ID = 'pg/bytea@1' as const;\n"],"mappings":";;;AAQA,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,sBAAsB;AACnC,MAAa,kBAAkB;AAC/B,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,qBAAqB;AAClC,MAAa,qBAAqB;AAClC,MAAa,sBAAsB;AACnC,MAAa,mBAAmB;AAChC,MAAa,kBAAkB;AAC/B,MAAa,qBAAqB;AAClC,MAAa,wBAAwB;AACrC,MAAa,0BAA0B;AACvC,MAAa,mBAAmB;AAChC,MAAa,qBAAqB;AAClC,MAAa,uBAAuB;AACpC,MAAa,mBAAmB;AAChC,MAAa,oBAAoB;AACjC,MAAa,oBAAoB"}
@@ -23,6 +23,7 @@ declare const PG_TIMETZ_CODEC_ID: "pg/timetz@1";
23
23
  declare const PG_INTERVAL_CODEC_ID: "pg/interval@1";
24
24
  declare const PG_JSON_CODEC_ID: "pg/json@1";
25
25
  declare const PG_JSONB_CODEC_ID: "pg/jsonb@1";
26
+ declare const PG_BYTEA_CODEC_ID: "pg/bytea@1";
26
27
  //#endregion
27
- export { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_CHAR_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_FLOAT_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_INT_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, PG_VARCHAR_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID };
28
+ export { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_BYTEA_CODEC_ID, PG_CHAR_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_FLOAT_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_INT_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, PG_VARCHAR_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID };
28
29
  //# sourceMappingURL=codec-ids.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codec-ids.d.mts","names":[],"sources":["../src/core/codec-ids.ts"],"sourcesContent":[],"mappings":";;;cAQa;cACA;AADA,cAEA,gBAFuC,EAAA,WAAA;AACvC,cAEA,mBAFuC,EAAA,cAAA;AACvC,cAEA,eAFuC,EAAA,UAAA;AACvC,cAEA,gBAF6C,EAAA,WAAA;AAC7C,cAEA,gBAFqC,EAAA,WAAA;AACrC,cAEA,gBAFuC,EAAA,WAAA;AACvC,cAEA,iBAFuC,EAAA,YAAA;AACvC,cAEA,kBAFuC,EAAA,aAAA;AACvC,cAEA,kBAFyC,EAAA,aAAA;AACzC,cAEA,mBAF2C,EAAA,cAAA;AAC3C,cAEA,gBAF2C,EAAA,WAAA;AAC3C,cAEA,eAF6C,EAAA,UAAA;AAC7C,cAEA,kBAFuC,EAAA,aAAA;AACvC,cAEA,qBAFqC,EAAA,gBAAA;AACrC,cAEA,uBAF2C,EAAA,kBAAA;AAC3C,cAEA,gBAFiD,EAAA,WAAA;AACjD,cAEA,kBAFqD,EAAA,aAAA;AACrD,cAEA,oBAFuC,EAAA,eAAA;AACvC,cAEA,gBAF2C,EAAA,WAAA;AAC3C,cAEA,iBAF+C,EAAA,YAAA"}
1
+ {"version":3,"file":"codec-ids.d.mts","names":[],"sources":["../src/core/codec-ids.ts"],"sourcesContent":[],"mappings":";;;cAQa;cACA;AADA,cAEA,gBAFuC,EAAA,WAAA;AACvC,cAEA,mBAFuC,EAAA,cAAA;AACvC,cAEA,eAFuC,EAAA,UAAA;AACvC,cAEA,gBAF6C,EAAA,WAAA;AAC7C,cAEA,gBAFqC,EAAA,WAAA;AACrC,cAEA,gBAFuC,EAAA,WAAA;AACvC,cAEA,iBAFuC,EAAA,YAAA;AACvC,cAEA,kBAFuC,EAAA,aAAA;AACvC,cAEA,kBAFyC,EAAA,aAAA;AACzC,cAEA,mBAF2C,EAAA,cAAA;AAC3C,cAEA,gBAF2C,EAAA,WAAA;AAC3C,cAEA,eAF6C,EAAA,UAAA;AAC7C,cAEA,kBAFuC,EAAA,aAAA;AACvC,cAEA,qBAFqC,EAAA,gBAAA;AACrC,cAEA,uBAF2C,EAAA,kBAAA;AAC3C,cAEA,gBAFiD,EAAA,WAAA;AACjD,cAEA,kBAFqD,EAAA,aAAA;AACrD,cAEA,oBAFuC,EAAA,eAAA;AACvC,cAEA,gBAF2C,EAAA,WAAA;AAC3C,cAEA,iBAF+C,EAAA,YAAA;AAC/C,cAEA,iBAFuC,EAAA,YAAA"}
@@ -1,3 +1,3 @@
1
- import { C as SQL_CHAR_CODEC_ID, D as SQL_TIMESTAMP_CODEC_ID, E as SQL_TEXT_CODEC_ID, O as SQL_VARCHAR_CODEC_ID, S as PG_VARCHAR_CODEC_ID, T as SQL_INT_CODEC_ID, _ as PG_TIMESTAMPTZ_CODEC_ID, a as PG_FLOAT4_CODEC_ID, b as PG_TIME_CODEC_ID, c as PG_INT2_CODEC_ID, d as PG_INTERVAL_CODEC_ID, f as PG_INT_CODEC_ID, g as PG_TEXT_CODEC_ID, h as PG_NUMERIC_CODEC_ID, i as PG_ENUM_CODEC_ID, l as PG_INT4_CODEC_ID, m as PG_JSON_CODEC_ID, n as PG_BOOL_CODEC_ID, o as PG_FLOAT8_CODEC_ID, p as PG_JSONB_CODEC_ID, r as PG_CHAR_CODEC_ID, s as PG_FLOAT_CODEC_ID, t as PG_BIT_CODEC_ID, u as PG_INT8_CODEC_ID, v as PG_TIMESTAMP_CODEC_ID, w as SQL_FLOAT_CODEC_ID, x as PG_VARBIT_CODEC_ID, y as PG_TIMETZ_CODEC_ID } from "./codec-ids-CojIXVf9.mjs";
1
+ import { C as PG_VARCHAR_CODEC_ID, D as SQL_TEXT_CODEC_ID, E as SQL_INT_CODEC_ID, O as SQL_TIMESTAMP_CODEC_ID, S as PG_VARBIT_CODEC_ID, T as SQL_FLOAT_CODEC_ID, _ as PG_TEXT_CODEC_ID, a as PG_ENUM_CODEC_ID, b as PG_TIMETZ_CODEC_ID, c as PG_FLOAT_CODEC_ID, d as PG_INT8_CODEC_ID, f as PG_INTERVAL_CODEC_ID, g as PG_NUMERIC_CODEC_ID, h as PG_JSON_CODEC_ID, i as PG_CHAR_CODEC_ID, k as SQL_VARCHAR_CODEC_ID, l as PG_INT2_CODEC_ID, m as PG_JSONB_CODEC_ID, n as PG_BOOL_CODEC_ID, o as PG_FLOAT4_CODEC_ID, p as PG_INT_CODEC_ID, r as PG_BYTEA_CODEC_ID, s as PG_FLOAT8_CODEC_ID, t as PG_BIT_CODEC_ID, u as PG_INT4_CODEC_ID, v as PG_TIMESTAMPTZ_CODEC_ID, w as SQL_CHAR_CODEC_ID, x as PG_TIME_CODEC_ID, y as PG_TIMESTAMP_CODEC_ID } from "./codec-ids-ckQX9Kcg.mjs";
2
2
 
3
- export { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_CHAR_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_FLOAT_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_INT_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, PG_VARCHAR_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID };
3
+ export { PG_BIT_CODEC_ID, PG_BOOL_CODEC_ID, PG_BYTEA_CODEC_ID, PG_CHAR_CODEC_ID, PG_ENUM_CODEC_ID, PG_FLOAT4_CODEC_ID, PG_FLOAT8_CODEC_ID, PG_FLOAT_CODEC_ID, PG_INT2_CODEC_ID, PG_INT4_CODEC_ID, PG_INT8_CODEC_ID, PG_INTERVAL_CODEC_ID, PG_INT_CODEC_ID, PG_JSONB_CODEC_ID, PG_JSON_CODEC_ID, PG_NUMERIC_CODEC_ID, PG_TEXT_CODEC_ID, PG_TIMESTAMPTZ_CODEC_ID, PG_TIMESTAMP_CODEC_ID, PG_TIMETZ_CODEC_ID, PG_TIME_CODEC_ID, PG_VARBIT_CODEC_ID, PG_VARCHAR_CODEC_ID, SQL_CHAR_CODEC_ID, SQL_FLOAT_CODEC_ID, SQL_INT_CODEC_ID, SQL_TEXT_CODEC_ID, SQL_TIMESTAMP_CODEC_ID, SQL_VARCHAR_CODEC_ID };
@@ -1,4 +1,4 @@
1
- import { r as dataTypes, t as CodecTypes$1 } from "./codecs-CE5EUsNM.mjs";
1
+ import { r as dataTypes, t as CodecTypes$1 } from "./codecs-B03dFv94.mjs";
2
2
  import { JsonValue } from "@prisma-next/contract/types";
3
3
 
4
4
  //#region src/exports/codec-types.d.ts
@@ -1,3 +1,3 @@
1
- import { n as dataTypes } from "./codecs-dzZ_dMpK.mjs";
1
+ import { n as dataTypes } from "./codecs-D0oXyJIH.mjs";
2
2
 
3
3
  export { dataTypes };
@@ -29,6 +29,7 @@ declare const codecs: _prisma_next_sql_relational_core_ast0.CodecDefBuilder<{
29
29
  bool: Codec<"pg/bool@1", readonly ["equality", "boolean"], boolean, boolean, Record<string, unknown>, unknown>;
30
30
  bit: Codec<"pg/bit@1", readonly ["equality", "order"], string, string, Record<string, unknown>, unknown>;
31
31
  "bit varying": Codec<"pg/varbit@1", readonly ["equality", "order"], string, string, Record<string, unknown>, unknown>;
32
+ bytea: Codec<"pg/bytea@1", readonly ["equality"], Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, Record<string, unknown>, unknown>;
32
33
  interval: Codec<"pg/interval@1", readonly ["equality", "order"], string | Record<string, unknown>, string, Record<string, unknown>, unknown>;
33
34
  enum: Codec<"pg/enum@1", readonly ["equality", "order"], string, string, Record<string, unknown>, unknown>;
34
35
  json: Codec<"pg/json@1", readonly [], string | number | boolean | {
@@ -234,6 +235,14 @@ declare const codecDefinitions: {
234
235
  readonly output: string;
235
236
  readonly jsType: string;
236
237
  };
238
+ readonly bytea: {
239
+ readonly typeId: "pg/bytea@1";
240
+ readonly scalar: "bytea";
241
+ readonly codec: Codec<"pg/bytea@1", readonly ["equality"], Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, Record<string, unknown>, unknown>;
242
+ readonly input: Uint8Array<ArrayBufferLike>;
243
+ readonly output: Uint8Array<ArrayBufferLike>;
244
+ readonly jsType: Uint8Array<ArrayBufferLike>;
245
+ };
237
246
  readonly interval: {
238
247
  readonly typeId: "pg/interval@1";
239
248
  readonly scalar: "interval";
@@ -312,6 +321,7 @@ declare const dataTypes: {
312
321
  readonly bool: "pg/bool@1";
313
322
  readonly bit: "pg/bit@1";
314
323
  readonly "bit varying": "pg/varbit@1";
324
+ readonly bytea: "pg/bytea@1";
315
325
  readonly interval: "pg/interval@1";
316
326
  readonly enum: "pg/enum@1";
317
327
  readonly json: "pg/json@1";
@@ -320,4 +330,4 @@ declare const dataTypes: {
320
330
  type CodecTypes = typeof codecs.CodecTypes;
321
331
  //#endregion
322
332
  export { codecDefinitions as n, dataTypes as r, CodecTypes as t };
323
- //# sourceMappingURL=codecs-CE5EUsNM.d.mts.map
333
+ //# sourceMappingURL=codecs-B03dFv94.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs-B03dFv94.d.mts","names":[],"sources":["../src/core/codecs.ts"],"sourcesContent":[],"mappings":";;;;;;cA8mBM,8CAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAgCC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAhCD,SAAA,UAAA,EAAA;IAgCC,SAAA,MAA0C,EAAA,YAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAC1C,SAA4B,KAAA,OAAA,CAAA,gBAAA,EAAA,SAAA,CAAA,UAAA,EAAA,OAAA,CAAA,MAAA,MAAA,QAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,CAAA;IAE7B,SAAU,KAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAFT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAED,UAAA,UAAoB,MAAA,CAAO"}
@@ -1,4 +1,4 @@
1
- import { S as PG_VARCHAR_CODEC_ID, _ as PG_TIMESTAMPTZ_CODEC_ID, a as PG_FLOAT4_CODEC_ID, b as PG_TIME_CODEC_ID, c as PG_INT2_CODEC_ID, d as PG_INTERVAL_CODEC_ID, f as PG_INT_CODEC_ID, g as PG_TEXT_CODEC_ID, h as PG_NUMERIC_CODEC_ID, i as PG_ENUM_CODEC_ID, l as PG_INT4_CODEC_ID, m as PG_JSON_CODEC_ID, n as PG_BOOL_CODEC_ID, o as PG_FLOAT8_CODEC_ID, p as PG_JSONB_CODEC_ID, r as PG_CHAR_CODEC_ID, s as PG_FLOAT_CODEC_ID, t as PG_BIT_CODEC_ID, u as PG_INT8_CODEC_ID, v as PG_TIMESTAMP_CODEC_ID, x as PG_VARBIT_CODEC_ID, y as PG_TIMETZ_CODEC_ID } from "./codec-ids-CojIXVf9.mjs";
1
+ import { C as PG_VARCHAR_CODEC_ID, S as PG_VARBIT_CODEC_ID, _ as PG_TEXT_CODEC_ID, a as PG_ENUM_CODEC_ID, b as PG_TIMETZ_CODEC_ID, c as PG_FLOAT_CODEC_ID, d as PG_INT8_CODEC_ID, f as PG_INTERVAL_CODEC_ID, g as PG_NUMERIC_CODEC_ID, h as PG_JSON_CODEC_ID, i as PG_CHAR_CODEC_ID, l as PG_INT2_CODEC_ID, m as PG_JSONB_CODEC_ID, n as PG_BOOL_CODEC_ID, o as PG_FLOAT4_CODEC_ID, p as PG_INT_CODEC_ID, r as PG_BYTEA_CODEC_ID, s as PG_FLOAT8_CODEC_ID, t as PG_BIT_CODEC_ID, u as PG_INT4_CODEC_ID, v as PG_TIMESTAMPTZ_CODEC_ID, x as PG_TIME_CODEC_ID, y as PG_TIMESTAMP_CODEC_ID } from "./codec-ids-ckQX9Kcg.mjs";
2
2
  import { codec, defineCodecs, sqlCodecDefinitions } from "@prisma-next/sql-relational-core/ast";
3
3
  import { ifDefined } from "@prisma-next/utils/defined";
4
4
  import { type } from "arktype";
@@ -240,6 +240,21 @@ const pgVarbitCodec = codec({
240
240
  renderOutputType: (typeParams) => renderLength("VarBit", typeParams),
241
241
  meta: { db: { sql: { postgres: { nativeType: "bit varying" } } } }
242
242
  });
243
+ const pgByteaCodec = codec({
244
+ typeId: PG_BYTEA_CODEC_ID,
245
+ targetTypes: ["bytea"],
246
+ traits: ["equality"],
247
+ encode: (value) => value,
248
+ decode: (wire) => wire instanceof Uint8Array && wire.constructor === Uint8Array ? wire : new Uint8Array(wire.buffer, wire.byteOffset, wire.byteLength),
249
+ encodeJson: (value) => Buffer.from(value).toString("base64"),
250
+ decodeJson: (json) => {
251
+ if (typeof json !== "string") throw new Error(`Expected base64 string for pg/bytea@1, got ${typeof json}`);
252
+ const decoded = Buffer.from(json, "base64");
253
+ if (decoded.toString("base64") !== json) throw new Error(`Invalid base64 string for pg/bytea@1 (length: ${json.length})`);
254
+ return new Uint8Array(decoded);
255
+ },
256
+ meta: { db: { sql: { postgres: { nativeType: "bytea" } } } }
257
+ });
243
258
  const pgEnumCodec = codec({
244
259
  typeId: PG_ENUM_CODEC_ID,
245
260
  targetTypes: ["enum"],
@@ -281,10 +296,10 @@ const pgJsonbCodec = codec({
281
296
  decode: (wire) => typeof wire === "string" ? JSON.parse(wire) : wire,
282
297
  meta: { db: { sql: { postgres: { nativeType: "jsonb" } } } }
283
298
  });
284
- const codecs = defineCodecs().add("char", sqlCharCodec).add("varchar", sqlVarcharCodec).add("int", sqlIntCodec).add("float", sqlFloatCodec).add("sql-text", sqlTextCodec).add("sql-timestamp", sqlTimestampCodec).add("text", pgTextCodec).add("character", pgCharCodec).add("character varying", pgVarcharCodec).add("integer", pgIntCodec).add("double precision", pgFloatCodec).add("int4", pgInt4Codec).add("int2", pgInt2Codec).add("int8", pgInt8Codec).add("float4", pgFloat4Codec).add("float8", pgFloat8Codec).add("numeric", pgNumericCodec).add("timestamp", pgTimestampCodec).add("timestamptz", pgTimestamptzCodec).add("time", pgTimeCodec).add("timetz", pgTimetzCodec).add("bool", pgBoolCodec).add("bit", pgBitCodec).add("bit varying", pgVarbitCodec).add("interval", pgIntervalCodec).add("enum", pgEnumCodec).add("json", pgJsonCodec).add("jsonb", pgJsonbCodec);
299
+ const codecs = defineCodecs().add("char", sqlCharCodec).add("varchar", sqlVarcharCodec).add("int", sqlIntCodec).add("float", sqlFloatCodec).add("sql-text", sqlTextCodec).add("sql-timestamp", sqlTimestampCodec).add("text", pgTextCodec).add("character", pgCharCodec).add("character varying", pgVarcharCodec).add("integer", pgIntCodec).add("double precision", pgFloatCodec).add("int4", pgInt4Codec).add("int2", pgInt2Codec).add("int8", pgInt8Codec).add("float4", pgFloat4Codec).add("float8", pgFloat8Codec).add("numeric", pgNumericCodec).add("timestamp", pgTimestampCodec).add("timestamptz", pgTimestamptzCodec).add("time", pgTimeCodec).add("timetz", pgTimetzCodec).add("bool", pgBoolCodec).add("bit", pgBitCodec).add("bit varying", pgVarbitCodec).add("bytea", pgByteaCodec).add("interval", pgIntervalCodec).add("enum", pgEnumCodec).add("json", pgJsonCodec).add("jsonb", pgJsonbCodec);
285
300
  const codecDefinitions = codecs.codecDefinitions;
286
301
  const dataTypes = codecs.dataTypes;
287
302
 
288
303
  //#endregion
289
304
  export { dataTypes as n, codecDefinitions as t };
290
- //# sourceMappingURL=codecs-dzZ_dMpK.mjs.map
305
+ //# sourceMappingURL=codecs-D0oXyJIH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codecs-D0oXyJIH.mjs","names":["arktype"],"sources":["../src/core/codecs.ts"],"sourcesContent":["/**\n * Unified codec definitions for Postgres adapter.\n *\n * This file contains a single source of truth for all codec information:\n * - Scalar names\n * - Type IDs\n * - Codec implementations (runtime)\n * - Type information (compile-time)\n *\n * This structure is used both at runtime (to populate the registry) and\n * at compile time (to derive CodecTypes).\n */\n\nimport type { JsonValue } from '@prisma-next/contract/types';\nimport type { Codec, CodecMeta, CodecTrait } from '@prisma-next/sql-relational-core/ast';\nimport { codec, defineCodecs, sqlCodecDefinitions } from '@prisma-next/sql-relational-core/ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { type as arktype } from 'arktype';\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_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_CODEC_ID,\n PG_TIME_CODEC_ID,\n PG_TIMESTAMP_CODEC_ID,\n PG_TIMESTAMPTZ_CODEC_ID,\n PG_TIMETZ_CODEC_ID,\n PG_VARBIT_CODEC_ID,\n PG_VARCHAR_CODEC_ID,\n} from './codec-ids';\n\nconst lengthParamsSchema = arktype({\n length: 'number.integer > 0',\n});\n\nconst numericParamsSchema = arktype({\n precision: 'number.integer > 0 & number.integer <= 1000',\n 'scale?': 'number.integer >= 0',\n});\n\nconst precisionParamsSchema = arktype({\n 'precision?': 'number.integer >= 0 & number.integer <= 6',\n});\n\nfunction renderLength(typeName: string, typeParams: Record<string, unknown>): 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\nfunction 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\n// Phase C: postgres' raw json/jsonb codecs no longer carry a\n// `renderOutputType` slot — the schema-typed JSON surface that drove\n// `typeParams: { schemaJson, type? }` retired in favor of the per-library\n// extension package (`@prisma-next/extension-arktype-json`). Untyped\n// json/jsonb columns have no typeParams; the framework emit path falls\n// through to the generic `CodecTypes['pg/jsonb@1']['output']` accessor\n// (which resolves to `JsonValue` via the codec-types map).\n\nfunction aliasCodec<\n Id extends string,\n TTraits extends readonly CodecTrait[],\n TWire,\n TJs,\n TParams,\n THelper,\n>(\n base: Codec<string, TTraits, TWire, TJs, TParams, THelper>,\n options: {\n readonly typeId: Id;\n readonly targetTypes: readonly string[];\n readonly meta?: CodecMeta;\n },\n): Codec<Id, TTraits, TWire, TJs, TParams, THelper> {\n return {\n id: options.typeId,\n targetTypes: options.targetTypes,\n ...ifDefined('meta', options.meta),\n ...ifDefined('paramsSchema', base.paramsSchema),\n ...ifDefined('init', base.init),\n ...ifDefined('encode', base.encode),\n ...ifDefined('traits', base.traits),\n ...ifDefined('renderOutputType', base.renderOutputType),\n decode: base.decode,\n encodeJson: base.encodeJson,\n decodeJson: base.decodeJson,\n } as Codec<Id, TTraits, TWire, TJs, TParams, THelper>;\n}\n\nconst sqlCharCodec = sqlCodecDefinitions.char.codec;\nconst sqlVarcharCodec = sqlCodecDefinitions.varchar.codec;\nconst sqlIntCodec = sqlCodecDefinitions.int.codec;\nconst sqlFloatCodec = sqlCodecDefinitions.float.codec;\nconst sqlTextCodec = sqlCodecDefinitions.text.codec;\nconst sqlTimestampCodec = sqlCodecDefinitions.timestamp.codec;\n\n// Create individual codec instances\nconst pgTextCodec = codec({\n typeId: PG_TEXT_CODEC_ID,\n targetTypes: ['text'],\n traits: ['equality', 'order', 'textual'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'text',\n },\n },\n },\n },\n});\n\nconst pgCharCodec = aliasCodec(sqlCharCodec, {\n typeId: PG_CHAR_CODEC_ID,\n targetTypes: ['character'],\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'character',\n },\n },\n },\n },\n});\n\nconst pgVarcharCodec = aliasCodec(sqlVarcharCodec, {\n typeId: PG_VARCHAR_CODEC_ID,\n targetTypes: ['character varying'],\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'character varying',\n },\n },\n },\n },\n});\n\nconst pgIntCodec = aliasCodec(sqlIntCodec, {\n typeId: PG_INT_CODEC_ID,\n targetTypes: ['int4'],\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'integer',\n },\n },\n },\n },\n});\n\nconst pgFloatCodec = aliasCodec(sqlFloatCodec, {\n typeId: PG_FLOAT_CODEC_ID,\n targetTypes: ['float8'],\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'double precision',\n },\n },\n },\n },\n});\n\nconst pgInt4Codec = codec({\n typeId: PG_INT4_CODEC_ID,\n targetTypes: ['int4'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: number): number => value,\n decode: (wire: number): number => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'integer',\n },\n },\n },\n },\n});\n\nconst pgNumericCodec = codec<\n typeof PG_NUMERIC_CODEC_ID,\n readonly ['equality', 'order', 'numeric'],\n string,\n string\n>({\n typeId: PG_NUMERIC_CODEC_ID,\n targetTypes: ['numeric', 'decimal'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: string): string => value,\n decode: (wire: string | number): string => {\n if (typeof wire === 'number') return String(wire);\n return wire;\n },\n paramsSchema: numericParamsSchema,\n renderOutputType: (typeParams) => {\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 return typeof scale === 'number' ? `Numeric<${precision}, ${scale}>` : `Numeric<${precision}>`;\n },\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'numeric',\n },\n },\n },\n },\n});\n\nconst pgInt2Codec = codec({\n typeId: PG_INT2_CODEC_ID,\n targetTypes: ['int2'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: number): number => value,\n decode: (wire: number): number => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'smallint',\n },\n },\n },\n },\n});\n\nconst pgInt8Codec = codec({\n typeId: PG_INT8_CODEC_ID,\n targetTypes: ['int8'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: number): number => value,\n decode: (wire: number): number => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'bigint',\n },\n },\n },\n },\n});\n\nconst pgFloat4Codec = codec({\n typeId: PG_FLOAT4_CODEC_ID,\n targetTypes: ['float4'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: number): number => value,\n decode: (wire: number): number => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'real',\n },\n },\n },\n },\n});\n\nconst pgFloat8Codec = codec({\n typeId: PG_FLOAT8_CODEC_ID,\n targetTypes: ['float8'],\n traits: ['equality', 'order', 'numeric'],\n encode: (value: number): number => value,\n decode: (wire: number): number => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'double precision',\n },\n },\n },\n },\n});\n\nconst pgTimestampCodec = codec<\n typeof PG_TIMESTAMP_CODEC_ID,\n readonly ['equality', 'order'],\n Date,\n Date\n>({\n typeId: PG_TIMESTAMP_CODEC_ID,\n targetTypes: ['timestamp'],\n traits: ['equality', 'order'],\n encode: (value: Date): Date => value,\n decode: (wire: Date): Date => wire,\n encodeJson: (value: Date) => value.toISOString(),\n decodeJson: (json) => {\n if (typeof json !== 'string') {\n throw new Error(`Expected ISO date string for pg/timestamp@1, got ${typeof json}`);\n }\n const date = new Date(json);\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 paramsSchema: precisionParamsSchema,\n renderOutputType: (typeParams) => renderPrecision('Timestamp', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'timestamp without time zone',\n },\n },\n },\n },\n});\n\nconst pgTimestamptzCodec = codec<\n typeof PG_TIMESTAMPTZ_CODEC_ID,\n readonly ['equality', 'order'],\n Date,\n Date\n>({\n typeId: PG_TIMESTAMPTZ_CODEC_ID,\n targetTypes: ['timestamptz'],\n traits: ['equality', 'order'],\n encode: (value: Date): Date => value,\n decode: (wire: Date): Date => wire,\n encodeJson: (value: Date) => value.toISOString(),\n decodeJson: (json) => {\n if (typeof json !== 'string') {\n throw new Error(`Expected ISO date string for pg/timestamptz@1, got ${typeof 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 paramsSchema: precisionParamsSchema,\n renderOutputType: (typeParams) => renderPrecision('Timestamptz', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'timestamp with time zone',\n },\n },\n },\n },\n});\n\nconst pgTimeCodec = codec<typeof PG_TIME_CODEC_ID, readonly ['equality', 'order'], string, string>({\n typeId: PG_TIME_CODEC_ID,\n targetTypes: ['time'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n paramsSchema: precisionParamsSchema,\n renderOutputType: (typeParams) => renderPrecision('Time', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'time',\n },\n },\n },\n },\n});\n\nconst pgTimetzCodec = codec<\n typeof PG_TIMETZ_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n>({\n typeId: PG_TIMETZ_CODEC_ID,\n targetTypes: ['timetz'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n paramsSchema: precisionParamsSchema,\n renderOutputType: (typeParams) => renderPrecision('Timetz', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'timetz',\n },\n },\n },\n },\n});\n\nconst pgBoolCodec = codec({\n typeId: PG_BOOL_CODEC_ID,\n targetTypes: ['bool'],\n traits: ['equality', 'boolean'],\n encode: (value: boolean): boolean => value,\n decode: (wire: boolean): boolean => wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'boolean',\n },\n },\n },\n },\n});\n\nconst pgBitCodec = codec<typeof PG_BIT_CODEC_ID, readonly ['equality', 'order'], string, string>({\n typeId: PG_BIT_CODEC_ID,\n targetTypes: ['bit'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n paramsSchema: lengthParamsSchema,\n renderOutputType: (typeParams) => renderLength('Bit', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'bit',\n },\n },\n },\n },\n});\n\nconst pgVarbitCodec = codec<\n typeof PG_VARBIT_CODEC_ID,\n readonly ['equality', 'order'],\n string,\n string\n>({\n typeId: PG_VARBIT_CODEC_ID,\n targetTypes: ['bit varying'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n paramsSchema: lengthParamsSchema,\n renderOutputType: (typeParams) => renderLength('VarBit', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'bit varying',\n },\n },\n },\n },\n});\n\nconst pgByteaCodec = codec({\n typeId: PG_BYTEA_CODEC_ID,\n targetTypes: ['bytea'],\n traits: ['equality'],\n encode: (value: Uint8Array): Uint8Array => value,\n decode: (wire: Uint8Array): Uint8Array =>\n // Postgres node drivers commonly return Buffer instances (which extend\n // Uint8Array) — normalize to a plain Uint8Array view so engine-agnostic\n // consumers don't accidentally observe Buffer-specific APIs.\n wire instanceof Uint8Array && wire.constructor === Uint8Array\n ? wire\n : new Uint8Array(wire.buffer, wire.byteOffset, wire.byteLength),\n encodeJson: (value: Uint8Array): string => Buffer.from(value).toString('base64'),\n decodeJson: (json): Uint8Array => {\n if (typeof json !== 'string') {\n throw new Error(`Expected base64 string for pg/bytea@1, got ${typeof json}`);\n }\n const decoded = Buffer.from(json, 'base64');\n if (decoded.toString('base64') !== json) {\n throw new Error(`Invalid base64 string for pg/bytea@1 (length: ${json.length})`);\n }\n return new Uint8Array(decoded);\n },\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'bytea',\n },\n },\n },\n },\n});\n\nconst pgEnumCodec = codec({\n typeId: PG_ENUM_CODEC_ID,\n targetTypes: ['enum'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string): string => wire,\n renderOutputType: (typeParams) => {\n const values = typeParams['values'];\n if (!Array.isArray(values)) {\n throw new Error(\n `renderOutputType: expected array \"values\" in typeParams for enum, got ${typeof values}`,\n );\n }\n return values\n .map((value) => `'${String(value).replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\")}'`)\n .join(' | ');\n },\n});\n\nconst pgIntervalCodec = codec<\n typeof PG_INTERVAL_CODEC_ID,\n readonly ['equality', 'order'],\n string | Record<string, unknown>,\n string\n>({\n typeId: PG_INTERVAL_CODEC_ID,\n targetTypes: ['interval'],\n traits: ['equality', 'order'],\n encode: (value: string): string => value,\n decode: (wire: string | Record<string, unknown>): string => {\n if (typeof wire === 'string') return wire;\n return JSON.stringify(wire);\n },\n paramsSchema: precisionParamsSchema,\n renderOutputType: (typeParams) => renderPrecision('Interval', typeParams),\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'interval',\n },\n },\n },\n },\n});\n\nconst pgJsonCodec = codec({\n typeId: PG_JSON_CODEC_ID,\n targetTypes: ['json'],\n traits: [],\n encode: (value: string | JsonValue): string => JSON.stringify(value),\n decode: (wire: string | JsonValue): JsonValue =>\n typeof wire === 'string' ? JSON.parse(wire) : wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'json',\n },\n },\n },\n },\n});\n\nconst pgJsonbCodec = codec({\n typeId: PG_JSONB_CODEC_ID,\n targetTypes: ['jsonb'],\n traits: ['equality'],\n encode: (value: string | JsonValue): string => JSON.stringify(value),\n decode: (wire: string | JsonValue): JsonValue =>\n typeof wire === 'string' ? JSON.parse(wire) : wire,\n meta: {\n db: {\n sql: {\n postgres: {\n nativeType: 'jsonb',\n },\n },\n },\n },\n});\n\n// Build codec definitions using the builder DSL\nconst codecs = defineCodecs()\n .add('char', sqlCharCodec)\n .add('varchar', sqlVarcharCodec)\n .add('int', sqlIntCodec)\n .add('float', sqlFloatCodec)\n .add('sql-text', sqlTextCodec)\n .add('sql-timestamp', sqlTimestampCodec)\n .add('text', pgTextCodec)\n .add('character', pgCharCodec)\n .add('character varying', pgVarcharCodec)\n .add('integer', pgIntCodec)\n .add('double precision', pgFloatCodec)\n .add('int4', pgInt4Codec)\n .add('int2', pgInt2Codec)\n .add('int8', pgInt8Codec)\n .add('float4', pgFloat4Codec)\n .add('float8', pgFloat8Codec)\n .add('numeric', pgNumericCodec)\n .add('timestamp', pgTimestampCodec)\n .add('timestamptz', pgTimestamptzCodec)\n .add('time', pgTimeCodec)\n .add('timetz', pgTimetzCodec)\n .add('bool', pgBoolCodec)\n .add('bit', pgBitCodec)\n .add('bit varying', pgVarbitCodec)\n .add('bytea', pgByteaCodec)\n .add('interval', pgIntervalCodec)\n .add('enum', pgEnumCodec)\n .add('json', pgJsonCodec)\n .add('jsonb', pgJsonbCodec);\n\n// Export derived structures directly from codecs builder\nexport const codecDefinitions = codecs.codecDefinitions;\nexport const dataTypes = codecs.dataTypes;\n\nexport type CodecTypes = typeof codecs.CodecTypes;\n"],"mappings":";;;;;;AA4CA,MAAM,qBAAqBA,KAAQ,EACjC,QAAQ,sBACT,CAAC;AAEF,MAAM,sBAAsBA,KAAQ;CAClC,WAAW;CACX,UAAU;CACX,CAAC;AAEF,MAAM,wBAAwBA,KAAQ,EACpC,cAAc,6CACf,CAAC;AAEF,SAAS,aAAa,UAAkB,YAAyD;CAC/F,MAAM,SAAS,WAAW;AAC1B,KAAI,WAAW,OACb;AAEF,KAAI,OAAO,WAAW,YAAY,CAAC,OAAO,SAAS,OAAO,IAAI,CAAC,OAAO,UAAU,OAAO,CACrF,OAAM,IAAI,MACR,iEAAiE,SAAS,QAAQ,OAAO,OAAO,GACjG;AAEH,QAAO,GAAG,SAAS,GAAG,OAAO;;AAG/B,SAAS,gBAAgB,UAAkB,YAA6C;CACtF,MAAM,YAAY,WAAW;AAC7B,KAAI,cAAc,OAChB,QAAO;AAET,KACE,OAAO,cAAc,YACrB,CAAC,OAAO,SAAS,UAAU,IAC3B,CAAC,OAAO,UAAU,UAAU,CAE5B,OAAM,IAAI,MACR,oEAAoE,SAAS,QAAQ,OAAO,UAAU,GACvG;AAEH,QAAO,GAAG,SAAS,GAAG,UAAU;;AAWlC,SAAS,WAQP,MACA,SAKkD;AAClD,QAAO;EACL,IAAI,QAAQ;EACZ,aAAa,QAAQ;EACrB,GAAG,UAAU,QAAQ,QAAQ,KAAK;EAClC,GAAG,UAAU,gBAAgB,KAAK,aAAa;EAC/C,GAAG,UAAU,QAAQ,KAAK,KAAK;EAC/B,GAAG,UAAU,UAAU,KAAK,OAAO;EACnC,GAAG,UAAU,UAAU,KAAK,OAAO;EACnC,GAAG,UAAU,oBAAoB,KAAK,iBAAiB;EACvD,QAAQ,KAAK;EACb,YAAY,KAAK;EACjB,YAAY,KAAK;EAClB;;AAGH,MAAM,eAAe,oBAAoB,KAAK;AAC9C,MAAM,kBAAkB,oBAAoB,QAAQ;AACpD,MAAM,cAAc,oBAAoB,IAAI;AAC5C,MAAM,gBAAgB,oBAAoB,MAAM;AAChD,MAAM,eAAe,oBAAoB,KAAK;AAC9C,MAAM,oBAAoB,oBAAoB,UAAU;AAGxD,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,QACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,WAAW,cAAc;CAC3C,QAAQ;CACR,aAAa,CAAC,YAAY;CAC1B,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,aACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,iBAAiB,WAAW,iBAAiB;CACjD,QAAQ;CACR,aAAa,CAAC,oBAAoB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,qBACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,aAAa,WAAW,aAAa;CACzC,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,WACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,eAAe,WAAW,eAAe;CAC7C,QAAQ;CACR,aAAa,CAAC,SAAS;CACvB,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,oBACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,WACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,iBAAiB,MAKrB;CACA,QAAQ;CACR,aAAa,CAAC,WAAW,UAAU;CACnC,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAkC;AACzC,MAAI,OAAO,SAAS,SAAU,QAAO,OAAO,KAAK;AACjD,SAAO;;CAET,cAAc;CACd,mBAAmB,eAAe;EAChC,MAAM,YAAY,WAAW;AAC7B,MAAI,cAAc,OAAW,QAAO;AACpC,MACE,OAAO,cAAc,YACrB,CAAC,OAAO,SAAS,UAAU,IAC3B,CAAC,OAAO,UAAU,UAAU,CAE5B,OAAM,IAAI,MACR,iFAAiF,OAAO,UAAU,GACnG;EAEH,MAAM,QAAQ,WAAW;AACzB,SAAO,OAAO,UAAU,WAAW,WAAW,UAAU,IAAI,MAAM,KAAK,WAAW,UAAU;;CAE9F,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,WACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,YACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,UACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,gBAAgB,MAAM;CAC1B,QAAQ;CACR,aAAa,CAAC,SAAS;CACvB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,QACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,gBAAgB,MAAM;CAC1B,QAAQ;CACR,aAAa,CAAC,SAAS;CACvB,QAAQ;EAAC;EAAY;EAAS;EAAU;CACxC,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,oBACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,mBAAmB,MAKvB;CACA,QAAQ;CACR,aAAa,CAAC,YAAY;CAC1B,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAAsB;CAC/B,SAAS,SAAqB;CAC9B,aAAa,UAAgB,MAAM,aAAa;CAChD,aAAa,SAAS;AACpB,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,MAAM,oDAAoD,OAAO,OAAO;EAEpF,MAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,SAAS,CAAC,CAC9B,OAAM,IAAI,MAAM,+CAA+C,OAAO;AAExE,SAAO;;CAET,cAAc;CACd,mBAAmB,eAAe,gBAAgB,aAAa,WAAW;CAC1E,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,+BACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,qBAAqB,MAKzB;CACA,QAAQ;CACR,aAAa,CAAC,cAAc;CAC5B,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAAsB;CAC/B,SAAS,SAAqB;CAC9B,aAAa,UAAgB,MAAM,aAAa;CAChD,aAAa,SAAS;AACpB,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,MAAM,sDAAsD,OAAO,OAAO;EAEtF,MAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,MAAI,OAAO,MAAM,KAAK,SAAS,CAAC,CAC9B,OAAM,IAAI,MAAM,iDAAiD,OAAO;AAE1E,SAAO;;CAET,cAAc;CACd,mBAAmB,eAAe,gBAAgB,eAAe,WAAW;CAC5E,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,4BACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAA+E;CACjG,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,cAAc;CACd,mBAAmB,eAAe,gBAAgB,QAAQ,WAAW;CACrE,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,QACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,gBAAgB,MAKpB;CACA,QAAQ;CACR,aAAa,CAAC,SAAS;CACvB,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,cAAc;CACd,mBAAmB,eAAe,gBAAgB,UAAU,WAAW;CACvE,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,UACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ,CAAC,YAAY,UAAU;CAC/B,SAAS,UAA4B;CACrC,SAAS,SAA2B;CACpC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,WACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,aAAa,MAA8E;CAC/F,QAAQ;CACR,aAAa,CAAC,MAAM;CACpB,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,cAAc;CACd,mBAAmB,eAAe,aAAa,OAAO,WAAW;CACjE,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,OACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,gBAAgB,MAKpB;CACA,QAAQ;CACR,aAAa,CAAC,cAAc;CAC5B,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,cAAc;CACd,mBAAmB,eAAe,aAAa,UAAU,WAAW;CACpE,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,eACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,eAAe,MAAM;CACzB,QAAQ;CACR,aAAa,CAAC,QAAQ;CACtB,QAAQ,CAAC,WAAW;CACpB,SAAS,UAAkC;CAC3C,SAAS,SAIP,gBAAgB,cAAc,KAAK,gBAAgB,aAC/C,OACA,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,WAAW;CACnE,aAAa,UAA8B,OAAO,KAAK,MAAM,CAAC,SAAS,SAAS;CAChF,aAAa,SAAqB;AAChC,MAAI,OAAO,SAAS,SAClB,OAAM,IAAI,MAAM,8CAA8C,OAAO,OAAO;EAE9E,MAAM,UAAU,OAAO,KAAK,MAAM,SAAS;AAC3C,MAAI,QAAQ,SAAS,SAAS,KAAK,KACjC,OAAM,IAAI,MAAM,iDAAiD,KAAK,OAAO,GAAG;AAElF,SAAO,IAAI,WAAW,QAAQ;;CAEhC,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,SACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAyB;CAClC,mBAAmB,eAAe;EAChC,MAAM,SAAS,WAAW;AAC1B,MAAI,CAAC,MAAM,QAAQ,OAAO,CACxB,OAAM,IAAI,MACR,yEAAyE,OAAO,SACjF;AAEH,SAAO,OACJ,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,CAAC,GAAG,CAChF,KAAK,MAAM;;CAEjB,CAAC;AAEF,MAAM,kBAAkB,MAKtB;CACA,QAAQ;CACR,aAAa,CAAC,WAAW;CACzB,QAAQ,CAAC,YAAY,QAAQ;CAC7B,SAAS,UAA0B;CACnC,SAAS,SAAmD;AAC1D,MAAI,OAAO,SAAS,SAAU,QAAO;AACrC,SAAO,KAAK,UAAU,KAAK;;CAE7B,cAAc;CACd,mBAAmB,eAAe,gBAAgB,YAAY,WAAW;CACzE,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,YACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,cAAc,MAAM;CACxB,QAAQ;CACR,aAAa,CAAC,OAAO;CACrB,QAAQ,EAAE;CACV,SAAS,UAAsC,KAAK,UAAU,MAAM;CACpE,SAAS,SACP,OAAO,SAAS,WAAW,KAAK,MAAM,KAAK,GAAG;CAChD,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,QACb,EACF,EACF,EACF;CACF,CAAC;AAEF,MAAM,eAAe,MAAM;CACzB,QAAQ;CACR,aAAa,CAAC,QAAQ;CACtB,QAAQ,CAAC,WAAW;CACpB,SAAS,UAAsC,KAAK,UAAU,MAAM;CACpE,SAAS,SACP,OAAO,SAAS,WAAW,KAAK,MAAM,KAAK,GAAG;CAChD,MAAM,EACJ,IAAI,EACF,KAAK,EACH,UAAU,EACR,YAAY,SACb,EACF,EACF,EACF;CACF,CAAC;AAGF,MAAM,SAAS,cAAc,CAC1B,IAAI,QAAQ,aAAa,CACzB,IAAI,WAAW,gBAAgB,CAC/B,IAAI,OAAO,YAAY,CACvB,IAAI,SAAS,cAAc,CAC3B,IAAI,YAAY,aAAa,CAC7B,IAAI,iBAAiB,kBAAkB,CACvC,IAAI,QAAQ,YAAY,CACxB,IAAI,aAAa,YAAY,CAC7B,IAAI,qBAAqB,eAAe,CACxC,IAAI,WAAW,WAAW,CAC1B,IAAI,oBAAoB,aAAa,CACrC,IAAI,QAAQ,YAAY,CACxB,IAAI,QAAQ,YAAY,CACxB,IAAI,QAAQ,YAAY,CACxB,IAAI,UAAU,cAAc,CAC5B,IAAI,UAAU,cAAc,CAC5B,IAAI,WAAW,eAAe,CAC9B,IAAI,aAAa,iBAAiB,CAClC,IAAI,eAAe,mBAAmB,CACtC,IAAI,QAAQ,YAAY,CACxB,IAAI,UAAU,cAAc,CAC5B,IAAI,QAAQ,YAAY,CACxB,IAAI,OAAO,WAAW,CACtB,IAAI,eAAe,cAAc,CACjC,IAAI,SAAS,aAAa,CAC1B,IAAI,YAAY,gBAAgB,CAChC,IAAI,QAAQ,YAAY,CACxB,IAAI,QAAQ,YAAY,CACxB,IAAI,SAAS,aAAa;AAG7B,MAAa,mBAAmB,OAAO;AACvC,MAAa,YAAY,OAAO"}
package/dist/codecs.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as codecDefinitions, r as dataTypes, t as CodecTypes } from "./codecs-CE5EUsNM.mjs";
1
+ import { n as codecDefinitions, r as dataTypes, t as CodecTypes } from "./codecs-B03dFv94.mjs";
2
2
  export { type CodecTypes, codecDefinitions, dataTypes };
package/dist/codecs.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { n as dataTypes, t as codecDefinitions } from "./codecs-dzZ_dMpK.mjs";
1
+ import { n as dataTypes, t as codecDefinitions } from "./codecs-D0oXyJIH.mjs";
2
2
 
3
3
  export { codecDefinitions, dataTypes };
package/dist/control.mjs CHANGED
@@ -3,7 +3,7 @@ import { t as parsePostgresDefault } from "./default-normalizer-DNOpRoOF.mjs";
3
3
  import { t as normalizeSchemaNativeType } from "./native-type-normalizer-CInai_oY.mjs";
4
4
  import { o as renderDefaultLiteral } from "./planner-ddl-builders-Dxvw1LHw.mjs";
5
5
  import "./issue-planner-CFjB0_oO.mjs";
6
- import { t as createPostgresMigrationPlanner } from "./planner-B4ZSLHRI.mjs";
6
+ import { t as createPostgresMigrationPlanner } from "./planner-Cm-ZLutk.mjs";
7
7
  import { a as ensurePrismaContractSchemaStatement, i as ensureMarkerTableStatement, n as buildMergeMarkerStatements, r as ensureLedgerTableStatement, t as buildLedgerInsertStatement } from "./statement-builders-CHqCtSfe.mjs";
8
8
  import { ifDefined } from "@prisma-next/utils/defined";
9
9
  import { contractToSchemaIR, extractCodecControlHooks, runnerFailure, runnerSuccess } from "@prisma-next/family-sql/control";
@@ -14,9 +14,6 @@ import { SqlQueryError } from "@prisma-next/sql-errors";
14
14
  //#region src/core/migrations/runner.ts
15
15
  const DEFAULT_CONFIG = { defaultSchema: "public" };
16
16
  const LOCK_DOMAIN = "prisma_next.contract.marker";
17
- function isDataTransformOperation(op) {
18
- return typeof op === "object" && op !== null && "operationClass" in op && op.operationClass === "data" && "name" in op && "check" in op && "run" in op;
19
- }
20
17
  /**
21
18
  * Deep clones and freezes a record object to prevent mutation.
22
19
  * Recursively clones nested objects and arrays to ensure complete isolation.
@@ -87,7 +84,7 @@ var PostgresMigrationRunner = class {
87
84
  why: "The resulting database schema does not satisfy the destination contract.",
88
85
  meta: { issues: schemaVerifyResult.schema.issues }
89
86
  });
90
- const incomingInvariants = options.plan.providedInvariants;
87
+ const incomingInvariants = options.plan.providedInvariants ?? [];
91
88
  const existingInvariants = new Set(existingMarker?.invariants ?? []);
92
89
  const incomingIsSubsetOfExisting = incomingInvariants.every((id) => existingInvariants.has(id));
93
90
  if (!(isSelfEdge && applyValue.operationsExecuted === 0 && incomingIsSubsetOfExisting)) {
@@ -114,13 +111,6 @@ var PostgresMigrationRunner = class {
114
111
  for (const operation of options.plan.operations) {
115
112
  options.callbacks?.onOperationStart?.(operation);
116
113
  try {
117
- if (operation.operationClass === "data" && isDataTransformOperation(operation)) {
118
- const dtResult = await this.executeDataTransform(driver, operation, { runIdempotency });
119
- if (!dtResult.ok) return dtResult;
120
- executedOperations.push(operation);
121
- operationsExecuted += 1;
122
- continue;
123
- }
124
114
  if (runPostchecks && runIdempotency) {
125
115
  if (await this.expectationsAreSatisfied(driver, operation.postcheck)) {
126
116
  executedOperations.push(this.createPostcheckPreSatisfiedSkipRecord(operation));
@@ -148,46 +138,6 @@ var PostgresMigrationRunner = class {
148
138
  executedOperations
149
139
  });
150
140
  }
151
- /**
152
- * Executes a data transform operation with the check → (skip or run) → check lifecycle.
153
- *
154
- * 1. If check is a query AST: render to SQL, execute. Empty result = already applied (skip).
155
- * 2. If check is `true`: always skip. If `false`: always run.
156
- * 3. Execute run ASTs (rendered to SQL) sequentially.
157
- * 4. Re-execute check as post-run validation. If violations remain, fail.
158
- */
159
- async executeDataTransform(driver, op, options) {
160
- if (op.check === true) return okVoid();
161
- if (options.runIdempotency && op.check !== null && op.check !== false) {
162
- if ((await driver.query(op.check.sql, op.check.params)).rows.length === 0) return okVoid();
163
- }
164
- if (op.run) for (const plan of op.run) try {
165
- await driver.query(plan.sql, plan.params);
166
- } catch (error) {
167
- if (SqlQueryError.is(error)) return runnerFailure("EXECUTION_FAILED", `Data transform "${op.name}" failed: ${error.message}`, {
168
- why: error.message,
169
- meta: {
170
- operationId: op.id,
171
- dataTransformName: op.name,
172
- sql: plan.sql,
173
- sqlState: error.sqlState
174
- }
175
- });
176
- throw error;
177
- }
178
- if (op.check !== null && op.check !== false) {
179
- const checkResult = await driver.query(op.check.sql, op.check.params);
180
- if (checkResult.rows.length > 0) return runnerFailure("POSTCHECK_FAILED", `Data transform "${op.name}" did not resolve all violations (${checkResult.rows.length} remaining)`, {
181
- why: `After executing the data transform, the check query still returns ${checkResult.rows.length} violation(s).`,
182
- meta: {
183
- operationId: op.id,
184
- dataTransformName: op.name,
185
- remainingViolations: checkResult.rows.length
186
- }
187
- });
188
- }
189
- return okVoid();
190
- }
191
141
  async ensureControlTables(driver) {
192
142
  await this.executeStatement(driver, ensurePrismaContractSchemaStatement);
193
143
  await this.executeStatement(driver, ensureMarkerTableStatement);
@@ -195,7 +145,7 @@ var PostgresMigrationRunner = class {
195
145
  }
196
146
  async runExpectationSteps(driver, steps, operation, phase) {
197
147
  for (const step of steps) {
198
- const result = await driver.query(step.sql);
148
+ const result = await driver.query(step.sql, step.params ?? []);
199
149
  if (!this.stepResultIsTrue(result.rows)) return runnerFailure(phase === "precheck" ? "PRECHECK_FAILED" : "POSTCHECK_FAILED", `Operation ${operation.id} failed during ${phase}: ${step.description}`, { meta: {
200
150
  operationId: operation.id,
201
151
  phase,
@@ -206,7 +156,7 @@ var PostgresMigrationRunner = class {
206
156
  }
207
157
  async runExecuteSteps(driver, steps, operation) {
208
158
  for (const step of steps) try {
209
- await driver.query(step.sql);
159
+ await driver.query(step.sql, step.params ?? []);
210
160
  } catch (error) {
211
161
  if (SqlQueryError.is(error)) return runnerFailure("EXECUTION_FAILED", `Operation ${operation.id} failed during execution: ${step.description}`, {
212
162
  why: error.message,
@@ -242,7 +192,7 @@ var PostgresMigrationRunner = class {
242
192
  async expectationsAreSatisfied(driver, steps) {
243
193
  if (steps.length === 0) return false;
244
194
  for (const step of steps) {
245
- const result = await driver.query(step.sql);
195
+ const result = await driver.query(step.sql, step.params ?? []);
246
196
  if (!this.stepResultIsTrue(result.rows)) return false;
247
197
  }
248
198
  return true;
@@ -314,7 +264,7 @@ var PostgresMigrationRunner = class {
314
264
  return okVoid();
315
265
  }
316
266
  async upsertMarker(driver, options, existingMarker) {
317
- const incomingInvariants = options.plan.providedInvariants;
267
+ const incomingInvariants = options.plan.providedInvariants ?? [];
318
268
  const writeStatements = buildMergeMarkerStatements({
319
269
  storageHash: options.plan.destination.storageHash,
320
270
  profileHash: options.plan.destination.profileHash ?? options.destinationContract.profileHash ?? options.plan.destination.storageHash,
@@ -1 +1 @@
1
- {"version":3,"file":"control.mjs","names":["DEFAULT_CONFIG: RunnerConfig","cloned: Record<string, unknown>","family: SqlControlFamilyInstance","config: RunnerConfig","applyValue: ApplyPlanSuccessValue","executedOperations: Array<SqlMigrationPlanOperation<PostgresPlanTargetDetails>>","error: unknown","postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails>"],"sources":["../src/core/migrations/runner.ts","../src/exports/control.ts"],"sourcesContent":["import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type {\n MigrationOperationPolicy,\n SqlControlFamilyInstance,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationRunner,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n} from '@prisma-next/family-sql/control';\nimport { runnerFailure, runnerSuccess } from '@prisma-next/family-sql/control';\nimport { verifySqlSchema } from '@prisma-next/family-sql/schema-verify';\nimport type { DataTransformOperation } from '@prisma-next/framework-components/control';\nimport { SqlQueryError } from '@prisma-next/sql-errors';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { Result } from '@prisma-next/utils/result';\nimport { ok, okVoid } from '@prisma-next/utils/result';\nimport { parsePostgresDefault } from '../default-normalizer';\nimport { normalizeSchemaNativeType } from '../native-type-normalizer';\nimport type { PostgresPlanTargetDetails } from './planner-target-details';\nimport {\n buildLedgerInsertStatement,\n buildMergeMarkerStatements,\n ensureLedgerTableStatement,\n ensureMarkerTableStatement,\n ensurePrismaContractSchemaStatement,\n type SqlStatement,\n} from './statement-builders';\n\ninterface RunnerConfig {\n readonly defaultSchema: string;\n}\n\ninterface ApplyPlanSuccessValue {\n readonly operationsExecuted: number;\n readonly executedOperations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[];\n}\n\nconst DEFAULT_CONFIG: RunnerConfig = {\n defaultSchema: 'public',\n};\n\nconst LOCK_DOMAIN = 'prisma_next.contract.marker';\n\nfunction isDataTransformOperation(op: unknown): op is DataTransformOperation {\n return (\n typeof op === 'object' &&\n op !== null &&\n 'operationClass' in op &&\n (op as { operationClass: string }).operationClass === 'data' &&\n 'name' in op &&\n 'check' in op &&\n 'run' in op\n );\n}\n\n/**\n * Deep clones and freezes a record object to prevent mutation.\n * Recursively clones nested objects and arrays to ensure complete isolation.\n */\nfunction cloneAndFreezeRecord<T extends Record<string, unknown>>(value: T): T {\n const cloned: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val === null || val === undefined) {\n cloned[key] = val;\n } else if (Array.isArray(val)) {\n // Clone array (shallow clone of array elements)\n cloned[key] = Object.freeze([...val]);\n } else if (typeof val === 'object') {\n // Recursively clone nested objects\n cloned[key] = cloneAndFreezeRecord(val as Record<string, unknown>);\n } else {\n // Primitives are copied as-is\n cloned[key] = val;\n }\n }\n return Object.freeze(cloned) as T;\n}\n\nexport function createPostgresMigrationRunner(\n family: SqlControlFamilyInstance,\n config: Partial<RunnerConfig> = {},\n): SqlMigrationRunner<PostgresPlanTargetDetails> {\n return new PostgresMigrationRunner(family, { ...DEFAULT_CONFIG, ...config });\n}\n\nclass PostgresMigrationRunner implements SqlMigrationRunner<PostgresPlanTargetDetails> {\n constructor(\n private readonly family: SqlControlFamilyInstance,\n private readonly config: RunnerConfig,\n ) {}\n\n async execute(\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n ): Promise<SqlMigrationRunnerResult> {\n const schema = options.schemaName ?? this.config.defaultSchema;\n const driver = options.driver;\n const lockKey = `${LOCK_DOMAIN}:${schema}`;\n\n // Static checks - fail fast before transaction\n const destinationCheck = this.ensurePlanMatchesDestinationContract(\n options.plan.destination,\n options.destinationContract,\n );\n if (!destinationCheck.ok) {\n return destinationCheck;\n }\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, options.plan.operations);\n if (!policyCheck.ok) {\n return policyCheck;\n }\n\n // Begin transaction for DB operations\n await this.beginTransaction(driver);\n let committed = false;\n try {\n await this.acquireLock(driver, lockKey);\n await this.ensureControlTables(driver);\n const existingMarker = await this.family.readMarker({ driver });\n\n // Validate plan origin matches existing marker (needs marker from DB)\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (!markerCheck.ok) {\n return markerCheck;\n }\n\n // db update (origin: null) always applies; migration-apply (origin set,\n // origin !== destination) skips if marker already matches destination.\n // Self-edges (origin === destination) intentionally bypass the skip:\n // the migration is data-only, and the data transform's own check\n // decides whether `run` fires.\n const markerAtDestination = this.markerMatchesDestination(existingMarker, options.plan);\n const isSelfEdge = options.plan.origin?.storageHash === options.plan.destination.storageHash;\n const skipOperations = markerAtDestination && options.plan.origin != null && !isSelfEdge;\n let applyValue: ApplyPlanSuccessValue;\n\n if (skipOperations) {\n applyValue = { operationsExecuted: 0, executedOperations: [] };\n } else {\n const applyResult = await this.applyPlan(driver, options);\n if (!applyResult.ok) {\n return applyResult;\n }\n applyValue = applyResult.value;\n }\n\n // Verify resulting schema matches contract\n // Step 1: Introspect live schema (DB I/O, family-owned)\n const schemaIR = await this.family.introspect({\n driver,\n contract: options.destinationContract,\n });\n\n // Step 2: Pure verification (no DB I/O)\n const schemaVerifyResult = verifySqlSchema({\n contract: options.destinationContract,\n schema: schemaIR,\n strict: options.strictVerification ?? true,\n context: options.context ?? {},\n typeMetadataRegistry: this.family.typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n normalizeDefault: parsePostgresDefault,\n normalizeNativeType: normalizeSchemaNativeType,\n });\n if (!schemaVerifyResult.ok) {\n return runnerFailure('SCHEMA_VERIFY_FAILED', schemaVerifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: {\n issues: schemaVerifyResult.schema.issues,\n },\n });\n }\n\n // Self-edge no-op detection: a self-edge migration with zero ops in\n // the plan that brings no new invariants produced no observable\n // change. Skip the marker + ledger writes so an idempotent re-apply\n // of a self-edge data transform doesn't churn updatedAt or pile up\n // empty ledger entries. db update no-ops still write a ledger entry\n // as audit trail.\n //\n // TODO(invariant-routing follow-up): `executeDataTransform` always\n // counts every op it visits (including self-skips via `check === true`\n // or empty idempotency probe), so `operationsExecuted === 0` here\n // means \"the plan had zero ops\" rather than \"every op self-skipped\".\n // The CLI is unaffected today because `migration-apply.ts` marker-\n // subtraction empties `effectiveRequired` first and short-circuits\n // before we run; the non-CLI re-apply path needs a per-op `executed`\n // flag threaded through `executeDataTransform` to recover the\n // intended check. See review thread A13 / future M5 ADR draft.\n const incomingInvariants = options.plan.providedInvariants;\n const existingInvariants = new Set(existingMarker?.invariants ?? []);\n const incomingIsSubsetOfExisting = incomingInvariants.every((id) =>\n existingInvariants.has(id),\n );\n const isSelfEdgeNoOp =\n isSelfEdge && applyValue.operationsExecuted === 0 && incomingIsSubsetOfExisting;\n\n if (!isSelfEdgeNoOp) {\n await this.upsertMarker(driver, options, existingMarker);\n await this.recordLedgerEntry(\n driver,\n options,\n existingMarker,\n applyValue.executedOperations,\n );\n }\n\n await this.commitTransaction(driver);\n committed = true;\n return runnerSuccess({\n operationsPlanned: options.plan.operations.length,\n operationsExecuted: applyValue.operationsExecuted,\n });\n } finally {\n if (!committed) {\n await this.rollbackTransaction(driver);\n }\n }\n }\n\n private async applyPlan(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n ): Promise<Result<ApplyPlanSuccessValue, SqlMigrationRunnerFailure>> {\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false; // Default true\n const runPostchecks = checks?.postchecks !== false; // Default true\n const runIdempotency = checks?.idempotencyChecks !== false; // Default true\n\n let operationsExecuted = 0;\n const executedOperations: Array<SqlMigrationPlanOperation<PostgresPlanTargetDetails>> = [];\n for (const operation of options.plan.operations) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n // Data transform operations have a different execution lifecycle\n if (operation.operationClass === 'data' && isDataTransformOperation(operation)) {\n const dtResult = await this.executeDataTransform(driver, operation, {\n runIdempotency,\n });\n if (!dtResult.ok) {\n return dtResult;\n }\n executedOperations.push(operation);\n operationsExecuted += 1;\n continue;\n }\n\n // Idempotency probe: only run if both postchecks and idempotency checks are enabled\n if (runPostchecks && runIdempotency) {\n const postcheckAlreadySatisfied = await this.expectationsAreSatisfied(\n driver,\n operation.postcheck,\n );\n if (postcheckAlreadySatisfied) {\n executedOperations.push(this.createPostcheckPreSatisfiedSkipRecord(operation));\n continue;\n }\n }\n\n // Prechecks: only run if enabled\n if (runPrechecks) {\n const precheckResult = await this.runExpectationSteps(\n driver,\n operation.precheck,\n operation,\n 'precheck',\n );\n if (!precheckResult.ok) {\n return precheckResult;\n }\n }\n\n const executeResult = await this.runExecuteSteps(driver, operation.execute, operation);\n if (!executeResult.ok) {\n return executeResult;\n }\n\n // Postchecks: only run if enabled\n if (runPostchecks) {\n const postcheckResult = await this.runExpectationSteps(\n driver,\n operation.postcheck,\n operation,\n 'postcheck',\n );\n if (!postcheckResult.ok) {\n return postcheckResult;\n }\n }\n\n executedOperations.push(operation);\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n return ok({ operationsExecuted, executedOperations });\n }\n\n /**\n * Executes a data transform operation with the check → (skip or run) → check lifecycle.\n *\n * 1. If check is a query AST: render to SQL, execute. Empty result = already applied (skip).\n * 2. If check is `true`: always skip. If `false`: always run.\n * 3. Execute run ASTs (rendered to SQL) sequentially.\n * 4. Re-execute check as post-run validation. If violations remain, fail.\n */\n private async executeDataTransform(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n op: DataTransformOperation,\n options: { runIdempotency: boolean },\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n // Step 1: Check (skip guard)\n if (op.check === true) {\n // Always skip, regardless of idempotency setting\n return okVoid();\n }\n if (options.runIdempotency && op.check !== null && op.check !== false) {\n const checkResult = await driver.query(op.check.sql, op.check.params);\n if (checkResult.rows.length === 0) {\n // No violations — already applied, skip\n return okVoid();\n }\n }\n\n // Step 2: Execute run steps\n if (op.run) {\n for (const plan of op.run) {\n try {\n await driver.query(plan.sql, plan.params);\n } catch (error: unknown) {\n if (SqlQueryError.is(error)) {\n return runnerFailure(\n 'EXECUTION_FAILED',\n `Data transform \"${op.name}\" failed: ${error.message}`,\n {\n why: error.message,\n meta: {\n operationId: op.id,\n dataTransformName: op.name,\n sql: plan.sql,\n sqlState: error.sqlState,\n },\n },\n );\n }\n throw error;\n }\n }\n }\n\n // Step 3: Post-run validation (check again)\n if (op.check !== null && op.check !== false) {\n const checkResult = await driver.query(op.check.sql, op.check.params);\n if (checkResult.rows.length > 0) {\n return runnerFailure(\n 'POSTCHECK_FAILED',\n `Data transform \"${op.name}\" did not resolve all violations (${checkResult.rows.length} remaining)`,\n {\n why: `After executing the data transform, the check query still returns ${checkResult.rows.length} violation(s).`,\n meta: {\n operationId: op.id,\n dataTransformName: op.name,\n remainingViolations: checkResult.rows.length,\n },\n },\n );\n }\n }\n\n return okVoid();\n }\n\n private async ensureControlTables(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await this.executeStatement(driver, ensurePrismaContractSchemaStatement);\n await this.executeStatement(driver, ensureMarkerTableStatement);\n await this.executeStatement(driver, ensureLedgerTableStatement);\n }\n\n private async runExpectationSteps(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n phase: 'precheck' | 'postcheck',\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n const result = await driver.query(step.sql);\n if (!this.stepResultIsTrue(result.rows)) {\n const code = phase === 'precheck' ? 'PRECHECK_FAILED' : 'POSTCHECK_FAILED';\n return runnerFailure(\n code,\n `Operation ${operation.id} failed during ${phase}: ${step.description}`,\n {\n meta: {\n operationId: operation.id,\n phase,\n stepDescription: step.description,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private async runExecuteSteps(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n try {\n await driver.query(step.sql);\n } catch (error: unknown) {\n // Catch SqlQueryError and include normalized metadata\n if (SqlQueryError.is(error)) {\n return runnerFailure(\n 'EXECUTION_FAILED',\n `Operation ${operation.id} failed during execution: ${step.description}`,\n {\n why: error.message,\n meta: {\n operationId: operation.id,\n stepDescription: step.description,\n sql: step.sql,\n sqlState: error.sqlState,\n constraint: error.constraint,\n table: error.table,\n column: error.column,\n detail: error.detail,\n },\n },\n );\n }\n // Let SqlConnectionError and other errors propagate (fail-fast)\n throw error;\n }\n }\n return okVoid();\n }\n\n private stepResultIsTrue(rows: readonly Record<string, unknown>[]): boolean {\n if (!rows || rows.length === 0) {\n return false;\n }\n const firstRow = rows[0];\n const firstValue = firstRow ? Object.values(firstRow)[0] : undefined;\n if (typeof firstValue === 'boolean') {\n return firstValue;\n }\n if (typeof firstValue === 'number') {\n return firstValue !== 0;\n }\n if (typeof firstValue === 'string') {\n const lower = firstValue.toLowerCase();\n // PostgreSQL boolean representations: 't'/'f', 'true'/'false', '1'/'0'\n if (lower === 't' || lower === 'true' || lower === '1') {\n return true;\n }\n if (lower === 'f' || lower === 'false' || lower === '0') {\n return false;\n }\n // For other strings, non-empty is truthy (though this case shouldn't occur for boolean checks)\n return firstValue.length > 0;\n }\n return Boolean(firstValue);\n }\n\n private async expectationsAreSatisfied(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n ): Promise<boolean> {\n if (steps.length === 0) {\n return false;\n }\n for (const step of steps) {\n const result = await driver.query(step.sql);\n if (!this.stepResultIsTrue(result.rows)) {\n return false;\n }\n }\n return true;\n }\n\n private createPostcheckPreSatisfiedSkipRecord(\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n ): SqlMigrationPlanOperation<PostgresPlanTargetDetails> {\n // Clone and freeze existing meta if present\n const clonedMeta = operation.meta ? cloneAndFreezeRecord(operation.meta) : undefined;\n\n // Create frozen runner metadata\n const runnerMeta = Object.freeze({\n skipped: true,\n reason: 'postcheck_pre_satisfied',\n });\n\n // Merge and freeze the combined meta\n const mergedMeta = Object.freeze({\n ...(clonedMeta ?? {}),\n runner: runnerMeta,\n });\n\n // Clone and freeze arrays to prevent mutation\n const frozenPostcheck = Object.freeze([...operation.postcheck]);\n\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...ifDefined('summary', operation.summary),\n operationClass: operation.operationClass,\n target: operation.target, // Already frozen from plan creation\n precheck: Object.freeze([]),\n execute: Object.freeze([]),\n postcheck: frozenPostcheck,\n ...ifDefined('meta', operation.meta || mergedMeta ? mergedMeta : undefined),\n });\n }\n\n private markerMatchesDestination(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['plan'],\n ): boolean {\n if (!marker) {\n return false;\n }\n if (marker.storageHash !== plan.destination.storageHash) {\n return false;\n }\n if (plan.destination.profileHash && marker.profileHash !== plan.destination.profileHash) {\n return false;\n }\n return true;\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[],\n ): Result<void, SqlMigrationRunnerFailure> {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${policy.allowedOperationClasses.join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n allowedClasses: policy.allowedOperationClasses,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['plan'],\n ): Result<void, SqlMigrationRunnerFailure> {\n const origin = plan.origin ?? null;\n if (!origin) {\n // No origin assertion on the plan — the caller does not want origin validation.\n // This is the case for `db update`, which introspects the live schema and does not\n // rely on marker continuity. `db init` handles its own marker checks before the runner.\n return okVoid();\n }\n\n if (!marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n {\n meta: {\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (origin.profileHash && marker.profileHash !== origin.profileHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker profile hash (${marker.profileHash}) does not match plan origin profile hash (${origin.profileHash}).`,\n {\n meta: {\n markerProfileHash: marker.profileHash,\n expectedOriginProfileHash: origin.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private ensurePlanMatchesDestinationContract(\n destination: SqlMigrationPlanContractInfo,\n contract: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['destinationContract'],\n ): Result<void, SqlMigrationRunnerFailure> {\n if (destination.storageHash !== contract.storage.storageHash) {\n return runnerFailure(\n 'DESTINATION_CONTRACT_MISMATCH',\n `Plan destination storage hash (${destination.storageHash}) does not match provided contract storage hash (${contract.storage.storageHash}).`,\n {\n meta: {\n planStorageHash: destination.storageHash,\n contractStorageHash: contract.storage.storageHash,\n },\n },\n );\n }\n if (\n destination.profileHash &&\n contract.profileHash &&\n destination.profileHash !== contract.profileHash\n ) {\n return runnerFailure(\n 'DESTINATION_CONTRACT_MISMATCH',\n `Plan destination profile hash (${destination.profileHash}) does not match provided contract profile hash (${contract.profileHash}).`,\n {\n meta: {\n planProfileHash: destination.profileHash,\n contractProfileHash: contract.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async upsertMarker(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n ): Promise<void> {\n const incomingInvariants = options.plan.providedInvariants;\n const writeStatements = buildMergeMarkerStatements({\n storageHash: options.plan.destination.storageHash,\n profileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n contractJson: options.destinationContract,\n canonicalVersion: null,\n meta: {},\n invariants: incomingInvariants,\n });\n const statement = existingMarker ? writeStatements.update : writeStatements.insert;\n await this.executeStatement(driver, statement);\n }\n\n private async recordLedgerEntry(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n executedOperations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[],\n ): Promise<void> {\n const ledgerStatement = buildLedgerInsertStatement({\n originStorageHash: existingMarker?.storageHash ?? null,\n originProfileHash: existingMarker?.profileHash ?? null,\n destinationStorageHash: options.plan.destination.storageHash,\n destinationProfileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n contractJsonBefore: existingMarker?.contractJson ?? null,\n contractJsonAfter: options.destinationContract,\n operations: executedOperations,\n });\n await this.executeStatement(driver, ledgerStatement);\n }\n\n private async acquireLock(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n key: string,\n ): Promise<void> {\n await driver.query('select pg_advisory_xact_lock(hashtext($1))', [key]);\n }\n\n private async beginTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('BEGIN');\n }\n\n private async commitTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('COMMIT');\n }\n\n private async rollbackTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('ROLLBACK');\n }\n\n private async executeStatement(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n statement: SqlStatement,\n ): Promise<void> {\n if (statement.params.length > 0) {\n await driver.query(statement.sql, statement.params);\n return;\n }\n await driver.query(statement.sql);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type {\n SqlControlFamilyInstance,\n SqlControlTargetDescriptor,\n} from '@prisma-next/family-sql/control';\nimport { contractToSchemaIR, extractCodecControlHooks } from '@prisma-next/family-sql/control';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n ControlTargetInstance,\n MigrationRunner,\n} from '@prisma-next/framework-components/control';\nimport type { SqlStorage, StorageColumn } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { postgresTargetDescriptorMeta } from '../core/descriptor-meta';\nimport { createPostgresMigrationPlanner } from '../core/migrations/planner';\nimport { renderDefaultLiteral } from '../core/migrations/planner-ddl-builders';\nimport type { PostgresPlanTargetDetails } from '../core/migrations/planner-target-details';\nimport { createPostgresMigrationRunner } from '../core/migrations/runner';\n\nfunction buildNativeTypeExpander(\n frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', 'postgres'>>,\n) {\n if (!frameworkComponents) {\n return undefined;\n }\n const codecHooks = extractCodecControlHooks(frameworkComponents);\n return (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n }) => {\n if (!input.typeParams) return input.nativeType;\n // Mirror `renderExpectedNativeType` in verify-sql-schema: when a codec\n // has no `expandNativeType` hook (e.g. `pg/enum@1`, whose typeParams\n // describe the value set rather than a DDL suffix), fall back to the\n // bare native type rather than throwing. Throwing here would reject\n // every plan involving an enum-/values-typed column as soon as its\n // `typeRef` resolved to a `StorageTypeInstance` carrying typeParams.\n if (!input.codecId) return input.nativeType;\n const hooks = codecHooks.get(input.codecId);\n if (!hooks?.expandNativeType) return input.nativeType;\n return hooks.expandNativeType(input);\n };\n}\n\nexport function postgresRenderDefault(def: ColumnDefault, column: StorageColumn): string {\n if (def.kind === 'function') {\n return def.expression;\n }\n return renderDefaultLiteral(def.value, column);\n}\n\nconst postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails> =\n {\n ...postgresTargetDescriptorMeta,\n migrations: {\n createPlanner(_family: SqlControlFamilyInstance) {\n return createPostgresMigrationPlanner();\n },\n createRunner(family) {\n return createPostgresMigrationRunner(family) as MigrationRunner<'sql', 'postgres'>;\n },\n contractToSchema(contract, frameworkComponents) {\n const expander = buildNativeTypeExpander(frameworkComponents);\n return contractToSchemaIR(contract as Contract<SqlStorage> | null, {\n annotationNamespace: 'pg',\n ...ifDefined('expandNativeType', expander),\n renderDefault: postgresRenderDefault,\n frameworkComponents: frameworkComponents ?? [],\n });\n },\n },\n create(): ControlTargetInstance<'sql', 'postgres'> {\n return {\n familyId: 'sql',\n targetId: 'postgres',\n };\n },\n /**\n * Direct method for SQL-specific usage.\n * @deprecated Use migrations.createPlanner() for CLI compatibility.\n */\n createPlanner(_family: SqlControlFamilyInstance) {\n return createPostgresMigrationPlanner();\n },\n /**\n * Direct method for SQL-specific usage.\n * @deprecated Use migrations.createRunner() for CLI compatibility.\n */\n createRunner(family) {\n return createPostgresMigrationRunner(family);\n },\n };\n\nexport default postgresTargetDescriptor;\n"],"mappings":"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"}
1
+ {"version":3,"file":"control.mjs","names":["DEFAULT_CONFIG: RunnerConfig","cloned: Record<string, unknown>","family: SqlControlFamilyInstance","config: RunnerConfig","applyValue: ApplyPlanSuccessValue","executedOperations: Array<SqlMigrationPlanOperation<PostgresPlanTargetDetails>>","error: unknown","postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails>"],"sources":["../src/core/migrations/runner.ts","../src/exports/control.ts"],"sourcesContent":["import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport type {\n MigrationOperationPolicy,\n SqlControlFamilyInstance,\n SqlMigrationPlanContractInfo,\n SqlMigrationPlanOperation,\n SqlMigrationPlanOperationStep,\n SqlMigrationRunner,\n SqlMigrationRunnerExecuteOptions,\n SqlMigrationRunnerFailure,\n SqlMigrationRunnerResult,\n} from '@prisma-next/family-sql/control';\nimport { runnerFailure, runnerSuccess } from '@prisma-next/family-sql/control';\nimport { verifySqlSchema } from '@prisma-next/family-sql/schema-verify';\nimport { SqlQueryError } from '@prisma-next/sql-errors';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport type { Result } from '@prisma-next/utils/result';\nimport { ok, okVoid } from '@prisma-next/utils/result';\nimport { parsePostgresDefault } from '../default-normalizer';\nimport { normalizeSchemaNativeType } from '../native-type-normalizer';\nimport type { PostgresPlanTargetDetails } from './planner-target-details';\nimport {\n buildLedgerInsertStatement,\n buildMergeMarkerStatements,\n ensureLedgerTableStatement,\n ensureMarkerTableStatement,\n ensurePrismaContractSchemaStatement,\n type SqlStatement,\n} from './statement-builders';\n\ninterface RunnerConfig {\n readonly defaultSchema: string;\n}\n\ninterface ApplyPlanSuccessValue {\n readonly operationsExecuted: number;\n readonly executedOperations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[];\n}\n\nconst DEFAULT_CONFIG: RunnerConfig = {\n defaultSchema: 'public',\n};\n\nconst LOCK_DOMAIN = 'prisma_next.contract.marker';\n\n/**\n * Deep clones and freezes a record object to prevent mutation.\n * Recursively clones nested objects and arrays to ensure complete isolation.\n */\nfunction cloneAndFreezeRecord<T extends Record<string, unknown>>(value: T): T {\n const cloned: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value)) {\n if (val === null || val === undefined) {\n cloned[key] = val;\n } else if (Array.isArray(val)) {\n // Clone array (shallow clone of array elements)\n cloned[key] = Object.freeze([...val]);\n } else if (typeof val === 'object') {\n // Recursively clone nested objects\n cloned[key] = cloneAndFreezeRecord(val as Record<string, unknown>);\n } else {\n // Primitives are copied as-is\n cloned[key] = val;\n }\n }\n return Object.freeze(cloned) as T;\n}\n\nexport function createPostgresMigrationRunner(\n family: SqlControlFamilyInstance,\n config: Partial<RunnerConfig> = {},\n): SqlMigrationRunner<PostgresPlanTargetDetails> {\n return new PostgresMigrationRunner(family, { ...DEFAULT_CONFIG, ...config });\n}\n\nclass PostgresMigrationRunner implements SqlMigrationRunner<PostgresPlanTargetDetails> {\n constructor(\n private readonly family: SqlControlFamilyInstance,\n private readonly config: RunnerConfig,\n ) {}\n\n async execute(\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n ): Promise<SqlMigrationRunnerResult> {\n const schema = options.schemaName ?? this.config.defaultSchema;\n const driver = options.driver;\n const lockKey = `${LOCK_DOMAIN}:${schema}`;\n\n // Static checks - fail fast before transaction\n const destinationCheck = this.ensurePlanMatchesDestinationContract(\n options.plan.destination,\n options.destinationContract,\n );\n if (!destinationCheck.ok) {\n return destinationCheck;\n }\n\n const policyCheck = this.enforcePolicyCompatibility(options.policy, options.plan.operations);\n if (!policyCheck.ok) {\n return policyCheck;\n }\n\n // Begin transaction for DB operations\n await this.beginTransaction(driver);\n let committed = false;\n try {\n await this.acquireLock(driver, lockKey);\n await this.ensureControlTables(driver);\n const existingMarker = await this.family.readMarker({ driver });\n\n // Validate plan origin matches existing marker (needs marker from DB)\n const markerCheck = this.ensureMarkerCompatibility(existingMarker, options.plan);\n if (!markerCheck.ok) {\n return markerCheck;\n }\n\n // db update (origin: null) always applies; migration-apply (origin set,\n // origin !== destination) skips if marker already matches destination.\n // Self-edges (origin === destination) intentionally bypass the skip:\n // the migration is data-only, and the data transform's own check\n // decides whether `run` fires.\n const markerAtDestination = this.markerMatchesDestination(existingMarker, options.plan);\n const isSelfEdge = options.plan.origin?.storageHash === options.plan.destination.storageHash;\n const skipOperations = markerAtDestination && options.plan.origin != null && !isSelfEdge;\n let applyValue: ApplyPlanSuccessValue;\n\n if (skipOperations) {\n applyValue = { operationsExecuted: 0, executedOperations: [] };\n } else {\n const applyResult = await this.applyPlan(driver, options);\n if (!applyResult.ok) {\n return applyResult;\n }\n applyValue = applyResult.value;\n }\n\n // Verify resulting schema matches contract\n // Step 1: Introspect live schema (DB I/O, family-owned)\n const schemaIR = await this.family.introspect({\n driver,\n contract: options.destinationContract,\n });\n\n // Step 2: Pure verification (no DB I/O)\n const schemaVerifyResult = verifySqlSchema({\n contract: options.destinationContract,\n schema: schemaIR,\n strict: options.strictVerification ?? true,\n context: options.context ?? {},\n typeMetadataRegistry: this.family.typeMetadataRegistry,\n frameworkComponents: options.frameworkComponents,\n normalizeDefault: parsePostgresDefault,\n normalizeNativeType: normalizeSchemaNativeType,\n });\n if (!schemaVerifyResult.ok) {\n return runnerFailure('SCHEMA_VERIFY_FAILED', schemaVerifyResult.summary, {\n why: 'The resulting database schema does not satisfy the destination contract.',\n meta: {\n issues: schemaVerifyResult.schema.issues,\n },\n });\n }\n\n // Self-edge no-op detection: a self-edge migration whose ops all\n // self-skipped (every op pre-satisfied) and that brings no new\n // invariants produced no observable change. Skip the marker +\n // ledger writes so an idempotent re-apply of a self-edge data\n // transform doesn't churn updatedAt or pile up empty ledger\n // entries. With data transforms now flowing through the unified\n // op loop, a pre-satisfied DT lands in the\n // `postcheckAlreadySatisfied` skip path which does not increment\n // `operationsExecuted`, so the check below correctly distinguishes\n // \"every op self-skipped\" from \"the plan had ops that ran\". `db\n // update` no-ops still write a ledger entry as audit trail.\n const incomingInvariants = options.plan.providedInvariants ?? [];\n const existingInvariants = new Set(existingMarker?.invariants ?? []);\n const incomingIsSubsetOfExisting = incomingInvariants.every((id) =>\n existingInvariants.has(id),\n );\n const isSelfEdgeNoOp =\n isSelfEdge && applyValue.operationsExecuted === 0 && incomingIsSubsetOfExisting;\n\n if (!isSelfEdgeNoOp) {\n await this.upsertMarker(driver, options, existingMarker);\n await this.recordLedgerEntry(\n driver,\n options,\n existingMarker,\n applyValue.executedOperations,\n );\n }\n\n await this.commitTransaction(driver);\n committed = true;\n return runnerSuccess({\n operationsPlanned: options.plan.operations.length,\n operationsExecuted: applyValue.operationsExecuted,\n });\n } finally {\n if (!committed) {\n await this.rollbackTransaction(driver);\n }\n }\n }\n\n private async applyPlan(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n ): Promise<Result<ApplyPlanSuccessValue, SqlMigrationRunnerFailure>> {\n const checks = options.executionChecks;\n const runPrechecks = checks?.prechecks !== false; // Default true\n const runPostchecks = checks?.postchecks !== false; // Default true\n const runIdempotency = checks?.idempotencyChecks !== false; // Default true\n\n let operationsExecuted = 0;\n const executedOperations: Array<SqlMigrationPlanOperation<PostgresPlanTargetDetails>> = [];\n for (const operation of options.plan.operations) {\n options.callbacks?.onOperationStart?.(operation);\n try {\n // Idempotency probe: only run if both postchecks and idempotency checks are enabled\n if (runPostchecks && runIdempotency) {\n const postcheckAlreadySatisfied = await this.expectationsAreSatisfied(\n driver,\n operation.postcheck,\n );\n if (postcheckAlreadySatisfied) {\n executedOperations.push(this.createPostcheckPreSatisfiedSkipRecord(operation));\n continue;\n }\n }\n\n // Prechecks: only run if enabled\n if (runPrechecks) {\n const precheckResult = await this.runExpectationSteps(\n driver,\n operation.precheck,\n operation,\n 'precheck',\n );\n if (!precheckResult.ok) {\n return precheckResult;\n }\n }\n\n const executeResult = await this.runExecuteSteps(driver, operation.execute, operation);\n if (!executeResult.ok) {\n return executeResult;\n }\n\n // Postchecks: only run if enabled\n if (runPostchecks) {\n const postcheckResult = await this.runExpectationSteps(\n driver,\n operation.postcheck,\n operation,\n 'postcheck',\n );\n if (!postcheckResult.ok) {\n return postcheckResult;\n }\n }\n\n executedOperations.push(operation);\n operationsExecuted += 1;\n } finally {\n options.callbacks?.onOperationComplete?.(operation);\n }\n }\n return ok({ operationsExecuted, executedOperations });\n }\n\n private async ensureControlTables(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await this.executeStatement(driver, ensurePrismaContractSchemaStatement);\n await this.executeStatement(driver, ensureMarkerTableStatement);\n await this.executeStatement(driver, ensureLedgerTableStatement);\n }\n\n private async runExpectationSteps(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n phase: 'precheck' | 'postcheck',\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n const code = phase === 'precheck' ? 'PRECHECK_FAILED' : 'POSTCHECK_FAILED';\n return runnerFailure(\n code,\n `Operation ${operation.id} failed during ${phase}: ${step.description}`,\n {\n meta: {\n operationId: operation.id,\n phase,\n stepDescription: step.description,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private async runExecuteSteps(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n ): Promise<Result<void, SqlMigrationRunnerFailure>> {\n for (const step of steps) {\n try {\n await driver.query(step.sql, step.params ?? []);\n } catch (error: unknown) {\n // Catch SqlQueryError and include normalized metadata\n if (SqlQueryError.is(error)) {\n return runnerFailure(\n 'EXECUTION_FAILED',\n `Operation ${operation.id} failed during execution: ${step.description}`,\n {\n why: error.message,\n meta: {\n operationId: operation.id,\n stepDescription: step.description,\n sql: step.sql,\n sqlState: error.sqlState,\n constraint: error.constraint,\n table: error.table,\n column: error.column,\n detail: error.detail,\n },\n },\n );\n }\n // Let SqlConnectionError and other errors propagate (fail-fast)\n throw error;\n }\n }\n return okVoid();\n }\n\n private stepResultIsTrue(rows: readonly Record<string, unknown>[]): boolean {\n if (!rows || rows.length === 0) {\n return false;\n }\n const firstRow = rows[0];\n const firstValue = firstRow ? Object.values(firstRow)[0] : undefined;\n if (typeof firstValue === 'boolean') {\n return firstValue;\n }\n if (typeof firstValue === 'number') {\n return firstValue !== 0;\n }\n if (typeof firstValue === 'string') {\n const lower = firstValue.toLowerCase();\n // PostgreSQL boolean representations: 't'/'f', 'true'/'false', '1'/'0'\n if (lower === 't' || lower === 'true' || lower === '1') {\n return true;\n }\n if (lower === 'f' || lower === 'false' || lower === '0') {\n return false;\n }\n // For other strings, non-empty is truthy (though this case shouldn't occur for boolean checks)\n return firstValue.length > 0;\n }\n return Boolean(firstValue);\n }\n\n private async expectationsAreSatisfied(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n steps: readonly SqlMigrationPlanOperationStep[],\n ): Promise<boolean> {\n if (steps.length === 0) {\n return false;\n }\n for (const step of steps) {\n const result = await driver.query(step.sql, step.params ?? []);\n if (!this.stepResultIsTrue(result.rows)) {\n return false;\n }\n }\n return true;\n }\n\n private createPostcheckPreSatisfiedSkipRecord(\n operation: SqlMigrationPlanOperation<PostgresPlanTargetDetails>,\n ): SqlMigrationPlanOperation<PostgresPlanTargetDetails> {\n // Clone and freeze existing meta if present\n const clonedMeta = operation.meta ? cloneAndFreezeRecord(operation.meta) : undefined;\n\n // Create frozen runner metadata\n const runnerMeta = Object.freeze({\n skipped: true,\n reason: 'postcheck_pre_satisfied',\n });\n\n // Merge and freeze the combined meta\n const mergedMeta = Object.freeze({\n ...(clonedMeta ?? {}),\n runner: runnerMeta,\n });\n\n // Clone and freeze arrays to prevent mutation\n const frozenPostcheck = Object.freeze([...operation.postcheck]);\n\n return Object.freeze({\n id: operation.id,\n label: operation.label,\n ...ifDefined('summary', operation.summary),\n operationClass: operation.operationClass,\n target: operation.target, // Already frozen from plan creation\n precheck: Object.freeze([]),\n execute: Object.freeze([]),\n postcheck: frozenPostcheck,\n ...ifDefined('meta', operation.meta || mergedMeta ? mergedMeta : undefined),\n });\n }\n\n private markerMatchesDestination(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['plan'],\n ): boolean {\n if (!marker) {\n return false;\n }\n if (marker.storageHash !== plan.destination.storageHash) {\n return false;\n }\n if (plan.destination.profileHash && marker.profileHash !== plan.destination.profileHash) {\n return false;\n }\n return true;\n }\n\n private enforcePolicyCompatibility(\n policy: MigrationOperationPolicy,\n operations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[],\n ): Result<void, SqlMigrationRunnerFailure> {\n const allowedClasses = new Set(policy.allowedOperationClasses);\n for (const operation of operations) {\n if (!allowedClasses.has(operation.operationClass)) {\n return runnerFailure(\n 'POLICY_VIOLATION',\n `Operation ${operation.id} has class \"${operation.operationClass}\" which is not allowed by policy.`,\n {\n why: `Policy only allows: ${policy.allowedOperationClasses.join(', ')}.`,\n meta: {\n operationId: operation.id,\n operationClass: operation.operationClass,\n allowedClasses: policy.allowedOperationClasses,\n },\n },\n );\n }\n }\n return okVoid();\n }\n\n private ensureMarkerCompatibility(\n marker: ContractMarkerRecord | null,\n plan: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['plan'],\n ): Result<void, SqlMigrationRunnerFailure> {\n const origin = plan.origin ?? null;\n if (!origin) {\n // No origin assertion on the plan — the caller does not want origin validation.\n // This is the case for `db update`, which introspects the live schema and does not\n // rely on marker continuity. `db init` handles its own marker checks before the runner.\n return okVoid();\n }\n\n if (!marker) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Missing contract marker: expected origin storage hash ${origin.storageHash}.`,\n {\n meta: {\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (marker.storageHash !== origin.storageHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker (${marker.storageHash}) does not match plan origin (${origin.storageHash}).`,\n {\n meta: {\n markerStorageHash: marker.storageHash,\n expectedOriginStorageHash: origin.storageHash,\n },\n },\n );\n }\n if (origin.profileHash && marker.profileHash !== origin.profileHash) {\n return runnerFailure(\n 'MARKER_ORIGIN_MISMATCH',\n `Existing contract marker profile hash (${marker.profileHash}) does not match plan origin profile hash (${origin.profileHash}).`,\n {\n meta: {\n markerProfileHash: marker.profileHash,\n expectedOriginProfileHash: origin.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private ensurePlanMatchesDestinationContract(\n destination: SqlMigrationPlanContractInfo,\n contract: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['destinationContract'],\n ): Result<void, SqlMigrationRunnerFailure> {\n if (destination.storageHash !== contract.storage.storageHash) {\n return runnerFailure(\n 'DESTINATION_CONTRACT_MISMATCH',\n `Plan destination storage hash (${destination.storageHash}) does not match provided contract storage hash (${contract.storage.storageHash}).`,\n {\n meta: {\n planStorageHash: destination.storageHash,\n contractStorageHash: contract.storage.storageHash,\n },\n },\n );\n }\n if (\n destination.profileHash &&\n contract.profileHash &&\n destination.profileHash !== contract.profileHash\n ) {\n return runnerFailure(\n 'DESTINATION_CONTRACT_MISMATCH',\n `Plan destination profile hash (${destination.profileHash}) does not match provided contract profile hash (${contract.profileHash}).`,\n {\n meta: {\n planProfileHash: destination.profileHash,\n contractProfileHash: contract.profileHash,\n },\n },\n );\n }\n return okVoid();\n }\n\n private async upsertMarker(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n ): Promise<void> {\n const incomingInvariants = options.plan.providedInvariants ?? [];\n const writeStatements = buildMergeMarkerStatements({\n storageHash: options.plan.destination.storageHash,\n profileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n contractJson: options.destinationContract,\n canonicalVersion: null,\n meta: {},\n invariants: incomingInvariants,\n });\n const statement = existingMarker ? writeStatements.update : writeStatements.insert;\n await this.executeStatement(driver, statement);\n }\n\n private async recordLedgerEntry(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n options: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>,\n existingMarker: ContractMarkerRecord | null,\n executedOperations: readonly SqlMigrationPlanOperation<PostgresPlanTargetDetails>[],\n ): Promise<void> {\n const ledgerStatement = buildLedgerInsertStatement({\n originStorageHash: existingMarker?.storageHash ?? null,\n originProfileHash: existingMarker?.profileHash ?? null,\n destinationStorageHash: options.plan.destination.storageHash,\n destinationProfileHash:\n options.plan.destination.profileHash ??\n options.destinationContract.profileHash ??\n options.plan.destination.storageHash,\n contractJsonBefore: existingMarker?.contractJson ?? null,\n contractJsonAfter: options.destinationContract,\n operations: executedOperations,\n });\n await this.executeStatement(driver, ledgerStatement);\n }\n\n private async acquireLock(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n key: string,\n ): Promise<void> {\n await driver.query('select pg_advisory_xact_lock(hashtext($1))', [key]);\n }\n\n private async beginTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('BEGIN');\n }\n\n private async commitTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('COMMIT');\n }\n\n private async rollbackTransaction(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n ): Promise<void> {\n await driver.query('ROLLBACK');\n }\n\n private async executeStatement(\n driver: SqlMigrationRunnerExecuteOptions<PostgresPlanTargetDetails>['driver'],\n statement: SqlStatement,\n ): Promise<void> {\n if (statement.params.length > 0) {\n await driver.query(statement.sql, statement.params);\n return;\n }\n await driver.query(statement.sql);\n }\n}\n","import type { ColumnDefault, Contract } from '@prisma-next/contract/types';\nimport type {\n SqlControlFamilyInstance,\n SqlControlTargetDescriptor,\n} from '@prisma-next/family-sql/control';\nimport { contractToSchemaIR, extractCodecControlHooks } from '@prisma-next/family-sql/control';\nimport type { TargetBoundComponentDescriptor } from '@prisma-next/framework-components/components';\nimport type {\n ControlTargetInstance,\n MigrationRunner,\n} from '@prisma-next/framework-components/control';\nimport type { SqlStorage, StorageColumn } from '@prisma-next/sql-contract/types';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { postgresTargetDescriptorMeta } from '../core/descriptor-meta';\nimport { createPostgresMigrationPlanner } from '../core/migrations/planner';\nimport { renderDefaultLiteral } from '../core/migrations/planner-ddl-builders';\nimport type { PostgresPlanTargetDetails } from '../core/migrations/planner-target-details';\nimport { createPostgresMigrationRunner } from '../core/migrations/runner';\n\nfunction buildNativeTypeExpander(\n frameworkComponents?: ReadonlyArray<TargetBoundComponentDescriptor<'sql', 'postgres'>>,\n) {\n if (!frameworkComponents) {\n return undefined;\n }\n const codecHooks = extractCodecControlHooks(frameworkComponents);\n return (input: {\n readonly nativeType: string;\n readonly codecId?: string;\n readonly typeParams?: Record<string, unknown>;\n }) => {\n if (!input.typeParams) return input.nativeType;\n // Mirror `renderExpectedNativeType` in verify-sql-schema: when a codec\n // has no `expandNativeType` hook (e.g. `pg/enum@1`, whose typeParams\n // describe the value set rather than a DDL suffix), fall back to the\n // bare native type rather than throwing. Throwing here would reject\n // every plan involving an enum-/values-typed column as soon as its\n // `typeRef` resolved to a `StorageTypeInstance` carrying typeParams.\n if (!input.codecId) return input.nativeType;\n const hooks = codecHooks.get(input.codecId);\n if (!hooks?.expandNativeType) return input.nativeType;\n return hooks.expandNativeType(input);\n };\n}\n\nexport function postgresRenderDefault(def: ColumnDefault, column: StorageColumn): string {\n if (def.kind === 'function') {\n return def.expression;\n }\n return renderDefaultLiteral(def.value, column);\n}\n\nconst postgresTargetDescriptor: SqlControlTargetDescriptor<'postgres', PostgresPlanTargetDetails> =\n {\n ...postgresTargetDescriptorMeta,\n migrations: {\n createPlanner(_family: SqlControlFamilyInstance) {\n return createPostgresMigrationPlanner();\n },\n createRunner(family) {\n return createPostgresMigrationRunner(family) as MigrationRunner<'sql', 'postgres'>;\n },\n contractToSchema(contract, frameworkComponents) {\n const expander = buildNativeTypeExpander(frameworkComponents);\n return contractToSchemaIR(contract as Contract<SqlStorage> | null, {\n annotationNamespace: 'pg',\n ...ifDefined('expandNativeType', expander),\n renderDefault: postgresRenderDefault,\n frameworkComponents: frameworkComponents ?? [],\n });\n },\n },\n create(): ControlTargetInstance<'sql', 'postgres'> {\n return {\n familyId: 'sql',\n targetId: 'postgres',\n };\n },\n /**\n * Direct method for SQL-specific usage.\n * @deprecated Use migrations.createPlanner() for CLI compatibility.\n */\n createPlanner(_family: SqlControlFamilyInstance) {\n return createPostgresMigrationPlanner();\n },\n /**\n * Direct method for SQL-specific usage.\n * @deprecated Use migrations.createRunner() for CLI compatibility.\n */\n createRunner(family) {\n return createPostgresMigrationRunner(family);\n },\n };\n\nexport default postgresTargetDescriptor;\n"],"mappings":";;;;;;;;;;;;;;AAuCA,MAAMA,iBAA+B,EACnC,eAAe,UAChB;AAED,MAAM,cAAc;;;;;AAMpB,SAAS,qBAAwD,OAAa;CAC5E,MAAMC,SAAkC,EAAE;AAC1C,MAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,MAAM,CAC5C,KAAI,QAAQ,QAAQ,QAAQ,OAC1B,QAAO,OAAO;UACL,MAAM,QAAQ,IAAI,CAE3B,QAAO,OAAO,OAAO,OAAO,CAAC,GAAG,IAAI,CAAC;UAC5B,OAAO,QAAQ,SAExB,QAAO,OAAO,qBAAqB,IAA+B;KAGlE,QAAO,OAAO;AAGlB,QAAO,OAAO,OAAO,OAAO;;AAG9B,SAAgB,8BACd,QACA,SAAgC,EAAE,EACa;AAC/C,QAAO,IAAI,wBAAwB,QAAQ;EAAE,GAAG;EAAgB,GAAG;EAAQ,CAAC;;AAG9E,IAAM,0BAAN,MAAuF;CACrF,YACE,AAAiBC,QACjB,AAAiBC,QACjB;EAFiB;EACA;;CAGnB,MAAM,QACJ,SACmC;EACnC,MAAM,SAAS,QAAQ,cAAc,KAAK,OAAO;EACjD,MAAM,SAAS,QAAQ;EACvB,MAAM,UAAU,GAAG,YAAY,GAAG;EAGlC,MAAM,mBAAmB,KAAK,qCAC5B,QAAQ,KAAK,aACb,QAAQ,oBACT;AACD,MAAI,CAAC,iBAAiB,GACpB,QAAO;EAGT,MAAM,cAAc,KAAK,2BAA2B,QAAQ,QAAQ,QAAQ,KAAK,WAAW;AAC5F,MAAI,CAAC,YAAY,GACf,QAAO;AAIT,QAAM,KAAK,iBAAiB,OAAO;EACnC,IAAI,YAAY;AAChB,MAAI;AACF,SAAM,KAAK,YAAY,QAAQ,QAAQ;AACvC,SAAM,KAAK,oBAAoB,OAAO;GACtC,MAAM,iBAAiB,MAAM,KAAK,OAAO,WAAW,EAAE,QAAQ,CAAC;GAG/D,MAAM,cAAc,KAAK,0BAA0B,gBAAgB,QAAQ,KAAK;AAChF,OAAI,CAAC,YAAY,GACf,QAAO;GAQT,MAAM,sBAAsB,KAAK,yBAAyB,gBAAgB,QAAQ,KAAK;GACvF,MAAM,aAAa,QAAQ,KAAK,QAAQ,gBAAgB,QAAQ,KAAK,YAAY;GACjF,MAAM,iBAAiB,uBAAuB,QAAQ,KAAK,UAAU,QAAQ,CAAC;GAC9E,IAAIC;AAEJ,OAAI,eACF,cAAa;IAAE,oBAAoB;IAAG,oBAAoB,EAAE;IAAE;QACzD;IACL,MAAM,cAAc,MAAM,KAAK,UAAU,QAAQ,QAAQ;AACzD,QAAI,CAAC,YAAY,GACf,QAAO;AAET,iBAAa,YAAY;;GAK3B,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW;IAC5C;IACA,UAAU,QAAQ;IACnB,CAAC;GAGF,MAAM,qBAAqB,gBAAgB;IACzC,UAAU,QAAQ;IAClB,QAAQ;IACR,QAAQ,QAAQ,sBAAsB;IACtC,SAAS,QAAQ,WAAW,EAAE;IAC9B,sBAAsB,KAAK,OAAO;IAClC,qBAAqB,QAAQ;IAC7B,kBAAkB;IAClB,qBAAqB;IACtB,CAAC;AACF,OAAI,CAAC,mBAAmB,GACtB,QAAO,cAAc,wBAAwB,mBAAmB,SAAS;IACvE,KAAK;IACL,MAAM,EACJ,QAAQ,mBAAmB,OAAO,QACnC;IACF,CAAC;GAcJ,MAAM,qBAAqB,QAAQ,KAAK,sBAAsB,EAAE;GAChE,MAAM,qBAAqB,IAAI,IAAI,gBAAgB,cAAc,EAAE,CAAC;GACpE,MAAM,6BAA6B,mBAAmB,OAAO,OAC3D,mBAAmB,IAAI,GAAG,CAC3B;AAID,OAAI,EAFF,cAAc,WAAW,uBAAuB,KAAK,6BAElC;AACnB,UAAM,KAAK,aAAa,QAAQ,SAAS,eAAe;AACxD,UAAM,KAAK,kBACT,QACA,SACA,gBACA,WAAW,mBACZ;;AAGH,SAAM,KAAK,kBAAkB,OAAO;AACpC,eAAY;AACZ,UAAO,cAAc;IACnB,mBAAmB,QAAQ,KAAK,WAAW;IAC3C,oBAAoB,WAAW;IAChC,CAAC;YACM;AACR,OAAI,CAAC,UACH,OAAM,KAAK,oBAAoB,OAAO;;;CAK5C,MAAc,UACZ,QACA,SACmE;EACnE,MAAM,SAAS,QAAQ;EACvB,MAAM,eAAe,QAAQ,cAAc;EAC3C,MAAM,gBAAgB,QAAQ,eAAe;EAC7C,MAAM,iBAAiB,QAAQ,sBAAsB;EAErD,IAAI,qBAAqB;EACzB,MAAMC,qBAAkF,EAAE;AAC1F,OAAK,MAAM,aAAa,QAAQ,KAAK,YAAY;AAC/C,WAAQ,WAAW,mBAAmB,UAAU;AAChD,OAAI;AAEF,QAAI,iBAAiB,gBAKnB;SAJkC,MAAM,KAAK,yBAC3C,QACA,UAAU,UACX,EAC8B;AAC7B,yBAAmB,KAAK,KAAK,sCAAsC,UAAU,CAAC;AAC9E;;;AAKJ,QAAI,cAAc;KAChB,MAAM,iBAAiB,MAAM,KAAK,oBAChC,QACA,UAAU,UACV,WACA,WACD;AACD,SAAI,CAAC,eAAe,GAClB,QAAO;;IAIX,MAAM,gBAAgB,MAAM,KAAK,gBAAgB,QAAQ,UAAU,SAAS,UAAU;AACtF,QAAI,CAAC,cAAc,GACjB,QAAO;AAIT,QAAI,eAAe;KACjB,MAAM,kBAAkB,MAAM,KAAK,oBACjC,QACA,UAAU,WACV,WACA,YACD;AACD,SAAI,CAAC,gBAAgB,GACnB,QAAO;;AAIX,uBAAmB,KAAK,UAAU;AAClC,0BAAsB;aACd;AACR,YAAQ,WAAW,sBAAsB,UAAU;;;AAGvD,SAAO,GAAG;GAAE;GAAoB;GAAoB,CAAC;;CAGvD,MAAc,oBACZ,QACe;AACf,QAAM,KAAK,iBAAiB,QAAQ,oCAAoC;AACxE,QAAM,KAAK,iBAAiB,QAAQ,2BAA2B;AAC/D,QAAM,KAAK,iBAAiB,QAAQ,2BAA2B;;CAGjE,MAAc,oBACZ,QACA,OACA,WACA,OACkD;AAClD,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,MAAM,OAAO,MAAM,KAAK,KAAK,KAAK,UAAU,EAAE,CAAC;AAC9D,OAAI,CAAC,KAAK,iBAAiB,OAAO,KAAK,CAErC,QAAO,cADM,UAAU,aAAa,oBAAoB,oBAGtD,aAAa,UAAU,GAAG,iBAAiB,MAAM,IAAI,KAAK,eAC1D,EACE,MAAM;IACJ,aAAa,UAAU;IACvB;IACA,iBAAiB,KAAK;IACvB,EACF,CACF;;AAGL,SAAO,QAAQ;;CAGjB,MAAc,gBACZ,QACA,OACA,WACkD;AAClD,OAAK,MAAM,QAAQ,MACjB,KAAI;AACF,SAAM,OAAO,MAAM,KAAK,KAAK,KAAK,UAAU,EAAE,CAAC;WACxCC,OAAgB;AAEvB,OAAI,cAAc,GAAG,MAAM,CACzB,QAAO,cACL,oBACA,aAAa,UAAU,GAAG,4BAA4B,KAAK,eAC3D;IACE,KAAK,MAAM;IACX,MAAM;KACJ,aAAa,UAAU;KACvB,iBAAiB,KAAK;KACtB,KAAK,KAAK;KACV,UAAU,MAAM;KAChB,YAAY,MAAM;KAClB,OAAO,MAAM;KACb,QAAQ,MAAM;KACd,QAAQ,MAAM;KACf;IACF,CACF;AAGH,SAAM;;AAGV,SAAO,QAAQ;;CAGjB,AAAQ,iBAAiB,MAAmD;AAC1E,MAAI,CAAC,QAAQ,KAAK,WAAW,EAC3B,QAAO;EAET,MAAM,WAAW,KAAK;EACtB,MAAM,aAAa,WAAW,OAAO,OAAO,SAAS,CAAC,KAAK;AAC3D,MAAI,OAAO,eAAe,UACxB,QAAO;AAET,MAAI,OAAO,eAAe,SACxB,QAAO,eAAe;AAExB,MAAI,OAAO,eAAe,UAAU;GAClC,MAAM,QAAQ,WAAW,aAAa;AAEtC,OAAI,UAAU,OAAO,UAAU,UAAU,UAAU,IACjD,QAAO;AAET,OAAI,UAAU,OAAO,UAAU,WAAW,UAAU,IAClD,QAAO;AAGT,UAAO,WAAW,SAAS;;AAE7B,SAAO,QAAQ,WAAW;;CAG5B,MAAc,yBACZ,QACA,OACkB;AAClB,MAAI,MAAM,WAAW,EACnB,QAAO;AAET,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,SAAS,MAAM,OAAO,MAAM,KAAK,KAAK,KAAK,UAAU,EAAE,CAAC;AAC9D,OAAI,CAAC,KAAK,iBAAiB,OAAO,KAAK,CACrC,QAAO;;AAGX,SAAO;;CAGT,AAAQ,sCACN,WACsD;EAEtD,MAAM,aAAa,UAAU,OAAO,qBAAqB,UAAU,KAAK,GAAG;EAG3E,MAAM,aAAa,OAAO,OAAO;GAC/B,SAAS;GACT,QAAQ;GACT,CAAC;EAGF,MAAM,aAAa,OAAO,OAAO;GAC/B,GAAI,cAAc,EAAE;GACpB,QAAQ;GACT,CAAC;EAGF,MAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,UAAU,UAAU,CAAC;AAE/D,SAAO,OAAO,OAAO;GACnB,IAAI,UAAU;GACd,OAAO,UAAU;GACjB,GAAG,UAAU,WAAW,UAAU,QAAQ;GAC1C,gBAAgB,UAAU;GAC1B,QAAQ,UAAU;GAClB,UAAU,OAAO,OAAO,EAAE,CAAC;GAC3B,SAAS,OAAO,OAAO,EAAE,CAAC;GAC1B,WAAW;GACX,GAAG,UAAU,QAAQ,UAAU,QAAQ,aAAa,aAAa,OAAU;GAC5E,CAAC;;CAGJ,AAAQ,yBACN,QACA,MACS;AACT,MAAI,CAAC,OACH,QAAO;AAET,MAAI,OAAO,gBAAgB,KAAK,YAAY,YAC1C,QAAO;AAET,MAAI,KAAK,YAAY,eAAe,OAAO,gBAAgB,KAAK,YAAY,YAC1E,QAAO;AAET,SAAO;;CAGT,AAAQ,2BACN,QACA,YACyC;EACzC,MAAM,iBAAiB,IAAI,IAAI,OAAO,wBAAwB;AAC9D,OAAK,MAAM,aAAa,WACtB,KAAI,CAAC,eAAe,IAAI,UAAU,eAAe,CAC/C,QAAO,cACL,oBACA,aAAa,UAAU,GAAG,cAAc,UAAU,eAAe,oCACjE;GACE,KAAK,uBAAuB,OAAO,wBAAwB,KAAK,KAAK,CAAC;GACtE,MAAM;IACJ,aAAa,UAAU;IACvB,gBAAgB,UAAU;IAC1B,gBAAgB,OAAO;IACxB;GACF,CACF;AAGL,SAAO,QAAQ;;CAGjB,AAAQ,0BACN,QACA,MACyC;EACzC,MAAM,SAAS,KAAK,UAAU;AAC9B,MAAI,CAAC,OAIH,QAAO,QAAQ;AAGjB,MAAI,CAAC,OACH,QAAO,cACL,0BACA,yDAAyD,OAAO,YAAY,IAC5E,EACE,MAAM,EACJ,2BAA2B,OAAO,aACnC,EACF,CACF;AAEH,MAAI,OAAO,gBAAgB,OAAO,YAChC,QAAO,cACL,0BACA,6BAA6B,OAAO,YAAY,gCAAgC,OAAO,YAAY,KACnG,EACE,MAAM;GACJ,mBAAmB,OAAO;GAC1B,2BAA2B,OAAO;GACnC,EACF,CACF;AAEH,MAAI,OAAO,eAAe,OAAO,gBAAgB,OAAO,YACtD,QAAO,cACL,0BACA,0CAA0C,OAAO,YAAY,6CAA6C,OAAO,YAAY,KAC7H,EACE,MAAM;GACJ,mBAAmB,OAAO;GAC1B,2BAA2B,OAAO;GACnC,EACF,CACF;AAEH,SAAO,QAAQ;;CAGjB,AAAQ,qCACN,aACA,UACyC;AACzC,MAAI,YAAY,gBAAgB,SAAS,QAAQ,YAC/C,QAAO,cACL,iCACA,kCAAkC,YAAY,YAAY,mDAAmD,SAAS,QAAQ,YAAY,KAC1I,EACE,MAAM;GACJ,iBAAiB,YAAY;GAC7B,qBAAqB,SAAS,QAAQ;GACvC,EACF,CACF;AAEH,MACE,YAAY,eACZ,SAAS,eACT,YAAY,gBAAgB,SAAS,YAErC,QAAO,cACL,iCACA,kCAAkC,YAAY,YAAY,mDAAmD,SAAS,YAAY,KAClI,EACE,MAAM;GACJ,iBAAiB,YAAY;GAC7B,qBAAqB,SAAS;GAC/B,EACF,CACF;AAEH,SAAO,QAAQ;;CAGjB,MAAc,aACZ,QACA,SACA,gBACe;EACf,MAAM,qBAAqB,QAAQ,KAAK,sBAAsB,EAAE;EAChE,MAAM,kBAAkB,2BAA2B;GACjD,aAAa,QAAQ,KAAK,YAAY;GACtC,aACE,QAAQ,KAAK,YAAY,eACzB,QAAQ,oBAAoB,eAC5B,QAAQ,KAAK,YAAY;GAC3B,cAAc,QAAQ;GACtB,kBAAkB;GAClB,MAAM,EAAE;GACR,YAAY;GACb,CAAC;EACF,MAAM,YAAY,iBAAiB,gBAAgB,SAAS,gBAAgB;AAC5E,QAAM,KAAK,iBAAiB,QAAQ,UAAU;;CAGhD,MAAc,kBACZ,QACA,SACA,gBACA,oBACe;EACf,MAAM,kBAAkB,2BAA2B;GACjD,mBAAmB,gBAAgB,eAAe;GAClD,mBAAmB,gBAAgB,eAAe;GAClD,wBAAwB,QAAQ,KAAK,YAAY;GACjD,wBACE,QAAQ,KAAK,YAAY,eACzB,QAAQ,oBAAoB,eAC5B,QAAQ,KAAK,YAAY;GAC3B,oBAAoB,gBAAgB,gBAAgB;GACpD,mBAAmB,QAAQ;GAC3B,YAAY;GACb,CAAC;AACF,QAAM,KAAK,iBAAiB,QAAQ,gBAAgB;;CAGtD,MAAc,YACZ,QACA,KACe;AACf,QAAM,OAAO,MAAM,8CAA8C,CAAC,IAAI,CAAC;;CAGzE,MAAc,iBACZ,QACe;AACf,QAAM,OAAO,MAAM,QAAQ;;CAG7B,MAAc,kBACZ,QACe;AACf,QAAM,OAAO,MAAM,SAAS;;CAG9B,MAAc,oBACZ,QACe;AACf,QAAM,OAAO,MAAM,WAAW;;CAGhC,MAAc,iBACZ,QACA,WACe;AACf,MAAI,UAAU,OAAO,SAAS,GAAG;AAC/B,SAAM,OAAO,MAAM,UAAU,KAAK,UAAU,OAAO;AACnD;;AAEF,QAAM,OAAO,MAAM,UAAU,IAAI;;;;;;ACvlBrC,SAAS,wBACP,qBACA;AACA,KAAI,CAAC,oBACH;CAEF,MAAM,aAAa,yBAAyB,oBAAoB;AAChE,SAAQ,UAIF;AACJ,MAAI,CAAC,MAAM,WAAY,QAAO,MAAM;AAOpC,MAAI,CAAC,MAAM,QAAS,QAAO,MAAM;EACjC,MAAM,QAAQ,WAAW,IAAI,MAAM,QAAQ;AAC3C,MAAI,CAAC,OAAO,iBAAkB,QAAO,MAAM;AAC3C,SAAO,MAAM,iBAAiB,MAAM;;;AAIxC,SAAgB,sBAAsB,KAAoB,QAA+B;AACvF,KAAI,IAAI,SAAS,WACf,QAAO,IAAI;AAEb,QAAO,qBAAqB,IAAI,OAAO,OAAO;;AAGhD,MAAMC,2BACJ;CACE,GAAG;CACH,YAAY;EACV,cAAc,SAAmC;AAC/C,UAAO,gCAAgC;;EAEzC,aAAa,QAAQ;AACnB,UAAO,8BAA8B,OAAO;;EAE9C,iBAAiB,UAAU,qBAAqB;AAE9C,UAAO,mBAAmB,UAAyC;IACjE,qBAAqB;IACrB,GAAG,UAAU,oBAHE,wBAAwB,oBAAoB,CAGjB;IAC1C,eAAe;IACf,qBAAqB,uBAAuB,EAAE;IAC/C,CAAC;;EAEL;CACD,SAAmD;AACjD,SAAO;GACL,UAAU;GACV,UAAU;GACX;;CAMH,cAAc,SAAmC;AAC/C,SAAO,gCAAgC;;CAMzC,aAAa,QAAQ;AACnB,SAAO,8BAA8B,OAAO;;CAE/C;AAEH,sBAAe"}
@@ -4,15 +4,32 @@ import { errorDataTransformContractMismatch } from "@prisma-next/errors/migratio
4
4
  //#region src/core/migrations/operations/data-transform.ts
5
5
  function dataTransform(contract, name, options, adapter) {
6
6
  const runClosures = Array.isArray(options.run) ? options.run : [options.run];
7
+ const checkPlan = options.check ? invokeAndLower(options.check, contract, adapter, name) : null;
8
+ const runPlans = runClosures.map((closure) => invokeAndLower(closure, contract, adapter, name));
9
+ const precheck = checkPlan ? [{
10
+ description: `Check ${name} has work to do`,
11
+ sql: `SELECT EXISTS (${checkPlan.sql}) AS ok`,
12
+ params: checkPlan.params
13
+ }] : [];
14
+ const execute = runPlans.map((plan) => ({
15
+ description: `Run ${name}`,
16
+ sql: plan.sql,
17
+ params: plan.params
18
+ }));
19
+ const postcheck = checkPlan ? [{
20
+ description: `Verify ${name} resolved all violations`,
21
+ sql: `SELECT NOT EXISTS (${checkPlan.sql}) AS ok`,
22
+ params: checkPlan.params
23
+ }] : [];
7
24
  return {
8
25
  id: `data_migration.${name}`,
9
26
  label: `Data transform: ${name}`,
10
27
  operationClass: "data",
11
- name,
12
28
  ...ifDefined("invariantId", options.invariantId),
13
- source: "migration.ts",
14
- check: options.check ? invokeAndLower(options.check, contract, adapter, name) : null,
15
- run: runClosures.map((closure) => invokeAndLower(closure, contract, adapter, name))
29
+ target: { id: "postgres" },
30
+ precheck,
31
+ execute,
32
+ postcheck
16
33
  };
17
34
  }
18
35
  function invokeAndLower(closure, contract, adapter, name) {
@@ -38,4 +55,4 @@ function assertContractMatches(plan, contract, name) {
38
55
 
39
56
  //#endregion
40
57
  export { dataTransform as t };
41
- //# sourceMappingURL=data-transform-C83dy0vk.mjs.map
58
+ //# sourceMappingURL=data-transform-Be_i_DBc.mjs.map