@zmdb/migrations 1.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +36 -0
  3. package/dist/declarations/emit.d.ts +23 -0
  4. package/dist/declarations/emit.d.ts.map +1 -0
  5. package/dist/declarations/emit.js +581 -0
  6. package/dist/declarations/emit.js.map +1 -0
  7. package/dist/declarations/index.d.ts +3 -0
  8. package/dist/declarations/index.d.ts.map +1 -0
  9. package/dist/declarations/index.js +3 -0
  10. package/dist/declarations/index.js.map +1 -0
  11. package/dist/declarations/tagged-property.d.ts +33 -0
  12. package/dist/declarations/tagged-property.d.ts.map +1 -0
  13. package/dist/declarations/tagged-property.js +148 -0
  14. package/dist/declarations/tagged-property.js.map +1 -0
  15. package/dist/embedded.d.ts +25 -0
  16. package/dist/embedded.d.ts.map +1 -0
  17. package/dist/embedded.js +133 -0
  18. package/dist/embedded.js.map +1 -0
  19. package/dist/file-io.d.ts +15 -0
  20. package/dist/file-io.d.ts.map +1 -0
  21. package/dist/file-io.js +92 -0
  22. package/dist/file-io.js.map +1 -0
  23. package/dist/files.d.ts +11 -0
  24. package/dist/files.d.ts.map +1 -0
  25. package/dist/files.js +10 -0
  26. package/dist/files.js.map +1 -0
  27. package/dist/index.d.ts +70 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +350 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/introspect/common.d.ts +26 -0
  32. package/dist/introspect/common.d.ts.map +1 -0
  33. package/dist/introspect/common.js +155 -0
  34. package/dist/introspect/common.js.map +1 -0
  35. package/dist/introspect/drift.d.ts +45 -0
  36. package/dist/introspect/drift.d.ts.map +1 -0
  37. package/dist/introspect/drift.js +84 -0
  38. package/dist/introspect/drift.js.map +1 -0
  39. package/dist/introspect/index.d.ts +8 -0
  40. package/dist/introspect/index.d.ts.map +1 -0
  41. package/dist/introspect/index.js +10 -0
  42. package/dist/introspect/index.js.map +1 -0
  43. package/dist/operations/check.d.ts +16 -0
  44. package/dist/operations/check.d.ts.map +1 -0
  45. package/dist/operations/check.js +236 -0
  46. package/dist/operations/check.js.map +1 -0
  47. package/dist/operations/embed.d.ts +23 -0
  48. package/dist/operations/embed.d.ts.map +1 -0
  49. package/dist/operations/embed.js +52 -0
  50. package/dist/operations/embed.js.map +1 -0
  51. package/dist/operations/export.d.ts +9 -0
  52. package/dist/operations/export.d.ts.map +1 -0
  53. package/dist/operations/export.js +15 -0
  54. package/dist/operations/export.js.map +1 -0
  55. package/dist/operations/generate.d.ts +17 -0
  56. package/dist/operations/generate.d.ts.map +1 -0
  57. package/dist/operations/generate.js +115 -0
  58. package/dist/operations/generate.js.map +1 -0
  59. package/dist/operations/migrate.d.ts +23 -0
  60. package/dist/operations/migrate.d.ts.map +1 -0
  61. package/dist/operations/migrate.js +67 -0
  62. package/dist/operations/migrate.js.map +1 -0
  63. package/dist/operations/pull.d.ts +40 -0
  64. package/dist/operations/pull.d.ts.map +1 -0
  65. package/dist/operations/pull.js +100 -0
  66. package/dist/operations/pull.js.map +1 -0
  67. package/dist/operations/push.d.ts +20 -0
  68. package/dist/operations/push.d.ts.map +1 -0
  69. package/dist/operations/push.js +82 -0
  70. package/dist/operations/push.js.map +1 -0
  71. package/dist/operations/upgrade.d.ts +10 -0
  72. package/dist/operations/upgrade.d.ts.map +1 -0
  73. package/dist/operations/upgrade.js +38 -0
  74. package/dist/operations/upgrade.js.map +1 -0
  75. package/dist/project.d.ts +46 -0
  76. package/dist/project.d.ts.map +1 -0
  77. package/dist/project.js +42 -0
  78. package/dist/project.js.map +1 -0
  79. package/dist/runner.d.ts +59 -0
  80. package/dist/runner.d.ts.map +1 -0
  81. package/dist/runner.js +163 -0
  82. package/dist/runner.js.map +1 -0
  83. package/dist/testing/official-dialects.fixture.d.ts +16 -0
  84. package/dist/testing/official-dialects.fixture.d.ts.map +1 -0
  85. package/dist/testing/official-dialects.fixture.js +21 -0
  86. package/dist/testing/official-dialects.fixture.js.map +1 -0
  87. package/dist/testing.d.ts +8 -0
  88. package/dist/testing.d.ts.map +1 -0
  89. package/dist/testing.js +27 -0
  90. package/dist/testing.js.map +1 -0
  91. package/package.json +81 -0
  92. package/src/declarations/emit.ts +705 -0
  93. package/src/declarations/index.ts +13 -0
  94. package/src/declarations/tagged-property.ts +163 -0
  95. package/src/embedded.ts +192 -0
  96. package/src/file-io.ts +114 -0
  97. package/src/files.ts +34 -0
  98. package/src/index.ts +502 -0
  99. package/src/introspect/__fixtures__/mysql-8.4.11.json +371 -0
  100. package/src/introspect/common.ts +203 -0
  101. package/src/introspect/drift.ts +157 -0
  102. package/src/introspect/index.ts +33 -0
  103. package/src/operations/check.ts +309 -0
  104. package/src/operations/embed.ts +87 -0
  105. package/src/operations/export.ts +21 -0
  106. package/src/operations/generate.ts +144 -0
  107. package/src/operations/migrate.ts +110 -0
  108. package/src/operations/pull.ts +160 -0
  109. package/src/operations/push.ts +98 -0
  110. package/src/operations/upgrade.ts +56 -0
  111. package/src/project.ts +93 -0
  112. package/src/runner.ts +260 -0
  113. package/src/testing/official-dialects.fixture.ts +24 -0
  114. package/src/testing.ts +32 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/introspect/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0F,MAAM,WAAW,CAAC;AAEnH,OAAO,EAaN,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,OAAO,eAAgB,SAAQ,SAAS;IACnC,OAAO,CAAS;IAChB,GAAG,CAAS;IACZ,KAAK,CAAS;IACd,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,GAAW,EAAE,KAAa,EAAE,QAAgB,EAAE,KAAc;QACvF,KAAK,CAAC,GAAG,OAAO,QAAQ,MAAM,CAAC,GAAG,CAAC,WAAW,KAAK,aAAa,QAAQ,cAAc,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9G,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,GAAsC,EAAE,KAAa;IACpE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IACnG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7B,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,GAAsC,EACtC,KAAa,EACb,OAAe,EACf,KAAa;IAEb,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,UAAU,GAAuB,EAAE;IACrE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,SAAS,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,SAAS,KAAK,GAAG;YAAE,MAAM,IAAI,IAAI,CAAC;aACjC,IAAI,SAAS,KAAK,GAAG;YAAE,MAAM,IAAI,GAAG,CAAC;;YACrC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,KAAwB;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAA2B;IACrE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5F,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1D,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,KAAa,EAAE,OAAe,EAAE,GAAW,EAAE,KAAa;IAC/E,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,WAAW,CAAC;QACjB,KAAK,UAAU,CAAC;QAChB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC;QACpB;YACE,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAa,EAAE,OAA0B;IACnF,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,UAAU,CAAsC,MAAoB;IAClF,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAiC;IAC5D,OAAO,MAAM,CAAC,QAAQ,CACpB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAkC,CAAC;IAEvC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACrD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK;oBAAE,KAAK,IAAI,CAAC,CAAC;;oBACtC,KAAK,GAAG,SAAS,CAAC;YACzB,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YAChE,KAAK,GAAG,SAAS,CAAC;YAClB,SAAS;QACX,CAAC;QACD,IAAI,SAAS,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aAC7B,IAAI,SAAS,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;aAClC,IAAI,SAAS,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7C,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type ChangeOp, type SchemaSnapshot, type SqlDialect, type TableSnapshot } from '@zmdb/sql';
