@prisma-next/cli 0.5.0-dev.9 → 0.6.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +61 -26
  2. package/dist/cli-errors-B9OBbled.d.mts +3 -0
  3. package/dist/cli-errors-D3_sMh2K.mjs +33 -0
  4. package/dist/cli-errors-D3_sMh2K.mjs.map +1 -0
  5. package/dist/cli.mjs +16 -78
  6. package/dist/cli.mjs.map +1 -1
  7. package/dist/client-qVH-rEgd.mjs +1595 -0
  8. package/dist/client-qVH-rEgd.mjs.map +1 -0
  9. package/dist/{result-handler-Ba3zWQsI.mjs → command-helpers-BeZHkxV8.mjs} +70 -47
  10. package/dist/command-helpers-BeZHkxV8.mjs.map +1 -0
  11. package/dist/commands/contract-emit.d.mts.map +1 -1
  12. package/dist/commands/contract-emit.mjs +2 -4
  13. package/dist/commands/contract-infer.d.mts.map +1 -1
  14. package/dist/commands/contract-infer.mjs +2 -4
  15. package/dist/commands/db-init.d.mts.map +1 -1
  16. package/dist/commands/db-init.mjs +16 -13
  17. package/dist/commands/db-init.mjs.map +1 -1
  18. package/dist/commands/db-schema.d.mts.map +1 -1
  19. package/dist/commands/db-schema.mjs +6 -7
  20. package/dist/commands/db-schema.mjs.map +1 -1
  21. package/dist/commands/db-sign.d.mts.map +1 -1
  22. package/dist/commands/db-sign.mjs +9 -9
  23. package/dist/commands/db-sign.mjs.map +1 -1
  24. package/dist/commands/db-update.d.mts.map +1 -1
  25. package/dist/commands/db-update.mjs +15 -13
  26. package/dist/commands/db-update.mjs.map +1 -1
  27. package/dist/commands/db-verify.d.mts.map +1 -1
  28. package/dist/commands/db-verify.mjs +1 -321
  29. package/dist/commands/migration-apply.d.mts +28 -13
  30. package/dist/commands/migration-apply.d.mts.map +1 -1
  31. package/dist/commands/migration-apply.mjs +55 -151
  32. package/dist/commands/migration-apply.mjs.map +1 -1
  33. package/dist/commands/migration-new.d.mts +0 -1
  34. package/dist/commands/migration-new.d.mts.map +1 -1
  35. package/dist/commands/migration-new.mjs +34 -40
  36. package/dist/commands/migration-new.mjs.map +1 -1
  37. package/dist/commands/migration-plan.d.mts +33 -6
  38. package/dist/commands/migration-plan.d.mts.map +1 -1
  39. package/dist/commands/migration-plan.mjs +2 -348
  40. package/dist/commands/migration-ref.d.mts +1 -1
  41. package/dist/commands/migration-ref.d.mts.map +1 -1
  42. package/dist/commands/migration-ref.mjs +8 -12
  43. package/dist/commands/migration-ref.mjs.map +1 -1
  44. package/dist/commands/migration-show.d.mts +13 -7
  45. package/dist/commands/migration-show.d.mts.map +1 -1
  46. package/dist/commands/migration-show.mjs +35 -36
  47. package/dist/commands/migration-show.mjs.map +1 -1
  48. package/dist/commands/migration-status.d.mts +126 -5
  49. package/dist/commands/migration-status.d.mts.map +1 -1
  50. package/dist/commands/migration-status.mjs +2 -4
  51. package/dist/{config-loader-C25b63rJ.mjs → config-loader-B6sJjXTv.mjs} +3 -5
  52. package/dist/config-loader-B6sJjXTv.mjs.map +1 -0
  53. package/dist/config-loader.d.mts +0 -1
  54. package/dist/config-loader.d.mts.map +1 -1
  55. package/dist/config-loader.mjs +2 -3
  56. package/dist/contract-emit-9DBda5Ou.mjs +150 -0
  57. package/dist/contract-emit-9DBda5Ou.mjs.map +1 -0
  58. package/dist/contract-emit-B77TsJqf.mjs +327 -0
  59. package/dist/contract-emit-B77TsJqf.mjs.map +1 -0
  60. package/dist/{contract-enrichment-CAOELa-H.mjs → contract-enrichment-Dani0mMW.mjs} +4 -6
  61. package/dist/contract-enrichment-Dani0mMW.mjs.map +1 -0
  62. package/dist/{contract-infer-D9cC3rJm.mjs → contract-infer-BK9YFGEG.mjs} +13 -22
  63. package/dist/contract-infer-BK9YFGEG.mjs.map +1 -0
  64. package/dist/db-verify-C0y1PCO2.mjs +404 -0
  65. package/dist/db-verify-C0y1PCO2.mjs.map +1 -0
  66. package/dist/exports/config-types.mjs +1 -2
  67. package/dist/exports/control-api.d.mts +101 -586
  68. package/dist/exports/control-api.d.mts.map +1 -1
  69. package/dist/exports/control-api.mjs +4 -6
  70. package/dist/exports/index.d.mts.map +1 -1
  71. package/dist/exports/index.mjs +28 -30
  72. package/dist/exports/index.mjs.map +1 -1
  73. package/dist/exports/init-output.d.mts +2 -4
  74. package/dist/exports/init-output.d.mts.map +1 -1
  75. package/dist/exports/init-output.mjs +2 -3
  76. package/dist/extension-pack-inputs-C7xgE-vv.mjs +74 -0
  77. package/dist/extension-pack-inputs-C7xgE-vv.mjs.map +1 -0
  78. package/dist/{framework-components-Cr--XBKy.mjs → framework-components-ChqVUxR-.mjs} +3 -4
  79. package/dist/{framework-components-Cr--XBKy.mjs.map → framework-components-ChqVUxR-.mjs.map} +1 -1
  80. package/dist/global-flags-Icqpxk23.d.mts +12 -0
  81. package/dist/global-flags-Icqpxk23.d.mts.map +1 -0
  82. package/dist/helpers-eqdN8tH6.mjs +25 -0
  83. package/dist/helpers-eqdN8tH6.mjs.map +1 -0
  84. package/dist/{init-C5220SY9.mjs → init-DETSgw3h.mjs} +40 -49
  85. package/dist/init-DETSgw3h.mjs.map +1 -0
  86. package/dist/{inspect-live-schema-yrHAvG71.mjs → inspect-live-schema-CWYxGKlb.mjs} +10 -11
  87. package/dist/inspect-live-schema-CWYxGKlb.mjs.map +1 -0
  88. package/dist/migration-cli.d.mts +41 -12
  89. package/dist/migration-cli.d.mts.map +1 -1
  90. package/dist/migration-cli.mjs +309 -86
  91. package/dist/migration-cli.mjs.map +1 -1
  92. package/dist/{migration-command-scaffold-B3B09et6.mjs → migration-command-scaffold-B5dORFEv.mjs} +8 -9
  93. package/dist/migration-command-scaffold-B5dORFEv.mjs.map +1 -0
  94. package/dist/migration-plan-C6lVaHsO.mjs +554 -0
  95. package/dist/migration-plan-C6lVaHsO.mjs.map +1 -0
  96. package/dist/{migration-status-DUMiH8_G.mjs → migration-status-CZ-D5k7k.mjs} +272 -65
  97. package/dist/migration-status-CZ-D5k7k.mjs.map +1 -0
  98. package/dist/migrations-D_UJnpuW.mjs +216 -0
  99. package/dist/migrations-D_UJnpuW.mjs.map +1 -0
  100. package/dist/{output-BpcQrnnq.mjs → output-B16Kefzx.mjs} +9 -3
  101. package/dist/output-B16Kefzx.mjs.map +1 -0
  102. package/dist/{progress-adapter-DvQWB1nK.mjs → progress-adapter-DFfvZcYL.mjs} +2 -2
  103. package/dist/{progress-adapter-DvQWB1nK.mjs.map → progress-adapter-DFfvZcYL.mjs.map} +1 -1
  104. package/dist/result-handler-rmPVKIP2.mjs +25 -0
  105. package/dist/result-handler-rmPVKIP2.mjs.map +1 -0
  106. package/dist/rolldown-runtime-twds-ZHy.mjs +14 -0
  107. package/dist/{terminal-ui-C3ZLwQxK.mjs → terminal-ui-C_hFNbAn.mjs} +4 -28
  108. package/dist/terminal-ui-C_hFNbAn.mjs.map +1 -0
  109. package/dist/types-D7x-IFLO.d.mts +858 -0
  110. package/dist/types-D7x-IFLO.d.mts.map +1 -0
  111. package/dist/{verify-Bkycc-Tf.mjs → verify-CiwNWM9N.mjs} +3 -4
  112. package/dist/verify-CiwNWM9N.mjs.map +1 -0
  113. package/package.json +28 -26
  114. package/src/cli.ts +32 -6
  115. package/src/commands/contract-emit.ts +67 -163
  116. package/src/commands/contract-infer.ts +7 -20
  117. package/src/commands/db-init.ts +15 -3
  118. package/src/commands/db-update.ts +9 -4
  119. package/src/commands/db-verify.ts +47 -15
  120. package/src/commands/init/index.ts +1 -1
  121. package/src/commands/init/init.ts +2 -2
  122. package/src/commands/init/templates/code-templates.ts +26 -18
  123. package/src/commands/inspect-live-schema.ts +10 -5
  124. package/src/commands/migration-apply.ts +114 -212
  125. package/src/commands/migration-new.ts +42 -45
  126. package/src/commands/migration-plan.ts +212 -72
  127. package/src/commands/migration-ref.ts +8 -7
  128. package/src/commands/migration-show.ts +60 -41
  129. package/src/commands/migration-status.ts +483 -64
  130. package/src/config-path-validation.ts +0 -1
  131. package/src/control-api/client.ts +85 -5
  132. package/src/control-api/contract-enrichment.ts +6 -4
  133. package/src/control-api/operations/apply-aggregate.ts +290 -0
  134. package/src/control-api/operations/contract-emit.ts +198 -115
  135. package/src/control-api/operations/db-apply-aggregate.ts +397 -0
  136. package/src/control-api/operations/db-init.ts +51 -253
  137. package/src/control-api/operations/db-update.ts +66 -183
  138. package/src/control-api/operations/db-verify.ts +342 -0
  139. package/src/control-api/operations/migration-apply.ts +424 -131
  140. package/src/control-api/types.ts +280 -29
  141. package/src/exports/control-api.ts +15 -3
  142. package/src/load-ts-contract.ts +28 -26
  143. package/src/migration-cli.ts +445 -122
  144. package/src/utils/cli-errors.ts +49 -2
  145. package/src/utils/combine-schema-results.ts +84 -0
  146. package/src/utils/command-helpers.ts +69 -25
  147. package/src/utils/contract-space-aggregate-loader.ts +204 -0
  148. package/src/utils/contract-space-extension-migrations-pass.ts +120 -0
  149. package/src/utils/contract-space-migrate-pass.ts +156 -0
  150. package/src/utils/emit-queue.ts +26 -0
  151. package/src/utils/extension-pack-inputs.ts +170 -0
  152. package/src/utils/formatters/graph-migration-mapper.ts +7 -3
  153. package/src/utils/formatters/migrations.ts +197 -61
  154. package/src/utils/publish-contract-artifact-pair.ts +134 -0
  155. package/dist/cli-errors-BFYgBH3L.d.mts +0 -4
  156. package/dist/cli-errors-Cd79vmTH.mjs +0 -5
  157. package/dist/client-CrsnY58k.mjs +0 -997
  158. package/dist/client-CrsnY58k.mjs.map +0 -1
  159. package/dist/commands/db-verify.mjs.map +0 -1
  160. package/dist/commands/migration-plan.mjs.map +0 -1
  161. package/dist/config-loader-C25b63rJ.mjs.map +0 -1
  162. package/dist/contract-emit--feXyNd7.mjs +0 -4
  163. package/dist/contract-emit-NJ01hiiv.mjs +0 -195
  164. package/dist/contract-emit-NJ01hiiv.mjs.map +0 -1
  165. package/dist/contract-emit-V5SSitUT.mjs +0 -122
  166. package/dist/contract-emit-V5SSitUT.mjs.map +0 -1
  167. package/dist/contract-enrichment-CAOELa-H.mjs.map +0 -1
  168. package/dist/contract-infer-D9cC3rJm.mjs.map +0 -1
  169. package/dist/extract-operation-statements-DsFfxXVZ.mjs +0 -13
  170. package/dist/extract-operation-statements-DsFfxXVZ.mjs.map +0 -1
  171. package/dist/extract-sql-ddl-D9UbZDyz.mjs +0 -26
  172. package/dist/extract-sql-ddl-D9UbZDyz.mjs.map +0 -1
  173. package/dist/init-C5220SY9.mjs.map +0 -1
  174. package/dist/inspect-live-schema-yrHAvG71.mjs.map +0 -1
  175. package/dist/migration-command-scaffold-B3B09et6.mjs.map +0 -1
  176. package/dist/migration-status-DUMiH8_G.mjs.map +0 -1
  177. package/dist/migrations-Bo5WtTla.mjs +0 -153
  178. package/dist/migrations-Bo5WtTla.mjs.map +0 -1
  179. package/dist/output-BpcQrnnq.mjs.map +0 -1
  180. package/dist/result-handler-Ba3zWQsI.mjs.map +0 -1
  181. package/dist/terminal-ui-C3ZLwQxK.mjs.map +0 -1
  182. package/dist/validate-contract-deps-B_Cs29TL.mjs +0 -37
  183. package/dist/validate-contract-deps-B_Cs29TL.mjs.map +0 -1
  184. package/dist/verify-Bkycc-Tf.mjs.map +0 -1
  185. package/src/control-api/operations/extract-operation-statements.ts +0 -14
  186. package/src/control-api/operations/extract-sql-ddl.ts +0 -47
