@prisma-next/cli 0.3.0-dev.11 → 0.3.0-dev.114

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 (215) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +470 -134
  3. package/dist/cli-errors-ByGuoqNj.mjs +3 -0
  4. package/dist/cli-errors-D6HxRn3A.d.mts +2 -0
  5. package/dist/cli.d.mts +1 -0
  6. package/dist/cli.js +1 -2350
  7. package/dist/cli.mjs +235 -0
  8. package/dist/cli.mjs.map +1 -0
  9. package/dist/client-612RJJD_.mjs +1069 -0
  10. package/dist/client-612RJJD_.mjs.map +1 -0
  11. package/dist/commands/contract-emit.d.mts +7 -0
  12. package/dist/commands/contract-emit.d.mts.map +1 -0
  13. package/dist/commands/contract-emit.mjs +4 -0
  14. package/dist/commands/contract-infer.d.mts +7 -0
  15. package/dist/commands/contract-infer.d.mts.map +1 -0
  16. package/dist/commands/contract-infer.mjs +4 -0
  17. package/dist/commands/db-init.d.mts +7 -0
  18. package/dist/commands/db-init.d.mts.map +1 -0
  19. package/dist/commands/db-init.mjs +124 -0
  20. package/dist/commands/db-init.mjs.map +1 -0
  21. package/dist/commands/db-schema.d.mts +7 -0
  22. package/dist/commands/db-schema.d.mts.map +1 -0
  23. package/dist/commands/db-schema.mjs +52 -0
  24. package/dist/commands/db-schema.mjs.map +1 -0
  25. package/dist/commands/db-sign.d.mts +7 -0
  26. package/dist/commands/db-sign.d.mts.map +1 -0
  27. package/dist/commands/db-sign.mjs +135 -0
  28. package/dist/commands/db-sign.mjs.map +1 -0
  29. package/dist/commands/db-update.d.mts +7 -0
  30. package/dist/commands/db-update.d.mts.map +1 -0
  31. package/dist/commands/db-update.mjs +121 -0
  32. package/dist/commands/db-update.mjs.map +1 -0
  33. package/dist/commands/db-verify.d.mts +7 -0
  34. package/dist/commands/db-verify.d.mts.map +1 -0
  35. package/dist/commands/db-verify.mjs +310 -0
  36. package/dist/commands/db-verify.mjs.map +1 -0
  37. package/dist/commands/migration-apply.d.mts +36 -0
  38. package/dist/commands/migration-apply.d.mts.map +1 -0
  39. package/dist/commands/migration-apply.mjs +240 -0
  40. package/dist/commands/migration-apply.mjs.map +1 -0
  41. package/dist/commands/migration-plan.d.mts +47 -0
  42. package/dist/commands/migration-plan.d.mts.map +1 -0
  43. package/dist/commands/migration-plan.mjs +288 -0
  44. package/dist/commands/migration-plan.mjs.map +1 -0
  45. package/dist/commands/migration-ref.d.mts +43 -0
  46. package/dist/commands/migration-ref.d.mts.map +1 -0
  47. package/dist/commands/migration-ref.mjs +194 -0
  48. package/dist/commands/migration-ref.mjs.map +1 -0
  49. package/dist/commands/migration-show.d.mts +28 -0
  50. package/dist/commands/migration-show.d.mts.map +1 -0
  51. package/dist/commands/migration-show.mjs +139 -0
  52. package/dist/commands/migration-show.mjs.map +1 -0
  53. package/dist/commands/migration-status.d.mts +85 -0
  54. package/dist/commands/migration-status.d.mts.map +1 -0
  55. package/dist/commands/migration-status.mjs +4 -0
  56. package/dist/commands/migration-verify.d.mts +16 -0
  57. package/dist/commands/migration-verify.d.mts.map +1 -0
  58. package/dist/commands/migration-verify.mjs +87 -0
  59. package/dist/commands/migration-verify.mjs.map +1 -0
  60. package/dist/config-loader-d_KF19Tw.mjs +43 -0
  61. package/dist/config-loader-d_KF19Tw.mjs.map +1 -0
  62. package/dist/{config-loader.d.ts → config-loader.d.mts} +8 -3
  63. package/dist/config-loader.d.mts.map +1 -0
  64. package/dist/config-loader.mjs +3 -0
  65. package/dist/contract-emit-CVv7dbQ9.mjs +187 -0
  66. package/dist/contract-emit-CVv7dbQ9.mjs.map +1 -0
  67. package/dist/contract-infer-Bvw8u8Eu.mjs +83 -0
  68. package/dist/contract-infer-Bvw8u8Eu.mjs.map +1 -0
  69. package/dist/exports/config-types.d.mts +2 -0
  70. package/dist/exports/config-types.mjs +3 -0
  71. package/dist/exports/control-api.d.mts +626 -0
  72. package/dist/exports/control-api.d.mts.map +1 -0
  73. package/dist/exports/control-api.mjs +107 -0
  74. package/dist/exports/control-api.mjs.map +1 -0
  75. package/dist/{load-ts-contract.d.ts → exports/index.d.mts} +10 -5
  76. package/dist/exports/index.d.mts.map +1 -0
  77. package/dist/exports/index.mjs +130 -0
  78. package/dist/exports/index.mjs.map +1 -0
  79. package/dist/extract-sql-ddl-Jf5blEO0.mjs +26 -0
  80. package/dist/extract-sql-ddl-Jf5blEO0.mjs.map +1 -0
  81. package/dist/framework-components-M2j-qPfr.mjs +59 -0
  82. package/dist/framework-components-M2j-qPfr.mjs.map +1 -0
  83. package/dist/inspect-live-schema-BQe5i4YE.mjs +90 -0
  84. package/dist/inspect-live-schema-BQe5i4YE.mjs.map +1 -0
  85. package/dist/migration-command-scaffold-SLrjcKXS.mjs +104 -0
  86. package/dist/migration-command-scaffold-SLrjcKXS.mjs.map +1 -0
  87. package/dist/migration-status-B7OVZ-Ka.mjs +1576 -0
  88. package/dist/migration-status-B7OVZ-Ka.mjs.map +1 -0
  89. package/dist/migrations-Db_ea9eE.mjs +173 -0
  90. package/dist/migrations-Db_ea9eE.mjs.map +1 -0
  91. package/dist/progress-adapter-DRNe2idZ.mjs +43 -0
  92. package/dist/progress-adapter-DRNe2idZ.mjs.map +1 -0
  93. package/dist/terminal-ui-DAcMBRKf.mjs +980 -0
  94. package/dist/terminal-ui-DAcMBRKf.mjs.map +1 -0
  95. package/dist/verify-DXKxBFvU.mjs +385 -0
  96. package/dist/verify-DXKxBFvU.mjs.map +1 -0
  97. package/package.json +88 -43
  98. package/src/cli.ts +109 -58
  99. package/src/commands/contract-emit.ts +236 -143
  100. package/src/commands/contract-infer-paths.ts +32 -0
  101. package/src/commands/contract-infer.ts +131 -0
  102. package/src/commands/db-init.ts +211 -425
  103. package/src/commands/db-schema.ts +77 -0
  104. package/src/commands/db-sign.ts +207 -228
  105. package/src/commands/db-update.ts +236 -0
  106. package/src/commands/db-verify.ts +484 -186
  107. package/src/commands/inspect-live-schema.ts +171 -0
  108. package/src/commands/migration-apply.ts +416 -0
  109. package/src/commands/migration-plan.ts +451 -0
  110. package/src/commands/migration-ref.ts +305 -0
  111. package/src/commands/migration-show.ts +246 -0
  112. package/src/commands/migration-status.ts +838 -0
  113. package/src/commands/migration-verify.ts +134 -0
  114. package/src/config-loader.ts +13 -3
  115. package/src/control-api/client.ts +614 -0
  116. package/src/control-api/contract-enrichment.ts +135 -0
  117. package/src/control-api/errors.ts +9 -0
  118. package/src/control-api/operations/contract-emit.ts +173 -0
  119. package/src/control-api/operations/db-init.ts +286 -0
  120. package/src/control-api/operations/db-update.ts +221 -0
  121. package/src/control-api/operations/extract-sql-ddl.ts +47 -0
  122. package/src/control-api/operations/migration-apply.ts +194 -0
  123. package/src/control-api/operations/migration-helpers.ts +49 -0
  124. package/src/control-api/types.ts +683 -0
  125. package/src/exports/config-types.ts +4 -3
  126. package/src/exports/control-api.ts +56 -0
  127. package/src/load-ts-contract.ts +16 -11
  128. package/src/utils/cli-errors.ts +5 -2
  129. package/src/utils/command-helpers.ts +293 -3
  130. package/src/utils/formatters/emit.ts +67 -0
  131. package/src/utils/formatters/errors.ts +82 -0
  132. package/src/utils/formatters/graph-migration-mapper.ts +220 -0
  133. package/src/utils/formatters/graph-render.ts +1317 -0
  134. package/src/utils/formatters/graph-types.ts +114 -0
  135. package/src/utils/formatters/help.ts +380 -0
  136. package/src/utils/formatters/helpers.ts +28 -0
  137. package/src/utils/formatters/migrations.ts +346 -0
  138. package/src/utils/formatters/styled.ts +212 -0
  139. package/src/utils/formatters/verify.ts +620 -0
  140. package/src/utils/global-flags.ts +41 -23
  141. package/src/utils/migration-command-scaffold.ts +187 -0
  142. package/src/utils/migration-types.ts +12 -0
  143. package/src/utils/progress-adapter.ts +75 -0
  144. package/src/utils/result-handler.ts +12 -13
  145. package/src/utils/shutdown.ts +92 -0
  146. package/src/utils/suggest-command.ts +31 -0
  147. package/src/utils/terminal-ui.ts +276 -0
  148. package/dist/chunk-BZMBKEEQ.js +0 -997
  149. package/dist/chunk-BZMBKEEQ.js.map +0 -1
  150. package/dist/chunk-CVNWLFXO.js +0 -91
  151. package/dist/chunk-CVNWLFXO.js.map +0 -1
  152. package/dist/chunk-HWYQOCAJ.js +0 -47
  153. package/dist/chunk-HWYQOCAJ.js.map +0 -1
  154. package/dist/chunk-QUPBU4KV.js +0 -131
  155. package/dist/chunk-QUPBU4KV.js.map +0 -1
  156. package/dist/cli.d.ts +0 -2
  157. package/dist/cli.d.ts.map +0 -1
  158. package/dist/cli.js.map +0 -1
  159. package/dist/commands/contract-emit.d.ts +0 -3
  160. package/dist/commands/contract-emit.d.ts.map +0 -1
  161. package/dist/commands/contract-emit.js +0 -9
  162. package/dist/commands/contract-emit.js.map +0 -1
  163. package/dist/commands/db-init.d.ts +0 -3
  164. package/dist/commands/db-init.d.ts.map +0 -1
  165. package/dist/commands/db-init.js +0 -337
  166. package/dist/commands/db-init.js.map +0 -1
  167. package/dist/commands/db-introspect.d.ts +0 -3
  168. package/dist/commands/db-introspect.d.ts.map +0 -1
  169. package/dist/commands/db-introspect.js +0 -186
  170. package/dist/commands/db-introspect.js.map +0 -1
  171. package/dist/commands/db-schema-verify.d.ts +0 -3
  172. package/dist/commands/db-schema-verify.d.ts.map +0 -1
  173. package/dist/commands/db-schema-verify.js +0 -160
  174. package/dist/commands/db-schema-verify.js.map +0 -1
  175. package/dist/commands/db-sign.d.ts +0 -3
  176. package/dist/commands/db-sign.d.ts.map +0 -1
  177. package/dist/commands/db-sign.js +0 -195
  178. package/dist/commands/db-sign.js.map +0 -1
  179. package/dist/commands/db-verify.d.ts +0 -3
  180. package/dist/commands/db-verify.d.ts.map +0 -1
  181. package/dist/commands/db-verify.js +0 -169
  182. package/dist/commands/db-verify.js.map +0 -1
  183. package/dist/config-loader.d.ts.map +0 -1
  184. package/dist/config-loader.js +0 -7
  185. package/dist/config-loader.js.map +0 -1
  186. package/dist/exports/config-types.d.ts +0 -3
  187. package/dist/exports/config-types.d.ts.map +0 -1
  188. package/dist/exports/config-types.js +0 -6
  189. package/dist/exports/config-types.js.map +0 -1
  190. package/dist/exports/index.d.ts +0 -4
  191. package/dist/exports/index.d.ts.map +0 -1
  192. package/dist/exports/index.js +0 -175
  193. package/dist/exports/index.js.map +0 -1
  194. package/dist/load-ts-contract.d.ts.map +0 -1
  195. package/dist/utils/action.d.ts +0 -16
  196. package/dist/utils/action.d.ts.map +0 -1
  197. package/dist/utils/cli-errors.d.ts +0 -7
  198. package/dist/utils/cli-errors.d.ts.map +0 -1
  199. package/dist/utils/command-helpers.d.ts +0 -12
  200. package/dist/utils/command-helpers.d.ts.map +0 -1
  201. package/dist/utils/framework-components.d.ts +0 -70
  202. package/dist/utils/framework-components.d.ts.map +0 -1
  203. package/dist/utils/global-flags.d.ts +0 -25
  204. package/dist/utils/global-flags.d.ts.map +0 -1
  205. package/dist/utils/output.d.ts +0 -142
  206. package/dist/utils/output.d.ts.map +0 -1
  207. package/dist/utils/result-handler.d.ts +0 -15
  208. package/dist/utils/result-handler.d.ts.map +0 -1
  209. package/dist/utils/spinner.d.ts +0 -29
  210. package/dist/utils/spinner.d.ts.map +0 -1
  211. package/src/commands/db-introspect.ts +0 -256
  212. package/src/commands/db-schema-verify.ts +0 -232
  213. package/src/utils/action.ts +0 -43
  214. package/src/utils/output.ts +0 -1471
  215. package/src/utils/spinner.ts +0 -67
