prisma-next 0.11.0-dev.7 → 0.11.0-dev.70

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 (146) hide show
  1. package/dist/cli.mjs +10 -11
  2. package/dist/cli.mjs.map +1 -1
  3. package/dist/{client-oXO2WCPD.mjs → client-6WehTnUh.mjs} +72 -60
  4. package/dist/client-6WehTnUh.mjs.map +1 -0
  5. package/dist/{command-helpers-DtavI0wJ.mjs → command-helpers-CoceqqMl.mjs} +642 -45
  6. package/dist/command-helpers-CoceqqMl.mjs.map +1 -0
  7. package/dist/commands/contract-emit.d.mts.map +1 -1
  8. package/dist/commands/contract-emit.mjs +1 -1
  9. package/dist/commands/contract-infer.d.mts.map +1 -1
  10. package/dist/commands/contract-infer.mjs +1 -1
  11. package/dist/commands/db-init.d.mts.map +1 -1
  12. package/dist/commands/db-init.mjs +32 -7
  13. package/dist/commands/db-init.mjs.map +1 -1
  14. package/dist/commands/db-schema.d.mts.map +1 -1
  15. package/dist/commands/db-schema.mjs +3 -4
  16. package/dist/commands/db-schema.mjs.map +1 -1
  17. package/dist/commands/db-sign.d.mts.map +1 -1
  18. package/dist/commands/db-sign.mjs +12 -10
  19. package/dist/commands/db-sign.mjs.map +1 -1
  20. package/dist/commands/db-update.d.mts.map +1 -1
  21. package/dist/commands/db-update.mjs +41 -11
  22. package/dist/commands/db-update.mjs.map +1 -1
  23. package/dist/commands/db-verify.d.mts.map +1 -1
  24. package/dist/commands/db-verify.mjs +1 -1
  25. package/dist/commands/migrate.d.mts +6 -2
  26. package/dist/commands/migrate.d.mts.map +1 -1
  27. package/dist/commands/migrate.mjs +75 -40
  28. package/dist/commands/migrate.mjs.map +1 -1
  29. package/dist/commands/migration-check.d.mts +4 -3
  30. package/dist/commands/migration-check.d.mts.map +1 -1
  31. package/dist/commands/migration-check.mjs +1 -280
  32. package/dist/commands/migration-graph.d.mts +13 -2
  33. package/dist/commands/migration-graph.d.mts.map +1 -1
  34. package/dist/commands/migration-graph.mjs +2 -137
  35. package/dist/commands/migration-list.d.mts +67 -4
  36. package/dist/commands/migration-list.d.mts.map +1 -1
  37. package/dist/commands/migration-list.mjs +2 -103
  38. package/dist/commands/migration-log.d.mts +10 -1
  39. package/dist/commands/migration-log.d.mts.map +1 -1
  40. package/dist/commands/migration-log.mjs +10 -15
  41. package/dist/commands/migration-log.mjs.map +1 -1
  42. package/dist/commands/migration-new.d.mts.map +1 -1
  43. package/dist/commands/migration-new.mjs +32 -38
  44. package/dist/commands/migration-new.mjs.map +1 -1
  45. package/dist/commands/migration-plan.d.mts +3 -2
  46. package/dist/commands/migration-plan.d.mts.map +1 -1
  47. package/dist/commands/migration-plan.mjs +1 -1
  48. package/dist/commands/migration-show.d.mts +4 -55
  49. package/dist/commands/migration-show.d.mts.map +1 -1
  50. package/dist/commands/migration-show.mjs +61 -153
  51. package/dist/commands/migration-show.mjs.map +1 -1
  52. package/dist/commands/migration-status.d.mts +12 -49
  53. package/dist/commands/migration-status.d.mts.map +1 -1
  54. package/dist/commands/migration-status.mjs +85 -81
  55. package/dist/commands/migration-status.mjs.map +1 -1
  56. package/dist/commands/ref.d.mts +1 -1
  57. package/dist/commands/ref.d.mts.map +1 -1
  58. package/dist/commands/ref.mjs +38 -10
  59. package/dist/commands/ref.mjs.map +1 -1
  60. package/dist/config-loader-B6sJjXTv.mjs.map +1 -1
  61. package/dist/config-loader.d.mts.map +1 -1
  62. package/dist/contract-at-errors-Bhf2jnkp.mjs +42 -0
  63. package/dist/contract-at-errors-Bhf2jnkp.mjs.map +1 -0
  64. package/dist/{contract-emit-CmsklifJ.mjs → contract-emit-C47r1loe.mjs} +4 -6
  65. package/dist/{contract-emit-CmsklifJ.mjs.map → contract-emit-C47r1loe.mjs.map} +1 -1
  66. package/dist/{contract-emit-o-8VmdQX.mjs → contract-emit-DxEfEc-M.mjs} +21 -7
  67. package/dist/{contract-emit-o-8VmdQX.mjs.map → contract-emit-DxEfEc-M.mjs.map} +1 -1
  68. package/dist/{contract-enrichment-Dani0mMW.mjs → contract-enrichment-a0V5Y_mL.mjs} +4 -25
  69. package/dist/contract-enrichment-a0V5Y_mL.mjs.map +1 -0
  70. package/dist/{contract-infer-pKkiCt7C.mjs → contract-infer-BLiomU8g.mjs} +3 -4
  71. package/dist/{contract-infer-pKkiCt7C.mjs.map → contract-infer-BLiomU8g.mjs.map} +1 -1
  72. package/dist/contract-space-aggregate-loader-lafgkTwG.mjs +247 -0
  73. package/dist/contract-space-aggregate-loader-lafgkTwG.mjs.map +1 -0
  74. package/dist/{db-verify-AoIUriL4.mjs → db-verify-D44Qj3w9.mjs} +5 -7
  75. package/dist/{db-verify-AoIUriL4.mjs.map → db-verify-D44Qj3w9.mjs.map} +1 -1
  76. package/dist/exports/control-api.d.mts +3 -3
  77. package/dist/exports/control-api.d.mts.map +1 -1
  78. package/dist/exports/control-api.mjs +3 -3
  79. package/dist/exports/index.d.mts.map +1 -1
  80. package/dist/exports/index.mjs +1 -1
  81. package/dist/exports/index.mjs.map +1 -1
  82. package/dist/exports/init-output.d.mts.map +1 -1
  83. package/dist/exports/init-output.mjs +1 -1
  84. package/dist/extension-pack-inputs-IDvjRCi3.mjs +62 -0
  85. package/dist/extension-pack-inputs-IDvjRCi3.mjs.map +1 -0
  86. package/dist/{framework-components-65gOHkHB.mjs → framework-components-R_O3y5IW.mjs} +2 -2
  87. package/dist/{framework-components-65gOHkHB.mjs.map → framework-components-R_O3y5IW.mjs.map} +1 -1
  88. package/dist/global-flags-DG4uY5tV.d.mts +34 -0
  89. package/dist/global-flags-DG4uY5tV.d.mts.map +1 -0
  90. package/dist/{graph-render-DJVv0_uf.mjs → graph-render-rFAqZujX.mjs} +2 -2
  91. package/dist/{graph-render-DJVv0_uf.mjs.map → graph-render-rFAqZujX.mjs.map} +1 -1
  92. package/dist/{init-Db5Itt5r.mjs → init-DE-phHWK.mjs} +4 -5
  93. package/dist/{init-Db5Itt5r.mjs.map → init-DE-phHWK.mjs.map} +1 -1
  94. package/dist/{inspect-live-schema-LeWvkZVz.mjs → inspect-live-schema-Ccnmg5bz.mjs} +4 -5
  95. package/dist/{inspect-live-schema-LeWvkZVz.mjs.map → inspect-live-schema-Ccnmg5bz.mjs.map} +1 -1
  96. package/dist/migration-check-CKfQlAWR.mjs +341 -0
  97. package/dist/migration-check-CKfQlAWR.mjs.map +1 -0
  98. package/dist/migration-cli.d.mts.map +1 -1
  99. package/dist/migration-cli.mjs +4 -4
  100. package/dist/migration-cli.mjs.map +1 -1
  101. package/dist/{migration-command-scaffold-BtkunvFQ.mjs → migration-command-scaffold-C_KuV0Gm.mjs} +4 -5
  102. package/dist/{migration-command-scaffold-BtkunvFQ.mjs.map → migration-command-scaffold-C_KuV0Gm.mjs.map} +1 -1
  103. package/dist/migration-graph-kPluRdF2.mjs +1232 -0
  104. package/dist/migration-graph-kPluRdF2.mjs.map +1 -0
  105. package/dist/migration-list-CE35R5Ag.mjs +505 -0
  106. package/dist/migration-list-CE35R5Ag.mjs.map +1 -0
  107. package/dist/migration-list-styler-DeAwACt3.mjs +402 -0
  108. package/dist/migration-list-styler-DeAwACt3.mjs.map +1 -0
  109. package/dist/{migration-plan-C2jeH1J5.mjs → migration-plan-DHLa2Khm.mjs} +372 -133
  110. package/dist/migration-plan-DHLa2Khm.mjs.map +1 -0
  111. package/dist/{migration-types-BXWvz12q.d.mts → migration-types-CAQ-0TEE.d.mts} +1 -1
  112. package/dist/{migration-types-BXWvz12q.d.mts.map → migration-types-CAQ-0TEE.d.mts.map} +1 -1
  113. package/dist/{migrations-CwZMa1Ck.mjs → migrations-CjO1DsYe.mjs} +12 -13
  114. package/dist/migrations-CjO1DsYe.mjs.map +1 -0
  115. package/dist/{output-BlsrGMEF.mjs → output-CF_hqzI-.mjs} +1 -1
  116. package/dist/{output-BlsrGMEF.mjs.map → output-CF_hqzI-.mjs.map} +1 -1
  117. package/dist/{progress-adapter-DFfvZcYL.mjs → progress-adapter-C644QK8l.mjs} +1 -1
  118. package/dist/{progress-adapter-DFfvZcYL.mjs.map → progress-adapter-C644QK8l.mjs.map} +1 -1
  119. package/dist/ref-advancement-DUZqsue6.mjs +50 -0
  120. package/dist/ref-advancement-DUZqsue6.mjs.map +1 -0
  121. package/dist/terminal-ui-BbtqsQYY.d.mts +133 -0
  122. package/dist/terminal-ui-BbtqsQYY.d.mts.map +1 -0
  123. package/dist/{types-C9FfXb1l.d.mts → types-Ci7TndCS.d.mts} +21 -28
  124. package/dist/types-Ci7TndCS.d.mts.map +1 -0
  125. package/dist/{verify-Bom75OYI.mjs → verify-vl983Ed-.mjs} +2 -2
  126. package/dist/{verify-Bom75OYI.mjs.map → verify-vl983Ed-.mjs.map} +1 -1
  127. package/package.json +11 -11
  128. package/dist/cli-errors-Czmx92Zy.d.mts +0 -3
  129. package/dist/cli-errors-Djtz98Vm.mjs +0 -71
  130. package/dist/cli-errors-Djtz98Vm.mjs.map +0 -1
  131. package/dist/client-oXO2WCPD.mjs.map +0 -1
  132. package/dist/command-helpers-DtavI0wJ.mjs.map +0 -1
  133. package/dist/commands/migration-check.mjs.map +0 -1
  134. package/dist/commands/migration-graph.mjs.map +0 -1
  135. package/dist/commands/migration-list.mjs.map +0 -1
  136. package/dist/contract-enrichment-Dani0mMW.mjs.map +0 -1
  137. package/dist/contract-space-aggregate-loader-BmNQwlws.mjs +0 -160
  138. package/dist/contract-space-aggregate-loader-BmNQwlws.mjs.map +0 -1
  139. package/dist/global-flags-CdE7M0d9.d.mts +0 -15
  140. package/dist/global-flags-CdE7M0d9.d.mts.map +0 -1
  141. package/dist/migration-plan-C2jeH1J5.mjs.map +0 -1
  142. package/dist/migrations-CwZMa1Ck.mjs.map +0 -1
  143. package/dist/rolldown-runtime-twds-ZHy.mjs +0 -14
  144. package/dist/terminal-ui-BiB_8KNo.mjs +0 -379
  145. package/dist/terminal-ui-BiB_8KNo.mjs.map +0 -1
  146. package/dist/types-C9FfXb1l.d.mts.map +0 -1