2
+ import { type CatalogForeignKeySnapshot, type CatalogIndexSnapshot } from './common.js';
3
+ export interface DriftOptions {
4
+ /**
5
+ * Table-name globs to omit. When absent, the migration ledger is omitted.
6
+ * Supplying the list replaces that default, matching introspection selection.
7
+ */
8
+ readonly exclude?: readonly string[];
9
+ /** The selected database product whose migration rules compare the snapshots. */
10
+ readonly dialect: SqlDialect;
11
+ /**
12
+ * Database-owned catalog normalization. MySQL-family introspectors set this
13
+ * because their servers may create an undeclared btree index for a foreign key.
14
+ */
15
+ readonly omitForeignKeySupportIndexes?: boolean;
16
+ }
17
+ export interface DriftReport {
18
+ /** Operations that transform the declared snapshot into the live database shape. */
19
+ readonly onlyInDatabase: readonly ChangeOp[];
20
+ /** Operations that transform the live database snapshot into the declared shape. */
21
+ readonly onlyInDeclarations: readonly ChangeOp[];
22
+ readonly clean: boolean;
23
+ }
24
+ interface NormalizedDriftTableSnapshot extends Omit<TableSnapshot, 'foreignKeys'> {
25
+ readonly foreignKeys: readonly CatalogForeignKeySnapshot[];
26
+ readonly indexes?: readonly CatalogIndexSnapshot[];
27
+ }
28
+ interface NormalizedDriftSnapshot extends Omit<SchemaSnapshot, 'tables'> {
29
+ readonly tables: readonly NormalizedDriftTableSnapshot[];
30
+ }
31
+ type SnapshotRole = 'live' | 'declared';
32
+ /**
33
+ * Internal normalization boundary used before both calls to the migration diff.
34
+ *
35
+ * Exported from the introspection subpath as the vendor-neutral normalization
36
+ * seam used by independently shipped database introspectors.
37
+ */
38
+ export declare function normalizeDriftSnapshot(snapshot: SchemaSnapshot, role: SnapshotRole, options?: Pick<DriftOptions, 'exclude' | 'omitForeignKeySupportIndexes'>): NormalizedDriftSnapshot;
39
+ /**
40
+ * Compare an introspected snapshot and declared snapshot through the migration
41
+ * comparator in both directions.
42
+ */
43
+ export declare function detectDrift(live: SchemaSnapshot, declared: SchemaSnapshot, options: DriftOptions): DriftReport;
44
+ export {};
45
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/introspect/drift.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAiB,KAAK,yBAAyB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvG,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B;;;OAGG;IACH,QAAQ,CAAC,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,cAAc,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC7C,oFAAoF;IACpF,QAAQ,CAAC,kBAAkB,EAAE,SAAS,QAAQ,EAAE,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAiBD,UAAU,4BAA6B,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;IAC/E,QAAQ,CAAC,WAAW,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACpD;AAED,UAAU,uBAAwB,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,4BAA4B,EAAE,CAAC;CAC1D;AAED,KAAK,YAAY,GAAG,MAAM,GAAG,UAAU,CAAC;AA6CxC;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,8BAA8B,CAAM,GAC3E,uBAAuB,CA0BzB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAW9G"}
@@ -0,0 +1,84 @@
1
+ import {} from '@zmdb/sql';
2
+ import { diff } from '../index.js';
3
+ import { tableSelected } from './common.js';
4
+ function normalizeColumn(column) {
5
+ return {
6
+ name: column.name,
7
+ type: column.type,
8
+ nullable: column.nullable,
9
+ primaryKey: column.primaryKey,
10
+ ...(column.length === undefined ? {} : { length: column.length }),
11
+ ...(column.unique === undefined ? {} : { unique: column.unique }),
12
+ };
13
+ }
14
+ function sameColumns(index, foreignKey) {
15
+ if (index.columns.length !== foreignKey.columns.length)
16
+ return false;
17
+ return index.columns.every((column, position) => {
18
+ const expected = foreignKey.columns[position];
19
+ return typeof column === 'string' && column === expected;
20
+ });
21
+ }
22
+ function isMySqlForeignKeySupportingIndex(index, foreignKeys) {
23
+ if (index.unique || index.where !== undefined)
24
+ return false;
25
+ if (index.method !== undefined && index.method.toLowerCase() !== 'btree')
26
+ return false;
27
+ return foreignKeys.some(foreignKey => (index.name === foreignKey.name || index.name === `${foreignKey.name}_idx`) && sameColumns(index, foreignKey));
28
+ }
29
+ function normalizeIndexes(table, role, omitForeignKeySupportIndexes) {
30
+ if (table.indexes === undefined)
31
+ return undefined;
32
+ if (role !== 'live' || !omitForeignKeySupportIndexes)
33
+ return table.indexes;
34
+ const foreignKeys = table.foreignKeys ?? [];
35
+ return table.indexes.filter(index => !isMySqlForeignKeySupportingIndex(index, foreignKeys));
36
+ }
37
+ /**
38
+ * Internal normalization boundary used before both calls to the migration diff.
39
+ *
40
+ * Exported from the introspection subpath as the vendor-neutral normalization
41
+ * seam used by independently shipped database introspectors.
42
+ */
43
+ export function normalizeDriftSnapshot(snapshot, role, options = {}) {
44
+ const comparable = snapshot;
45
+ const selection = options.exclude === undefined ? {} : { exclude: options.exclude };
46
+ const tables = comparable.tables
47
+ .filter(table => tableSelected(table.name, selection))
48
+ .map(table => {
49
+ const indexes = normalizeIndexes(table, role, options.omitForeignKeySupportIndexes ?? false);
50
+ const normalized = {
51
+ name: table.name,
52
+ // Catalog spellings and default expressions are evidence, not drift:
53
+ // aliases have already collapsed into `type`, and servers rewrite defaults.
54
+ columns: table.columns.map(normalizeColumn),
55
+ primaryKey: table.primaryKey,
56
+ foreignKeys: table.foreignKeys ?? [],
57
+ ...(table.tableOptions === undefined ? {} : { tableOptions: table.tableOptions }),
58
+ ...(indexes === undefined ? {} : { indexes }),
59
+ };
60
+ return normalized;
61
+ })
62
+ .toSorted((left, right) => left.name.localeCompare(right.name));
63
+ return {
64
+ version: 1,
65
+ tables,
66
+ extensions: snapshot.extensions.toSorted((left, right) => left.name.localeCompare(right.name)),
67
+ };
68
+ }
69
+ /**
70
+ * Compare an introspected snapshot and declared snapshot through the migration
71
+ * comparator in both directions.
72
+ */
73
+ export function detectDrift(live, declared, options) {
74
+ const normalizedLive = normalizeDriftSnapshot(live, 'live', options);
75
+ const normalizedDeclared = normalizeDriftSnapshot(declared, 'declared', options);
76
+ const onlyInDatabase = diff(normalizedDeclared, normalizedLive, { dialect: options.dialect });
77
+ const onlyInDeclarations = diff(normalizedLive, normalizedDeclared, { dialect: options.dialect });
78
+ return {
79
+ onlyInDatabase,
80
+ onlyInDeclarations,
81
+ clean: onlyInDatabase.length === 0 && onlyInDeclarations.length === 0,
82
+ };
83
+ }
84
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/introspect/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Introspector, type SqlDialect } from '@zmdb/sql';
2
+ export { type IntrospectionDriver, type Introspector, type IntrospectOptions } from '@zmdb/sql';
3
+ export { detectDrift, type DriftOptions, type DriftReport } from './drift.js';
4
+ export { action, CatalogRowError, deterministicForeignKeyName, flagField, integerField, nullableIntegerField, nullableTextField, query, sortByName, sortWarnings, splitSqlList, tableSelected, textField, type CatalogColumnSnapshot, type CatalogForeignKeySnapshot, type CatalogIndexColumn, type CatalogIndexSnapshot, type CatalogSchemaSnapshot, type CatalogTableSnapshot, type CatalogWarning, type ReferentialAction, } from './common.js';
5
+ export { normalizeDriftSnapshot } from './drift.js';
6
+ /** Resolve the catalog reader carried by an explicitly selected database package. */
7
+ export declare function createIntrospector<Name extends string>(dialect: SqlDialect<Name>): Introspector<Name>;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/introspect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,MAAM,EACN,eAAe,EACf,2BAA2B,EAC3B,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,EACT,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,qFAAqF;AACrF,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAErG"}
@@ -0,0 +1,10 @@
1
+ import {} from '@zmdb/sql';
2
+ export {} from '@zmdb/sql';
3
+ export { detectDrift } from './drift.js';
4
+ export { action, CatalogRowError, deterministicForeignKeyName, flagField, integerField, nullableIntegerField, nullableTextField, query, sortByName, sortWarnings, splitSqlList, tableSelected, textField, } from './common.js';
5
+ export { normalizeDriftSnapshot } from './drift.js';
6
+ /** Resolve the catalog reader carried by an explicitly selected database package. */
7
+ export function createIntrospector(dialect) {
8
+ return dialect.introspector;
9
+ }
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/introspect/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,MAAM,WAAW,CAAC;AAE/D,OAAO,EAAuE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,WAAW,EAAuC,MAAM,YAAY,CAAC;AAC9E,OAAO,EACL,MAAM,EACN,eAAe,EACf,2BAA2B,EAC3B,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,EACL,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,GASV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEpD,qFAAqF;AACrF,MAAM,UAAU,kBAAkB,CAAsB,OAAyB;IAC/E,OAAO,OAAO,CAAC,YAAY,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type MigrationProject } from '../project.js';
2
+ export type CheckFindingKind = 'uncommitted-schema' | 'duplicate-version' | 'snapshot-version' | 'missing-down' | 'stale-embedded' | 'drift';
3
+ export interface CheckFinding {
4
+ readonly kind: CheckFindingKind;
5
+ readonly message: string;
6
+ readonly subject: string;
7
+ }
8
+ export interface CheckResult {
9
+ readonly findings: readonly CheckFinding[];
10
+ readonly skipped: readonly {
11
+ readonly kind: 'drift';
12
+ readonly reason: string;
13
+ }[];
14
+ }
15
+ export declare function checkProject(project: MigrationProject): Promise<CheckResult>;
16
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/operations/check.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAK7F,MAAM,MAAM,gBAAgB,GACxB,oBAAoB,GACpB,mBAAmB,GACnB,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,OAAO,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClF;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqFlF"}
@@ -0,0 +1,236 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { readMigrations } from '../file-io.js';
4
+ import { diff, snapshot, } from '../index.js';
5
+ import { detectDrift } from '../introspect/index.js';
6
+ import { migrationTarget, requiredIntrospector } from '../project.js';
7
+ import { EMBEDDED_WITH_DOWN_MARKER, embeddedOutputPath, renderEmbeddedModule } from './embed.js';
8
+ const EMPTY_SNAPSHOT = { version: 1, tables: [], extensions: [] };
9
+ export async function checkProject(project) {
10
+ const findings = [];
11
+ const skipped = [];
12
+ const snapshotPath = join(project.outDir, 'snapshot.json');
13
+ const stored = await storedSnapshot(snapshotPath);
14
+ const declared = snapshot(project.schemas);
15
+ if ('newerVersion' in stored) {
16
+ findings.push({
17
+ kind: 'snapshot-version',
18
+ message: `snapshot version ${String(stored.newerVersion)} is newer than this build's version 1`,
19
+ subject: snapshotPath,
20
+ });
21
+ }
22
+ else if (diff(stored.snapshot, declared, { dialect: migrationTarget(project) }).length > 0) {
23
+ findings.push({
24
+ kind: 'uncommitted-schema',
25
+ message: 'declarations differ from the stored snapshot; run zmdb generate',
26
+ subject: snapshotPath,
27
+ });
28
+ }
29
+ const migrations = await readMigrations(project.outDir);
30
+ const byVersion = new Map();
31
+ for (const migration of migrations) {
32
+ const paths = byVersion.get(migration.version) ?? [];
33
+ paths.push(migration.path);
34
+ byVersion.set(migration.version, paths);
35
+ if (!migration.hasDown) {
36
+ findings.push({
37
+ kind: 'missing-down',
38
+ message: `migration ${String(migration.version)} ${migration.name} has no -- zmdb:down section`,
39
+ subject: migration.path,
40
+ });
41
+ }
42
+ }
43
+ for (const [version, paths] of byVersion) {
44
+ if (paths.length < 2)
45
+ continue;
46
+ findings.push({
47
+ kind: 'duplicate-version',
48
+ message: `migration version ${String(version)} appears in ${String(paths.length)} files`,
49
+ subject: paths.join(', '),
50
+ });
51
+ }
52
+ if (project.dialect.migrations.embedded) {
53
+ const embeddedPath = embeddedOutputPath(project);
54
+ const embedded = await optionalFile(embeddedPath);
55
+ if (embedded !== undefined) {
56
+ const withDown = embedded.startsWith(`// Generated by \`zmdb embed\`. Do not edit.\n${EMBEDDED_WITH_DOWN_MARKER}\n`);
57
+ const expected = await renderEmbeddedModule(project, withDown ? { withDown: true } : {});
58
+ if (embedded !== expected.source) {
59
+ findings.push({
60
+ kind: 'stale-embedded',
61
+ message: 'embedded migration module differs from the configured migration files; run zmdb embed',
62
+ subject: embeddedPath,
63
+ });
64
+ }
65
+ }
66
+ }
67
+ if (project.driver === undefined) {
68
+ skipped.push({ kind: 'drift', reason: `config ${project.configPath} has no driver` });
69
+ }
70
+ else if (!('newerVersion' in stored)) {
71
+ const introspector = requiredIntrospector(project);
72
+ const live = await introspector.snapshot(project.driver, project.introspect);
73
+ const report = detectDrift(introspector.normalizeForDrift(live, 'live'), introspector.normalizeForDrift(stored.snapshot, 'declared'), { dialect: project.dialect });
74
+ if (!report.clean) {
75
+ findings.push({
76
+ kind: 'drift',
77
+ message: `live database differs from the stored snapshot: ` +
78
+ `${String(report.onlyInDatabase.length)} database-only and ` +
79
+ `${String(report.onlyInDeclarations.length)} declaration-only operations`,
80
+ subject: project.configPath,
81
+ });
82
+ }
83
+ }
84
+ return { findings, skipped };
85
+ }
86
+ async function optionalFile(path) {
87
+ try {
88
+ return await readFile(path, 'utf8');
89
+ }
90
+ catch (error) {
91
+ if (errorCode(error) === 'ENOENT')
92
+ return undefined;
93
+ throw error;
94
+ }
95
+ }
96
+ async function storedSnapshot(path) {
97
+ let source;
98
+ try {
99
+ source = await readFile(path, 'utf8');
100
+ }
101
+ catch (error) {
102
+ if (errorCode(error) === 'ENOENT')
103
+ return { snapshot: EMPTY_SNAPSHOT };
104
+ throw error;
105
+ }
106
+ const parsed = JSON.parse(source);
107
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
108
+ throw new TypeError(`stored snapshot ${path} must be a JSON object`);
109
+ }
110
+ const version = Reflect.get(parsed, 'version');
111
+ if (typeof version !== 'number' || !Number.isSafeInteger(version)) {
112
+ throw new TypeError(`stored snapshot ${path} has no safe integer version`);
113
+ }
114
+ if (version > 1)
115
+ return { newerVersion: version };
116
+ if (version !== 1)
117
+ throw new TypeError(`stored snapshot ${path} uses unknown version ${String(version)}`);
118
+ return { snapshot: snapshotV1(parsed, path) };
119
+ }
120
+ function snapshotV1(value, path) {
121
+ const stored = record(value, `stored snapshot ${path}`);
122
+ const tableValues = array(stored.tables, `stored snapshot ${path} tables`);
123
+ const extensionValues = array(stored.extensions, `stored snapshot ${path} extensions`);
124
+ return {
125
+ version: 1,
126
+ tables: tableValues.map((table, index) => tableSnapshot(table, path, index)),
127
+ extensions: extensionValues.map((extension, index) => extensionSnapshot(extension, path, index)),
128
+ };
129
+ }
130
+ function tableSnapshot(value, path, index) {
131
+ const table = record(value, `stored snapshot ${path} table ${String(index)}`);
132
+ const name = text(table.name, `stored snapshot ${path} table ${String(index)} name`);
133
+ const columns = array(table.columns, `stored snapshot ${path} table ${name} columns`).map((column, columnIndex) => columnSnapshot(column, path, name, columnIndex));
134
+ const primaryKey = table.primaryKey === undefined
135
+ ? columns.filter(column => column.primaryKey).map(column => column.name)
136
+ : stringArray(table.primaryKey, `stored snapshot ${path} table ${name} primaryKey`);
137
+ const foreignKeys = table.foreignKeys === undefined
138
+ ? []
139
+ : array(table.foreignKeys, `stored snapshot ${path} table ${name} foreignKeys`).map((foreignKey, keyIndex) => foreignKeySnapshot(foreignKey, path, name, keyIndex));
140
+ return { name, columns, primaryKey, foreignKeys };
141
+ }
142
+ function columnSnapshot(value, path, table, index) {
143
+ const column = record(value, `stored snapshot ${path} table ${table} column ${String(index)}`);
144
+ const length = column.length;
145
+ if (length !== undefined && (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 1)) {
146
+ throw new TypeError(`stored snapshot ${path} table ${table} column ${String(index)} length must be positive`);
147
+ }
148
+ return {
149
+ name: text(column.name, `stored snapshot ${path} table ${table} column ${String(index)} name`),
150
+ type: columnType(column.type, path, table, index),
151
+ nullable: flag(column.nullable, `stored snapshot ${path} table ${table} column ${String(index)} nullable`),
152
+ primaryKey: flag(column.primaryKey, `stored snapshot ${path} table ${table} column ${String(index)} primaryKey`),
153
+ ...(length === undefined ? {} : { length }),
154
+ };
155
+ }
156
+ function columnType(value, path, table, index) {
157
+ if (typeof value === 'string')
158
+ return value;
159
+ const type = record(value, `stored snapshot ${path} table ${table} column ${String(index)} type`);
160
+ const args = type.args === undefined
161
+ ? undefined
162
+ : array(type.args, `stored snapshot ${path} table ${table} column ${String(index)} type args`).map((argument, argumentIndex) => {
163
+ if (typeof argument === 'string' || typeof argument === 'number')
164
+ return argument;
165
+ throw new TypeError(`stored snapshot ${path} table ${table} column ${String(index)} type arg ${String(argumentIndex)} ` +
166
+ 'must be a string or number');
167
+ });
168
+ return {
169
+ extension: text(type.extension, `stored snapshot ${path} table ${table} column ${String(index)} type extension`),
170
+ name: text(type.name, `stored snapshot ${path} table ${table} column ${String(index)} type name`),
171
+ ...(args === undefined ? {} : { args }),
172
+ };
173
+ }
174
+ function foreignKeySnapshot(value, path, table, index) {
175
+ const foreignKey = record(value, `stored snapshot ${path} table ${table} foreign key ${String(index)}`);
176
+ return {
177
+ name: text(foreignKey.name, `stored snapshot ${path} table ${table} foreign key ${String(index)} name`),
178
+ columns: stringArray(foreignKey.columns, `stored snapshot ${path} table ${table} foreign key ${String(index)} columns`),
179
+ targetTable: text(foreignKey.targetTable, `stored snapshot ${path} table ${table} foreign key ${String(index)} targetTable`),
180
+ targetColumns: stringArray(foreignKey.targetColumns, `stored snapshot ${path} table ${table} foreign key ${String(index)} targetColumns`),
181
+ onDelete: referentialAction(foreignKey.onDelete, `stored snapshot ${path} table ${table} foreign key ${String(index)} onDelete`),
182
+ onUpdate: referentialAction(foreignKey.onUpdate, `stored snapshot ${path} table ${table} foreign key ${String(index)} onUpdate`),
183
+ };
184
+ }
185
+ function extensionSnapshot(value, path, index) {
186
+ const extension = record(value, `stored snapshot ${path} extension ${String(index)}`);
187
+ const schema = extension.schema;
188
+ if (schema !== undefined && typeof schema !== 'string') {
189
+ throw new TypeError(`stored snapshot ${path} extension ${String(index)} schema must be a string`);
190
+ }
191
+ return {
192
+ name: text(extension.name, `stored snapshot ${path} extension ${String(index)} name`),
193
+ ...(schema === undefined ? {} : { schema }),
194
+ };
195
+ }
196
+ function referentialAction(value, label) {
197
+ if (value === 'cascade' ||
198
+ value === 'restrict' ||
199
+ value === 'set null' ||
200
+ value === 'set default' ||
201
+ value === 'no action') {
202
+ return value;
203
+ }
204
+ throw new TypeError(`${label} must be a referential action`);
205
+ }
206
+ function record(value, label) {
207
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
208
+ throw new TypeError(`${label} must be an object`);
209
+ }
210
+ return Object.fromEntries(Object.entries(value));
211
+ }
212
+ function array(value, label) {
213
+ if (!Array.isArray(value))
214
+ throw new TypeError(`${label} must be an array`);
215
+ return value;
216
+ }
217
+ function stringArray(value, label) {
218
+ return array(value, label).map((item, index) => text(item, `${label} item ${String(index)}`));
219
+ }
220
+ function text(value, label) {
221
+ if (typeof value !== 'string')
222
+ throw new TypeError(`${label} must be a string`);
223
+ return value;
224
+ }
225
+ function flag(value, label) {
226
+ if (typeof value !== 'boolean')
227
+ throw new TypeError(`${label} must be a boolean`);
228
+ return value;
229
+ }
230
+ function errorCode(error) {
231
+ if (typeof error !== 'object' || error === null)
232
+ return undefined;
233
+ const code = Reflect.get(error, 'code');
234
+ return typeof code === 'string' ? code : undefined;
235
+ }
236
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/operations/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type MigrationProject } from '../project.js';
2
+ export declare const EMBEDDED_WITH_DOWN_MARKER = "// Includes down sections for development tooling.";
3
+ export interface EmbedOptions {
4
+ readonly out?: string;
5
+ readonly withDown?: boolean;
6
+ }
7
+ export interface EmbeddedModuleResult {
8
+ readonly file: string;
9
+ readonly source: string;
10
+ readonly migrations: readonly {
11
+ readonly version: number;
12
+ readonly name: string;
13
+ readonly checksum: string;
14
+ }[];
15
+ }
16
+ export interface EmbedResult {
17
+ readonly file: string;
18
+ readonly migrations: EmbeddedModuleResult['migrations'];
19
+ }
20
+ export declare function embeddedOutputPath(project: MigrationProject, requested?: string): string;
21
+ export declare function renderEmbeddedModule(project: MigrationProject, options?: EmbedOptions): Promise<EmbeddedModuleResult>;
22
+ export declare function embedMigrations(project: MigrationProject, options?: EmbedOptions): Promise<EmbedResult>;
23
+ //# sourceMappingURL=embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/operations/embed.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkD,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtG,eAAO,MAAM,yBAAyB,uDAAuD,CAAC;AAE9F,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS;QAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC3B,EAAE,CAAC;CACL;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;CACzD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxF;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,oBAAoB,CAAC,CA8B/B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CASjH"}
@@ -0,0 +1,52 @@
1
+ import { dirname, join, resolve } from 'node:path';
2
+ import { dialectName } from '@zmdb/sql';
3
+ import { readMigrations, writeTextAtomically } from '../file-io.js';
4
+ import { MigrationProjectError, requiredSourceFormatter } from '../project.js';
5
+ export const EMBEDDED_WITH_DOWN_MARKER = '// Includes down sections for development tooling.';
6
+ export function embeddedOutputPath(project, requested) {
7
+ return requested === undefined
8
+ ? join(project.outDir, 'embedded.ts')
9
+ : resolve(dirname(project.configPath), requested);
10
+ }
11
+ export async function renderEmbeddedModule(project, options = {}) {
12
+ const file = embeddedOutputPath(project, options.out);
13
+ const migrations = await Promise.all((await readMigrations(project.outDir)).map(async (migration) => ({
14
+ version: migration.version,
15
+ name: migration.name,
16
+ up: migration.up,
17
+ ...(options.withDown === true ? { down: migration.down } : {}),
18
+ checksum: await checksum(migration.up),
19
+ })));
20
+ const arrayType = options.withDown === true
21
+ ? 'readonly (EmbeddedMigration & { readonly down: string })[]'
22
+ : 'readonly EmbeddedMigration[]';
23
+ const marker = options.withDown === true ? `${EMBEDDED_WITH_DOWN_MARKER}\n` : '';
24
+ const raw = '// Generated by `zmdb embed`. Do not edit.\n' +
25
+ marker +
26
+ "import type { EmbeddedMigration } from '@zmdb/migrations/embedded';\n\n" +
27
+ `export const migrations: ${arrayType} = ${JSON.stringify(migrations, null, 2)} as const;\n`;
28
+ return {
29
+ file,
30
+ source: await requiredSourceFormatter(project)(file, raw),
31
+ migrations: migrations.map(migration => ({
32
+ version: migration.version,
33
+ name: migration.name,
34
+ checksum: migration.checksum,
35
+ })),
36
+ };
37
+ }
38
+ export async function embedMigrations(project, options = {}) {
39
+ if (!project.dialect.migrations.embedded) {
40
+ throw new MigrationProjectError(`embedded migrations are not supported by ${dialectName(project.dialect)} in ${project.configPath}`);
41
+ }
42
+ const rendered = await renderEmbeddedModule(project, options);
43
+ await writeTextAtomically(rendered.file, rendered.source);
44
+ return { file: rendered.file, migrations: rendered.migrations };
45
+ }
46
+ async function checksum(source) {
47
+ const bytes = new TextEncoder().encode(source);
48
+ const digest = new Uint8Array(await globalThis.crypto.subtle.digest('SHA-256', bytes));
49
+ const hex = Array.from(digest, byte => byte.toString(16).padStart(2, '0')).join('');
50
+ return `sha256:${hex}`;
51
+ }
52
+ //# sourceMappingURL=embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/operations/embed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ChangeOp } from '../index.js';
2
+ import { type MigrationProject } from '../project.js';
3
+ export interface ExportResult {
4
+ readonly ops: readonly ChangeOp[];
5
+ readonly statements: readonly string[];
6
+ }
7
+ /** Reflect declarations and hand the resulting plan directly to the DDL emitter. */
8
+ export declare function exportSchema(project: MigrationProject): ExportResult;
9
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/operations/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,QAAQ,EAAuB,MAAM,aAAa,CAAC;AACzF,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIvE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,YAAY,CASpE"}
@@ -0,0 +1,15 @@
1
+ import { diff, emitUp, snapshot } from '../index.js';
2
+ import { migrationTarget } from '../project.js';
3
+ const EMPTY_SNAPSHOT = { version: 1, tables: [], extensions: [] };
4
+ /** Reflect declarations and hand the resulting plan directly to the DDL emitter. */
5
+ export function exportSchema(project) {
6
+ const target = migrationTarget(project);
7
+ const next = snapshot(project.schemas);
8
+ const ops = diff(EMPTY_SNAPSHOT, next, { dialect: target });
9
+ target.migrations.validatePlan({ before: EMPTY_SNAPSHOT, after: next, operations: ops });
10
+ return {
11
+ ops,
12
+ statements: ops.map(operation => emitUp(operation, target)),
13
+ };
14
+ }
15
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/operations/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAsC,MAAM,aAAa,CAAC;AACzF,OAAO,EAAE,eAAe,EAAyB,MAAM,eAAe,CAAC;AAEvE,MAAM,cAAc,GAAmB,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AAOlF,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,OAAyB;IACpD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACzF,OAAO;QACL,GAAG;QACH,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;KAC5D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type ChangeOp } from '../index.js';
2
+ import { type MigrationProject } from '../project.js';
3
+ export type GenerateResult = {
4
+ readonly ops: readonly ChangeOp[];
5
+ } | {
6
+ readonly file: string;
7
+ readonly version: number;
8
+ readonly name: string;
9
+ readonly ops: readonly ChangeOp[];
10
+ };
11
+ export interface GenerateOptions {
12
+ readonly name?: string;
13
+ readonly now?: Date;
14
+ }
15
+ /** Load declarations, diff once, emit the plan unchanged, and persist both artefacts. */
16
+ export declare function generateMigration(project: MigrationProject, options?: GenerateOptions): Promise<GenerateResult>;
17
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/operations/generate.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoC,KAAK,QAAQ,EAAuB,MAAM,aAAa,CAAC;AACnG,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAIvE,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,GACrC;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,SAAS,QAAQ,EAAE,CAAC;CACnC,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CACrB;AAED,yFAAyF;AACzF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,gBAAgB,EACzB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAyBzB"}