@@ -0,0 +1,276 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { bold, cyan, dim, green, red, yellow } from 'colorette';
3
+ import { shutdownSignal } from './shutdown';
4
+
5
+ /**
6
+ * Composable CLI output abstraction.
7
+ *
8
+ * Follows the Unix convention of separating data from decoration:
9
+ * - **stdout** — data output only (`ui.output()`). This is what scripts and pipes capture.
10
+ * - **stderr** — all decoration (spinners, logs, notes, intro/outro). Visible in terminal, invisible in pipes.
11
+ *
12
+ * Rules:
13
+ * 1. All methods except `output()` and `error()` write to stderr only in interactive mode.
14
+ * 2. `output(data)` always writes to stdout — if a command calls it, there is data to emit.
15
+ * 3. `error()` always writes to stderr — errors matter even when piped.
16
+ * 4. All other decoration is suppressed when piped — `isInteractive` gates every other decoration method.
17
+ * 5. Never write data to stderr — decoration methods are for human context only.
18
+ * 6. Never write decoration to stdout — it breaks pipes, `$(...)` captures, and `> file` redirects.
19
+ */
20
+ export class TerminalUI {
21
+ /**
22
+ * True when stdout is a TTY (interactive terminal).
23
+ * False when piped (e.g., `prisma-next db verify | jq`).
24
+ */
25
+ readonly isInteractive: boolean;
26
+
27
+ /**
28
+ * Whether color output is enabled.
29
+ */
30
+ readonly useColor: boolean;
31
+
32
+ private static readonly stderrOpts = { output: process.stderr } as const;
33
+
34
+ constructor(options?: {
35
+ readonly color?: boolean | undefined;
36
+ readonly interactive?: boolean | undefined;
37
+ }) {
38
+ // --interactive/--no-interactive override TTY detection
39
+ this.isInteractive = options?.interactive ?? !!process.stdout.isTTY;
40
+ this.useColor = options?.color ?? this.isInteractive;
41
+ }
42
+
43
+ // ---------------------------------------------------------------------------
44
+ // Decoration → stderr (only in interactive mode)
45
+ // ---------------------------------------------------------------------------
46
+
47
+ /**
48
+ * Log a message line to stderr. No-op when piped.
49
+ */
50
+ log(message: string): void {
51
+ if (!this.isInteractive) return;
52
+ clack.log.message(message, TerminalUI.stderrOpts);
53
+ }
54
+
55
+ /**
56
+ * Log a success message to stderr. No-op when piped.
57
+ */
58
+ success(message: string): void {
59
+ if (!this.isInteractive) return;
60
+ clack.log.success(message, TerminalUI.stderrOpts);
61
+ }
62
+
63
+ /**
64
+ * Log a warning message to stderr. No-op when piped.
65
+ */
66
+ warn(message: string): void {
67
+ if (!this.isInteractive) return;
68
+ clack.log.warn(message, TerminalUI.stderrOpts);
69
+ }
70
+
71
+ /**
72
+ * Log an error message to stderr. Always writes (errors matter even in pipes).
73
+ */
74
+ error(message: string): void {
75
+ clack.log.error(message, TerminalUI.stderrOpts);
76
+ }
77
+
78
+ /**
79
+ * Log an info message to stderr. No-op when piped.
80
+ */
81
+ info(message: string): void {
82
+ if (!this.isInteractive) return;
83
+ clack.log.info(message, TerminalUI.stderrOpts);
84
+ }
85
+
86
+ /**
87
+ * Log a step message to stderr. No-op when piped.
88
+ */
89
+ step(message: string): void {
90
+ if (!this.isInteractive) return;
91
+ clack.log.step(message, TerminalUI.stderrOpts);
92
+ }
93
+
94
+ /**
95
+ * Display a note box on stderr. No-op when piped.
96
+ */
97
+ note(message: string, title?: string): void {
98
+ if (!this.isInteractive) return;
99
+ clack.note(message, title, TerminalUI.stderrOpts);
100
+ }
101
+
102
+ /**
103
+ * Display intro banner on stderr. No-op when piped.
104
+ */
105
+ intro(title?: string): void {
106
+ if (!this.isInteractive) return;
107
+ clack.intro(title, TerminalUI.stderrOpts);
108
+ }
109
+
110
+ /**
111
+ * Display outro banner on stderr. No-op when piped.
112
+ */
113
+ outro(message?: string): void {
114
+ if (!this.isInteractive) return;
115
+ clack.outro(message, TerminalUI.stderrOpts);
116
+ }
117
+
118
+ /**
119
+ * Create a Clack spinner on stderr with a 100ms delay threshold.
120
+ * The spinner only appears if the operation takes longer than the threshold,
121
+ * avoiding flicker for fast operations. Returns a no-op spinner when not interactive.
122
+ */
123
+ spinner(delayMs = 100): clack.SpinnerResult {
124
+ const noop: clack.SpinnerResult = {
125
+ start: () => {},
126
+ stop: () => {},
127
+ cancel: () => {},
128
+ error: () => {},
129
+ message: () => {},
130
+ clear: () => {},
131
+ get isCancelled() {
132
+ return false;
133
+ },
134
+ };
135
+
136
+ if (!this.isInteractive) {
137
+ return noop;
138
+ }
139
+
140
+ // Wrap the real spinner with a delay: only show it after `delayMs`
141
+ let inner: clack.SpinnerResult | undefined;
142
+ let timer: ReturnType<typeof setTimeout> | undefined;
143
+ let pendingMsg: string | undefined;
144
+ let settled = false;
145
+
146
+ const ensureCleared = () => {
147
+ if (timer !== undefined) {
148
+ clearTimeout(timer);
149
+ timer = undefined;
150
+ }
151
+ };
152
+
153
+ // Cancel the spinner if a shutdown signal fires
154
+ const onAbort = () => {
155
+ if (!settled) {
156
+ settled = true;
157
+ ensureCleared();
158
+ if (inner) {
159
+ inner.cancel('Interrupted');
160
+ }
161
+ }
162
+ };
163
+ if (!shutdownSignal.aborted) {
164
+ shutdownSignal.addEventListener('abort', onAbort, { once: true });
165
+ }
166
+
167
+ return {
168
+ start(msg?: string) {
169
+ pendingMsg = msg;
170
+ timer = setTimeout(() => {
171
+ if (!settled) {
172
+ inner = clack.spinner(TerminalUI.stderrOpts);
173
+ inner.start(pendingMsg);
174
+ }
175
+ }, delayMs);
176
+ },
177
+ stop(msg?: string) {
178
+ settled = true;
179
+ ensureCleared();
180
+ if (inner) {
181
+ inner.stop(msg);
182
+ }
183
+ },
184
+ cancel(msg?: string) {
185
+ settled = true;
186
+ ensureCleared();
187
+ if (inner) {
188
+ inner.cancel(msg);
189
+ }
190
+ },
191
+ error(msg?: string) {
192
+ settled = true;
193
+ ensureCleared();
194
+ if (inner) {
195
+ inner.error(msg);
196
+ }
197
+ },
198
+ message(msg?: string) {
199
+ pendingMsg = msg;
200
+ if (inner) {
201
+ inner.message(msg);
202
+ }
203
+ },
204
+ clear() {
205
+ settled = true;
206
+ ensureCleared();
207
+ if (inner) {
208
+ inner.clear();
209
+ }
210
+ },
211
+ get isCancelled() {
212
+ return inner?.isCancelled ?? false;
213
+ },
214
+ };
215
+ }
216
+
217
+ /**
218
+ * Prompt for yes/no confirmation on stderr. Returns true if confirmed.
219
+ * In non-interactive mode or when cancelled (Ctrl-C), returns false.
220
+ */
221
+ async confirm(message: string): Promise<boolean> {
222
+ if (!this.isInteractive) return false;
223
+ const result = await clack.confirm({
224
+ message,
225
+ ...TerminalUI.stderrOpts,
226
+ });
227
+ if (clack.isCancel(result)) return false;
228
+ return result;
229
+ }
230
+
231
+ /**
232
+ * Write a raw line to stderr. No-op when piped.
233
+ * Use for decoration that doesn't fit Clack's log format (e.g. styled headers).
234
+ */
235
+ stderr(message: string): void {
236
+ if (!this.isInteractive) return;
237
+ process.stderr.write(`${message}\n`);
238
+ }
239
+
240
+ // ---------------------------------------------------------------------------
241
+ // Data → stdout (only when piped)
242
+ // ---------------------------------------------------------------------------
243
+
244
+ /**
245
+ * Write machine-readable data to stdout.
246
+ * Always writes — if a command calls output(), there is data to emit.
247
+ *
248
+ * This is what scripts and pipes capture: `prisma-next db verify --json | jq .ok`
249
+ */
250
+ output(data: string): void {
251
+ process.stdout.write(`${data}\n`);
252
+ }
253
+
254
+ // ---------------------------------------------------------------------------
255
+ // Color helpers
256
+ // ---------------------------------------------------------------------------
257
+
258
+ green(text: string): string {
259
+ return this.useColor ? green(text) : text;
260
+ }
261
+ red(text: string): string {
262
+ return this.useColor ? red(text) : text;
263
+ }
264
+ cyan(text: string): string {
265
+ return this.useColor ? cyan(text) : text;
266
+ }
267
+ dim(text: string): string {
268
+ return this.useColor ? dim(text) : text;
269
+ }
270
+ bold(text: string): string {
271
+ return this.useColor ? bold(text) : text;
272
+ }
273
+ yellow(text: string): string {
274
+ return this.useColor ? yellow(text) : text;
275
+ }
276
+ }