@@ -1,14 +1,26 @@
1
- import type { MigrationPlanOperation } from '@prisma-next/framework-components/control';
2
- import { findLatestMigration, reconstructGraph } from '@prisma-next/migration-tools/dag';
1
+ import type {
2
+ MigrationPlanOperation,
3
+ OperationPreview,
4
+ } from '@prisma-next/framework-components/control';
5
+ import { MigrationToolsError } from '@prisma-next/migration-tools/errors';
3
6
  import { readMigrationPackage, readMigrationsDir } from '@prisma-next/migration-tools/io';
4
- import type { MigrationBundle } from '@prisma-next/migration-tools/types';
5
- import { MigrationToolsError } from '@prisma-next/migration-tools/types';
7
+ import {
8
+ findLatestMigration,
9
+ reconstructGraph,
10
+ } from '@prisma-next/migration-tools/migration-graph';
11
+ import type { OnDiskMigrationPackage } from '@prisma-next/migration-tools/package';
12
+ import { APP_SPACE_ID, spaceMigrationDirectory } from '@prisma-next/migration-tools/spaces';
6
13
  import { notOk, ok, type Result } from '@prisma-next/utils/result';
7
14
  import { Command } from 'commander';
8
15
  import { relative, resolve } from 'pathe';
9
16
  import { loadConfig } from '../config-loader';