@@ -0,0 +1,505 @@
1
+ import { t as loadConfig } from "./config-loader-B6sJjXTv.mjs";
2
+ import { B as errorInvalidSpaceId, Q as errorSpaceNotFound, T as formatStyledHeader, _ as createTerminalUI, d as setCommandSeeAlso, g as parseGlobalFlagsOrExit, l as setCommandDescriptions, s as resolveMigrationPaths, t as addGlobalOptions, u as setCommandExamples, y as handleResult } from "./command-helpers-CoceqqMl.mjs";
3
+ import { r as buildReadAggregate } from "./contract-space-aggregate-loader-lafgkTwG.mjs";
4
+ import { a as MIGRATION_LIST_ASCII_KIND_GLYPH, c as formatMigrationDataColumn, d as migrationListForwardArrow, i as renderMigrationListWithStyle, l as formatNodeLineDataColumn, n as createAnsiMigrationListStyler, o as MIGRATION_LIST_UNICODE_KIND_GLYPH, p as classifyMigrationListGraphTopology, r as buildMigrationListTopologyBySpace, s as computeMigrationDirNameWidth, u as migrationListEmptySource } from "./migration-list-styler-DeAwACt3.mjs";
5
+ import { Command } from "commander";
6
+ import { ifDefined } from "@prisma-next/utils/defined";
7
+ import { notOk, ok } from "@prisma-next/utils/result";
8
+ import { APP_SPACE_ID, RESERVED_SPACE_SUBDIR_NAMES, isValidSpaceId, listContractSpaceDirectories } from "@prisma-next/migration-tools/spaces";
9
+ import { EMPTY_CONTRACT_HASH } from "@prisma-next/migration-tools/constants";
10
+ import { HEAD_REF_NAME, refsByContractHash } from "@prisma-next/migration-tools/refs";
11
+ //#region src/utils/formatters/migration-list-graph-layout.ts
12
+ function canonicalFrom(from) {
13
+ return from ?? EMPTY_CONTRACT_HASH;
14
+ }
15
+ function forwardInDegree(topology, hash) {
16
+ return topology.forwardInDegree.get(hash) ?? 0;
17
+ }
18
+ function forwardOutDegree(topology, hash) {
19
+ return topology.forwardOutDegree.get(hash) ?? 0;
20
+ }
21
+ function buildForwardProducersByTo(entries, kindByMigrationHash) {
22
+ const byTo = /* @__PURE__ */ new Map();
23
+ for (const entry of entries) {
24
+ if (kindByMigrationHash.get(entry.migrationHash) !== "forward") continue;
25
+ const bucket = byTo.get(entry.to);
26
+ if (bucket) bucket.push(entry);
27
+ else byTo.set(entry.to, [entry]);
28
+ }
29
+ return byTo;
30
+ }
31
+ function countForwardProducersTo(forwardProducersByTo, contract) {
32
+ return forwardProducersByTo.get(contract)?.length ?? 0;
33
+ }
34
+ function hasLaterForwardDepartingFrom(entries, startIndex, contract, kindByMigrationHash) {
35
+ for (let index = startIndex + 1; index < entries.length; index++) {
36
+ const later = entries[index];
37
+ if (later === void 0) continue;
38
+ if (kindByMigrationHash.get(later.migrationHash) !== "forward") continue;
39
+ if (canonicalFrom(later.from) === contract) return true;
40
+ }
41
+ return false;
42
+ }
43
+ function computeMigrationListGraphLayout(entries, topology = classifyMigrationListGraphTopology(entries)) {
44
+ const { kindByMigrationHash } = topology;
45
+ const forwardProducersByTo = buildForwardProducersByTo(entries, kindByMigrationHash);
46
+ const convergencesEmitted = /* @__PURE__ */ new Set();
47
+ const producerLaneByHash = /* @__PURE__ */ new Map();
48
+ const lanes = [];
49
+ const rows = [];
50
+ function emitNodeLine(contractHash) {
51
+ rows.push({
52
+ kind: "nodeLine",
53
+ contractHash,
54
+ laneIndex: 0
55
+ });
56
+ }
57
+ function emitConnector(connectorKind, contractHash, startLane, endLane, branchCount) {
58
+ rows.push({
59
+ kind: "connector",
60
+ connectorKind,
61
+ contractHash,
62
+ startLane,
63
+ endLane,
64
+ branchCount
65
+ });
66
+ }
67
+ function activeLaneIndices() {
68
+ const indices = [];
69
+ for (let index = 0; index < lanes.length; index++) if (lanes[index]?.active) indices.push(index);
70
+ return indices;
71
+ }
72
+ function lanesWanting(contract) {
73
+ const indices = [];
74
+ for (let index = 0; index < lanes.length; index++) {
75
+ const lane = lanes[index];
76
+ if (lane?.active && lane.want === contract) indices.push(index);
77
+ }
78
+ return indices;
79
+ }
80
+ function ensureLane(index) {
81
+ while (lanes.length <= index) lanes.push({
82
+ want: "",
83
+ active: false
84
+ });
85
+ }
86
+ function openLaneAtRight(want) {
87
+ const index = lanes.length;
88
+ lanes.push({
89
+ want,
90
+ active: true
91
+ });
92
+ return index;
93
+ }
94
+ function closeLane(index) {
95
+ ensureLane(index);
96
+ const lane = lanes[index];
97
+ if (lane) lane.active = false;
98
+ }
99
+ function emitJoinAbove(contractHash, laneIndices) {
100
+ if (laneIndices.length < 2) return;
101
+ const startLane = Math.min(...laneIndices);
102
+ emitConnector("joinAbove", contractHash, startLane, Math.max(...laneIndices), laneIndices.length);
103
+ for (const index of laneIndices) if (index !== startLane) closeLane(index);
104
+ }
105
+ function emitConvergencePreamble(contract) {
106
+ if (convergencesEmitted.has(contract)) return;
107
+ if (forwardInDegree(topology, contract) < 2) return;
108
+ const consumersWanting = lanesWanting(contract);
109
+ if (forwardOutDegree(topology, contract) >= 2 && consumersWanting.length >= 2) emitJoinAbove(contract, consumersWanting);
110
+ emitNodeLine(contract);
111
+ const producers = forwardProducersByTo.get(contract) ?? [];
112
+ if (producers.length >= 2) emitConnector("fanBelow", contract, 0, producers.length - 1, producers.length);
113
+ for (const [producerIndex, producer] of producers.entries()) {
114
+ ensureLane(producerIndex);
115
+ lanes[producerIndex] = {
116
+ want: canonicalFrom(producer.from),
117
+ active: true
118
+ };
119
+ producerLaneByHash.set(producer.migrationHash, producerIndex);
120
+ }
121
+ convergencesEmitted.add(contract);
122
+ }
123
+ function placeWoven(entry, edgeKind, laneIndex) {
124
+ const passThroughLanes = activeLaneIndices().filter((index) => index !== laneIndex);
125
+ rows.push({
126
+ kind: "migration",
127
+ entry,
128
+ edgeKind,
129
+ laneIndex,
130
+ passThroughLanes,
131
+ woven: true
132
+ });
133
+ ensureLane(laneIndex);
134
+ lanes[laneIndex] = {
135
+ want: canonicalFrom(entry.from),
136
+ active: true
137
+ };
138
+ }
139
+ function placeUnwoven(entry, edgeKind) {
140
+ const passThroughLanes = activeLaneIndices();
141
+ const laneIndex = passThroughLanes.length === 0 ? 0 : Math.max(...passThroughLanes) + 1;
142
+ rows.push({
143
+ kind: "migration",
144
+ entry,
145
+ edgeKind,
146
+ laneIndex,
147
+ passThroughLanes,
148
+ woven: false
149
+ });
150
+ }
151
+ for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {
152
+ const entry = entries[entryIndex];
153
+ const edgeKind = kindByMigrationHash.get(entry.migrationHash) ?? "forward";
154
+ const to = entry.to;
155
+ if (edgeKind !== "forward") {
156
+ placeUnwoven(entry, edgeKind);
157
+ continue;
158
+ }
159
+ if (forwardInDegree(topology, to) >= 2 && !convergencesEmitted.has(to)) emitConvergencePreamble(to);
160
+ const presetLane = producerLaneByHash.get(entry.migrationHash);
161
+ const wantingTo = lanesWanting(to);
162
+ if (wantingTo.length >= 2 && countForwardProducersTo(forwardProducersByTo, to) === 1) emitJoinAbove(to, wantingTo);
163
+ if (presetLane !== void 0) {
164
+ placeWoven(entry, edgeKind, presetLane);
165
+ continue;
166
+ }
167
+ const firstWanting = wantingTo[0];
168
+ if (firstWanting !== void 0) {
169
+ placeWoven(entry, edgeKind, firstWanting);
170
+ continue;
171
+ }
172
+ if (hasLaterForwardDepartingFrom(entries, entryIndex, to, kindByMigrationHash)) {
173
+ placeUnwoven(entry, edgeKind);
174
+ continue;
175
+ }
176
+ placeWoven(entry, edgeKind, openLaneAtRight(canonicalFrom(entry.from)));
177
+ }
178
+ return { rows };
179
+ }
180
+ //#endregion
181
+ //#region src/utils/formatters/migration-list-graph-render.ts
182
+ const UNICODE_PALETTE = {
183
+ lane: "│",
184
+ node: "o",
185
+ forwardArrow: migrationListForwardArrow("unicode"),
186
+ emptySource: migrationListEmptySource("unicode"),
187
+ kind: MIGRATION_LIST_UNICODE_KIND_GLYPH,
188
+ fanBelow: (branchCount) => branchCount === 2 ? "├─┐" : "├─┬─┐",
189
+ joinAbove: (branchCount) => branchCount === 2 ? "├─┘" : "└─┴─┘"
190
+ };
191
+ const ASCII_PALETTE = {
192
+ lane: "|",
193
+ node: "o",
194
+ forwardArrow: migrationListForwardArrow("ascii"),
195
+ emptySource: migrationListEmptySource("ascii"),
196
+ kind: MIGRATION_LIST_ASCII_KIND_GLYPH,
197
+ fanBelow: (branchCount) => branchCount === 2 ? "+-\\" : "+-|-\\",
198
+ joinAbove: (branchCount) => branchCount === 2 ? "+-/" : "/-+-/"
199
+ };
200
+ function paletteFor(mode) {
201
+ return mode === "ascii" ? ASCII_PALETTE : UNICODE_PALETTE;
202
+ }
203
+ function migrationEntries(layout) {
204
+ const entries = [];
205
+ for (const row of layout.rows) if (row.kind === "migration") entries.push(row.entry);
206
+ return entries;
207
+ }
208
+ function layoutMaxLaneIndex(layout) {
209
+ let max = 0;
210
+ for (const row of layout.rows) if (row.kind === "migration") max = Math.max(max, row.laneIndex, ...row.passThroughLanes);
211
+ else if (row.kind === "connector") max = Math.max(max, row.endLane);
212
+ else max = Math.max(max, row.laneIndex);
213
+ return max;
214
+ }
215
+ function laneCell(glyph) {
216
+ return `${glyph} `;
217
+ }
218
+ function emptyLaneCell() {
219
+ return " ";
220
+ }
221
+ function renderMigrationGutter(row, maxLane, palette, style) {
222
+ const cells = [];
223
+ for (let lane = 0; lane <= maxLane; lane++) if (lane === row.laneIndex) cells.push(laneCell(style.kind(palette.kind[row.edgeKind])));
224
+ else if (row.passThroughLanes.includes(lane)) cells.push(laneCell(style.lane(palette.lane)));
225
+ else cells.push(emptyLaneCell());
226
+ return cells.join("");
227
+ }
228
+ function renderNodeLineGutter(row, openLanes, maxLane, palette, style) {
229
+ const cells = [];
230
+ for (let lane = 0; lane <= maxLane; lane++) if (lane === row.laneIndex) cells.push(laneCell(palette.node));
231
+ else if (openLanes.has(lane)) cells.push(laneCell(style.lane(palette.lane)));
232
+ else cells.push(emptyLaneCell());
233
+ return cells.join("");
234
+ }
235
+ function renderConnectorGutter(row, openLanes, maxLane, palette, style) {
236
+ const spanWidth = (row.endLane - row.startLane + 1) * 2;
237
+ let spanGlyph = (row.connectorKind === "fanBelow" ? palette.fanBelow(row.branchCount) : palette.joinAbove(row.branchCount)).padEnd(spanWidth, " ").slice(0, spanWidth);
238
+ if (![...openLanes].some((lane) => lane < row.startLane || lane > row.endLane) && spanGlyph.endsWith(" ")) spanGlyph = spanGlyph.slice(0, -1);
239
+ let gutter = "";
240
+ for (let lane = 0; lane < row.startLane; lane++) gutter += openLanes.has(lane) ? laneCell(style.lane(palette.lane)) : emptyLaneCell();
241
+ gutter += style.lane(spanGlyph);
242
+ for (let lane = row.endLane + 1; lane <= maxLane; lane++) gutter += openLanes.has(lane) ? laneCell(style.lane(palette.lane)) : emptyLaneCell();
243
+ return gutter;
244
+ }
245
+ function advanceOpenLanes(row, openLanes) {
246
+ if (row.kind === "migration") return new Set([row.laneIndex, ...row.passThroughLanes]);
247
+ if (row.kind === "connector") {
248
+ if (row.connectorKind === "fanBelow") {
249
+ const next = new Set(openLanes);
250
+ for (let lane = row.startLane; lane <= row.endLane; lane++) next.add(lane);
251
+ return next;
252
+ }
253
+ const next = new Set(openLanes);
254
+ for (let lane = row.startLane + 1; lane <= row.endLane; lane++) next.delete(lane);
255
+ return next;
256
+ }
257
+ return openLanes;
258
+ }
259
+ function renderMigrationListGraphWithStyle(layout, style, glyphMode) {
260
+ const palette = paletteFor(glyphMode);
261
+ const migrations = migrationEntries(layout);
262
+ const layoutMaxLane = layoutMaxLaneIndex(layout);
263
+ const dirNameWidth = computeMigrationDirNameWidth(migrations);
264
+ const gutterMaxLane = layoutMaxLane;
265
+ const blockDataStart = (layoutMaxLane + 1) * 2;
266
+ const gutterVisibleWidth = (gutterMaxLane + 1) * 2;
267
+ const lines = [];
268
+ let openLanes = /* @__PURE__ */ new Set();
269
+ function padToDataColumn(gutter, dataStart) {
270
+ return gutter + " ".repeat(Math.max(0, dataStart - gutterVisibleWidth));
271
+ }
272
+ for (const row of layout.rows) {
273
+ if (row.kind === "migration") {
274
+ const gutter = renderMigrationGutter(row, gutterMaxLane, palette, style);
275
+ const data = formatMigrationDataColumn(row.entry, {
276
+ dirNameWidth,
277
+ edgeKind: row.edgeKind,
278
+ style,
279
+ forwardArrow: palette.forwardArrow,
280
+ emptySource: palette.emptySource
281
+ });
282
+ lines.push(`${padToDataColumn(gutter, blockDataStart)}${data}`);
283
+ } else if (row.kind === "nodeLine") {
284
+ const gutter = renderNodeLineGutter(row, openLanes, gutterMaxLane, palette, style);
285
+ const data = formatNodeLineDataColumn(row.contractHash, style);
286
+ lines.push(`${padToDataColumn(gutter, blockDataStart)}${data}`);
287
+ } else lines.push(renderConnectorGutter(row, openLanes, gutterMaxLane, palette, style));
288
+ openLanes = advanceOpenLanes(row, openLanes);
289
+ }
290
+ return lines.map((line) => line.trimEnd()).join("\n");
291
+ }
292
+ function formatGraphEmptyStateLine(spaceId, style) {
293
+ return style.emptyState(`There are no migrations in migrations/${spaceId}/ yet`);
294
+ }
295
+ function renderGraphSpaceBlock(spaceId, migrations, multiSpace, style, glyphMode, topology) {
296
+ if (migrations.length === 0) {
297
+ const emptyLine = formatGraphEmptyStateLine(spaceId, style);
298
+ if (!multiSpace) return [emptyLine];
299
+ return [style.spaceHeading(`${spaceId}:`), ` ${emptyLine}`];
300
+ }
301
+ const rows = renderMigrationListGraphWithStyle(computeMigrationListGraphLayout(migrations, topology), style, glyphMode).split("\n");
302
+ if (!multiSpace) return rows;
303
+ return [style.spaceHeading(`${spaceId}:`), ...rows.map((row) => ` ${row}`)];
304
+ }
305
+ function renderMigrationListGraphResult(result, style, glyphMode, topologyBySpaceId) {
306
+ const multiSpace = result.spaces.length > 1;
307
+ const lines = [];
308
+ for (let index = 0; index < result.spaces.length; index++) {
309
+ const space = result.spaces[index];
310
+ if (index > 0) lines.push("");
311
+ const topology = topologyBySpaceId.get(space.spaceId);
312
+ if (topology === void 0) throw new Error(`missing topology for space ${space.spaceId}`);
313
+ lines.push(...renderGraphSpaceBlock(space.spaceId, space.migrations, multiSpace, style, glyphMode, topology));
314
+ }
315
+ if (result.spaces.reduce((count, space) => count + space.migrations.length, 0) > 0) {
316
+ lines.push("");
317
+ lines.push(style.summary(result.summary));
318
+ }
319
+ return lines.join("\n");
320
+ }
321
+ //#endregion
322
+ //#region src/commands/migration-list.ts
323
+ function compareSpaceIds(a, b) {
324
+ if (a === APP_SPACE_ID) return b === APP_SPACE_ID ? 0 : -1;
325
+ if (b === APP_SPACE_ID) return 1;
326
+ if (a < b) return -1;
327
+ if (a > b) return 1;
328
+ return 0;
329
+ }
330
+ function compareDirNamesDescending(a, b) {
331
+ if (a.dirName < b.dirName) return 1;
332
+ if (a.dirName > b.dirName) return -1;
333
+ return 0;
334
+ }
335
+ /**
336
+ * Ref names decorating a space's destination contract hashes. The
337
+ * tolerant `member.refs` deliberately omits the structural `head.json`;
338
+ * for extension spaces the old enumerator surfaced it as a `head`
339
+ * decoration on the tip migration, so fold `member.headRef` back in to
340
+ * keep that output. The app space synthesises its head, so it carries
341
+ * no on-disk `head` ref to restore.
342
+ */
343
+ function listRefsByContractHash(member) {
344
+ const byHash = new Map(refsByContractHash(member.refs));
345
+ if (member.spaceId !== APP_SPACE_ID && member.headRef !== null) {
346
+ const hash = member.headRef.hash;
347
+ const bucket = byHash.get(hash) ?? [];
348
+ if (!bucket.includes(HEAD_REF_NAME)) byHash.set(hash, [...bucket, HEAD_REF_NAME].sort());
349
+ }
350
+ return byHash;
351
+ }
352
+ async function orderedOnDiskSpaceIds(projectMigrationsDir) {
353
+ return (await listContractSpaceDirectories(projectMigrationsDir)).filter((name) => !RESERVED_SPACE_SUBDIR_NAMES.has(name)).filter(isValidSpaceId).sort(compareSpaceIds);
354
+ }
355
+ /**
356
+ * Project the loaded {@link ContractSpaceAggregate} into the render-ready
357
+ * {@link MigrationSpaceListEntry} rows `migration list` displays.
358
+ *
359
+ * Space membership matches the on-disk contract-space directories (not the
360
+ * aggregate's always-present synthesized app member when `migrations/app/`
361
+ * is absent); package and ref data come from `aggregate.space(id)`.
362
+ */
363
+ async function migrationSpaceListEntriesFromAggregate(aggregate, projectMigrationsDir) {
364
+ const spaceIds = await orderedOnDiskSpaceIds(projectMigrationsDir);
365
+ const spaces = [];
366
+ for (const spaceId of spaceIds) {
367
+ const member = aggregate.space(spaceId);
368
+ if (member === void 0) continue;
369
+ const refsByHash = listRefsByContractHash(member);
370
+ const migrations = member.packages.map((pkg) => ({
371
+ dirName: pkg.dirName,
372
+ from: pkg.metadata.from,
373
+ to: pkg.metadata.to,
374
+ migrationHash: pkg.metadata.migrationHash,
375
+ operationCount: pkg.ops.length,
376
+ createdAt: pkg.metadata.createdAt,
377
+ refs: refsByHash.get(pkg.metadata.to) ?? [],
378
+ providedInvariants: pkg.metadata.providedInvariants
379
+ })).sort(compareDirNamesDescending);
380
+ spaces.push({
381
+ spaceId,
382
+ migrations
383
+ });
384
+ }
385
+ return spaces;
386
+ }
387
+ function renderMigrationListHumanOutput(result, options) {
388
+ const styler = createAnsiMigrationListStyler({ useColor: options.useColor });
389
+ const topologyBySpaceId = buildMigrationListTopologyBySpace(result);
390
+ if (options.graph) return renderMigrationListGraphResult(result, styler, options.glyphMode, topologyBySpaceId);
391
+ return renderMigrationListWithStyle(result, styler, options.glyphMode, topologyBySpaceId);
392
+ }
393
+ function computeSummary(spaces) {
394
+ const totalMigrations = spaces.reduce((count, space) => count + space.migrations.length, 0);
395
+ if (spaces.length <= 1) return `${totalMigrations} migration(s) on disk`;
396
+ return `${totalMigrations} migration(s) across ${spaces.length} contract space(s)`;
397
+ }
398
+ /**
399
+ * Policy core of `migration list`: validates `--space`, narrows the
400
+ * pre-enumerated spaces, and assembles a {@link MigrationListResult}.
401
+ *
402
+ * - `migrations/` missing or contains no valid space directories →
403
+ * caller passes `spaces: []`; this synthesizes `[{ spaceId: APP_SPACE_ID, migrations: [] }]`.
404
+ * - `--space <id>` on an existing-but-empty space → `{ spaceId, migrations: [] }` in the input.
405
+ * - `--space <id>` on a non-existent (or reserved) space → `SPACE_NOT_FOUND`.
406
+ */
407
+ function runMigrationList(inputs) {
408
+ const { spaces, spaceFilter } = inputs;
409
+ if (spaceFilter !== void 0 && !isValidSpaceId(spaceFilter)) return notOk(errorInvalidSpaceId(spaceFilter));
410
+ if (spaceFilter !== void 0 && !spaces.some((s) => s.spaceId === spaceFilter)) return notOk(errorSpaceNotFound(spaceFilter, spaces.map((s) => s.spaceId).sort()));
411
+ const scopedSpaces = spaceFilter !== void 0 ? spaces.filter((s) => s.spaceId === spaceFilter) : spaces;
412
+ const resultSpaces = scopedSpaces.length === 0 ? [{
413
+ spaceId: APP_SPACE_ID,
414
+ migrations: []
415
+ }] : scopedSpaces;
416
+ return ok({
417
+ ok: true,
418
+ spaces: resultSpaces,
419
+ summary: computeSummary(resultSpaces)
420
+ });
421
+ }
422
+ /**
423
+ * CLI shell: loads config, resolves paths, prints the styled header on
424
+ * stderr (interactive mode only), and delegates to {@link runMigrationList}.
425
+ * Kept intentionally thin so the unit-testable surface lives in the core.
426
+ */
427
+ async function executeMigrationListCommand(options, flags, ui) {
428
+ const config = await loadConfig(options.config);
429
+ const { configPath, migrationsDir, migrationsRelative } = resolveMigrationPaths(options.config, config);
430
+ if (!flags.json && !flags.quiet) {
431
+ const header = formatStyledHeader({
432
+ command: "migration list",
433
+ description: "List on-disk migrations, latest first, per contract space",
434
+ details: [
435
+ {
436
+ label: "config",
437
+ value: configPath
438
+ },
439
+ {
440
+ label: "migrations",
441
+ value: migrationsRelative
442
+ },
443
+ ...options.space !== void 0 ? [{
444
+ label: "space",
445
+ value: options.space
446
+ }] : []
447
+ ],
448
+ flags
449
+ });
450
+ ui.stderr(header);
451
+ }
452
+ const loaded = await buildReadAggregate(config, { migrationsDir });
453
+ if (!loaded.ok) return notOk(loaded.failure);
454
+ return runMigrationList({
455
+ spaces: await migrationSpaceListEntriesFromAggregate(loaded.value.aggregate, migrationsDir),
456
+ ...ifDefined("spaceFilter", options.space)
457
+ });
458
+ }
459
+ function createMigrationListCommand() {
460
+ const command = new Command("list");
461
+ setCommandDescriptions(command, "List on-disk migrations, latest first, per contract space", "Enumerates every on-disk migration under migrations/<space>/ for every\ncontract space found on disk, latest first. Offline — does not consult\nthe database. Each row leads with a kind glyph (* forward, ↩ rollback,\n⟲ self), then dirName, then source → destination contract hashes\n(7-char git-style). Self-edges show a single hash. Invariants render as\n{...}; refs on the destination as (production, db). Pass --space <id>\nto narrow to one contract space. --graph draws the forward spine with\nlane gutters; --ascii forces ASCII glyphs (orthogonal to --no-color).");
462
+ setCommandExamples(command, [
463
+ "prisma-next migration list",
464
+ "prisma-next migration list --graph",
465
+ "prisma-next migration list --space app",
466
+ "prisma-next migration list --graph --ascii",
467
+ "prisma-next migration list --json"
468
+ ]);
469
+ setCommandSeeAlso(command, [
470
+ {
471
+ verb: "migration status",
472
+ oneLiner: "Show migration path and pending status"
473
+ },
474
+ {
475
+ verb: "migration log",
476
+ oneLiner: "Show executed migration history"
477
+ },
478
+ {
479
+ verb: "migration graph",
480
+ oneLiner: "Show the migration graph topology"
481
+ },
482
+ {
483
+ verb: "migration show",
484
+ oneLiner: "Display migration package contents"
485
+ }
486
+ ]);
487
+ addGlobalOptions(command).option("--config <path>", "Path to prisma-next.config.ts").option("--space <id>", "Narrow output to a single contract space").option("--graph", "Draw migration relationships as an annotated tree").option("--ascii", "Use ASCII glyphs for --graph (pipe-friendly)").action(async (options) => {
488
+ const flags = parseGlobalFlagsOrExit(options);
489
+ const ui = createTerminalUI(flags);
490
+ const exitCode = handleResult(await executeMigrationListCommand(options, flags, ui), flags, ui, (listResult) => {
491
+ if (flags.json) ui.output(JSON.stringify(listResult, null, 2));
492
+ else if (!flags.quiet) ui.output(renderMigrationListHumanOutput(listResult, {
493
+ graph: options.graph === true,
494
+ glyphMode: ui.resolveGlyphMode(options.ascii === true),
495
+ useColor: ui.useColor
496
+ }));
497
+ });
498
+ process.exit(exitCode);
499
+ });
500
+ return command;
501
+ }
502
+ //#endregion
503
+ export { runMigrationList as a, renderMigrationListHumanOutput as i, executeMigrationListCommand as n, migrationSpaceListEntriesFromAggregate as r, createMigrationListCommand as t };
504
+
505
+ //# sourceMappingURL=migration-list-CE35R5Ag.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration-list-CE35R5Ag.mjs","names":[],"sources":["../src/utils/formatters/migration-list-graph-layout.ts","../src/utils/formatters/migration-list-graph-render.ts","../src/commands/migration-list.ts"],"sourcesContent":["import { EMPTY_CONTRACT_HASH } from '@prisma-next/migration-tools/constants';\nimport {\n classifyMigrationListGraphTopology,\n type MigrationEdgeKind,\n type MigrationListGraphTopology,\n} from './migration-list-graph-topology';\nimport type { MigrationListEntry } from './migration-list-types';\n\nexport type ConnectorKind = 'fanBelow' | 'joinAbove';\n\nexport interface MigrationLayoutRow {\n readonly kind: 'migration';\n readonly entry: MigrationListEntry;\n readonly edgeKind: MigrationEdgeKind;\n readonly laneIndex: number;\n readonly passThroughLanes: readonly number[];\n readonly woven: boolean;\n}\n\nexport interface NodeLineLayoutRow {\n readonly kind: 'nodeLine';\n readonly contractHash: string;\n readonly laneIndex: number;\n}\n\nexport interface ConnectorLayoutRow {\n readonly kind: 'connector';\n readonly connectorKind: ConnectorKind;\n readonly contractHash: string;\n readonly startLane: number;\n readonly endLane: number;\n readonly branchCount: number;\n}\n\nexport type LayoutRow = MigrationLayoutRow | NodeLineLayoutRow | ConnectorLayoutRow;\n\nexport interface MigrationListGraphLayout {\n readonly rows: readonly LayoutRow[];\n}\n\ninterface LaneState {\n want: string;\n active: boolean;\n}\n\nfunction canonicalFrom(from: string | null): string {\n return from ?? EMPTY_CONTRACT_HASH;\n}\n\nfunction forwardInDegree(topology: MigrationListGraphTopology, hash: string): number {\n return topology.forwardInDegree.get(hash) ?? 0;\n}\n\nfunction forwardOutDegree(topology: MigrationListGraphTopology, hash: string): number {\n return topology.forwardOutDegree.get(hash) ?? 0;\n}\n\nfunction buildForwardProducersByTo(\n entries: readonly MigrationListEntry[],\n kindByMigrationHash: ReadonlyMap<string, MigrationEdgeKind>,\n): Map<string, MigrationListEntry[]> {\n const byTo = new Map<string, MigrationListEntry[]>();\n for (const entry of entries) {\n if (kindByMigrationHash.get(entry.migrationHash) !== 'forward') continue;\n const bucket = byTo.get(entry.to);\n if (bucket) bucket.push(entry);\n else byTo.set(entry.to, [entry]);\n }\n return byTo;\n}\n\nfunction countForwardProducersTo(\n forwardProducersByTo: Map<string, MigrationListEntry[]>,\n contract: string,\n): number {\n return forwardProducersByTo.get(contract)?.length ?? 0;\n}\n\nfunction hasLaterForwardDepartingFrom(\n entries: readonly MigrationListEntry[],\n startIndex: number,\n contract: string,\n kindByMigrationHash: ReadonlyMap<string, MigrationEdgeKind>,\n): boolean {\n for (let index = startIndex + 1; index < entries.length; index++) {\n const later = entries[index];\n if (later === undefined) continue;\n if (kindByMigrationHash.get(later.migrationHash) !== 'forward') continue;\n if (canonicalFrom(later.from) === contract) return true;\n }\n return false;\n}\n\nexport function computeMigrationListGraphLayout(\n entries: readonly MigrationListEntry[],\n topology: MigrationListGraphTopology = classifyMigrationListGraphTopology(entries),\n): MigrationListGraphLayout {\n const { kindByMigrationHash } = topology;\n const forwardProducersByTo = buildForwardProducersByTo(entries, kindByMigrationHash);\n const convergencesEmitted = new Set<string>();\n const producerLaneByHash = new Map<string, number>();\n const lanes: LaneState[] = [];\n const rows: LayoutRow[] = [];\n\n function emitNodeLine(contractHash: string): void {\n rows.push({ kind: 'nodeLine', contractHash, laneIndex: 0 });\n }\n\n function emitConnector(\n connectorKind: ConnectorKind,\n contractHash: string,\n startLane: number,\n endLane: number,\n branchCount: number,\n ): void {\n rows.push({\n kind: 'connector',\n connectorKind,\n contractHash,\n startLane,\n endLane,\n branchCount,\n });\n }\n\n function activeLaneIndices(): number[] {\n const indices: number[] = [];\n for (let index = 0; index < lanes.length; index++) {\n if (lanes[index]?.active) indices.push(index);\n }\n return indices;\n }\n\n function lanesWanting(contract: string): number[] {\n const indices: number[] = [];\n for (let index = 0; index < lanes.length; index++) {\n const lane = lanes[index];\n if (lane?.active && lane.want === contract) indices.push(index);\n }\n return indices;\n }\n\n function ensureLane(index: number): void {\n while (lanes.length <= index) {\n lanes.push({ want: '', active: false });\n }\n }\n\n function openLaneAtRight(want: string): number {\n const index = lanes.length;\n lanes.push({ want, active: true });\n return index;\n }\n\n function closeLane(index: number): void {\n ensureLane(index);\n const lane = lanes[index];\n if (lane) lane.active = false;\n }\n\n function emitJoinAbove(contractHash: string, laneIndices: readonly number[]): void {\n if (laneIndices.length < 2) return;\n const startLane = Math.min(...laneIndices);\n const endLane = Math.max(...laneIndices);\n emitConnector('joinAbove', contractHash, startLane, endLane, laneIndices.length);\n for (const index of laneIndices) {\n if (index !== startLane) closeLane(index);\n }\n }\n\n function emitConvergencePreamble(contract: string): void {\n if (convergencesEmitted.has(contract)) return;\n if (forwardInDegree(topology, contract) < 2) return;\n\n const consumersWanting = lanesWanting(contract);\n if (forwardOutDegree(topology, contract) >= 2 && consumersWanting.length >= 2) {\n emitJoinAbove(contract, consumersWanting);\n }\n\n emitNodeLine(contract);\n const producers = forwardProducersByTo.get(contract) ?? [];\n if (producers.length >= 2) {\n emitConnector('fanBelow', contract, 0, producers.length - 1, producers.length);\n }\n\n for (const [producerIndex, producer] of producers.entries()) {\n ensureLane(producerIndex);\n lanes[producerIndex] = { want: canonicalFrom(producer.from), active: true };\n producerLaneByHash.set(producer.migrationHash, producerIndex);\n }\n\n convergencesEmitted.add(contract);\n }\n\n function placeWoven(\n entry: MigrationListEntry,\n edgeKind: MigrationEdgeKind,\n laneIndex: number,\n ): void {\n const passThroughLanes = activeLaneIndices().filter((index) => index !== laneIndex);\n rows.push({\n kind: 'migration',\n entry,\n edgeKind,\n laneIndex,\n passThroughLanes,\n woven: true,\n });\n ensureLane(laneIndex);\n lanes[laneIndex] = { want: canonicalFrom(entry.from), active: true };\n }\n\n function placeUnwoven(entry: MigrationListEntry, edgeKind: MigrationEdgeKind): void {\n const passThroughLanes = activeLaneIndices();\n const laneIndex = passThroughLanes.length === 0 ? 0 : Math.max(...passThroughLanes) + 1;\n rows.push({\n kind: 'migration',\n entry,\n edgeKind,\n laneIndex,\n passThroughLanes,\n woven: false,\n });\n }\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n const entry = entries[entryIndex]!;\n const edgeKind = kindByMigrationHash.get(entry.migrationHash) ?? 'forward';\n const to = entry.to;\n\n if (edgeKind !== 'forward') {\n placeUnwoven(entry, edgeKind);\n continue;\n }\n\n if (forwardInDegree(topology, to) >= 2 && !convergencesEmitted.has(to)) {\n emitConvergencePreamble(to);\n }\n\n const presetLane = producerLaneByHash.get(entry.migrationHash);\n const wantingTo = lanesWanting(to);\n\n if (wantingTo.length >= 2 && countForwardProducersTo(forwardProducersByTo, to) === 1) {\n emitJoinAbove(to, wantingTo);\n }\n\n if (presetLane !== undefined) {\n placeWoven(entry, edgeKind, presetLane);\n continue;\n }\n\n const firstWanting = wantingTo[0];\n if (firstWanting !== undefined) {\n placeWoven(entry, edgeKind, firstWanting);\n continue;\n }\n\n if (hasLaterForwardDepartingFrom(entries, entryIndex, to, kindByMigrationHash)) {\n placeUnwoven(entry, edgeKind);\n continue;\n }\n\n const tipLaneIndex = openLaneAtRight(canonicalFrom(entry.from));\n placeWoven(entry, edgeKind, tipLaneIndex);\n }\n\n return { rows };\n}\n","import type { GlyphMode } from '../glyph-mode';\nimport {\n abbreviateContractHash,\n computeMigrationDirNameWidth,\n formatMigrationDataColumn,\n formatNodeLineDataColumn,\n MIGRATION_LIST_ASCII_KIND_GLYPH,\n MIGRATION_LIST_UNICODE_KIND_GLYPH,\n migrationListEmptySource,\n migrationListForwardArrow,\n} from './migration-list-data-column';\nimport type {\n ConnectorLayoutRow,\n LayoutRow,\n MigrationLayoutRow,\n MigrationListGraphLayout,\n NodeLineLayoutRow,\n} from './migration-list-graph-layout';\nimport { computeMigrationListGraphLayout } from './migration-list-graph-layout';\nimport type { MigrationListGraphTopology } from './migration-list-graph-topology';\nimport type { MigrationListStyler } from './migration-list-render';\nimport type { MigrationListEntry, MigrationListResult } from './migration-list-types';\n\nexport type { GlyphMode } from '../glyph-mode';\n\ninterface GlyphPalette {\n readonly lane: string;\n readonly node: string;\n readonly forwardArrow: string;\n readonly emptySource: string;\n readonly kind: typeof MIGRATION_LIST_UNICODE_KIND_GLYPH;\n readonly fanBelow: (branchCount: number) => string;\n readonly joinAbove: (branchCount: number) => string;\n}\n\nconst UNICODE_PALETTE: GlyphPalette = {\n lane: '│',\n node: 'o',\n forwardArrow: migrationListForwardArrow('unicode'),\n emptySource: migrationListEmptySource('unicode'),\n kind: MIGRATION_LIST_UNICODE_KIND_GLYPH,\n fanBelow: (branchCount) => (branchCount === 2 ? '├─┐' : '├─┬─┐'),\n joinAbove: (branchCount) => (branchCount === 2 ? '├─┘' : '└─┴─┘'),\n};\n\nconst ASCII_PALETTE: GlyphPalette = {\n lane: '|',\n node: 'o',\n forwardArrow: migrationListForwardArrow('ascii'),\n emptySource: migrationListEmptySource('ascii'),\n kind: MIGRATION_LIST_ASCII_KIND_GLYPH,\n fanBelow: (branchCount) => (branchCount === 2 ? '+-\\\\' : '+-|-\\\\'),\n joinAbove: (branchCount) => (branchCount === 2 ? '+-/' : '/-+-/'),\n};\n\nfunction paletteFor(mode: GlyphMode): GlyphPalette {\n return mode === 'ascii' ? ASCII_PALETTE : UNICODE_PALETTE;\n}\n\nfunction migrationEntries(layout: MigrationListGraphLayout): MigrationListEntry[] {\n const entries: MigrationListEntry[] = [];\n for (const row of layout.rows) {\n if (row.kind === 'migration') entries.push(row.entry);\n }\n return entries;\n}\n\nfunction layoutMaxLaneIndex(layout: MigrationListGraphLayout): number {\n let max = 0;\n for (const row of layout.rows) {\n if (row.kind === 'migration') {\n max = Math.max(max, row.laneIndex, ...row.passThroughLanes);\n } else if (row.kind === 'connector') {\n max = Math.max(max, row.endLane);\n } else {\n max = Math.max(max, row.laneIndex);\n }\n }\n return max;\n}\n\nfunction laneCell(glyph: string): string {\n return `${glyph} `;\n}\n\nfunction emptyLaneCell(): string {\n return ' ';\n}\n\nfunction renderMigrationGutter(\n row: MigrationLayoutRow,\n maxLane: number,\n palette: GlyphPalette,\n style: MigrationListStyler,\n): string {\n const cells: string[] = [];\n for (let lane = 0; lane <= maxLane; lane++) {\n if (lane === row.laneIndex) {\n cells.push(laneCell(style.kind(palette.kind[row.edgeKind])));\n } else if (row.passThroughLanes.includes(lane)) {\n cells.push(laneCell(style.lane(palette.lane)));\n } else {\n cells.push(emptyLaneCell());\n }\n }\n return cells.join('');\n}\n\nfunction renderNodeLineGutter(\n row: NodeLineLayoutRow,\n openLanes: ReadonlySet<number>,\n maxLane: number,\n palette: GlyphPalette,\n style: MigrationListStyler,\n): string {\n const cells: string[] = [];\n for (let lane = 0; lane <= maxLane; lane++) {\n if (lane === row.laneIndex) {\n cells.push(laneCell(palette.node));\n } else if (openLanes.has(lane)) {\n cells.push(laneCell(style.lane(palette.lane)));\n } else {\n cells.push(emptyLaneCell());\n }\n }\n return cells.join('');\n}\n\nfunction renderConnectorGutter(\n row: ConnectorLayoutRow,\n openLanes: ReadonlySet<number>,\n maxLane: number,\n palette: GlyphPalette,\n style: MigrationListStyler,\n): string {\n const spanLaneCount = row.endLane - row.startLane + 1;\n const spanWidth = spanLaneCount * 2;\n let spanGlyph = (\n row.connectorKind === 'fanBelow'\n ? palette.fanBelow(row.branchCount)\n : palette.joinAbove(row.branchCount)\n )\n .padEnd(spanWidth, ' ')\n .slice(0, spanWidth);\n\n const hasOutsideOpen = [...openLanes].some((lane) => lane < row.startLane || lane > row.endLane);\n if (!hasOutsideOpen && spanGlyph.endsWith(' ')) {\n spanGlyph = spanGlyph.slice(0, -1);\n }\n\n let gutter = '';\n for (let lane = 0; lane < row.startLane; lane++) {\n gutter += openLanes.has(lane) ? laneCell(style.lane(palette.lane)) : emptyLaneCell();\n }\n gutter += style.lane(spanGlyph);\n for (let lane = row.endLane + 1; lane <= maxLane; lane++) {\n gutter += openLanes.has(lane) ? laneCell(style.lane(palette.lane)) : emptyLaneCell();\n }\n return gutter;\n}\n\nfunction advanceOpenLanes(row: LayoutRow, openLanes: ReadonlySet<number>): ReadonlySet<number> {\n if (row.kind === 'migration') {\n return new Set([row.laneIndex, ...row.passThroughLanes]);\n }\n if (row.kind === 'connector') {\n if (row.connectorKind === 'fanBelow') {\n const next = new Set(openLanes);\n for (let lane = row.startLane; lane <= row.endLane; lane++) {\n next.add(lane);\n }\n return next;\n }\n const next = new Set(openLanes);\n for (let lane = row.startLane + 1; lane <= row.endLane; lane++) {\n next.delete(lane);\n }\n return next;\n }\n return openLanes;\n}\n\nexport function renderMigrationListGraphWithStyle(\n layout: MigrationListGraphLayout,\n style: MigrationListStyler,\n glyphMode: GlyphMode,\n): string {\n const palette = paletteFor(glyphMode);\n const migrations = migrationEntries(layout);\n const layoutMaxLane = layoutMaxLaneIndex(layout);\n const dirNameWidth = computeMigrationDirNameWidth(migrations);\n const gutterMaxLane = layoutMaxLane;\n const blockDataStart = (layoutMaxLane + 1) * 2;\n // Migration and node-line gutters always occupy a fixed, ANSI-free visible\n // width of two columns per lane. Padding is computed from this width rather\n // than the rendered string length so dimmed lanes (which carry zero-width\n // SGR bytes) stay column-aligned with the data that follows.\n const gutterVisibleWidth = (gutterMaxLane + 1) * 2;\n const lines: string[] = [];\n let openLanes: ReadonlySet<number> = new Set();\n\n function padToDataColumn(gutter: string, dataStart: number): string {\n return gutter + ' '.repeat(Math.max(0, dataStart - gutterVisibleWidth));\n }\n\n for (const row of layout.rows) {\n if (row.kind === 'migration') {\n const gutter = renderMigrationGutter(row, gutterMaxLane, palette, style);\n const data = formatMigrationDataColumn(row.entry, {\n dirNameWidth,\n edgeKind: row.edgeKind,\n style,\n forwardArrow: palette.forwardArrow,\n emptySource: palette.emptySource,\n });\n lines.push(`${padToDataColumn(gutter, blockDataStart)}${data}`);\n } else if (row.kind === 'nodeLine') {\n const gutter = renderNodeLineGutter(row, openLanes, gutterMaxLane, palette, style);\n const data = formatNodeLineDataColumn(row.contractHash, style);\n lines.push(`${padToDataColumn(gutter, blockDataStart)}${data}`);\n } else {\n lines.push(renderConnectorGutter(row, openLanes, gutterMaxLane, palette, style));\n }\n openLanes = advanceOpenLanes(row, openLanes);\n }\n\n return lines.map((line) => line.trimEnd()).join('\\n');\n}\n\nexport function renderMigrationListGraph(\n layout: MigrationListGraphLayout,\n style: MigrationListStyler,\n glyphMode: GlyphMode,\n): string {\n return renderMigrationListGraphWithStyle(layout, style, glyphMode);\n}\n\nexport function formatGraphNodeLineHash(contractHash: string, style: MigrationListStyler): string {\n return style.sourceHash(abbreviateContractHash(contractHash));\n}\n\nfunction formatGraphEmptyStateLine(spaceId: string, style: MigrationListStyler): string {\n return style.emptyState(`There are no migrations in migrations/${spaceId}/ yet`);\n}\n\nfunction renderGraphSpaceBlock(\n spaceId: string,\n migrations: readonly MigrationListEntry[],\n multiSpace: boolean,\n style: MigrationListStyler,\n glyphMode: GlyphMode,\n topology: MigrationListGraphTopology,\n): readonly string[] {\n if (migrations.length === 0) {\n const emptyLine = formatGraphEmptyStateLine(spaceId, style);\n if (!multiSpace) {\n return [emptyLine];\n }\n return [style.spaceHeading(`${spaceId}:`), ` ${emptyLine}`];\n }\n\n const layout = computeMigrationListGraphLayout(migrations, topology);\n const graphBody = renderMigrationListGraphWithStyle(layout, style, glyphMode);\n const rows = graphBody.split('\\n');\n if (!multiSpace) {\n return rows;\n }\n return [style.spaceHeading(`${spaceId}:`), ...rows.map((row) => ` ${row}`)];\n}\n\nexport function renderMigrationListGraphResult(\n result: MigrationListResult,\n style: MigrationListStyler,\n glyphMode: GlyphMode,\n topologyBySpaceId: ReadonlyMap<string, MigrationListGraphTopology>,\n): string {\n const multiSpace = result.spaces.length > 1;\n const lines: string[] = [];\n\n for (let index = 0; index < result.spaces.length; index++) {\n const space = result.spaces[index]!;\n if (index > 0) {\n lines.push('');\n }\n const topology = topologyBySpaceId.get(space.spaceId);\n if (topology === undefined) {\n throw new Error(`missing topology for space ${space.spaceId}`);\n }\n lines.push(\n ...renderGraphSpaceBlock(\n space.spaceId,\n space.migrations,\n multiSpace,\n style,\n glyphMode,\n topology,\n ),\n );\n }\n\n const totalMigrations = result.spaces.reduce(\n (count, space) => count + space.migrations.length,\n 0,\n );\n if (totalMigrations > 0) {\n lines.push('');\n lines.push(style.summary(result.summary));\n }\n\n return lines.join('\\n');\n}\n","import type {\n ContractSpaceAggregate,\n ContractSpaceMember,\n} from '@prisma-next/migration-tools/aggregate';\nimport { HEAD_REF_NAME, refsByContractHash } from '@prisma-next/migration-tools/refs';\nimport {\n APP_SPACE_ID,\n isValidSpaceId,\n listContractSpaceDirectories,\n RESERVED_SPACE_SUBDIR_NAMES,\n} from '@prisma-next/migration-tools/spaces';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config-loader';\nimport {\n type CliStructuredError,\n errorInvalidSpaceId,\n errorSpaceNotFound,\n} from '../utils/cli-errors';\nimport {\n addGlobalOptions,\n resolveMigrationPaths,\n setCommandDescriptions,\n setCommandExamples,\n setCommandSeeAlso,\n} from '../utils/command-helpers';\nimport { buildReadAggregate } from '../utils/contract-space-aggregate-loader';\nimport {\n type GlyphMode,\n renderMigrationListGraphResult,\n} from '../utils/formatters/migration-list-graph-render';\nimport {\n buildMigrationListTopologyBySpace,\n renderMigrationListWithStyle,\n} from '../utils/formatters/migration-list-render';\nimport { createAnsiMigrationListStyler } from '../utils/formatters/migration-list-styler';\nimport type {\n MigrationListEntry,\n MigrationListResult,\n MigrationSpaceListEntry,\n} from '../utils/formatters/migration-list-types';\nimport { formatStyledHeader } from '../utils/formatters/styled';\nimport type { CommonCommandOptions } from '../utils/global-flags';\nimport { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';\nimport { handleResult } from '../utils/result-handler';\nimport { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';\n\nfunction compareSpaceIds(a: string, b: string): number {\n if (a === APP_SPACE_ID) return b === APP_SPACE_ID ? 0 : -1;\n if (b === APP_SPACE_ID) return 1;\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nfunction compareDirNamesDescending(a: MigrationListEntry, b: MigrationListEntry): number {\n if (a.dirName < b.dirName) return 1;\n if (a.dirName > b.dirName) return -1;\n return 0;\n}\n\n/**\n * Ref names decorating a space's destination contract hashes. The\n * tolerant `member.refs` deliberately omits the structural `head.json`;\n * for extension spaces the old enumerator surfaced it as a `head`\n * decoration on the tip migration, so fold `member.headRef` back in to\n * keep that output. The app space synthesises its head, so it carries\n * no on-disk `head` ref to restore.\n */\nfunction listRefsByContractHash(\n member: ContractSpaceMember,\n): ReadonlyMap<string, readonly string[]> {\n const byHash = new Map(refsByContractHash(member.refs));\n if (member.spaceId !== APP_SPACE_ID && member.headRef !== null) {\n const hash = member.headRef.hash;\n const bucket = byHash.get(hash) ?? [];\n if (!bucket.includes(HEAD_REF_NAME)) {\n byHash.set(hash, [...bucket, HEAD_REF_NAME].sort());\n }\n }\n return byHash;\n}\n\nasync function orderedOnDiskSpaceIds(projectMigrationsDir: string): Promise<readonly string[]> {\n const candidateDirs = await listContractSpaceDirectories(projectMigrationsDir);\n return candidateDirs\n .filter((name) => !RESERVED_SPACE_SUBDIR_NAMES.has(name))\n .filter(isValidSpaceId)\n .sort(compareSpaceIds);\n}\n\n/**\n * Project the loaded {@link ContractSpaceAggregate} into the render-ready\n * {@link MigrationSpaceListEntry} rows `migration list` displays.\n *\n * Space membership matches the on-disk contract-space directories (not the\n * aggregate's always-present synthesized app member when `migrations/app/`\n * is absent); package and ref data come from `aggregate.space(id)`.\n */\nexport async function migrationSpaceListEntriesFromAggregate(\n aggregate: ContractSpaceAggregate,\n projectMigrationsDir: string,\n): Promise<readonly MigrationSpaceListEntry[]> {\n const spaceIds = await orderedOnDiskSpaceIds(projectMigrationsDir);\n const spaces: MigrationSpaceListEntry[] = [];\n\n for (const spaceId of spaceIds) {\n const member = aggregate.space(spaceId);\n if (member === undefined) {\n continue;\n }\n const refsByHash = listRefsByContractHash(member);\n const migrations: MigrationListEntry[] = member.packages\n .map((pkg) => ({\n dirName: pkg.dirName,\n from: pkg.metadata.from,\n to: pkg.metadata.to,\n migrationHash: pkg.metadata.migrationHash,\n operationCount: pkg.ops.length,\n createdAt: pkg.metadata.createdAt,\n refs: refsByHash.get(pkg.metadata.to) ?? [],\n providedInvariants: pkg.metadata.providedInvariants,\n }))\n .sort(compareDirNamesDescending);\n\n spaces.push({ spaceId, migrations });\n }\n\n return spaces;\n}\n\ninterface MigrationListOptions extends CommonCommandOptions {\n readonly config?: string;\n readonly space?: string;\n readonly graph?: boolean;\n readonly ascii?: boolean;\n}\n\nexport interface MigrationListHumanRenderOptions {\n readonly graph: boolean;\n readonly glyphMode: GlyphMode;\n readonly useColor: boolean;\n}\n\nexport function renderMigrationListHumanOutput(\n result: MigrationListResult,\n options: MigrationListHumanRenderOptions,\n): string {\n const styler = createAnsiMigrationListStyler({ useColor: options.useColor });\n const topologyBySpaceId = buildMigrationListTopologyBySpace(result);\n if (options.graph) {\n return renderMigrationListGraphResult(result, styler, options.glyphMode, topologyBySpaceId);\n }\n return renderMigrationListWithStyle(result, styler, options.glyphMode, topologyBySpaceId);\n}\n\n/**\n * Inputs for {@link runMigrationList} — the policy core of `migration list`\n * that tests exercise directly.\n *\n * The core does not call `loadConfig`, parse CLI flags, render a styled\n * header, or write to any stream. Enumeration is supplied by the caller\n * (the CLI shell builds it from {@link migrationSpaceListEntriesFromAggregate}).\n */\nexport interface RunMigrationListInputs {\n readonly spaces: readonly MigrationSpaceListEntry[];\n readonly spaceFilter?: string;\n}\n\nfunction computeSummary(spaces: readonly MigrationSpaceListEntry[]): string {\n const totalMigrations = spaces.reduce((count, space) => count + space.migrations.length, 0);\n if (spaces.length <= 1) {\n return `${totalMigrations} migration(s) on disk`;\n }\n return `${totalMigrations} migration(s) across ${spaces.length} contract space(s)`;\n}\n\n/**\n * Policy core of `migration list`: validates `--space`, narrows the\n * pre-enumerated spaces, and assembles a {@link MigrationListResult}.\n *\n * - `migrations/` missing or contains no valid space directories →\n * caller passes `spaces: []`; this synthesizes `[{ spaceId: APP_SPACE_ID, migrations: [] }]`.\n * - `--space <id>` on an existing-but-empty space → `{ spaceId, migrations: [] }` in the input.\n * - `--space <id>` on a non-existent (or reserved) space → `SPACE_NOT_FOUND`.\n */\nexport function runMigrationList(\n inputs: RunMigrationListInputs,\n): Result<MigrationListResult, CliStructuredError> {\n const { spaces, spaceFilter } = inputs;\n\n if (spaceFilter !== undefined && !isValidSpaceId(spaceFilter)) {\n return notOk(errorInvalidSpaceId(spaceFilter));\n }\n\n if (spaceFilter !== undefined && !spaces.some((s) => s.spaceId === spaceFilter)) {\n return notOk(errorSpaceNotFound(spaceFilter, spaces.map((s) => s.spaceId).sort()));\n }\n\n const scopedSpaces =\n spaceFilter !== undefined ? spaces.filter((s) => s.spaceId === spaceFilter) : spaces;\n\n const resultSpaces: readonly MigrationSpaceListEntry[] =\n scopedSpaces.length === 0 ? [{ spaceId: APP_SPACE_ID, migrations: [] }] : scopedSpaces;\n\n return ok({\n ok: true,\n spaces: resultSpaces,\n summary: computeSummary(resultSpaces),\n });\n}\n\n/**\n * CLI shell: loads config, resolves paths, prints the styled header on\n * stderr (interactive mode only), and delegates to {@link runMigrationList}.\n * Kept intentionally thin so the unit-testable surface lives in the core.\n */\nexport async function executeMigrationListCommand(\n options: MigrationListOptions,\n flags: GlobalFlags,\n ui: TerminalUI,\n): Promise<Result<MigrationListResult, CliStructuredError>> {\n const config = await loadConfig(options.config);\n const { configPath, migrationsDir, migrationsRelative } = resolveMigrationPaths(\n options.config,\n config,\n );\n\n if (!flags.json && !flags.quiet) {\n const header = formatStyledHeader({\n command: 'migration list',\n description: 'List on-disk migrations, latest first, per contract space',\n details: [\n { label: 'config', value: configPath },\n { label: 'migrations', value: migrationsRelative },\n ...(options.space !== undefined ? [{ label: 'space', value: options.space }] : []),\n ],\n flags,\n });\n ui.stderr(header);\n }\n\n const loaded = await buildReadAggregate(config, { migrationsDir });\n if (!loaded.ok) {\n return notOk(loaded.failure);\n }\n\n const spaces = await migrationSpaceListEntriesFromAggregate(\n loaded.value.aggregate,\n migrationsDir,\n );\n\n return runMigrationList({\n spaces,\n ...ifDefined('spaceFilter', options.space),\n });\n}\n\nexport function createMigrationListCommand(): Command {\n const command = new Command('list');\n setCommandDescriptions(\n command,\n 'List on-disk migrations, latest first, per contract space',\n 'Enumerates every on-disk migration under migrations/<space>/ for every\\n' +\n 'contract space found on disk, latest first. Offline — does not consult\\n' +\n 'the database. Each row leads with a kind glyph (* forward, ↩ rollback,\\n' +\n '⟲ self), then dirName, then source → destination contract hashes\\n' +\n '(7-char git-style). Self-edges show a single hash. Invariants render as\\n' +\n '{...}; refs on the destination as (production, db). Pass --space <id>\\n' +\n 'to narrow to one contract space. --graph draws the forward spine with\\n' +\n 'lane gutters; --ascii forces ASCII glyphs (orthogonal to --no-color).',\n );\n setCommandExamples(command, [\n 'prisma-next migration list',\n 'prisma-next migration list --graph',\n 'prisma-next migration list --space app',\n 'prisma-next migration list --graph --ascii',\n 'prisma-next migration list --json',\n ]);\n setCommandSeeAlso(command, [\n { verb: 'migration status', oneLiner: 'Show migration path and pending status' },\n { verb: 'migration log', oneLiner: 'Show executed migration history' },\n { verb: 'migration graph', oneLiner: 'Show the migration graph topology' },\n { verb: 'migration show', oneLiner: 'Display migration package contents' },\n ]);\n addGlobalOptions(command)\n .option('--config <path>', 'Path to prisma-next.config.ts')\n .option('--space <id>', 'Narrow output to a single contract space')\n .option('--graph', 'Draw migration relationships as an annotated tree')\n .option('--ascii', 'Use ASCII glyphs for --graph (pipe-friendly)')\n .action(async (options: MigrationListOptions) => {\n const flags = parseGlobalFlagsOrExit(options);\n const ui = createTerminalUI(flags);\n const result = await executeMigrationListCommand(options, flags, ui);\n const exitCode = handleResult(result, flags, ui, (listResult) => {\n if (flags.json) {\n ui.output(JSON.stringify(listResult, null, 2));\n } else if (!flags.quiet) {\n ui.output(\n renderMigrationListHumanOutput(listResult, {\n graph: options.graph === true,\n glyphMode: ui.resolveGlyphMode(options.ascii === true),\n useColor: ui.useColor,\n }),\n );\n }\n });\n process.exit(exitCode);\n });\n return command;\n}\n"],"mappings":"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"}