@prisma-next/cli 0.10.0-dev.9 → 0.11.0

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 (145) hide show
  1. package/README.md +1 -1
  2. package/dist/{cli-errors-CF60g2cG.mjs → cli-errors-Djtz98Vm.mjs} +3 -3
  3. package/dist/cli-errors-Djtz98Vm.mjs.map +1 -0
  4. package/dist/cli.mjs +46 -51
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/{client-Brv4qlfB.mjs → client-oXO2WCPD.mjs} +6 -5
  7. package/dist/client-oXO2WCPD.mjs.map +1 -0
  8. package/dist/{command-helpers-Dvgul7UA.mjs → command-helpers-BSb0tRC8.mjs} +103 -9
  9. package/dist/command-helpers-BSb0tRC8.mjs.map +1 -0
  10. package/dist/commands/contract-emit.mjs +1 -1
  11. package/dist/commands/contract-infer.mjs +1 -1
  12. package/dist/commands/db-init.d.mts.map +1 -1
  13. package/dist/commands/db-init.mjs +19 -20
  14. package/dist/commands/db-init.mjs.map +1 -1
  15. package/dist/commands/db-schema.mjs +6 -10
  16. package/dist/commands/db-schema.mjs.map +1 -1
  17. package/dist/commands/db-sign.mjs +7 -11
  18. package/dist/commands/db-sign.mjs.map +1 -1
  19. package/dist/commands/db-update.d.mts.map +1 -1
  20. package/dist/commands/db-update.mjs +16 -17
  21. package/dist/commands/db-update.mjs.map +1 -1
  22. package/dist/commands/db-verify.mjs +1 -1
  23. package/dist/commands/migrate.d.mts +1 -1
  24. package/dist/commands/migrate.mjs +7 -11
  25. package/dist/commands/migrate.mjs.map +1 -1
  26. package/dist/commands/migration-check.mjs +4 -7
  27. package/dist/commands/migration-check.mjs.map +1 -1
  28. package/dist/commands/migration-graph.d.mts +1 -1
  29. package/dist/commands/migration-graph.mjs +6 -10
  30. package/dist/commands/migration-graph.mjs.map +1 -1
  31. package/dist/commands/migration-list.mjs +5 -9
  32. package/dist/commands/migration-list.mjs.map +1 -1
  33. package/dist/commands/migration-log.d.mts.map +1 -1
  34. package/dist/commands/migration-log.mjs +7 -10
  35. package/dist/commands/migration-log.mjs.map +1 -1
  36. package/dist/commands/migration-new.mjs +6 -10
  37. package/dist/commands/migration-new.mjs.map +1 -1
  38. package/dist/commands/migration-plan.d.mts +1 -1
  39. package/dist/commands/migration-plan.mjs +1 -1
  40. package/dist/commands/migration-show.d.mts +1 -1
  41. package/dist/commands/migration-show.mjs +8 -12
  42. package/dist/commands/migration-show.mjs.map +1 -1
  43. package/dist/commands/migration-status.d.mts +1 -1
  44. package/dist/commands/migration-status.d.mts.map +1 -1
  45. package/dist/commands/migration-status.mjs +36 -14
  46. package/dist/commands/migration-status.mjs.map +1 -1
  47. package/dist/commands/ref.d.mts +1 -1
  48. package/dist/commands/ref.mjs +9 -19
  49. package/dist/commands/ref.mjs.map +1 -1
  50. package/dist/{contract-emit-iynA3BCA.mjs → contract-emit-bcrpT-wD.mjs} +3 -3
  51. package/dist/{contract-emit-iynA3BCA.mjs.map → contract-emit-bcrpT-wD.mjs.map} +1 -1
  52. package/dist/{contract-emit-BDBzHlaC.mjs → contract-emit-r4y8Zhf1.mjs} +7 -12
  53. package/dist/contract-emit-r4y8Zhf1.mjs.map +1 -0
  54. package/dist/{contract-infer-Dm8pBZMR.mjs → contract-infer-BmySmqVT.mjs} +8 -13
  55. package/dist/contract-infer-BmySmqVT.mjs.map +1 -0
  56. package/dist/{contract-space-aggregate-loader-pAc8CDfY.mjs → contract-space-aggregate-loader-BmNQwlws.mjs} +2 -2
  57. package/dist/{contract-space-aggregate-loader-pAc8CDfY.mjs.map → contract-space-aggregate-loader-BmNQwlws.mjs.map} +1 -1
  58. package/dist/{db-verify-CW8DR5Ei.mjs → db-verify-BClPs3ph.mjs} +9 -13
  59. package/dist/db-verify-BClPs3ph.mjs.map +1 -0
  60. package/dist/exports/control-api.d.mts +1 -1
  61. package/dist/exports/control-api.mjs +2 -2
  62. package/dist/exports/index.mjs +1 -1
  63. package/dist/exports/init-output.mjs +1 -1
  64. package/dist/{framework-components-xFLFpZUO.mjs → framework-components-65gOHkHB.mjs} +2 -2
  65. package/dist/{framework-components-xFLFpZUO.mjs.map → framework-components-65gOHkHB.mjs.map} +1 -1
  66. package/dist/{global-flags-DGmw6Kqg.d.mts → global-flags-CdE7M0d9.d.mts} +4 -1
  67. package/dist/global-flags-CdE7M0d9.d.mts.map +1 -0
  68. package/dist/{graph-render-eJDcLWny.mjs → graph-render-DJVv0_uf.mjs} +1 -1
  69. package/dist/{graph-render-eJDcLWny.mjs.map → graph-render-DJVv0_uf.mjs.map} +1 -1
  70. package/dist/{init-CxS9eqbQ.mjs → init-BCJZPWE1.mjs} +141 -55
  71. package/dist/init-BCJZPWE1.mjs.map +1 -0
  72. package/dist/{inspect-live-schema-iETRZ_59.mjs → inspect-live-schema-DSRbFoOL.mjs} +4 -4
  73. package/dist/{inspect-live-schema-iETRZ_59.mjs.map → inspect-live-schema-DSRbFoOL.mjs.map} +1 -1
  74. package/dist/{migration-command-scaffold-BlgVj_Pn.mjs → migration-command-scaffold-Bzd9La5c.mjs} +4 -4
  75. package/dist/{migration-command-scaffold-BlgVj_Pn.mjs.map → migration-command-scaffold-Bzd9La5c.mjs.map} +1 -1
  76. package/dist/{migration-plan-BSzcWsvm.mjs → migration-plan-CFwqw3Gk.mjs} +8 -12
  77. package/dist/migration-plan-CFwqw3Gk.mjs.map +1 -0
  78. package/dist/{migration-types-D2FW63pr.d.mts → migration-types-BXWvz12q.d.mts} +1 -1
  79. package/dist/{migration-types-D2FW63pr.d.mts.map → migration-types-BXWvz12q.d.mts.map} +1 -1
  80. package/dist/{migrations-CgANWI0w.mjs → migrations-CwZMa1Ck.mjs} +2 -2
  81. package/dist/{migrations-CgANWI0w.mjs.map → migrations-CwZMa1Ck.mjs.map} +1 -1
  82. package/dist/{output-B60Gw5fu.mjs → output-BlsrGMEF.mjs} +1 -1
  83. package/dist/{output-B60Gw5fu.mjs.map → output-BlsrGMEF.mjs.map} +1 -1
  84. package/dist/readme-mongo.md +35 -0
  85. package/dist/readme-postgres.md +34 -0
  86. package/dist/{terminal-ui-XtOQsqe9.mjs → terminal-ui-BiB_8KNo.mjs} +131 -24
  87. package/dist/terminal-ui-BiB_8KNo.mjs.map +1 -0
  88. package/dist/{types-0aS865QN.d.mts → types--CqjMdk0.d.mts} +2 -2
  89. package/dist/{types-0aS865QN.d.mts.map → types--CqjMdk0.d.mts.map} +1 -1
  90. package/dist/{verify-nlzO0uIY.mjs → verify-Bom75OYI.mjs} +2 -2
  91. package/dist/{verify-nlzO0uIY.mjs.map → verify-Bom75OYI.mjs.map} +1 -1
  92. package/package.json +18 -18
  93. package/src/cli.ts +36 -9
  94. package/src/commands/contract-emit.ts +4 -4
  95. package/src/commands/contract-infer.ts +6 -6
  96. package/src/commands/db-init.ts +13 -5
  97. package/src/commands/db-schema.ts +4 -4
  98. package/src/commands/db-sign.ts +4 -4
  99. package/src/commands/db-update.ts +13 -5
  100. package/src/commands/db-verify.ts +5 -5
  101. package/src/commands/init/detect-package-manager.ts +15 -0
  102. package/src/commands/init/errors.ts +31 -0
  103. package/src/commands/init/index.ts +2 -2
  104. package/src/commands/init/init.ts +33 -17
  105. package/src/commands/init/inputs.ts +6 -4
  106. package/src/commands/init/output.ts +1 -1
  107. package/src/commands/init/skill-install.ts +37 -26
  108. package/src/commands/init/templates/code-templates.ts +4 -12
  109. package/src/commands/init/templates/env.ts +8 -1
  110. package/src/commands/init/templates/readme-mongo.md +35 -0
  111. package/src/commands/init/templates/readme-postgres.md +34 -0
  112. package/src/commands/init/templates/readme.ts +62 -0
  113. package/src/commands/migrate.ts +4 -7
  114. package/src/commands/migration-check.ts +4 -4
  115. package/src/commands/migration-graph.ts +4 -4
  116. package/src/commands/migration-list.ts +4 -4
  117. package/src/commands/migration-log.ts +6 -5
  118. package/src/commands/migration-new.ts +4 -4
  119. package/src/commands/migration-plan.ts +4 -4
  120. package/src/commands/migration-show.ts +4 -4
  121. package/src/commands/migration-status.ts +49 -6
  122. package/src/commands/ref.ts +8 -8
  123. package/src/control-api/operations/apply-aggregate.ts +1 -0
  124. package/src/utils/cli-errors.ts +4 -0
  125. package/src/utils/command-helpers.ts +6 -2
  126. package/src/utils/global-flags.ts +102 -17
  127. package/src/utils/telemetry.ts +27 -52
  128. package/src/utils/terminal-ui.ts +44 -23
  129. package/dist/cli-errors-CF60g2cG.mjs.map +0 -1
  130. package/dist/client-Brv4qlfB.mjs.map +0 -1
  131. package/dist/command-helpers-Dvgul7UA.mjs.map +0 -1
  132. package/dist/contract-emit-BDBzHlaC.mjs.map +0 -1
  133. package/dist/contract-infer-Dm8pBZMR.mjs.map +0 -1
  134. package/dist/db-verify-CW8DR5Ei.mjs.map +0 -1
  135. package/dist/errors-BYAXmyRJ.mjs +0 -56
  136. package/dist/errors-BYAXmyRJ.mjs.map +0 -1
  137. package/dist/global-flags-DGmw6Kqg.d.mts.map +0 -1
  138. package/dist/init-CxS9eqbQ.mjs.map +0 -1
  139. package/dist/is-ci-YyvQBBke.mjs +0 -44
  140. package/dist/is-ci-YyvQBBke.mjs.map +0 -1
  141. package/dist/migration-plan-BSzcWsvm.mjs.map +0 -1
  142. package/dist/result-handler-CG3vVoKf.mjs +0 -25
  143. package/dist/result-handler-CG3vVoKf.mjs.map +0 -1
  144. package/dist/terminal-ui-XtOQsqe9.mjs.map +0 -1
  145. /package/dist/{cli-errors-DdcjVLJV.d.mts → cli-errors-Czmx92Zy.d.mts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-ui-BiB_8KNo.mjs","names":["isCI","ciInfoIsCI"],"sources":["../src/utils/formatters/helpers.ts","../src/utils/is-ci.ts","../src/utils/formatters/errors.ts","../src/utils/shutdown.ts","../src/utils/terminal-ui.ts"],"sourcesContent":["import { dim } from 'colorette';\n\nimport type { GlobalFlags } from '../global-flags';\n\n/**\n * Checks if verbose output is enabled at the specified level.\n */\nexport function isVerbose(flags: GlobalFlags, level: 1 | 2): boolean {\n return (flags.verbose ?? 0) >= level;\n}\n\n/**\n * Creates a color-aware formatter function.\n * Returns a function that applies the color only if colors are enabled.\n */\nexport function createColorFormatter<T extends (text: string) => string>(\n useColor: boolean,\n colorFn: T,\n): (text: string) => string {\n return useColor ? colorFn : (text: string) => text;\n}\n\n/**\n * Formats text with dim styling if colors are enabled.\n */\nexport function formatDim(useColor: boolean, text: string): string {\n return useColor ? dim(text) : text;\n}\n","import { isCI as ciInfoIsCI } from 'ci-info';\n\n/**\n * Returns true when the process is running in any CI environment recognised\n * by the `ci-info` package. The single source of truth for CI detection\n * across this CLI — colour-output suppression and telemetry-skip both call\n * this helper, so neither path drifts from the other when a new CI provider\n * is added upstream.\n *\n * `ci-info` checks the standard `CI=true` marker plus dozens of\n * provider-specific environment variables (Buildkite, Jenkins, Drone,\n * Bitbucket Pipelines, Azure Pipelines, AWS CodeBuild, …) that the raw\n * `process.env.CI` read misses.\n *\n */\nexport function isCI(): boolean {\n return ciInfoIsCI;\n}\n","import { red } from 'colorette';\n\nimport type { CliErrorConflict, CliErrorEnvelope } from '../cli-errors';\nimport type { GlobalFlags } from '../global-flags';\nimport { createColorFormatter, formatDim, isVerbose } from './helpers';\n\n/**\n * Formats error output for human-readable display.\n */\nexport function formatErrorOutput(error: CliErrorEnvelope, flags: GlobalFlags): string {\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatRed = createColorFormatter(useColor, red);\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n lines.push(`${formatRed('✖')} ${error.summary} (${error.code})`);\n\n if (error.why) {\n lines.push(`${formatDimText(` Why: ${error.why}`)}`);\n }\n if (error.fix) {\n lines.push(`${formatDimText(` Fix: ${error.fix}`)}`);\n }\n if (error.where?.path) {\n const whereLine = error.where.line\n ? `${error.where.path}:${error.where.line}`\n : error.where.path;\n lines.push(`${formatDimText(` Where: ${whereLine}`)}`);\n }\n // Show conflicts list if present (always show a short list; show full list when verbose)\n if (error.meta?.['conflicts']) {\n const conflicts = error.meta['conflicts'] as readonly CliErrorConflict[];\n if (conflicts.length > 0) {\n const maxToShow = isVerbose(flags, 1) ? conflicts.length : Math.min(3, conflicts.length);\n const header = isVerbose(flags, 1)\n ? ' Conflicts:'\n : ` Conflicts (showing ${maxToShow} of ${conflicts.length}):`;\n lines.push(`${formatDimText(header)}`);\n for (const conflict of conflicts.slice(0, maxToShow)) {\n lines.push(`${formatDimText(` - [${conflict.kind}] ${conflict.summary}`)}`);\n }\n if (!isVerbose(flags, 1) && conflicts.length > maxToShow) {\n lines.push(`${formatDimText(' Re-run with -v/--verbose to see all conflicts')}`);\n }\n }\n }\n // Show issues list if present (always show a short list; show full list when verbose)\n if (error.meta?.['issues']) {\n const issues = error.meta['issues'] as readonly { kind?: string; message?: string }[];\n if (issues.length > 0) {\n const maxToShow = isVerbose(flags, 1) ? issues.length : Math.min(3, issues.length);\n const header = isVerbose(flags, 1)\n ? ' Issues:'\n : ` Issues (showing ${maxToShow} of ${issues.length}):`;\n lines.push(`${formatDimText(header)}`);\n for (const issue of issues.slice(0, maxToShow)) {\n const kind = issue.kind ?? 'issue';\n const message = issue.message ?? '';\n lines.push(`${formatDimText(` - [${kind}] ${message}`)}`);\n }\n if (!isVerbose(flags, 1) && issues.length > maxToShow) {\n lines.push(`${formatDimText(' Re-run with -v/--verbose to see all issues')}`);\n }\n }\n }\n if (error.docsUrl && isVerbose(flags, 1)) {\n lines.push(formatDimText(error.docsUrl));\n }\n if (isVerbose(flags, 2) && error.meta) {\n lines.push(`${formatDimText(` Meta: ${JSON.stringify(error.meta, null, 2)}`)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats error output as JSON.\n */\nexport function formatErrorJson(error: CliErrorEnvelope): string {\n return JSON.stringify(error, null, 2);\n}\n","/**\n * Global shutdown controller for graceful SIGINT/SIGTERM handling.\n *\n * The CLI installs signal handlers once at startup. When a signal fires:\n * 1. The AbortController is aborted — in-flight async work (DB queries, emit) can check `signal.aborted`.\n * 2. A 3-second grace timer starts — gives `finally` blocks time to close connections.\n * 3. If the process hasn't exited by then, force-exit with code 130 (128 + SIGINT).\n * 4. A second signal during the grace period force-exits immediately.\n */\n\n/**\n * Creates a shutdown handler with its own AbortController.\n * Exposed for testing — production code uses the singleton below.\n */\nexport interface ShutdownHandler {\n readonly signal: AbortSignal;\n readonly isShuttingDown: () => boolean;\n readonly onSignal: () => void;\n readonly clearGraceTimer: () => void;\n}\n\nexport function createShutdownHandler(options?: {\n readonly exit?: (code: number) => void;\n readonly gracePeriodMs?: number;\n}): ShutdownHandler {\n const exit = options?.exit ?? ((code: number) => process.exit(code));\n const gracePeriodMs = options?.gracePeriodMs ?? 3000;\n\n const controller = new AbortController();\n let shuttingDown = false;\n let graceTimer: ReturnType<typeof setTimeout> | undefined;\n\n const onSignal = () => {\n if (shuttingDown) {\n // Second signal — force exit\n exit(130);\n return;\n }\n shuttingDown = true;\n controller.abort();\n\n // Give finally blocks time to clean up, then force-exit\n graceTimer = setTimeout(() => exit(130), gracePeriodMs);\n graceTimer.unref();\n };\n\n return {\n signal: controller.signal,\n isShuttingDown: () => shuttingDown,\n onSignal,\n clearGraceTimer: () => {\n if (graceTimer !== undefined) {\n clearTimeout(graceTimer);\n graceTimer = undefined;\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Singleton for production use\n// ---------------------------------------------------------------------------\n\nconst globalHandler = createShutdownHandler();\n\n/**\n * The global AbortSignal. Pass this to any async operation that should\n * be cancellable on Ctrl+C (e.g., DB queries, long-running emit).\n */\nexport const shutdownSignal: AbortSignal = globalHandler.signal;\n\n/**\n * Whether a shutdown has been initiated.\n */\nexport function isShuttingDown(): boolean {\n return globalHandler.isShuttingDown();\n}\n\n/**\n * Installs SIGINT and SIGTERM handlers. Call once at CLI startup.\n *\n * - First signal: aborts the controller, starts a 3s grace timer.\n * - Second signal: force-exits immediately.\n */\nlet installed = false;\n\nexport function installShutdownHandlers(): void {\n if (installed) return;\n installed = true;\n process.on('SIGINT', globalHandler.onSignal);\n process.on('SIGTERM', globalHandler.onSignal);\n}\n","import * as clack from '@clack/prompts';\nimport { bold, cyan, dim, green, red, yellow } from 'colorette';\nimport type { GlobalFlags } from './global-flags';\nimport { shutdownSignal } from './shutdown';\n\n/**\n * Composable CLI output abstraction.\n *\n * Follows the Unix convention of separating data from decoration:\n * - **stdout** — data output only (`ui.output()`). This is what scripts and pipes capture.\n * - **stderr** — all decoration (spinners, logs, notes, intro/outro). Visible in terminal, invisible in pipes.\n *\n * Rules:\n * 1. All methods except `output()` and `error()` write to stderr only in interactive mode.\n * 2. `output(data)` always writes to stdout — if a command calls it, there is data to emit.\n * 3. `error()` always writes to stderr — errors matter even when piped.\n * 4. Decoration is suppressed when piped unless `--format pretty` was explicit (`forcePretty`).\n * 5. Never write data to stderr — decoration methods are for human context only.\n * 6. Never write decoration to stdout — it breaks pipes, `$(...)` captures, and `> file` redirects.\n */\nexport class TerminalUI {\n /**\n * True when stdout is a TTY (interactive terminal).\n * False when piped (e.g., `prisma-next db verify | jq`).\n */\n readonly isInteractive: boolean;\n\n /**\n * Whether color output is enabled.\n */\n readonly useColor: boolean;\n\n /**\n * When true, decoration methods write even on non-TTY stdout\n * (explicit `--format pretty`).\n */\n readonly forcePretty: boolean;\n\n private static readonly stderrOpts = { output: process.stderr } as const;\n\n constructor(options?: {\n readonly color?: boolean | undefined;\n readonly interactive?: boolean | undefined;\n readonly forcePretty?: boolean | undefined;\n }) {\n // --interactive/--no-interactive override TTY detection\n this.isInteractive = options?.interactive ?? !!process.stdout.isTTY;\n this.forcePretty = options?.forcePretty ?? false;\n this.useColor = options?.color ?? (this.isInteractive || this.forcePretty);\n }\n\n private get shouldDecorate(): boolean {\n return this.isInteractive || this.forcePretty;\n }\n\n // ---------------------------------------------------------------------------\n // Decoration → stderr (interactive mode, or explicit --format pretty)\n // ---------------------------------------------------------------------------\n\n /**\n * Log a message line to stderr. No-op when piped unless forcePretty.\n */\n log(message: string): void {\n if (!this.shouldDecorate) return;\n clack.log.message(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Log a success message to stderr. No-op when piped unless forcePretty.\n */\n success(message: string): void {\n if (!this.shouldDecorate) return;\n clack.log.success(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Log a warning message to stderr. No-op when piped unless forcePretty.\n */\n warn(message: string): void {\n if (!this.shouldDecorate) return;\n clack.log.warn(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Log an error message to stderr. Always writes (errors matter even in pipes).\n */\n error(message: string): void {\n clack.log.error(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Log an info message to stderr. No-op when piped unless forcePretty.\n */\n info(message: string): void {\n if (!this.shouldDecorate) return;\n clack.log.info(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Log a step message to stderr. No-op when piped unless forcePretty.\n */\n step(message: string): void {\n if (!this.shouldDecorate) return;\n clack.log.step(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Display a note box on stderr. No-op when piped unless forcePretty.\n */\n note(message: string, title?: string): void {\n if (!this.shouldDecorate) return;\n clack.note(message, title, TerminalUI.stderrOpts);\n }\n\n /**\n * Display intro banner on stderr. No-op when piped unless forcePretty.\n */\n intro(title?: string): void {\n if (!this.shouldDecorate) return;\n clack.intro(title, TerminalUI.stderrOpts);\n }\n\n /**\n * Display outro banner on stderr. No-op when piped unless forcePretty.\n */\n outro(message?: string): void {\n if (!this.shouldDecorate) return;\n clack.outro(message, TerminalUI.stderrOpts);\n }\n\n /**\n * Create a Clack spinner on stderr with a 100ms delay threshold.\n * The spinner only appears if the operation takes longer than the threshold,\n * avoiding flicker for fast operations. Returns a no-op spinner when not decorating.\n */\n spinner(delayMs = 100): clack.SpinnerResult {\n const noop: clack.SpinnerResult = {\n start: () => {},\n stop: () => {},\n cancel: () => {},\n error: () => {},\n message: () => {},\n clear: () => {},\n get isCancelled() {\n return false;\n },\n };\n\n if (!this.shouldDecorate) {\n return noop;\n }\n\n // Wrap the real spinner with a delay: only show it after `delayMs`\n let inner: clack.SpinnerResult | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let pendingMsg: string | undefined;\n let settled = false;\n\n const ensureCleared = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n\n // Cancel the spinner if a shutdown signal fires\n const onAbort = () => {\n if (!settled) {\n settled = true;\n ensureCleared();\n if (inner) {\n inner.cancel('Interrupted');\n }\n }\n };\n if (!shutdownSignal.aborted) {\n shutdownSignal.addEventListener('abort', onAbort, { once: true });\n }\n\n return {\n start(msg?: string) {\n pendingMsg = msg;\n timer = setTimeout(() => {\n if (!settled) {\n inner = clack.spinner(TerminalUI.stderrOpts);\n inner.start(pendingMsg);\n }\n }, delayMs);\n },\n stop(msg?: string) {\n settled = true;\n ensureCleared();\n if (inner) {\n inner.stop(msg);\n }\n },\n cancel(msg?: string) {\n settled = true;\n ensureCleared();\n if (inner) {\n inner.cancel(msg);\n }\n },\n error(msg?: string) {\n settled = true;\n ensureCleared();\n if (inner) {\n inner.error(msg);\n }\n },\n message(msg?: string) {\n pendingMsg = msg;\n if (inner) {\n inner.message(msg);\n }\n },\n clear() {\n settled = true;\n ensureCleared();\n if (inner) {\n inner.clear();\n }\n },\n get isCancelled() {\n return inner?.isCancelled ?? false;\n },\n };\n }\n\n /**\n * Prompt for yes/no confirmation on stderr. Returns true if confirmed.\n * In non-interactive mode or when cancelled (Ctrl-C), returns false.\n */\n async confirm(message: string): Promise<boolean> {\n if (!this.isInteractive) return false;\n const result = await clack.confirm({\n message,\n ...TerminalUI.stderrOpts,\n });\n if (clack.isCancel(result)) return false;\n return result;\n }\n\n /**\n * Write a raw line to stderr. No-op when piped unless forcePretty.\n * Use for decoration that doesn't fit Clack's log format (e.g. styled headers).\n */\n stderr(message: string): void {\n if (!this.shouldDecorate) return;\n process.stderr.write(`${message}\\n`);\n }\n\n // ---------------------------------------------------------------------------\n // Data → stdout (only when piped)\n // ---------------------------------------------------------------------------\n\n /**\n * Write machine-readable data to stdout.\n * Always writes — if a command calls output(), there is data to emit.\n *\n * This is what scripts and pipes capture: `prisma-next db verify --json | jq .ok`\n */\n output(data: string): void {\n process.stdout.write(`${data}\\n`);\n }\n\n // ---------------------------------------------------------------------------\n // Color helpers\n // ---------------------------------------------------------------------------\n\n green(text: string): string {\n return this.useColor ? green(text) : text;\n }\n red(text: string): string {\n return this.useColor ? red(text) : text;\n }\n cyan(text: string): string {\n return this.useColor ? cyan(text) : text;\n }\n dim(text: string): string {\n return this.useColor ? dim(text) : text;\n }\n bold(text: string): string {\n return this.useColor ? bold(text) : text;\n }\n yellow(text: string): string {\n return this.useColor ? yellow(text) : text;\n }\n}\n\nexport function createTerminalUI(flags: GlobalFlags): TerminalUI {\n return new TerminalUI({\n color: flags.color,\n interactive: flags.interactive,\n forcePretty: flags.format === 'pretty' && flags.explicitFormat,\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as CliStructuredError } from "./cli-errors-DdcjVLJV.mjs";
1
+ import { t as CliStructuredError } from "./cli-errors-Czmx92Zy.mjs";
2
2
  import { Result } from "@prisma-next/utils/result";
3
3
  import { ContractSourceDiagnostics, ContractSourceProvider } from "@prisma-next/config/config-types";
4
4
  import { ControlAdapterDescriptor, ControlDriverDescriptor, ControlDriverInstance, ControlExtensionDescriptor, ControlFamilyDescriptor, ControlFamilyInstance, ControlTargetDescriptor, CoreSchemaView, MigrationPlanOperation, MigrationPlannerConflict, OperationPreview, SignDatabaseResult, VerifyDatabaseResult, VerifyDatabaseSchemaResult } from "@prisma-next/framework-components/control";
@@ -859,4 +859,4 @@ interface ControlClient {
859
859
  }
860
860
  //#endregion
861
861
  export { ExecuteDbVerifyOptions as A, EmitSuccess as C, SchemaVerifyOptions as D, OnControlProgress as E, executeDbVerify as M, SignOptions as O, EmitResult as S, MigrationApplyPathDecision as T, DbUpdateSuccess as _, ControlClient as a, EmitFailureCode as b, DbInitFailure as c, DbInitResult as d, DbInitSuccess as f, DbUpdateResult as g, DbUpdateOptions as h, ControlActionName as i, ExecuteDbVerifyResult as j, VerifyOptions as k, DbInitFailureCode as l, DbUpdateFailureCode as m, ContractEmitOptions as n, ControlClientOptions as o, DbUpdateFailure as p, ContractEmitResult as r, ControlProgressEvent as s, AggregatePerSpaceExecutionEntry as t, DbInitOptions as u, EmitContractConfig as v, IntrospectOptions as w, EmitOptions as x, EmitFailure as y };
862
- //# sourceMappingURL=types-0aS865QN.d.mts.map
862
+ //# sourceMappingURL=types--CqjMdk0.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types-0aS865QN.d.mts","names":[],"sources":["../src/control-api/operations/db-verify.ts","../src/control-api/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types--CqjMdk0.d.mts","names":[],"sources":["../src/control-api/operations/db-verify.ts","../src/control-api/types.ts"],"mappings":";;;;;;;;;;;;;;AAwCA;;;;;UAAiB,sBAAA;EAAA,SACN,MAAA,EAAQ,qBAAA,CAAsB,SAAA,EAAW,SAAA;EAAA,SACzC,cAAA,EAAgB,qBAAA,CAAsB,SAAA;EAAA,SACtC,QAAA,EAAU,QAAA;EAAA,SACV,aAAA;EAAA,SACA,QAAA,EAAU,SAAA;EAAA,SACV,cAAA,EAAgB,aAAA,CAAc,0BAAA,CAA2B,SAAA,EAAW,SAAA;EAAA,SACpE,mBAAA,EAAqB,aAAA,CAAc,8BAAA,CAA+B,SAAA,EAAW,SAAA;EAAA,SAC7E,IAAA;EAAA,SACA,UAAA;EAAA,SACA,UAAA;EAAA,SACA,UAAA,GAAa,iBAAA;AAAA;;;;;;;;;;;;;UAeP,sBAAA;EAAA,SACN,aAAA,EAAe,WAAA,SAAoB,0BAAA;EAAA,SACnC,WAAA;EAAA,SACA,UAAA;AAAA;AAAA,KAGC,qBAAA,GAAwB,MAAA,CAAO,sBAAA,EAAwB,kBAAA;;;;;;;;;;;;;;;;;iBAkB7C,eAAA,oDAAA,CACpB,OAAA,EAAS,sBAAA,CAAuB,SAAA,EAAW,SAAA,IAC1C,OAAA,CAAQ,qBAAA;;;;;;AApDX;;;;;;;;UCDiB,oBAAA;EAAA,SAEN,MAAA,EAAQ,uBAAA;EAAA,SAER,MAAA,EAAQ,uBAAA;EAAA,SAER,OAAA,EAAS,wBAAA;EDCqB;EAAA,SCE9B,MAAA,GAAS,uBAAA;EAAA,SAET,cAAA,GAAiB,aAAA,CAAc,0BAAA;EDH8C;;;;;EAAA,SCS7E,UAAA;AAAA;;;;KAUC,iBAAA;;;;;;;;;;;;;;KAwBA,oBAAA;EAAA,SAEG,MAAA,EAAQ,iBAAA;EAAA,SACR,IAAA;EAAA,SACA,MAAA;EAAA,SACA,YAAA;EAAA,SACA,KAAA;AAAA;EAAA,SAGA,MAAA,EAAQ,iBAAA;EAAA,SACR,IAAA;EAAA,SACA,MAAA;EAAA,SACA,OAAA;AAAA;;ADpCf;;;;KC4CY,iBAAA,IAAqB,KAAA,EAAO,oBAAA;;;;UASvB,aAAA;EDlDI;EAAA,SCoDV,QAAA;EDjDC;;;;;EAAA,SCuDD,UAAA;EDvD+B;EAAA,SCyD/B,UAAA,GAAa,iBAAA;AAAA;;;;UAMP,mBAAA;ED7CK;EAAA,SC+CX,QAAA;ED/C0B;;;;;EAAA,SCqD1B,MAAA;EDnDD;;;;;EAAA,SCyDC,UAAA;ED1DkC;EAAA,SC4DlC,UAAA,GAAa,iBAAA;AAAA;;;;UAMP,WAAA;;WAEN,QAAA;EAxHM;;;EAAA,SA4HN,YAAA;EAxHQ;;;EAAA,SA4HR,UAAA;EArHiB;;;;;EAAA,SA2HjB,UAAA;EAlIQ;EAAA,SAoIR,UAAA,GAAa,iBAAA;AAAA;;;;UAMP,aAAA;EAnIyB;EAAA,SAqI/B,QAAA;EA/HU;;AAUrB;;;EAVqB,SAqIV,IAAA;EA3HkB;AAwB7B;;;;EAxB6B,SAiIlB,UAAA;EAvGY;;;;;;EAAA,SA8GZ,aAAA;EAtGI;EAAA,SAwGJ,UAAA,GAAa,iBAAA;AAAA;;;AA9FxB;UAoGiB,eAAA;;WAEN,QAAA;EAtGiD;AAS5D;;;;EAT4D,SA4GjD,IAAA;EA3FA;;;;;EAAA,SAiGA,UAAA;EAzFyB;;;;;;;EAAA,SAiGzB,cAAA;EAjF8B;;AAMzC;;;;EANyC,SAwF9B,aAAA;EA5EA;EAAA,SA8EA,UAAA,GAAa,iBAAA;AAAA;;;;;AA5DxB;;;;UAuEiB,eAAA;EA/DN;;;;;;EAAA,SAsEA,QAAA,EAAU,QAAA;EAAA,SACV,aAAA;EAAA,SACA,MAAA;EAAA,SACA,UAAA;EAAA,SACA,UAAA;EAAA,SACA,UAAA;EAAA,SACA,UAAA,GAAa,iBAAA;AAAA;;;;UAMP,iBAAA;EA9BwB;;AAWzC;EAXyC,SAkC9B,MAAA;;;;;;WAMA,UAAA;EAnBA;EAAA,SAqBA,UAAA,GAAa,iBAAA;AAAA;;;;UAMP,kBAAA;EAlBA;;;EAAA,SAsBN,MAAA,EAAQ,sBAAA;EAlBR;;;;EAAA,SAuBA,MAAA;AAAA;AATX;;;AAAA,UAeiB,WAAA;EAXN;;;EAAA,SAeA,cAAA,EAAgB,kBAAA;EAVV;EAAA,SAYN,UAAA,GAAa,iBAAA;AAAA;;;;;;;;;AAmBxB;;;;UAAiB,+BAAA;EAAA,SACN,OAAA;EAQA;EAAA,SANA,IAAA;EAOE;;;;;EAAA,SADF,UAAA,EAAY,aAAA;IAAA,SACV,EAAA;IAAA,SACA,KAAA;IAAA,SACA,cAAA;EAAA;EAkBY;;;;;EAAA,SAXd,MAAA;IAAA,SACE,WAAA;EAAA;AAAA;;;;UAOI,aAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;IAAA,SACE,UAAA,EAAY,aAAA;MAAA,SACV,EAAA;MAAA,SACA,KAAA;MAAA,SACA,cAAA;IAAA;IAiBF;;;;;;;IAAA,SARA,OAAA,GAAU,gBAAA;EAAA;EAAA,SAEZ,WAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,SAAA;IAAA,SACE,iBAAA;IAAA,SACA,kBAAA;EAAA;EAAA,SAEF,MAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;EA0BI;;;;;;;EAAA,SAjBN,QAAA,GAAW,aAAA,CAAc,+BAAA;EAAA,SACzB,OAAA;AAAA;;;;KAMC,iBAAA;;;;UAKK,aAAA;EAAA,SACN,IAAA,EAAM,iBAAA;EAAA,SACN,OAAA;EAAA,SACA,GAAA;EAAA,SACA,SAAA,EAAW,aAAA,CAAc,wBAAA;EAAA,SACzB,IAAA,EAAM,MAAA;EAAA,SACN,MAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,WAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;AAAA;;AAab;;;KALY,YAAA,GAAe,MAAA,CAAO,aAAA,EAAe,aAAA;;;;UAKhC,eAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;IAAA,SACE,UAAA,EAAY,aAAA;MAAA,SACV,EAAA;MAAA,SACA,KAAA;MAAA,SACA,cAAA;IAAA;IAAA;;;;;;;IAAA,SASF,OAAA,GAAU,gBAAA;EAAA;EAAA,SAEZ,WAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;EAAA,SAEF,SAAA;IAAA,SACE,iBAAA;IAAA,SACA,kBAAA;EAAA;EAAA,SAEF,MAAA;IAAA,SACE,WAAA;IAAA,SACA,WAAA;EAAA;EAakB;;AAK/B;;EAL+B,SAPpB,QAAA,GAAW,aAAA,CAAc,+BAAA;EAAA,SACzB,OAAA;AAAA;;;;KAMC,mBAAA;;;;UAKK,eAAA;EAAA,SACN,IAAA,EAAM,mBAAA;EAAA,SACN,OAAA;EAAA,SACA,GAAA;EAAA,SACA,SAAA,EAAW,aAAA,CAAc,wBAAA;EAAA,SACzB,IAAA,EAAM,MAAA;AAAA;;AAOjB;;;KAAY,cAAA,GAAiB,MAAA,CAAO,eAAA,EAAiB,eAAA;;;;;UAMpC,WAAA;EANmB;EAAA,SAQzB,WAAA;EARyD;EAAA,SAUzD,aAAA;EAJM;EAAA,SAMN,WAAA;;WAEA,YAAA;EANA;EAAA,SAQA,WAAA;AAAA;;;;KAMC,eAAA;AAAZ;;;AAAA,UAQiB,WAAA;EAAA,SACN,IAAA,EAAM,eAAA;EAAA,SACN,OAAA;EAAA,SACA,GAAA;EAAA,SACA,IAAA,EAAM,MAAA;EAAA,SACN,WAAA,GAAc,yBAAA;AAAA;;;;;KAOb,UAAA,GAAa,MAAA,CAAO,WAAA,EAAa,WAAA;;;;;;;;;AAA7C;;;UAiBiB,qBAAA;EAjB4B;EAAA,SAmBlC,QAAA;EAnBoB;EAAA,SAqBpB,aAAA;EArBc;;;;;EAAA,SA2Bd,oBAAA,EAAsB,aAAA,CAAc,sBAAA;EAVT;;;;;EAAA,SAgB3B,OAAA;EAoB8B;;;;;EAAA,SAd9B,aAAA;EANA;;;;;;EAAA,SAaA,OAAA;EAO8B;AAuCzC;;;EAvCyC,SAF9B,UAAA;EA0CA;EAAA,SAxCA,UAAA,GAAa,iBAAA;AAAA;;;AAiFxB;;;;;;;;;;;UA1CiB,0BAAA;EAAA,SACN,OAAA;EAAA,SACA,OAAA;EAAA,SACA,aAAA;EAAA,SACA,IAAA;EAAA,SACA,EAAA;EAAA,SACA,kBAAA;AAAA;;;AA2DX;;;;;AAKA;;;;;;;;;AAAA,UA7CiB,0BAAA;EAAA,SACN,QAAA;EAAA,SACA,MAAA;EAAA,SACA,gBAAA;EAAA,SACA,eAAA;EAAA,SACA,OAAA;EAAA,SACA,kBAAA;EAAA,SACA,mBAAA;EAAA,SACA,YAAA;IAAA,SACE,OAAA;IAAA,SACA,aAAA;IAAA,SACA,IAAA;IAAA,SACA,EAAA;IAAA,SACA,UAAA;EAAA;AAAA;AAAA,UAII,qBAAA;EAAA,SACN,iBAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA,WAAkB,0BAAA;EAAA,SAClB,OAAA;EAwDA;;;;;EAAA,SAlDA,QAAA,EAAU,aAAA,CAAc,+BAAA;EA8DlB;;;;;;EAAA,SAvDN,YAAA,GAAe,0BAAA;AAAA;;;;KAMd,yBAAA;;AAqFZ;;UAhFiB,qBAAA;EAAA,SACN,IAAA,EAAM,yBAAA;EAAA,SACN,OAAA;EAAA,SACA,GAAA;EAAA,SACA,IAAA,EAAM,MAAA;AAAA;;;;KAML,oBAAA,GAAuB,MAAA,CAAO,qBAAA,EAAuB,qBAAA;;;;;;;;;;;;;UAkBhD,mBAAA;EA+J+B;EAAA,SA7JrC,UAAA;EA6JS;EAAA,SA3JT,MAAA,GAAS,WAAA;EAwKsC;EAAA,SAtK/C,UAAA,GAAa,iBAAA;AAAA;;;;;;;;UAUP,kBAAA;EAyMoB;EAAA,SAvM1B,WAAA;EA0CT;EAAA,SAxCS,aAAA;EAqDD;EAAA,SAnDC,WAAA;EA0DT;EAAA,SAxDS,KAAA;IAiET,sDA/DW,IAAA,UA+DJ;IAAA,SA7DI,GAAA;EAAA;EAsEX;;;;;EAAA,SA/DS,iBAAA;AAAA;;;;;;;;;;;UAiBM,aAAA;EA6EqB;;;;;;;EArEpC,IAAA;EA4Fc;;;;;;;;;;;EA/Ed,OAAA,CAAQ,UAAA,aAAuB,OAAA;EA2GV;;;;;EApGrB,KAAA,IAAS,OAAA;EAsHT;;;;;;;EA7GA,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,oBAAA;EAgI1B;;;;;;;EAvHd,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,OAAA,CAAQ,0BAAA;;;;;;;;;EAUpD,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAA,CAAQ,kBAAA;;;;;;;;;EAUpC,MAAA,CAAO,OAAA,EAAS,aAAA,GAAgB,OAAA,CAAQ,YAAA;;;;;;;;;;EAWxC,QAAA,CAAS,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,cAAA;;;;;;;;;;;;;;EAe5C,QAAA,CAAS,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,qBAAA;;;;;;;EAQ5C,UAAA,IAAc,OAAA,CAAQ,oBAAA;;;;;;EAOtB,cAAA,IAAkB,OAAA,CAAQ,WAAA,SAAoB,oBAAA;;;;;;;;;;;;EAa9C,cAAA,CAAe,OAAA,EAAS,qBAAA,GAAwB,OAAA,CAAQ,oBAAA;;;;;;;EAQxD,UAAA,CAAW,OAAA,GAAU,iBAAA,GAAoB,OAAA;;;;;;;;EASzC,YAAA,CAAa,QAAA,YAAoB,cAAA;;;;;;;;EASjC,gBAAA,CAAiB,QAAA,YAAoB,cAAA;;;;;;;;;EAUrC,kBAAA,CAAmB,UAAA,WAAqB,sBAAA,KAA2B,gBAAA;;;;;;;;EASnE,IAAA,CAAK,OAAA,EAAS,WAAA,GAAc,OAAA,CAAQ,UAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- import { i as isVerbose, n as createColorFormatter, r as formatDim } from "./is-ci-YyvQBBke.mjs";
1
+ import { c as isVerbose, o as createColorFormatter, s as formatDim } from "./terminal-ui-BiB_8KNo.mjs";
2
2
  import { ifDefined } from "@prisma-next/utils/defined";
3
3
  import { bold, cyan, dim, green, magenta, red, yellow } from "colorette";
4
4
  //#region src/utils/formatters/verify.ts
@@ -381,4 +381,4 @@ function formatSignJson(result) {
381
381
  //#endregion
382
382
  export { formatSignJson as a, formatVerifyOutput as c, formatSchemaVerifyOutput as i, formatIntrospectOutput as n, formatSignOutput as o, formatSchemaVerifyJson as r, formatVerifyJson as s, formatIntrospectJson as t };
383
383
 
384
- //# sourceMappingURL=verify-nlzO0uIY.mjs.map
384
+ //# sourceMappingURL=verify-Bom75OYI.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify-nlzO0uIY.mjs","names":[],"sources":["../src/utils/formatters/verify.ts"],"sourcesContent":["import type {\n CoreSchemaView,\n IntrospectSchemaResult,\n SchemaTreeNode,\n SchemaVerificationNode,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { bold, cyan, dim, green, magenta, red, yellow } from 'colorette';\nimport type { GlobalFlags } from '../global-flags';\nimport { createColorFormatter, formatDim, isVerbose } from './helpers';\n\n// ============================================================================\n// Verify Output Formatters\n// ============================================================================\n\nexport interface DbVerifyCommandSuccessResult {\n readonly ok: true;\n readonly mode: 'full' | 'marker-only';\n readonly summary: string;\n readonly contract: VerifyDatabaseResult['contract'];\n readonly marker?: VerifyDatabaseResult['marker'];\n readonly target: VerifyDatabaseResult['target'];\n readonly missingCodecs?: VerifyDatabaseResult['missingCodecs'];\n readonly codecCoverageSkipped?: VerifyDatabaseResult['codecCoverageSkipped'];\n readonly schema?: {\n readonly summary: string;\n readonly counts: VerifyDatabaseSchemaResult['schema']['counts'];\n readonly strict: boolean;\n };\n readonly warning?: string;\n readonly meta?:\n | (NonNullable<VerifyDatabaseResult['meta']> & {\n readonly schemaVerification: 'performed' | 'skipped';\n })\n | {\n readonly schemaVerification: 'performed' | 'skipped';\n };\n readonly timings: {\n readonly total: number;\n };\n}\n\n/**\n * Formats human-readable output for database verify.\n */\nexport function formatVerifyOutput(\n result: DbVerifyCommandSuccessResult,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatYellow = createColorFormatter(useColor, yellow);\n const formatDimText = (text: string) => formatDim(useColor, text);\n const verificationMode =\n result.mode === 'full'\n ? `marker + schema${result.schema?.strict ? ' (strict)' : ' (tolerant)'}`\n : 'marker only (--marker-only)';\n\n lines.push(`${formatGreen('✔')} ${result.summary}`);\n lines.push(`${formatDimText(` verification: ${verificationMode}`)}`);\n lines.push(`${formatDimText(` storageHash: ${result.contract.storageHash}`)}`);\n if (result.contract.profileHash) {\n lines.push(`${formatDimText(` profileHash: ${result.contract.profileHash}`)}`);\n }\n if (result.mode === 'full' && result.schema && isVerbose(flags, 1)) {\n lines.push(\n `${formatDimText(` schema: pass=${result.schema.counts.pass} warn=${result.schema.counts.warn} fail=${result.schema.counts.fail}`)}`,\n );\n }\n if (result.warning) {\n lines.push('');\n lines.push(`${formatYellow('⚠')} ${result.warning}`);\n }\n\n if (isVerbose(flags, 1)) {\n if (result.codecCoverageSkipped) {\n lines.push(\n `${formatDimText(' Codec coverage check skipped (helper returned no supported types)')}`,\n );\n }\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database verify.\n */\nexport function formatVerifyJson(result: DbVerifyCommandSuccessResult): string {\n const output = {\n ok: result.ok,\n summary: result.summary,\n mode: result.mode,\n contract: result.contract,\n ...ifDefined('marker', result.marker),\n target: result.target,\n ...ifDefined('missingCodecs', result.missingCodecs),\n ...ifDefined('codecCoverageSkipped', result.codecCoverageSkipped),\n ...ifDefined('schema', result.schema),\n ...ifDefined('warning', result.warning),\n ...ifDefined('meta', result.meta),\n timings: result.timings,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Formats JSON output for database introspection.\n */\nexport function formatIntrospectJson(result: IntrospectSchemaResult<unknown>): string {\n return JSON.stringify(result, null, 2);\n}\n\n/**\n * Renders a schema tree structure from CoreSchemaView.\n * Matches the style of renderSchemaVerificationTree for consistency.\n */\nfunction renderSchemaTree(\n node: SchemaTreeNode,\n flags: GlobalFlags,\n options: {\n readonly isLast: boolean;\n readonly prefix: string;\n readonly useColor: boolean;\n readonly formatDimText: (text: string) => string;\n readonly isRoot?: boolean;\n },\n): string[] {\n const { isLast, prefix, useColor, formatDimText, isRoot = false } = options;\n const lines: string[] = [];\n\n // Format node label with color based on kind (matching schema-verify style)\n let formattedLabel: string = node.label;\n\n if (useColor) {\n switch (node.kind) {\n case 'root':\n formattedLabel = bold(node.label);\n break;\n case 'entity': {\n // Parse \"table tableName\" format - color \"table\" dim, tableName cyan\n const tableMatch = node.label.match(/^table\\s+(.+)$/);\n if (tableMatch?.[1]) {\n const tableName = tableMatch[1];\n formattedLabel = `${dim('table')} ${cyan(tableName)}`;\n } else {\n // Fallback: color entire label with cyan\n formattedLabel = cyan(node.label);\n }\n break;\n }\n case 'collection': {\n // \"columns\" grouping node - dim the label\n formattedLabel = dim(node.label);\n break;\n }\n case 'field': {\n // Parse column name format: \"columnName: typeDisplay (nullability)\"\n // Color code: column name (cyan), type (default), nullability (dim)\n const columnMatch = node.label.match(/^([^:]+):\\s*(.+)$/);\n if (columnMatch?.[1] && columnMatch[2]) {\n const columnName = columnMatch[1];\n const rest = columnMatch[2];\n // Parse rest: \"typeDisplay (nullability)\"\n const typeMatch = rest.match(/^([^\\s(]+)\\s*(\\([^)]+\\))$/);\n if (typeMatch?.[1] && typeMatch[2]) {\n const typeDisplay = typeMatch[1];\n const nullability = typeMatch[2];\n formattedLabel = `${cyan(columnName)}: ${typeDisplay} ${dim(nullability)}`;\n } else {\n // Fallback if format doesn't match\n formattedLabel = `${cyan(columnName)}: ${rest}`;\n }\n } else {\n formattedLabel = node.label;\n }\n break;\n }\n case 'index': {\n // Parse index/unique constraint/primary key formats\n // \"primary key: columnName\" -> dim \"primary key\", cyan columnName\n const pkMatch = node.label.match(/^primary key:\\s*(.+)$/);\n if (pkMatch?.[1]) {\n const columnNames = pkMatch[1];\n formattedLabel = `${dim('primary key')}: ${cyan(columnNames)}`;\n } else {\n // \"unique name\" -> dim \"unique\", cyan \"name\"\n const uniqueMatch = node.label.match(/^unique\\s+(.+)$/);\n if (uniqueMatch?.[1]) {\n const name = uniqueMatch[1];\n formattedLabel = `${dim('unique')} ${cyan(name)}`;\n } else {\n // \"index name\" or \"unique index name\" -> dim label prefix, cyan name\n const indexMatch = node.label.match(/^(unique\\s+)?index\\s+(.+)$/);\n if (indexMatch?.[2]) {\n const indexPrefix = indexMatch[1] ? `${dim('unique')} ` : '';\n const name = indexMatch[2];\n formattedLabel = `${indexPrefix}${dim('index')} ${cyan(name)}`;\n } else {\n formattedLabel = dim(node.label);\n }\n }\n }\n break;\n }\n case 'dependency': {\n // Parse extension message formats similar to schema-verify\n // \"extensionName extension is enabled\" -> cyan extensionName, dim rest\n const extMatch = node.label.match(/^([^\\s]+)\\s+(extension is enabled)$/);\n if (extMatch?.[1] && extMatch[2]) {\n const extName = extMatch[1];\n const rest = extMatch[2];\n formattedLabel = `${cyan(extName)} ${dim(rest)}`;\n } else {\n // Fallback: color entire label with magenta\n formattedLabel = magenta(node.label);\n }\n break;\n }\n default:\n formattedLabel = node.label;\n break;\n }\n }\n\n // Root node renders without tree characters or prefix\n if (isRoot) {\n lines.push(formattedLabel);\n } else {\n const treeChar = isLast ? '└' : '├';\n const treePrefix = `${formatDimText(treeChar)}─ `;\n lines.push(`${prefix}${treePrefix}${formattedLabel}`);\n }\n\n // Render children if present\n if (node.children && node.children.length > 0) {\n const childPrefix = isRoot ? '' : `${prefix}${isLast ? ' ' : `${formatDimText('│')} `}`;\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const isLastChild = i === node.children.length - 1;\n const childLines = renderSchemaTree(child, flags, {\n isLast: isLastChild,\n prefix: childPrefix,\n useColor,\n formatDimText,\n isRoot: false,\n });\n lines.push(...childLines);\n }\n }\n\n return lines;\n}\n\n/**\n * Formats human-readable output for database introspection.\n */\nexport function formatIntrospectOutput(\n result: IntrospectSchemaResult<unknown>,\n schemaView: CoreSchemaView | undefined,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n if (schemaView) {\n // Render tree structure - root node is special (no tree characters)\n const treeLines = renderSchemaTree(schemaView.root, flags, {\n isLast: true,\n prefix: '',\n useColor,\n formatDimText,\n isRoot: true,\n });\n lines.push(...treeLines);\n } else {\n // Fallback: print summary when toSchemaView is not available\n lines.push(`✔ ${result.summary}`);\n if (isVerbose(flags, 1)) {\n lines.push(` Target: ${result.target.familyId}/${result.target.id}`);\n if (result.meta?.dbUrl) {\n lines.push(` Database: ${result.meta.dbUrl}`);\n }\n }\n }\n\n // Add timings in verbose mode\n if (isVerbose(flags, 1)) {\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Renders a schema verification tree structure from SchemaVerificationNode.\n * Similar to renderSchemaTree but for verification nodes with status-based colors and glyphs.\n */\nfunction renderSchemaVerificationTree(\n node: SchemaVerificationNode,\n flags: GlobalFlags,\n options: {\n readonly isLast: boolean;\n readonly prefix: string;\n readonly useColor: boolean;\n readonly formatDimText: (text: string) => string;\n readonly isRoot?: boolean;\n },\n): string[] {\n const { isLast, prefix, useColor, formatDimText, isRoot = false } = options;\n const lines: string[] = [];\n\n // Format status glyph and color based on status\n let statusGlyph = '';\n let statusColor: (text: string) => string = (text) => text;\n if (useColor) {\n switch (node.status) {\n case 'pass':\n statusGlyph = '✔';\n statusColor = green;\n break;\n case 'warn':\n statusGlyph = '⚠';\n statusColor = (text) => (useColor ? yellow(text) : text);\n break;\n case 'fail':\n statusGlyph = '✖';\n statusColor = red;\n break;\n }\n } else {\n switch (node.status) {\n case 'pass':\n statusGlyph = '✔';\n break;\n case 'warn':\n statusGlyph = '⚠';\n break;\n case 'fail':\n statusGlyph = '✖';\n break;\n }\n }\n\n // Format node label with color based on kind\n // For column nodes, we need to parse the name to color code different parts\n let labelColor: (text: string) => string = (text) => text;\n let formattedLabel: string = node.name;\n\n if (useColor) {\n switch (node.kind) {\n case 'contract':\n case 'schema':\n labelColor = bold;\n formattedLabel = labelColor(node.name);\n break;\n case 'table': {\n // Parse \"table tableName\" format - color \"table\" dim, tableName cyan\n const tableMatch = node.name.match(/^table\\s+(.+)$/);\n if (tableMatch?.[1]) {\n const tableName = tableMatch[1];\n formattedLabel = `${dim('table')} ${cyan(tableName)}`;\n } else {\n formattedLabel = dim(node.name);\n }\n break;\n }\n case 'columns':\n labelColor = dim;\n formattedLabel = labelColor(node.name);\n break;\n case 'column': {\n // Parse column name format: \"columnName: contractType -> nativeType (nullability)\"\n // Color code: column name (cyan), contract type (default), native type (dim), nullability (dim)\n const columnMatch = node.name.match(/^([^:]+):\\s*(.+)$/);\n if (columnMatch?.[1] && columnMatch[2]) {\n const columnName = columnMatch[1];\n const rest = columnMatch[2];\n // Parse rest: \"contractType -> nativeType (nullability)\"\n // Match contract type (can contain /, @, etc.), arrow, native type, then nullability in parentheses\n const typeMatch = rest.match(/^([^\\s→]+)\\s*→\\s*([^\\s(]+)\\s*(\\([^)]+\\))$/);\n if (typeMatch?.[1] && typeMatch[2] && typeMatch[3]) {\n const contractType = typeMatch[1];\n const nativeType = typeMatch[2];\n const nullability = typeMatch[3];\n formattedLabel = `${cyan(columnName)}: ${contractType} → ${dim(nativeType)} ${dim(nullability)}`;\n } else {\n // Fallback if format doesn't match (e.g., no native type or no nullability)\n formattedLabel = `${cyan(columnName)}: ${rest}`;\n }\n } else {\n formattedLabel = node.name;\n }\n break;\n }\n case 'type':\n case 'nullability':\n labelColor = (text) => text; // Default color\n formattedLabel = labelColor(node.name);\n break;\n case 'primaryKey': {\n // Parse \"primary key: columnName\" format - color \"primary key\" dim, columnName cyan\n const pkMatch = node.name.match(/^primary key:\\s*(.+)$/);\n if (pkMatch?.[1]) {\n const columnNames = pkMatch[1];\n formattedLabel = `${dim('primary key')}: ${cyan(columnNames)}`;\n } else {\n formattedLabel = dim(node.name);\n }\n break;\n }\n case 'foreignKey':\n case 'unique':\n case 'index':\n labelColor = dim;\n formattedLabel = labelColor(node.name);\n break;\n case 'dependency': {\n // Parse specific extension message formats\n // \"database is postgres\" -> dim \"database is\", cyan \"postgres\"\n const dbMatch = node.name.match(/^database is\\s+(.+)$/);\n if (dbMatch?.[1]) {\n const dbName = dbMatch[1];\n formattedLabel = `${dim('database is')} ${cyan(dbName)}`;\n } else {\n // \"vector extension is enabled\" -> dim everything except extension name\n // Match pattern: \"extensionName extension is enabled\"\n const extMatch = node.name.match(/^([^\\s]+)\\s+(extension is enabled)$/);\n if (extMatch?.[1] && extMatch[2]) {\n const extName = extMatch[1];\n const rest = extMatch[2];\n formattedLabel = `${cyan(extName)} ${dim(rest)}`;\n } else {\n // Fallback: color entire name with magenta\n labelColor = magenta;\n formattedLabel = labelColor(node.name);\n }\n }\n break;\n }\n default:\n formattedLabel = node.name;\n break;\n }\n } else {\n formattedLabel = node.name;\n }\n\n const statusGlyphColored = statusColor(statusGlyph);\n\n // Build the label with optional message for failure/warn nodes\n let nodeLabel = formattedLabel;\n if (\n (node.status === 'fail' || node.status === 'warn') &&\n node.message &&\n node.message.length > 0\n ) {\n // Always show message for failure/warn nodes - it provides crucial context\n // For parent nodes, the message summarizes child failures\n // For leaf nodes, the message explains the specific issue\n const messageText = formatDimText(`(${node.message})`);\n nodeLabel = `${formattedLabel} ${messageText}`;\n }\n\n // Root node renders without tree characters or | prefix\n // Root node renders without tree characters or prefix\n if (isRoot) {\n lines.push(`${statusGlyphColored} ${nodeLabel}`);\n } else {\n const treeChar = isLast ? '└' : '├';\n const treePrefix = `${formatDimText(treeChar)}─ `;\n lines.push(`${prefix}${treePrefix}${statusGlyphColored} ${nodeLabel}`);\n }\n\n // Render children if present\n if (node.children && node.children.length > 0) {\n const childPrefix = isRoot ? '' : `${prefix}${isLast ? ' ' : `${formatDimText('│')} `}`;\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const isLastChild = i === node.children.length - 1;\n const childLines = renderSchemaVerificationTree(child, flags, {\n isLast: isLastChild,\n prefix: childPrefix,\n useColor,\n formatDimText,\n isRoot: false,\n });\n lines.push(...childLines);\n }\n }\n\n return lines;\n}\n\n/**\n * Formats human-readable output for database schema verification.\n */\nexport function formatSchemaVerifyOutput(\n result: VerifyDatabaseSchemaResult,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatRed = createColorFormatter(useColor, red);\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n // Render verification tree first\n const treeLines = renderSchemaVerificationTree(result.schema.root, flags, {\n isLast: true,\n prefix: '',\n useColor,\n formatDimText,\n isRoot: true,\n });\n lines.push(...treeLines);\n\n // Add counts and timings in verbose mode\n if (isVerbose(flags, 1)) {\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n lines.push(\n `${formatDimText(` pass=${result.schema.counts.pass} warn=${result.schema.counts.warn} fail=${result.schema.counts.fail}`)}`,\n );\n }\n\n // Blank line before summary\n lines.push('');\n\n // Summary line at the end: summary with status glyph\n if (result.ok) {\n lines.push(`${formatGreen('✔')} ${result.summary}`);\n } else {\n const codeText = result.code ? ` (${result.code})` : '';\n lines.push(`${formatRed('✖')} ${result.summary}${codeText}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database schema verification.\n */\nexport function formatSchemaVerifyJson(result: VerifyDatabaseSchemaResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ============================================================================\n// Sign Output Formatters\n// ============================================================================\n\n/**\n * Formats human-readable output for database sign.\n */\nexport function formatSignOutput(result: SignDatabaseResult, flags: GlobalFlags): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n if (result.ok) {\n // Main success message in white (not dimmed)\n lines.push(`${formatGreen('✔')} Database signed`);\n\n // Show from -> to hashes with clear labels\n const previousHash = result.marker.previous?.storageHash ?? 'none';\n const currentHash = result.contract.storageHash;\n\n lines.push(`${formatDimText(` from: ${previousHash}`)}`);\n lines.push(`${formatDimText(` to: ${currentHash}`)}`);\n\n if (isVerbose(flags, 1)) {\n if (result.contract.profileHash) {\n lines.push(`${formatDimText(` profileHash: ${result.contract.profileHash}`)}`);\n }\n if (result.marker.previous?.profileHash) {\n lines.push(\n `${formatDimText(` previous profileHash: ${result.marker.previous.profileHash}`)}`,\n );\n }\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database sign.\n */\nexport function formatSignJson(result: SignDatabaseResult): string {\n return JSON.stringify(result, null, 2);\n}\n"],"mappings":";;;;;;;AAgDA,SAAgB,mBACd,QACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,eAAe,qBAAqB,UAAU,OAAO;CAC3D,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CACjE,MAAM,mBACJ,OAAO,SAAS,SACZ,kBAAkB,OAAO,QAAQ,SAAS,cAAc,kBACxD;CAEN,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,UAAU;CACnD,MAAM,KAAK,GAAG,cAAc,mBAAmB,mBAAmB,GAAG;CACrE,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;CAC/E,IAAI,OAAO,SAAS,aAClB,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;CAEjF,IAAI,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU,OAAO,EAAE,EAChE,MAAM,KACJ,GAAG,cAAc,kBAAkB,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,OAAO,GACpI;CAEH,IAAI,OAAO,SAAS;EAClB,MAAM,KAAK,GAAG;EACd,MAAM,KAAK,GAAG,aAAa,IAAI,CAAC,GAAG,OAAO,UAAU;;CAGtD,IAAI,UAAU,OAAO,EAAE,EAAE;EACvB,IAAI,OAAO,sBACT,MAAM,KACJ,GAAG,cAAc,sEAAsE,GACxF;EAEH,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;;CAG3E,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,iBAAiB,QAA8C;CAC7E,MAAM,SAAS;EACb,IAAI,OAAO;EACX,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,UAAU,OAAO;EACjB,GAAG,UAAU,UAAU,OAAO,OAAO;EACrC,QAAQ,OAAO;EACf,GAAG,UAAU,iBAAiB,OAAO,cAAc;EACnD,GAAG,UAAU,wBAAwB,OAAO,qBAAqB;EACjE,GAAG,UAAU,UAAU,OAAO,OAAO;EACrC,GAAG,UAAU,WAAW,OAAO,QAAQ;EACvC,GAAG,UAAU,QAAQ,OAAO,KAAK;EACjC,SAAS,OAAO;EACjB;CAED,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;AAMxC,SAAgB,qBAAqB,QAAiD;CACpF,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;;AAOxC,SAAS,iBACP,MACA,OACA,SAOU;CACV,MAAM,EAAE,QAAQ,QAAQ,UAAU,eAAe,SAAS,UAAU;CACpE,MAAM,QAAkB,EAAE;CAG1B,IAAI,iBAAyB,KAAK;CAElC,IAAI,UACF,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,iBAAiB,KAAK,KAAK,MAAM;GACjC;EACF,KAAK,UAAU;GAEb,MAAM,aAAa,KAAK,MAAM,MAAM,iBAAiB;GACrD,IAAI,aAAa,IAAI;IACnB,MAAM,YAAY,WAAW;IAC7B,iBAAiB,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,UAAU;UAGnD,iBAAiB,KAAK,KAAK,MAAM;GAEnC;;EAEF,KAAK;GAEH,iBAAiB,IAAI,KAAK,MAAM;GAChC;EAEF,KAAK,SAAS;GAGZ,MAAM,cAAc,KAAK,MAAM,MAAM,oBAAoB;GACzD,IAAI,cAAc,MAAM,YAAY,IAAI;IACtC,MAAM,aAAa,YAAY;IAC/B,MAAM,OAAO,YAAY;IAEzB,MAAM,YAAY,KAAK,MAAM,4BAA4B;IACzD,IAAI,YAAY,MAAM,UAAU,IAAI;KAClC,MAAM,cAAc,UAAU;KAC9B,MAAM,cAAc,UAAU;KAC9B,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI,YAAY,GAAG,IAAI,YAAY;WAGxE,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI;UAG3C,iBAAiB,KAAK;GAExB;;EAEF,KAAK,SAAS;GAGZ,MAAM,UAAU,KAAK,MAAM,MAAM,wBAAwB;GACzD,IAAI,UAAU,IAAI;IAChB,MAAM,cAAc,QAAQ;IAC5B,iBAAiB,GAAG,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY;UACvD;IAEL,MAAM,cAAc,KAAK,MAAM,MAAM,kBAAkB;IACvD,IAAI,cAAc,IAAI;KACpB,MAAM,OAAO,YAAY;KACzB,iBAAiB,GAAG,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK;WAC1C;KAEL,MAAM,aAAa,KAAK,MAAM,MAAM,6BAA6B;KACjE,IAAI,aAAa,IAAI;MACnB,MAAM,cAAc,WAAW,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK;MAC1D,MAAM,OAAO,WAAW;MACxB,iBAAiB,GAAG,cAAc,IAAI,QAAQ,CAAC,GAAG,KAAK,KAAK;YAE5D,iBAAiB,IAAI,KAAK,MAAM;;;GAItC;;EAEF,KAAK,cAAc;GAGjB,MAAM,WAAW,KAAK,MAAM,MAAM,sCAAsC;GACxE,IAAI,WAAW,MAAM,SAAS,IAAI;IAChC,MAAM,UAAU,SAAS;IACzB,MAAM,OAAO,SAAS;IACtB,iBAAiB,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK;UAG9C,iBAAiB,QAAQ,KAAK,MAAM;GAEtC;;EAEF;GACE,iBAAiB,KAAK;GACtB;;CAKN,IAAI,QACF,MAAM,KAAK,eAAe;MACrB;EAEL,MAAM,aAAa,GAAG,cADL,SAAS,MAAM,IACa,CAAC;EAC9C,MAAM,KAAK,GAAG,SAAS,aAAa,iBAAiB;;CAIvD,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;EAC7C,MAAM,cAAc,SAAS,KAAK,GAAG,SAAS,SAAS,QAAQ,GAAG,cAAc,IAAI,CAAC;EACrF,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;GAC7C,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GAEZ,MAAM,aAAa,iBAAiB,OAAO,OAAO;IAChD,QAFkB,MAAM,KAAK,SAAS,SAAS;IAG/C,QAAQ;IACR;IACA;IACA,QAAQ;IACT,CAAC;GACF,MAAM,KAAK,GAAG,WAAW;;;CAI7B,OAAO;;;;;AAMT,SAAgB,uBACd,QACA,YACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAEjE,IAAI,YAAY;EAEd,MAAM,YAAY,iBAAiB,WAAW,MAAM,OAAO;GACzD,QAAQ;GACR,QAAQ;GACR;GACA;GACA,QAAQ;GACT,CAAC;EACF,MAAM,KAAK,GAAG,UAAU;QACnB;EAEL,MAAM,KAAK,KAAK,OAAO,UAAU;EACjC,IAAI,UAAU,OAAO,EAAE,EAAE;GACvB,MAAM,KAAK,aAAa,OAAO,OAAO,SAAS,GAAG,OAAO,OAAO,KAAK;GACrE,IAAI,OAAO,MAAM,OACf,MAAM,KAAK,eAAe,OAAO,KAAK,QAAQ;;;CAMpD,IAAI,UAAU,OAAO,EAAE,EACrB,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;CAG3E,OAAO,MAAM,KAAK,KAAK;;;;;;AAOzB,SAAS,6BACP,MACA,OACA,SAOU;CACV,MAAM,EAAE,QAAQ,QAAQ,UAAU,eAAe,SAAS,UAAU;CACpE,MAAM,QAAkB,EAAE;CAG1B,IAAI,cAAc;CAClB,IAAI,eAAyC,SAAS;CACtD,IAAI,UACF,QAAQ,KAAK,QAAb;EACE,KAAK;GACH,cAAc;GACd,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd,eAAe,SAAU,WAAW,OAAO,KAAK,GAAG;GACnD;EACF,KAAK;GACH,cAAc;GACd,cAAc;GACd;;MAGJ,QAAQ,KAAK,QAAb;EACE,KAAK;GACH,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd;;CAMN,IAAI,cAAwC,SAAS;CACrD,IAAI,iBAAyB,KAAK;CAElC,IAAI,UACF,QAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,SAAS;GAEZ,MAAM,aAAa,KAAK,KAAK,MAAM,iBAAiB;GACpD,IAAI,aAAa,IAAI;IACnB,MAAM,YAAY,WAAW;IAC7B,iBAAiB,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,UAAU;UAEnD,iBAAiB,IAAI,KAAK,KAAK;GAEjC;;EAEF,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,UAAU;GAGb,MAAM,cAAc,KAAK,KAAK,MAAM,oBAAoB;GACxD,IAAI,cAAc,MAAM,YAAY,IAAI;IACtC,MAAM,aAAa,YAAY;IAC/B,MAAM,OAAO,YAAY;IAGzB,MAAM,YAAY,KAAK,MAAM,4CAA4C;IACzE,IAAI,YAAY,MAAM,UAAU,MAAM,UAAU,IAAI;KAClD,MAAM,eAAe,UAAU;KAC/B,MAAM,aAAa,UAAU;KAC7B,MAAM,cAAc,UAAU;KAC9B,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI,aAAa,KAAK,IAAI,WAAW,CAAC,GAAG,IAAI,YAAY;WAG9F,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI;UAG3C,iBAAiB,KAAK;GAExB;;EAEF,KAAK;EACL,KAAK;GACH,cAAc,SAAS;GACvB,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,cAAc;GAEjB,MAAM,UAAU,KAAK,KAAK,MAAM,wBAAwB;GACxD,IAAI,UAAU,IAAI;IAChB,MAAM,cAAc,QAAQ;IAC5B,iBAAiB,GAAG,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY;UAE5D,iBAAiB,IAAI,KAAK,KAAK;GAEjC;;EAEF,KAAK;EACL,KAAK;EACL,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,cAAc;GAGjB,MAAM,UAAU,KAAK,KAAK,MAAM,uBAAuB;GACvD,IAAI,UAAU,IAAI;IAChB,MAAM,SAAS,QAAQ;IACvB,iBAAiB,GAAG,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO;UACjD;IAGL,MAAM,WAAW,KAAK,KAAK,MAAM,sCAAsC;IACvE,IAAI,WAAW,MAAM,SAAS,IAAI;KAChC,MAAM,UAAU,SAAS;KACzB,MAAM,OAAO,SAAS;KACtB,iBAAiB,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK;WACzC;KAEL,aAAa;KACb,iBAAiB,WAAW,KAAK,KAAK;;;GAG1C;;EAEF;GACE,iBAAiB,KAAK;GACtB;;MAGJ,iBAAiB,KAAK;CAGxB,MAAM,qBAAqB,YAAY,YAAY;CAGnD,IAAI,YAAY;CAChB,KACG,KAAK,WAAW,UAAU,KAAK,WAAW,WAC3C,KAAK,WACL,KAAK,QAAQ,SAAS,GACtB;EAIA,MAAM,cAAc,cAAc,IAAI,KAAK,QAAQ,GAAG;EACtD,YAAY,GAAG,eAAe,GAAG;;CAKnC,IAAI,QACF,MAAM,KAAK,GAAG,mBAAmB,GAAG,YAAY;MAC3C;EAEL,MAAM,aAAa,GAAG,cADL,SAAS,MAAM,IACa,CAAC;EAC9C,MAAM,KAAK,GAAG,SAAS,aAAa,mBAAmB,GAAG,YAAY;;CAIxE,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;EAC7C,MAAM,cAAc,SAAS,KAAK,GAAG,SAAS,SAAS,QAAQ,GAAG,cAAc,IAAI,CAAC;EACrF,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;GAC7C,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GAEZ,MAAM,aAAa,6BAA6B,OAAO,OAAO;IAC5D,QAFkB,MAAM,KAAK,SAAS,SAAS;IAG/C,QAAQ;IACR;IACA;IACA,QAAQ;IACT,CAAC;GACF,MAAM,KAAK,GAAG,WAAW;;;CAI7B,OAAO;;;;;AAMT,SAAgB,yBACd,QACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,YAAY,qBAAqB,UAAU,IAAI;CACrD,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAGjE,MAAM,YAAY,6BAA6B,OAAO,OAAO,MAAM,OAAO;EACxE,QAAQ;EACR,QAAQ;EACR;EACA;EACA,QAAQ;EACT,CAAC;CACF,MAAM,KAAK,GAAG,UAAU;CAGxB,IAAI,UAAU,OAAO,EAAE,EAAE;EACvB,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;EACzE,MAAM,KACJ,GAAG,cAAc,UAAU,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,OAAO,GAC5H;;CAIH,MAAM,KAAK,GAAG;CAGd,IAAI,OAAO,IACT,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,UAAU;MAC9C;EACL,MAAM,WAAW,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK;EACrD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,GAAG,OAAO,UAAU,WAAW;;CAG9D,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,uBAAuB,QAA4C;CACjF,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;AAUxC,SAAgB,iBAAiB,QAA4B,OAA4B;CACvF,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAEjE,IAAI,OAAO,IAAI;EAEb,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,kBAAkB;EAGjD,MAAM,eAAe,OAAO,OAAO,UAAU,eAAe;EAC5D,MAAM,cAAc,OAAO,SAAS;EAEpC,MAAM,KAAK,GAAG,cAAc,WAAW,eAAe,GAAG;EACzD,MAAM,KAAK,GAAG,cAAc,WAAW,cAAc,GAAG;EAExD,IAAI,UAAU,OAAO,EAAE,EAAE;GACvB,IAAI,OAAO,SAAS,aAClB,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;GAEjF,IAAI,OAAO,OAAO,UAAU,aAC1B,MAAM,KACJ,GAAG,cAAc,2BAA2B,OAAO,OAAO,SAAS,cAAc,GAClF;GAEH,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;;;CAI7E,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,eAAe,QAAoC;CACjE,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE"}
1
+ {"version":3,"file":"verify-Bom75OYI.mjs","names":[],"sources":["../src/utils/formatters/verify.ts"],"sourcesContent":["import type {\n CoreSchemaView,\n IntrospectSchemaResult,\n SchemaTreeNode,\n SchemaVerificationNode,\n SignDatabaseResult,\n VerifyDatabaseResult,\n VerifyDatabaseSchemaResult,\n} from '@prisma-next/framework-components/control';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { bold, cyan, dim, green, magenta, red, yellow } from 'colorette';\nimport type { GlobalFlags } from '../global-flags';\nimport { createColorFormatter, formatDim, isVerbose } from './helpers';\n\n// ============================================================================\n// Verify Output Formatters\n// ============================================================================\n\nexport interface DbVerifyCommandSuccessResult {\n readonly ok: true;\n readonly mode: 'full' | 'marker-only';\n readonly summary: string;\n readonly contract: VerifyDatabaseResult['contract'];\n readonly marker?: VerifyDatabaseResult['marker'];\n readonly target: VerifyDatabaseResult['target'];\n readonly missingCodecs?: VerifyDatabaseResult['missingCodecs'];\n readonly codecCoverageSkipped?: VerifyDatabaseResult['codecCoverageSkipped'];\n readonly schema?: {\n readonly summary: string;\n readonly counts: VerifyDatabaseSchemaResult['schema']['counts'];\n readonly strict: boolean;\n };\n readonly warning?: string;\n readonly meta?:\n | (NonNullable<VerifyDatabaseResult['meta']> & {\n readonly schemaVerification: 'performed' | 'skipped';\n })\n | {\n readonly schemaVerification: 'performed' | 'skipped';\n };\n readonly timings: {\n readonly total: number;\n };\n}\n\n/**\n * Formats human-readable output for database verify.\n */\nexport function formatVerifyOutput(\n result: DbVerifyCommandSuccessResult,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatYellow = createColorFormatter(useColor, yellow);\n const formatDimText = (text: string) => formatDim(useColor, text);\n const verificationMode =\n result.mode === 'full'\n ? `marker + schema${result.schema?.strict ? ' (strict)' : ' (tolerant)'}`\n : 'marker only (--marker-only)';\n\n lines.push(`${formatGreen('✔')} ${result.summary}`);\n lines.push(`${formatDimText(` verification: ${verificationMode}`)}`);\n lines.push(`${formatDimText(` storageHash: ${result.contract.storageHash}`)}`);\n if (result.contract.profileHash) {\n lines.push(`${formatDimText(` profileHash: ${result.contract.profileHash}`)}`);\n }\n if (result.mode === 'full' && result.schema && isVerbose(flags, 1)) {\n lines.push(\n `${formatDimText(` schema: pass=${result.schema.counts.pass} warn=${result.schema.counts.warn} fail=${result.schema.counts.fail}`)}`,\n );\n }\n if (result.warning) {\n lines.push('');\n lines.push(`${formatYellow('⚠')} ${result.warning}`);\n }\n\n if (isVerbose(flags, 1)) {\n if (result.codecCoverageSkipped) {\n lines.push(\n `${formatDimText(' Codec coverage check skipped (helper returned no supported types)')}`,\n );\n }\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database verify.\n */\nexport function formatVerifyJson(result: DbVerifyCommandSuccessResult): string {\n const output = {\n ok: result.ok,\n summary: result.summary,\n mode: result.mode,\n contract: result.contract,\n ...ifDefined('marker', result.marker),\n target: result.target,\n ...ifDefined('missingCodecs', result.missingCodecs),\n ...ifDefined('codecCoverageSkipped', result.codecCoverageSkipped),\n ...ifDefined('schema', result.schema),\n ...ifDefined('warning', result.warning),\n ...ifDefined('meta', result.meta),\n timings: result.timings,\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Formats JSON output for database introspection.\n */\nexport function formatIntrospectJson(result: IntrospectSchemaResult<unknown>): string {\n return JSON.stringify(result, null, 2);\n}\n\n/**\n * Renders a schema tree structure from CoreSchemaView.\n * Matches the style of renderSchemaVerificationTree for consistency.\n */\nfunction renderSchemaTree(\n node: SchemaTreeNode,\n flags: GlobalFlags,\n options: {\n readonly isLast: boolean;\n readonly prefix: string;\n readonly useColor: boolean;\n readonly formatDimText: (text: string) => string;\n readonly isRoot?: boolean;\n },\n): string[] {\n const { isLast, prefix, useColor, formatDimText, isRoot = false } = options;\n const lines: string[] = [];\n\n // Format node label with color based on kind (matching schema-verify style)\n let formattedLabel: string = node.label;\n\n if (useColor) {\n switch (node.kind) {\n case 'root':\n formattedLabel = bold(node.label);\n break;\n case 'entity': {\n // Parse \"table tableName\" format - color \"table\" dim, tableName cyan\n const tableMatch = node.label.match(/^table\\s+(.+)$/);\n if (tableMatch?.[1]) {\n const tableName = tableMatch[1];\n formattedLabel = `${dim('table')} ${cyan(tableName)}`;\n } else {\n // Fallback: color entire label with cyan\n formattedLabel = cyan(node.label);\n }\n break;\n }\n case 'collection': {\n // \"columns\" grouping node - dim the label\n formattedLabel = dim(node.label);\n break;\n }\n case 'field': {\n // Parse column name format: \"columnName: typeDisplay (nullability)\"\n // Color code: column name (cyan), type (default), nullability (dim)\n const columnMatch = node.label.match(/^([^:]+):\\s*(.+)$/);\n if (columnMatch?.[1] && columnMatch[2]) {\n const columnName = columnMatch[1];\n const rest = columnMatch[2];\n // Parse rest: \"typeDisplay (nullability)\"\n const typeMatch = rest.match(/^([^\\s(]+)\\s*(\\([^)]+\\))$/);\n if (typeMatch?.[1] && typeMatch[2]) {\n const typeDisplay = typeMatch[1];\n const nullability = typeMatch[2];\n formattedLabel = `${cyan(columnName)}: ${typeDisplay} ${dim(nullability)}`;\n } else {\n // Fallback if format doesn't match\n formattedLabel = `${cyan(columnName)}: ${rest}`;\n }\n } else {\n formattedLabel = node.label;\n }\n break;\n }\n case 'index': {\n // Parse index/unique constraint/primary key formats\n // \"primary key: columnName\" -> dim \"primary key\", cyan columnName\n const pkMatch = node.label.match(/^primary key:\\s*(.+)$/);\n if (pkMatch?.[1]) {\n const columnNames = pkMatch[1];\n formattedLabel = `${dim('primary key')}: ${cyan(columnNames)}`;\n } else {\n // \"unique name\" -> dim \"unique\", cyan \"name\"\n const uniqueMatch = node.label.match(/^unique\\s+(.+)$/);\n if (uniqueMatch?.[1]) {\n const name = uniqueMatch[1];\n formattedLabel = `${dim('unique')} ${cyan(name)}`;\n } else {\n // \"index name\" or \"unique index name\" -> dim label prefix, cyan name\n const indexMatch = node.label.match(/^(unique\\s+)?index\\s+(.+)$/);\n if (indexMatch?.[2]) {\n const indexPrefix = indexMatch[1] ? `${dim('unique')} ` : '';\n const name = indexMatch[2];\n formattedLabel = `${indexPrefix}${dim('index')} ${cyan(name)}`;\n } else {\n formattedLabel = dim(node.label);\n }\n }\n }\n break;\n }\n case 'dependency': {\n // Parse extension message formats similar to schema-verify\n // \"extensionName extension is enabled\" -> cyan extensionName, dim rest\n const extMatch = node.label.match(/^([^\\s]+)\\s+(extension is enabled)$/);\n if (extMatch?.[1] && extMatch[2]) {\n const extName = extMatch[1];\n const rest = extMatch[2];\n formattedLabel = `${cyan(extName)} ${dim(rest)}`;\n } else {\n // Fallback: color entire label with magenta\n formattedLabel = magenta(node.label);\n }\n break;\n }\n default:\n formattedLabel = node.label;\n break;\n }\n }\n\n // Root node renders without tree characters or prefix\n if (isRoot) {\n lines.push(formattedLabel);\n } else {\n const treeChar = isLast ? '└' : '├';\n const treePrefix = `${formatDimText(treeChar)}─ `;\n lines.push(`${prefix}${treePrefix}${formattedLabel}`);\n }\n\n // Render children if present\n if (node.children && node.children.length > 0) {\n const childPrefix = isRoot ? '' : `${prefix}${isLast ? ' ' : `${formatDimText('│')} `}`;\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const isLastChild = i === node.children.length - 1;\n const childLines = renderSchemaTree(child, flags, {\n isLast: isLastChild,\n prefix: childPrefix,\n useColor,\n formatDimText,\n isRoot: false,\n });\n lines.push(...childLines);\n }\n }\n\n return lines;\n}\n\n/**\n * Formats human-readable output for database introspection.\n */\nexport function formatIntrospectOutput(\n result: IntrospectSchemaResult<unknown>,\n schemaView: CoreSchemaView | undefined,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n if (schemaView) {\n // Render tree structure - root node is special (no tree characters)\n const treeLines = renderSchemaTree(schemaView.root, flags, {\n isLast: true,\n prefix: '',\n useColor,\n formatDimText,\n isRoot: true,\n });\n lines.push(...treeLines);\n } else {\n // Fallback: print summary when toSchemaView is not available\n lines.push(`✔ ${result.summary}`);\n if (isVerbose(flags, 1)) {\n lines.push(` Target: ${result.target.familyId}/${result.target.id}`);\n if (result.meta?.dbUrl) {\n lines.push(` Database: ${result.meta.dbUrl}`);\n }\n }\n }\n\n // Add timings in verbose mode\n if (isVerbose(flags, 1)) {\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Renders a schema verification tree structure from SchemaVerificationNode.\n * Similar to renderSchemaTree but for verification nodes with status-based colors and glyphs.\n */\nfunction renderSchemaVerificationTree(\n node: SchemaVerificationNode,\n flags: GlobalFlags,\n options: {\n readonly isLast: boolean;\n readonly prefix: string;\n readonly useColor: boolean;\n readonly formatDimText: (text: string) => string;\n readonly isRoot?: boolean;\n },\n): string[] {\n const { isLast, prefix, useColor, formatDimText, isRoot = false } = options;\n const lines: string[] = [];\n\n // Format status glyph and color based on status\n let statusGlyph = '';\n let statusColor: (text: string) => string = (text) => text;\n if (useColor) {\n switch (node.status) {\n case 'pass':\n statusGlyph = '✔';\n statusColor = green;\n break;\n case 'warn':\n statusGlyph = '⚠';\n statusColor = (text) => (useColor ? yellow(text) : text);\n break;\n case 'fail':\n statusGlyph = '✖';\n statusColor = red;\n break;\n }\n } else {\n switch (node.status) {\n case 'pass':\n statusGlyph = '✔';\n break;\n case 'warn':\n statusGlyph = '⚠';\n break;\n case 'fail':\n statusGlyph = '✖';\n break;\n }\n }\n\n // Format node label with color based on kind\n // For column nodes, we need to parse the name to color code different parts\n let labelColor: (text: string) => string = (text) => text;\n let formattedLabel: string = node.name;\n\n if (useColor) {\n switch (node.kind) {\n case 'contract':\n case 'schema':\n labelColor = bold;\n formattedLabel = labelColor(node.name);\n break;\n case 'table': {\n // Parse \"table tableName\" format - color \"table\" dim, tableName cyan\n const tableMatch = node.name.match(/^table\\s+(.+)$/);\n if (tableMatch?.[1]) {\n const tableName = tableMatch[1];\n formattedLabel = `${dim('table')} ${cyan(tableName)}`;\n } else {\n formattedLabel = dim(node.name);\n }\n break;\n }\n case 'columns':\n labelColor = dim;\n formattedLabel = labelColor(node.name);\n break;\n case 'column': {\n // Parse column name format: \"columnName: contractType -> nativeType (nullability)\"\n // Color code: column name (cyan), contract type (default), native type (dim), nullability (dim)\n const columnMatch = node.name.match(/^([^:]+):\\s*(.+)$/);\n if (columnMatch?.[1] && columnMatch[2]) {\n const columnName = columnMatch[1];\n const rest = columnMatch[2];\n // Parse rest: \"contractType -> nativeType (nullability)\"\n // Match contract type (can contain /, @, etc.), arrow, native type, then nullability in parentheses\n const typeMatch = rest.match(/^([^\\s→]+)\\s*→\\s*([^\\s(]+)\\s*(\\([^)]+\\))$/);\n if (typeMatch?.[1] && typeMatch[2] && typeMatch[3]) {\n const contractType = typeMatch[1];\n const nativeType = typeMatch[2];\n const nullability = typeMatch[3];\n formattedLabel = `${cyan(columnName)}: ${contractType} → ${dim(nativeType)} ${dim(nullability)}`;\n } else {\n // Fallback if format doesn't match (e.g., no native type or no nullability)\n formattedLabel = `${cyan(columnName)}: ${rest}`;\n }\n } else {\n formattedLabel = node.name;\n }\n break;\n }\n case 'type':\n case 'nullability':\n labelColor = (text) => text; // Default color\n formattedLabel = labelColor(node.name);\n break;\n case 'primaryKey': {\n // Parse \"primary key: columnName\" format - color \"primary key\" dim, columnName cyan\n const pkMatch = node.name.match(/^primary key:\\s*(.+)$/);\n if (pkMatch?.[1]) {\n const columnNames = pkMatch[1];\n formattedLabel = `${dim('primary key')}: ${cyan(columnNames)}`;\n } else {\n formattedLabel = dim(node.name);\n }\n break;\n }\n case 'foreignKey':\n case 'unique':\n case 'index':\n labelColor = dim;\n formattedLabel = labelColor(node.name);\n break;\n case 'dependency': {\n // Parse specific extension message formats\n // \"database is postgres\" -> dim \"database is\", cyan \"postgres\"\n const dbMatch = node.name.match(/^database is\\s+(.+)$/);\n if (dbMatch?.[1]) {\n const dbName = dbMatch[1];\n formattedLabel = `${dim('database is')} ${cyan(dbName)}`;\n } else {\n // \"vector extension is enabled\" -> dim everything except extension name\n // Match pattern: \"extensionName extension is enabled\"\n const extMatch = node.name.match(/^([^\\s]+)\\s+(extension is enabled)$/);\n if (extMatch?.[1] && extMatch[2]) {\n const extName = extMatch[1];\n const rest = extMatch[2];\n formattedLabel = `${cyan(extName)} ${dim(rest)}`;\n } else {\n // Fallback: color entire name with magenta\n labelColor = magenta;\n formattedLabel = labelColor(node.name);\n }\n }\n break;\n }\n default:\n formattedLabel = node.name;\n break;\n }\n } else {\n formattedLabel = node.name;\n }\n\n const statusGlyphColored = statusColor(statusGlyph);\n\n // Build the label with optional message for failure/warn nodes\n let nodeLabel = formattedLabel;\n if (\n (node.status === 'fail' || node.status === 'warn') &&\n node.message &&\n node.message.length > 0\n ) {\n // Always show message for failure/warn nodes - it provides crucial context\n // For parent nodes, the message summarizes child failures\n // For leaf nodes, the message explains the specific issue\n const messageText = formatDimText(`(${node.message})`);\n nodeLabel = `${formattedLabel} ${messageText}`;\n }\n\n // Root node renders without tree characters or | prefix\n // Root node renders without tree characters or prefix\n if (isRoot) {\n lines.push(`${statusGlyphColored} ${nodeLabel}`);\n } else {\n const treeChar = isLast ? '└' : '├';\n const treePrefix = `${formatDimText(treeChar)}─ `;\n lines.push(`${prefix}${treePrefix}${statusGlyphColored} ${nodeLabel}`);\n }\n\n // Render children if present\n if (node.children && node.children.length > 0) {\n const childPrefix = isRoot ? '' : `${prefix}${isLast ? ' ' : `${formatDimText('│')} `}`;\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (!child) continue;\n const isLastChild = i === node.children.length - 1;\n const childLines = renderSchemaVerificationTree(child, flags, {\n isLast: isLastChild,\n prefix: childPrefix,\n useColor,\n formatDimText,\n isRoot: false,\n });\n lines.push(...childLines);\n }\n }\n\n return lines;\n}\n\n/**\n * Formats human-readable output for database schema verification.\n */\nexport function formatSchemaVerifyOutput(\n result: VerifyDatabaseSchemaResult,\n flags: GlobalFlags,\n): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatRed = createColorFormatter(useColor, red);\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n // Render verification tree first\n const treeLines = renderSchemaVerificationTree(result.schema.root, flags, {\n isLast: true,\n prefix: '',\n useColor,\n formatDimText,\n isRoot: true,\n });\n lines.push(...treeLines);\n\n // Add counts and timings in verbose mode\n if (isVerbose(flags, 1)) {\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n lines.push(\n `${formatDimText(` pass=${result.schema.counts.pass} warn=${result.schema.counts.warn} fail=${result.schema.counts.fail}`)}`,\n );\n }\n\n // Blank line before summary\n lines.push('');\n\n // Summary line at the end: summary with status glyph\n if (result.ok) {\n lines.push(`${formatGreen('✔')} ${result.summary}`);\n } else {\n const codeText = result.code ? ` (${result.code})` : '';\n lines.push(`${formatRed('✖')} ${result.summary}${codeText}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database schema verification.\n */\nexport function formatSchemaVerifyJson(result: VerifyDatabaseSchemaResult): string {\n return JSON.stringify(result, null, 2);\n}\n\n// ============================================================================\n// Sign Output Formatters\n// ============================================================================\n\n/**\n * Formats human-readable output for database sign.\n */\nexport function formatSignOutput(result: SignDatabaseResult, flags: GlobalFlags): string {\n if (flags.quiet) {\n return '';\n }\n\n const lines: string[] = [];\n\n const useColor = flags.color !== false;\n const formatGreen = createColorFormatter(useColor, green);\n const formatDimText = (text: string) => formatDim(useColor, text);\n\n if (result.ok) {\n // Main success message in white (not dimmed)\n lines.push(`${formatGreen('✔')} Database signed`);\n\n // Show from -> to hashes with clear labels\n const previousHash = result.marker.previous?.storageHash ?? 'none';\n const currentHash = result.contract.storageHash;\n\n lines.push(`${formatDimText(` from: ${previousHash}`)}`);\n lines.push(`${formatDimText(` to: ${currentHash}`)}`);\n\n if (isVerbose(flags, 1)) {\n if (result.contract.profileHash) {\n lines.push(`${formatDimText(` profileHash: ${result.contract.profileHash}`)}`);\n }\n if (result.marker.previous?.profileHash) {\n lines.push(\n `${formatDimText(` previous profileHash: ${result.marker.previous.profileHash}`)}`,\n );\n }\n lines.push(`${formatDimText(` Total time: ${result.timings.total}ms`)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Formats JSON output for database sign.\n */\nexport function formatSignJson(result: SignDatabaseResult): string {\n return JSON.stringify(result, null, 2);\n}\n"],"mappings":";;;;;;;AAgDA,SAAgB,mBACd,QACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,eAAe,qBAAqB,UAAU,OAAO;CAC3D,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CACjE,MAAM,mBACJ,OAAO,SAAS,SACZ,kBAAkB,OAAO,QAAQ,SAAS,cAAc,kBACxD;CAEN,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,UAAU;CACnD,MAAM,KAAK,GAAG,cAAc,mBAAmB,mBAAmB,GAAG;CACrE,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;CAC/E,IAAI,OAAO,SAAS,aAClB,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;CAEjF,IAAI,OAAO,SAAS,UAAU,OAAO,UAAU,UAAU,OAAO,EAAE,EAChE,MAAM,KACJ,GAAG,cAAc,kBAAkB,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,OAAO,GACpI;CAEH,IAAI,OAAO,SAAS;EAClB,MAAM,KAAK,GAAG;EACd,MAAM,KAAK,GAAG,aAAa,IAAI,CAAC,GAAG,OAAO,UAAU;;CAGtD,IAAI,UAAU,OAAO,EAAE,EAAE;EACvB,IAAI,OAAO,sBACT,MAAM,KACJ,GAAG,cAAc,sEAAsE,GACxF;EAEH,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;;CAG3E,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,iBAAiB,QAA8C;CAC7E,MAAM,SAAS;EACb,IAAI,OAAO;EACX,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,UAAU,OAAO;EACjB,GAAG,UAAU,UAAU,OAAO,OAAO;EACrC,QAAQ,OAAO;EACf,GAAG,UAAU,iBAAiB,OAAO,cAAc;EACnD,GAAG,UAAU,wBAAwB,OAAO,qBAAqB;EACjE,GAAG,UAAU,UAAU,OAAO,OAAO;EACrC,GAAG,UAAU,WAAW,OAAO,QAAQ;EACvC,GAAG,UAAU,QAAQ,OAAO,KAAK;EACjC,SAAS,OAAO;EACjB;CAED,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;AAMxC,SAAgB,qBAAqB,QAAiD;CACpF,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;;AAOxC,SAAS,iBACP,MACA,OACA,SAOU;CACV,MAAM,EAAE,QAAQ,QAAQ,UAAU,eAAe,SAAS,UAAU;CACpE,MAAM,QAAkB,EAAE;CAG1B,IAAI,iBAAyB,KAAK;CAElC,IAAI,UACF,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,iBAAiB,KAAK,KAAK,MAAM;GACjC;EACF,KAAK,UAAU;GAEb,MAAM,aAAa,KAAK,MAAM,MAAM,iBAAiB;GACrD,IAAI,aAAa,IAAI;IACnB,MAAM,YAAY,WAAW;IAC7B,iBAAiB,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,UAAU;UAGnD,iBAAiB,KAAK,KAAK,MAAM;GAEnC;;EAEF,KAAK;GAEH,iBAAiB,IAAI,KAAK,MAAM;GAChC;EAEF,KAAK,SAAS;GAGZ,MAAM,cAAc,KAAK,MAAM,MAAM,oBAAoB;GACzD,IAAI,cAAc,MAAM,YAAY,IAAI;IACtC,MAAM,aAAa,YAAY;IAC/B,MAAM,OAAO,YAAY;IAEzB,MAAM,YAAY,KAAK,MAAM,4BAA4B;IACzD,IAAI,YAAY,MAAM,UAAU,IAAI;KAClC,MAAM,cAAc,UAAU;KAC9B,MAAM,cAAc,UAAU;KAC9B,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI,YAAY,GAAG,IAAI,YAAY;WAGxE,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI;UAG3C,iBAAiB,KAAK;GAExB;;EAEF,KAAK,SAAS;GAGZ,MAAM,UAAU,KAAK,MAAM,MAAM,wBAAwB;GACzD,IAAI,UAAU,IAAI;IAChB,MAAM,cAAc,QAAQ;IAC5B,iBAAiB,GAAG,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY;UACvD;IAEL,MAAM,cAAc,KAAK,MAAM,MAAM,kBAAkB;IACvD,IAAI,cAAc,IAAI;KACpB,MAAM,OAAO,YAAY;KACzB,iBAAiB,GAAG,IAAI,SAAS,CAAC,GAAG,KAAK,KAAK;WAC1C;KAEL,MAAM,aAAa,KAAK,MAAM,MAAM,6BAA6B;KACjE,IAAI,aAAa,IAAI;MACnB,MAAM,cAAc,WAAW,KAAK,GAAG,IAAI,SAAS,CAAC,KAAK;MAC1D,MAAM,OAAO,WAAW;MACxB,iBAAiB,GAAG,cAAc,IAAI,QAAQ,CAAC,GAAG,KAAK,KAAK;YAE5D,iBAAiB,IAAI,KAAK,MAAM;;;GAItC;;EAEF,KAAK,cAAc;GAGjB,MAAM,WAAW,KAAK,MAAM,MAAM,sCAAsC;GACxE,IAAI,WAAW,MAAM,SAAS,IAAI;IAChC,MAAM,UAAU,SAAS;IACzB,MAAM,OAAO,SAAS;IACtB,iBAAiB,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK;UAG9C,iBAAiB,QAAQ,KAAK,MAAM;GAEtC;;EAEF;GACE,iBAAiB,KAAK;GACtB;;CAKN,IAAI,QACF,MAAM,KAAK,eAAe;MACrB;EAEL,MAAM,aAAa,GAAG,cADL,SAAS,MAAM,IACa,CAAC;EAC9C,MAAM,KAAK,GAAG,SAAS,aAAa,iBAAiB;;CAIvD,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;EAC7C,MAAM,cAAc,SAAS,KAAK,GAAG,SAAS,SAAS,QAAQ,GAAG,cAAc,IAAI,CAAC;EACrF,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;GAC7C,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GAEZ,MAAM,aAAa,iBAAiB,OAAO,OAAO;IAChD,QAFkB,MAAM,KAAK,SAAS,SAAS;IAG/C,QAAQ;IACR;IACA;IACA,QAAQ;IACT,CAAC;GACF,MAAM,KAAK,GAAG,WAAW;;;CAI7B,OAAO;;;;;AAMT,SAAgB,uBACd,QACA,YACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAEjE,IAAI,YAAY;EAEd,MAAM,YAAY,iBAAiB,WAAW,MAAM,OAAO;GACzD,QAAQ;GACR,QAAQ;GACR;GACA;GACA,QAAQ;GACT,CAAC;EACF,MAAM,KAAK,GAAG,UAAU;QACnB;EAEL,MAAM,KAAK,KAAK,OAAO,UAAU;EACjC,IAAI,UAAU,OAAO,EAAE,EAAE;GACvB,MAAM,KAAK,aAAa,OAAO,OAAO,SAAS,GAAG,OAAO,OAAO,KAAK;GACrE,IAAI,OAAO,MAAM,OACf,MAAM,KAAK,eAAe,OAAO,KAAK,QAAQ;;;CAMpD,IAAI,UAAU,OAAO,EAAE,EACrB,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;CAG3E,OAAO,MAAM,KAAK,KAAK;;;;;;AAOzB,SAAS,6BACP,MACA,OACA,SAOU;CACV,MAAM,EAAE,QAAQ,QAAQ,UAAU,eAAe,SAAS,UAAU;CACpE,MAAM,QAAkB,EAAE;CAG1B,IAAI,cAAc;CAClB,IAAI,eAAyC,SAAS;CACtD,IAAI,UACF,QAAQ,KAAK,QAAb;EACE,KAAK;GACH,cAAc;GACd,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd,eAAe,SAAU,WAAW,OAAO,KAAK,GAAG;GACnD;EACF,KAAK;GACH,cAAc;GACd,cAAc;GACd;;MAGJ,QAAQ,KAAK,QAAb;EACE,KAAK;GACH,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd;EACF,KAAK;GACH,cAAc;GACd;;CAMN,IAAI,cAAwC,SAAS;CACrD,IAAI,iBAAyB,KAAK;CAElC,IAAI,UACF,QAAQ,KAAK,MAAb;EACE,KAAK;EACL,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,SAAS;GAEZ,MAAM,aAAa,KAAK,KAAK,MAAM,iBAAiB;GACpD,IAAI,aAAa,IAAI;IACnB,MAAM,YAAY,WAAW;IAC7B,iBAAiB,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,UAAU;UAEnD,iBAAiB,IAAI,KAAK,KAAK;GAEjC;;EAEF,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,UAAU;GAGb,MAAM,cAAc,KAAK,KAAK,MAAM,oBAAoB;GACxD,IAAI,cAAc,MAAM,YAAY,IAAI;IACtC,MAAM,aAAa,YAAY;IAC/B,MAAM,OAAO,YAAY;IAGzB,MAAM,YAAY,KAAK,MAAM,4CAA4C;IACzE,IAAI,YAAY,MAAM,UAAU,MAAM,UAAU,IAAI;KAClD,MAAM,eAAe,UAAU;KAC/B,MAAM,aAAa,UAAU;KAC7B,MAAM,cAAc,UAAU;KAC9B,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI,aAAa,KAAK,IAAI,WAAW,CAAC,GAAG,IAAI,YAAY;WAG9F,iBAAiB,GAAG,KAAK,WAAW,CAAC,IAAI;UAG3C,iBAAiB,KAAK;GAExB;;EAEF,KAAK;EACL,KAAK;GACH,cAAc,SAAS;GACvB,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,cAAc;GAEjB,MAAM,UAAU,KAAK,KAAK,MAAM,wBAAwB;GACxD,IAAI,UAAU,IAAI;IAChB,MAAM,cAAc,QAAQ;IAC5B,iBAAiB,GAAG,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY;UAE5D,iBAAiB,IAAI,KAAK,KAAK;GAEjC;;EAEF,KAAK;EACL,KAAK;EACL,KAAK;GACH,aAAa;GACb,iBAAiB,WAAW,KAAK,KAAK;GACtC;EACF,KAAK,cAAc;GAGjB,MAAM,UAAU,KAAK,KAAK,MAAM,uBAAuB;GACvD,IAAI,UAAU,IAAI;IAChB,MAAM,SAAS,QAAQ;IACvB,iBAAiB,GAAG,IAAI,cAAc,CAAC,GAAG,KAAK,OAAO;UACjD;IAGL,MAAM,WAAW,KAAK,KAAK,MAAM,sCAAsC;IACvE,IAAI,WAAW,MAAM,SAAS,IAAI;KAChC,MAAM,UAAU,SAAS;KACzB,MAAM,OAAO,SAAS;KACtB,iBAAiB,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,KAAK;WACzC;KAEL,aAAa;KACb,iBAAiB,WAAW,KAAK,KAAK;;;GAG1C;;EAEF;GACE,iBAAiB,KAAK;GACtB;;MAGJ,iBAAiB,KAAK;CAGxB,MAAM,qBAAqB,YAAY,YAAY;CAGnD,IAAI,YAAY;CAChB,KACG,KAAK,WAAW,UAAU,KAAK,WAAW,WAC3C,KAAK,WACL,KAAK,QAAQ,SAAS,GACtB;EAIA,MAAM,cAAc,cAAc,IAAI,KAAK,QAAQ,GAAG;EACtD,YAAY,GAAG,eAAe,GAAG;;CAKnC,IAAI,QACF,MAAM,KAAK,GAAG,mBAAmB,GAAG,YAAY;MAC3C;EAEL,MAAM,aAAa,GAAG,cADL,SAAS,MAAM,IACa,CAAC;EAC9C,MAAM,KAAK,GAAG,SAAS,aAAa,mBAAmB,GAAG,YAAY;;CAIxE,IAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;EAC7C,MAAM,cAAc,SAAS,KAAK,GAAG,SAAS,SAAS,QAAQ,GAAG,cAAc,IAAI,CAAC;EACrF,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;GAC7C,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,CAAC,OAAO;GAEZ,MAAM,aAAa,6BAA6B,OAAO,OAAO;IAC5D,QAFkB,MAAM,KAAK,SAAS,SAAS;IAG/C,QAAQ;IACR;IACA;IACA,QAAQ;IACT,CAAC;GACF,MAAM,KAAK,GAAG,WAAW;;;CAI7B,OAAO;;;;;AAMT,SAAgB,yBACd,QACA,OACQ;CACR,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,YAAY,qBAAqB,UAAU,IAAI;CACrD,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAGjE,MAAM,YAAY,6BAA6B,OAAO,OAAO,MAAM,OAAO;EACxE,QAAQ;EACR,QAAQ;EACR;EACA;EACA,QAAQ;EACT,CAAC;CACF,MAAM,KAAK,GAAG,UAAU;CAGxB,IAAI,UAAU,OAAO,EAAE,EAAE;EACvB,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;EACzE,MAAM,KACJ,GAAG,cAAc,UAAU,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,OAAO,OAAO,GAC5H;;CAIH,MAAM,KAAK,GAAG;CAGd,IAAI,OAAO,IACT,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,GAAG,OAAO,UAAU;MAC9C;EACL,MAAM,WAAW,OAAO,OAAO,KAAK,OAAO,KAAK,KAAK;EACrD,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,GAAG,OAAO,UAAU,WAAW;;CAG9D,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,uBAAuB,QAA4C;CACjF,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE;;;;;AAUxC,SAAgB,iBAAiB,QAA4B,OAA4B;CACvF,IAAI,MAAM,OACR,OAAO;CAGT,MAAM,QAAkB,EAAE;CAE1B,MAAM,WAAW,MAAM,UAAU;CACjC,MAAM,cAAc,qBAAqB,UAAU,MAAM;CACzD,MAAM,iBAAiB,SAAiB,UAAU,UAAU,KAAK;CAEjE,IAAI,OAAO,IAAI;EAEb,MAAM,KAAK,GAAG,YAAY,IAAI,CAAC,kBAAkB;EAGjD,MAAM,eAAe,OAAO,OAAO,UAAU,eAAe;EAC5D,MAAM,cAAc,OAAO,SAAS;EAEpC,MAAM,KAAK,GAAG,cAAc,WAAW,eAAe,GAAG;EACzD,MAAM,KAAK,GAAG,cAAc,WAAW,cAAc,GAAG;EAExD,IAAI,UAAU,OAAO,EAAE,EAAE;GACvB,IAAI,OAAO,SAAS,aAClB,MAAM,KAAK,GAAG,cAAc,kBAAkB,OAAO,SAAS,cAAc,GAAG;GAEjF,IAAI,OAAO,OAAO,UAAU,aAC1B,MAAM,KACJ,GAAG,cAAc,2BAA2B,OAAO,OAAO,SAAS,cAAc,GAClF;GAEH,MAAM,KAAK,GAAG,cAAc,iBAAiB,OAAO,QAAQ,MAAM,IAAI,GAAG;;;CAI7E,OAAO,MAAM,KAAK,KAAK;;;;;AAMzB,SAAgB,eAAe,QAAoC;CACjE,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/cli",
3
- "version": "0.10.0-dev.9",
3
+ "version": "0.11.0",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -14,15 +14,15 @@
14
14
  "dependencies": {
15
15
  "@clack/prompts": "^1.3.0",
16
16
  "@dagrejs/dagre": "^3.0.0",
17
- "@prisma-next/config": "0.10.0-dev.9",
18
- "@prisma-next/contract": "0.10.0-dev.9",
19
- "@prisma-next/emitter": "0.10.0-dev.9",
20
- "@prisma-next/errors": "0.10.0-dev.9",
21
- "@prisma-next/framework-components": "0.10.0-dev.9",
22
- "@prisma-next/migration-tools": "0.10.0-dev.9",
23
- "@prisma-next/psl-printer": "0.10.0-dev.9",
24
- "@prisma-next/cli-telemetry": "0.10.0-dev.9",
25
- "@prisma-next/utils": "0.10.0-dev.9",
17
+ "@prisma-next/config": "0.11.0",
18
+ "@prisma-next/contract": "0.11.0",
19
+ "@prisma-next/emitter": "0.11.0",
20
+ "@prisma-next/errors": "0.11.0",
21
+ "@prisma-next/framework-components": "0.11.0",
22
+ "@prisma-next/migration-tools": "0.11.0",
23
+ "@prisma-next/psl-printer": "0.11.0",
24
+ "@prisma-next/cli-telemetry": "0.11.0",
25
+ "@prisma-next/utils": "0.11.0",
26
26
  "arktype": "^2.2.0",
27
27
  "c12": "^3.3.4",
28
28
  "ci-info": "^4.3.1",
@@ -39,14 +39,14 @@
39
39
  "wrap-ansi": "^10.0.0"
40
40
  },
41
41
  "devDependencies": {
42
- "@prisma-next/sql-contract": "0.10.0-dev.9",
43
- "@prisma-next/sql-contract-emitter": "0.10.0-dev.9",
44
- "@prisma-next/sql-contract-ts": "0.10.0-dev.9",
45
- "@prisma-next/sql-operations": "0.10.0-dev.9",
46
- "@prisma-next/sql-runtime": "0.10.0-dev.9",
47
- "@prisma-next/test-utils": "0.10.0-dev.9",
48
- "@prisma-next/tsconfig": "0.10.0-dev.9",
49
- "@prisma-next/tsdown": "0.10.0-dev.9",
42
+ "@prisma-next/sql-contract": "0.11.0",
43
+ "@prisma-next/sql-contract-emitter": "0.11.0",
44
+ "@prisma-next/sql-contract-ts": "0.11.0",
45
+ "@prisma-next/sql-operations": "0.11.0",
46
+ "@prisma-next/sql-runtime": "0.11.0",
47
+ "@prisma-next/test-utils": "0.11.0",
48
+ "@prisma-next/tsconfig": "0.11.0",
49
+ "@prisma-next/tsdown": "0.11.0",
50
50
  "@types/node": "24.10.4",
51
51
  "tsdown": "0.22.0",
52
52
  "typescript": "5.9.3",
package/src/cli.ts CHANGED
@@ -70,17 +70,18 @@ const program = new Command();
70
70
  program.name('prisma-next').description('Prisma Next CLI').version(packageJson.version);
71
71
 
72
72
  // Telemetry hook — fires at command start, before the action body
73
- // runs. Every failure mode is swallowed inside `runTelemetry`; the
74
- // hook never throws and never blocks long enough to be perceptible.
75
- //
76
- // Fire-and-forget: `fireTelemetryFromPreAction` `await`s a c12 config
77
- // load before forking the sender, so awaiting it here would block the
78
- // command's action body behind telemetry. Use `void` to dispatch in
79
- // parallel; the existing `.catch(() => {})` keeps errors swallowed.
73
+ // runs. Synchronous by construction: `fireTelemetryFromPreAction`
74
+ // resolves gates (cheap), then `fork()`s the detached sender. The
75
+ // fork is enqueued before the action body runs at all, so the child
76
+ // survives even when the action throws synchronously. The try/catch
77
+ // is defence-in-depth `runTelemetry` already swallows every failure
78
+ // mode internally and returns an outcome instead of throwing.
80
79
  program.hook('preAction', (_thisCommand, actionCommand) => {
81
- void fireTelemetryFromPreAction(actionCommand).catch(() => {
80
+ try {
81
+ fireTelemetryFromPreAction(actionCommand);
82
+ } catch {
82
83
  // defence-in-depth — runTelemetry already swallows internally.
83
- });
84
+ }
84
85
  });
85
86
 
86
87
  // Override version option description to match capitalization style
@@ -317,6 +318,32 @@ program.addCommand(dbCommand);
317
318
  program.addCommand(migrationCommand);
318
319
  program.addCommand(refCommand);
319
320
 
321
+ // Test-only hidden command used by `cli-telemetry`'s `cli-e2e.test.ts`
322
+ // to verify that telemetry still lands when a CLI command crashes
323
+ // mid-execution. The preAction hook is synchronous and `fork()`s the
324
+ // detached sender before this action body runs; the small sleep
325
+ // gives the IPC `child.send()` a tick to flush before the throw
326
+ // triggers commander's `exitOverride` and `process.exit(1)`. Hidden
327
+ // from help; underscore prefix marks it as internal. Doesn't depend
328
+ // on any project state, so it runs in any tempdir.
329
+ //
330
+ // Gated behind `PRISMA_NEXT_ENABLE_TEST_COMMANDS=1` so the command is
331
+ // not even registered (and therefore not invocable) in shipped
332
+ // binaries. `hidden: true` only filters the help output; without this
333
+ // env gate the command would still be callable from production. The
334
+ // e2e suite sets the env var when it spawns the CLI.
335
+ const TELEMETRY_CRASH_TEST_SLEEP_MS = 200;
336
+ if (process.env['PRISMA_NEXT_ENABLE_TEST_COMMANDS'] === '1') {
337
+ const telemetryCrashTestCommand = new Command('__telemetry-crash-test')
338
+ .description('Internal: deliberately throw for the telemetry e2e suite.')
339
+ .action(async () => {
340
+ await new Promise((settle) => setTimeout(settle, TELEMETRY_CRASH_TEST_SLEEP_MS));
341
+ throw new Error('__telemetry-crash-test: intentional crash for e2e coverage');
342
+ });
343
+ telemetryCrashTestCommand.configureHelp({ visibleCommands: () => [] });
344
+ program.addCommand(telemetryCrashTestCommand, { hidden: true });
345
+ }
346
+
320
347
  // Create help command
321
348
  const helpCommand = new Command('help')
322
349
  .description('Show usage instructions')
@@ -20,10 +20,10 @@ import {
20
20
  } from '../utils/formatters/emit';
21
21
  import { formatStyledHeader, formatSuccessMessage } from '../utils/formatters/styled';
22
22
  import type { CommonCommandOptions } from '../utils/global-flags';
23
- import { type GlobalFlags, parseGlobalFlags } from '../utils/global-flags';
23
+ import { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';
24
24
  import { createProgressAdapter } from '../utils/progress-adapter';
25
25
  import { handleResult } from '../utils/result-handler';
26
- import { TerminalUI } from '../utils/terminal-ui';
26
+ import { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';
27
27
 
28
28
  interface ContractEmitOptions extends CommonCommandOptions {
29
29
  readonly config?: string;
@@ -159,8 +159,8 @@ export function createContractEmitCommand(): Command {
159
159
  addGlobalOptions(command)
160
160
  .option('--config <path>', 'Path to prisma-next.config.ts')
161
161
  .action(async (options: ContractEmitOptions) => {
162
- const flags = parseGlobalFlags(options);
163
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
162
+ const flags = parseGlobalFlagsOrExit(options);
163
+ const ui = createTerminalUI(flags);
164
164
  const startTime = Date.now();
165
165
 
166
166
  const result = await executeContractEmitCommand(options, flags, ui, startTime);
@@ -10,9 +10,9 @@ import {
10
10
  setCommandDescriptions,
11
11
  setCommandExamples,
12
12
  } from '../utils/command-helpers';
13
- import { parseGlobalFlags } from '../utils/global-flags';
13
+ import { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';
14
14
  import { handleResult } from '../utils/result-handler';
15
- import { TerminalUI } from '../utils/terminal-ui';
15
+ import { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';
16
16
  import { resolveContractInferOutputPath } from './contract-infer-paths';
17
17
  import {
18
18
  type InspectLiveSchemaOptions,
@@ -39,10 +39,10 @@ interface ContractInferSuccessResult {
39
39
 
40
40
  async function executeContractInferCommand(
41
41
  options: ContractInferOptions,
42
+ flags: GlobalFlags,
42
43
  ui: TerminalUI,
43
44
  startTime: number,
44
45
  ): Promise<Result<ContractInferSuccessResult, CliStructuredError>> {
45
- const flags = parseGlobalFlags(options);
46
46
  const inspectResult = await inspectLiveSchema(options, flags, ui, startTime, {
47
47
  commandName: 'contract infer',
48
48
  description: 'Infer a PSL contract from the live database schema',
@@ -112,11 +112,11 @@ export function createContractInferCommand(): Command {
112
112
  .option('--config <path>', 'Path to prisma-next.config.ts')
113
113
  .option('--output <path>', 'Write the inferred PSL contract to the specified path')
114
114
  .action(async (options: ContractInferOptions) => {
115
- const flags = parseGlobalFlags(options);
116
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
115
+ const flags = parseGlobalFlagsOrExit(options);
116
+ const ui = createTerminalUI(flags);
117
117
  const startTime = Date.now();
118
118
 
119
- const result = await executeContractInferCommand(options, ui, startTime);
119
+ const result = await executeContractInferCommand(options, flags, ui, startTime);
120
120
  const exitCode = handleResult(result, flags, ui, (value) => {
121
121
  if (flags.json) {
122
122
  ui.output(JSON.stringify(value, null, 2));
@@ -24,13 +24,13 @@ import {
24
24
  formatMigrationPlanOutput,
25
25
  type MigrationCommandResult,
26
26
  } from '../utils/formatters/migrations';
27
- import { type GlobalFlags, parseGlobalFlags } from '../utils/global-flags';
27
+ import { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';
28
28
  import {
29
29
  addMigrationCommandOptions,
30
30
  prepareMigrationContext,
31
31
  } from '../utils/migration-command-scaffold';
32
32
  import { handleResult } from '../utils/result-handler';
33
- import { TerminalUI } from '../utils/terminal-ui';
33
+ import { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';
34
34
 
35
35
  type DbInitOptions = MigrationCommandOptions;
36
36
 
@@ -80,9 +80,17 @@ function mapDbInitFailure(failure: DbInitFailure): CliStructuredError {
80
80
  }
81
81
 
82
82
  if (failure.code === 'RUNNER_FAILED') {
83
+ const runnerCode =
84
+ typeof failure.meta?.['runnerErrorCode'] === 'string'
85
+ ? failure.meta['runnerErrorCode']
86
+ : undefined;
87
+ const fix =
88
+ runnerCode === 'LEGACY_MARKER_SHAPE'
89
+ ? 'Legacy marker-table shape detected. Drop `prisma_contract.marker` (Postgres) or `_prisma_marker` (SQLite) and re-run `prisma-next db init` to recreate it with the current per-space schema.'
90
+ : 'Fix the schema mismatch (db init is additive-only), or drop/reset the database and re-run `prisma-next db init`';
83
91
  return errorRunnerFailed(failure.summary, {
84
92
  why: failure.why ?? 'Migration runner failed',
85
- fix: 'Fix the schema mismatch (db init is additive-only), or drop/reset the database and re-run `prisma-next db init`',
93
+ fix,
86
94
  ...(failure.meta
87
95
  ? { meta: { code: 'RUNNER_FAILED', ...failure.meta } }
88
96
  : { meta: { code: 'RUNNER_FAILED' } }),
@@ -222,10 +230,10 @@ export function createDbInitCommand(): Command {
222
230
  ]);
223
231
  addMigrationCommandOptions(command);
224
232
  command.action(async (options: DbInitOptions) => {
225
- const flags = parseGlobalFlags(options);
233
+ const flags = parseGlobalFlagsOrExit(options);
226
234
  const startTime = Date.now();
227
235
 
228
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
236
+ const ui = createTerminalUI(flags);
229
237
 
230
238
  const result = await executeDbInitCommand(options, flags, ui, startTime);
231
239
 
@@ -6,9 +6,9 @@ import {
6
6
  setCommandExamples,
7
7
  } from '../utils/command-helpers';
8
8
  import { formatIntrospectJson, formatIntrospectOutput } from '../utils/formatters/verify';
9
- import { parseGlobalFlags } from '../utils/global-flags';
9
+ import { parseGlobalFlagsOrExit } from '../utils/global-flags';
10
10
  import { handleResult } from '../utils/result-handler';
11
- import { TerminalUI } from '../utils/terminal-ui';
11
+ import { createTerminalUI } from '../utils/terminal-ui';
12
12
  import {
13
13
  type InspectLiveSchemaOptions,
14
14
  type InspectLiveSchemaResult,
@@ -46,8 +46,8 @@ export function createDbSchemaCommand(): Command {
46
46
  .option('--db <url>', 'Database connection string')
47
47
  .option('--config <path>', 'Path to prisma-next.config.ts')
48
48
  .action(async (options: InspectLiveSchemaOptions) => {
49
- const flags = parseGlobalFlags(options);
50
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
49
+ const flags = parseGlobalFlagsOrExit(options);
50
+ const ui = createTerminalUI(flags);
51
51
  const startTime = Date.now();
52
52
 
53
53
  const result = await inspectLiveSchema(options, flags, ui, startTime, {
@@ -40,10 +40,10 @@ import {
40
40
  formatSignOutput,
41
41
  } from '../utils/formatters/verify';
42
42
  import type { CommonCommandOptions } from '../utils/global-flags';
43
- import { type GlobalFlags, parseGlobalFlags } from '../utils/global-flags';
43
+ import { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';
44
44
  import { createProgressAdapter } from '../utils/progress-adapter';
45
45
  import { handleResult } from '../utils/result-handler';
46
- import { TerminalUI } from '../utils/terminal-ui';
46
+ import { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';
47
47
 
48
48
  interface DbSignOptions extends CommonCommandOptions {
49
49
  readonly db?: string;
@@ -270,7 +270,7 @@ export function createDbSignCommand(): Command {
270
270
  'Contract reference (hash, prefix, ref name, migration dir name, <dir>^, or ./path)',
271
271
  )
272
272
  .action(async (positionalContract: string | undefined, options: DbSignOptions) => {
273
- const flags = parseGlobalFlags(options);
273
+ const flags = parseGlobalFlagsOrExit(options);
274
274
 
275
275
  if (positionalContract && options.contract) {
276
276
  process.stderr.write(
@@ -280,7 +280,7 @@ export function createDbSignCommand(): Command {
280
280
  return;
281
281
  }
282
282
 
283
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
283
+ const ui = createTerminalUI(flags);
284
284
 
285
285
  const result = await executeDbSignCommand(positionalContract, options, flags, ui);
286
286
 
@@ -33,13 +33,13 @@ import {
33
33
  formatMigrationPlanOutput,
34
34
  type MigrationCommandResult,
35
35
  } from '../utils/formatters/migrations';
36
- import { type GlobalFlags, parseGlobalFlags } from '../utils/global-flags';
36
+ import { type GlobalFlags, parseGlobalFlagsOrExit } from '../utils/global-flags';
37
37
  import {
38
38
  addMigrationCommandOptions,
39
39
  prepareMigrationContext,
40
40
  } from '../utils/migration-command-scaffold';
41
41
  import { handleResult } from '../utils/result-handler';
42
- import { TerminalUI } from '../utils/terminal-ui';
42
+ import { createTerminalUI, type TerminalUI } from '../utils/terminal-ui';
43
43
 
44
44
  interface DbUpdateOptions extends MigrationCommandOptions {
45
45
  readonly to?: string;
@@ -54,9 +54,17 @@ function mapDbUpdateFailure(failure: DbUpdateFailure): CliStructuredError {
54
54
  }
55
55
 
56
56
  if (failure.code === 'RUNNER_FAILED') {
57
+ const runnerCode =
58
+ typeof failure.meta?.['runnerErrorCode'] === 'string'
59
+ ? failure.meta['runnerErrorCode']
60
+ : undefined;
61
+ const fix =
62
+ runnerCode === 'LEGACY_MARKER_SHAPE'
63
+ ? 'Legacy marker-table shape detected. Drop `prisma_contract.marker` (Postgres) or `_prisma_marker` (SQLite) and re-run `prisma-next db init` to recreate it with the current per-space schema.'
64
+ : 'Inspect the reported conflict, reconcile schema drift if needed, then re-run `prisma-next db update`';
57
65
  return errorRunnerFailed(failure.summary, {
58
66
  why: failure.why ?? 'Migration runner failed',
59
- fix: 'Inspect the reported conflict, reconcile schema drift if needed, then re-run `prisma-next db update`',
67
+ fix,
60
68
  ...ifDefined('meta', failure.meta),
61
69
  });
62
70
  }
@@ -238,10 +246,10 @@ export function createDbUpdateCommand(): Command {
238
246
  'Target contract reference (hash, prefix, ref name, migration dir name, <dir>^, or ./path)',
239
247
  );
240
248
  command.action(async (options: DbUpdateOptions) => {
241
- const flags = parseGlobalFlags(options);
249
+ const flags = parseGlobalFlagsOrExit(options);
242
250
  const startTime = Date.now();
243
251
 
244
- const ui = new TerminalUI({ color: flags.color, interactive: flags.interactive });
252
+ const ui = createTerminalUI(flags);
245
253
 
246
254
  let result = await executeDbUpdateCommand(options, flags, ui, startTime);
247
255