10
- import { extractOperationStatements } from '../control-api/operations/extract-operation-statements';
11
- import { type CliStructuredError, errorRuntime, errorUnexpected } from '../utils/cli-errors';
17
+ import { createControlClient } from '../control-api/client';
18
+ import {
19
+ type CliStructuredError,
20
+ errorRuntime,
21
+ errorUnexpected,
22
+ mapMigrationToolsError,
23
+ } from '../utils/cli-errors';
12
24
  import {
13
25
  addGlobalOptions,
14
26
  setCommandDescriptions,
@@ -29,17 +41,22 @@ export interface MigrationShowResult {
29
41
  readonly ok: true;
30
42
  readonly dirName: string;
31
43
  readonly dirPath: string;
32
- readonly from: string;
44
+ readonly from: string | null;
33
45
  readonly to: string;
34
- readonly migrationId: string;
35
- readonly kind: string;
46
+ readonly migrationHash: string;
36
47
  readonly createdAt: string;
37
48
  readonly operations: readonly {
38
49
  readonly id: string;
39
50
  readonly label: string;
40
51
  readonly operationClass: string;
41
52
  }[];
42
- readonly sql: readonly string[];
53
+ /**
54
+ * Family-agnostic textual preview of the migration's operations. Replaces
55
+ * the previous string-array DDL field. Always defined; statements is empty
56
+ * for a no-op migration or a family that does not implement the
57
+ * `OperationPreviewCapable` capability.
58
+ */
59
+ readonly preview: OperationPreview;
43
60
  readonly summary: string;
44
61
  }
45
62
 
@@ -48,11 +65,11 @@ function looksLikePath(target: string): boolean {
48
65
  }
49
66
 
50
67
  export function resolveByHashPrefix(
51
- packages: readonly MigrationBundle[],
68
+ packages: readonly OnDiskMigrationPackage[],
52
69
  prefix: string,
53
- ): Result<MigrationBundle, CliStructuredError> {
70
+ ): Result<OnDiskMigrationPackage, CliStructuredError> {
54
71
  const normalizedPrefix = prefix.startsWith('sha256:') ? prefix : `sha256:${prefix}`;
55
- const matches = packages.filter((p) => p.manifest.migrationId.startsWith(normalizedPrefix));
72
+ const matches = packages.filter((p) => p.metadata.migrationHash.startsWith(normalizedPrefix));
56
73
 
57
74
  if (matches.length === 1) {
58
75
  return ok(matches[0]!);
@@ -61,13 +78,13 @@ export function resolveByHashPrefix(
61
78
  if (matches.length === 0) {
62
79
  return notOk(
63
80
  errorRuntime('No migration found matching prefix', {
64
- why: `No migration has a migrationId starting with "${normalizedPrefix}"`,
81
+ why: `No migration has a migrationHash starting with "${normalizedPrefix}"`,
65
82
  fix: 'Run `prisma-next migration show` (no argument) to see the latest migration, or check the migrations directory for available packages.',
66
83
  }),
67
84
  );
68
85
  }
69
86
 
70
- const candidates = matches.map((p) => ` ${p.dirName} ${p.manifest.migrationId}`).join('\n');
87
+ const candidates = matches.map((p) => ` ${p.dirName} ${p.metadata.migrationHash}`).join('\n');
71
88
  return notOk(
72
89
  errorRuntime('Ambiguous hash prefix', {
73
90
  why: `Multiple migrations match prefix "${normalizedPrefix}":\n${candidates}`,
@@ -87,16 +104,17 @@ async function executeMigrationShowCommand(
87
104
  ? relative(process.cwd(), resolve(options.config))
88
105
  : 'prisma-next.config.ts';
89
106
 
90
- const migrationsDir = resolve(
107
+ const migrationsDirRoot = resolve(
91
108
  options.config ? resolve(options.config, '..') : process.cwd(),
92
109
  config.migrations?.dir ?? 'migrations',
93
110
  );
94
- const migrationsRelative = relative(process.cwd(), migrationsDir);
111
+ const appMigrationsDir = spaceMigrationDirectory(migrationsDirRoot, APP_SPACE_ID);
112
+ const appMigrationsRelative = relative(process.cwd(), appMigrationsDir);
95
113
 
96
114
  if (!flags.json && !flags.quiet) {
97
115
  const details: Array<{ label: string; value: string }> = [
98
116
  { label: 'config', value: configPath },
99
- { label: 'migrations', value: migrationsRelative },
117
+ { label: 'migrations', value: appMigrationsRelative },
100
118
  ];
101
119
  if (target) {
102
120
  details.push({ label: 'target', value: target });
@@ -110,17 +128,17 @@ async function executeMigrationShowCommand(
110
128
  ui.stderr(header);
111
129
  }
112
130
 
113
- let pkg: MigrationBundle;
131
+ let pkg: OnDiskMigrationPackage;
114
132
 
115
133
  try {
116
134
  if (target && looksLikePath(target)) {
117
135
  pkg = await readMigrationPackage(resolve(target));
118
136
  } else {
119
- const allPackages = await readMigrationsDir(migrationsDir);
137
+ const allPackages = await readMigrationsDir(appMigrationsDir);
120
138
  if (allPackages.length === 0) {
121
139
  return notOk(
122
140
  errorRuntime('No migrations found', {
123
- why: `No migration packages found in ${migrationsRelative}`,
141
+ why: `No migration packages found in ${appMigrationsRelative}`,
124
142
  fix: 'Run `prisma-next migration plan` to create a migration first.',
125
143
  }),
126
144
  );
@@ -142,7 +160,7 @@ async function executeMigrationShowCommand(
142
160
  );
143
161
  }
144
162
  const leafPkg = allPackages.find(
145
- (p) => p.manifest.migrationId === latestMigration.migrationId,
163
+ (p) => p.metadata.migrationHash === latestMigration.migrationHash,
146
164
  );
147
165
  if (!leafPkg) {
148
166
  return notOk(
@@ -157,13 +175,7 @@ async function executeMigrationShowCommand(
157
175
  }
158
176
  } catch (error) {
159
177
  if (MigrationToolsError.is(error)) {
160
- return notOk(
161
- errorRuntime(error.message, {
162
- why: error.why,
163
- fix: error.fix,
164
- meta: { code: error.code, ...(error.details ?? {}) },
165
- }),
166
- );
178
+ return notOk(mapMigrationToolsError(error));
167
179
  }
168
180
  return notOk(
169
181
  errorUnexpected(error instanceof Error ? error.message : String(error), {
@@ -173,23 +185,33 @@ async function executeMigrationShowCommand(
173
185
  }
174
186
 
175
187
  const ops = pkg.ops as readonly MigrationPlanOperation[];
176
- const sql = extractOperationStatements(config.family.familyId, ops) ?? [];
188
+
189
+ // `migration show` is an offline command; the control client is constructed
190
+ // purely to dispatch the family-specific `toOperationPreview` capability and
191
+ // is not connected to a database.
192
+ const client = createControlClient({
193
+ family: config.family,
194
+ target: config.target,
195
+ adapter: config.adapter,
196
+ ...(config.driver ? { driver: config.driver } : {}),
197
+ extensionPacks: config.extensionPacks ?? [],
198
+ });
199
+ const preview: OperationPreview = client.toOperationPreview(ops) ?? { statements: [] };
177
200
 
178
201
  const result: MigrationShowResult = {
179
202
  ok: true,
180
203
  dirName: pkg.dirName,
181
204
  dirPath: relative(process.cwd(), pkg.dirPath),
182
- from: pkg.manifest.from,
183
- to: pkg.manifest.to,
184
- migrationId: pkg.manifest.migrationId,
185
- kind: pkg.manifest.kind,
186
- createdAt: pkg.manifest.createdAt,
205
+ from: pkg.metadata.from,
206
+ to: pkg.metadata.to,
207
+ migrationHash: pkg.metadata.migrationHash,
208
+ createdAt: pkg.metadata.createdAt,
187
209
  operations: ops.map((op) => ({
188
210
  id: op.id,
189
211
  label: op.label,
190
212
  operationClass: op.operationClass,
191
213
  })),
192
- sql,
214
+ preview,
193
215
  summary: `${ops.length} operation(s)`,
194
216
  };
195
217
  return ok(result);
@@ -200,7 +222,7 @@ export function createMigrationShowCommand(): Command {
200
222
  setCommandDescriptions(
201
223
  command,
202
224
  'Display migration package contents',
203
- 'Shows the operations, DDL preview, and metadata for a migration package.\n' +
225
+ 'Shows the operations, statement preview, and metadata for a migration package.\n' +
204
226
  'Accepts a directory path, a hash prefix (git-style), or defaults to the\n' +
205
227
  'latest migration.',
206
228
  );
@@ -209,10 +231,7 @@ export function createMigrationShowCommand(): Command {
209
231
  'prisma-next migration show sha256:a1b2c3',
210
232
  ]);
211
233
  addGlobalOptions(command)
212
- .argument(
213
- '[target]',
214
- 'Migration directory path or migrationId hash prefix (defaults to latest)',
215
- )
234
+ .argument('[target]', 'Migration directory path or migrationHash prefix (defaults to latest)')
216
235
  .option('--config <path>', 'Path to prisma-next.config.ts')
217
236
  .action(async (target: string | undefined, options: MigrationShowOptions) => {
218
237
  const flags = parseGlobalFlags(options);