@prisma-next/core-control-plane 0.3.0-dev.84 → 0.3.0-dev.85

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.
package/dist/errors.d.mts CHANGED
@@ -102,6 +102,7 @@ declare function errorFileNotFound(filePath: string, options?: {
102
102
  declare function errorDatabaseConnectionRequired(options?: {
103
103
  readonly why?: string;
104
104
  readonly commandName?: string;
105
+ readonly retryCommand?: string;
105
106
  }): CliStructuredError;
106
107
  /**
107
108
  * Query runner factory is required but not provided in config.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.mts","names":[],"sources":["../src/errors.ts"],"sourcesContent":[],"mappings":";;;;;;AAOA;AAqBA;AAUa,UA/BI,gBAAA,CA+Be;EAYf,SAAA,EAAA,EAAA,KAAA;EAYK,SAAA,IAAA,EAAA,MAAA;EAwBN,SAAA,MAAA,EAAA,MAAA;EAoBsB,SAAA,QAAA,EAAA,OAAA,GAAA,MAAA,GAAA,MAAA;EApEE,SAAA,OAAA,EAAA,MAAA;EAAK,SAAA,GAAA,EAAA,MAAA,GAAA,SAAA;EAyF7B,SAAA,GAAA,EAAA,MAAA,GAAA,SAAuB;EAkBvB,SAAA,KAAA,EAAA;IAcA,SAAA,IAAA,EAAA,MAAA,GAAA,SAA6B;IAkB7B,SAAA,IAAA,EAAA,MAAiB,GAAA,SAO9B;EAaa,CAAA,GAAA,SAAA;EAiBA,SAAA,IAAA,EAjMC,MAiMD,CAAA,MAAA,EAAA,OAA+B,CAAA,GAAA,SAE3C;EAYY,SAAA,OAAA,EAAA,MAAA,GAAA,SAAgC;AAchD;AAoBA;AAYA;AAuBA;AA6BgB,UA1SC,gBAAA,CA0SD;EAcA,SAAA,IAAA,EAAA,MAAA;EAqBA,SAAA,OAAA,EAAA,MAAkB;EAclB,SAAA,GAAA,CAAA,EAAA,MAAiB;AAuBjC;AAqBA;AAeA;;;AAII,cAhZS,kBAAA,SAA2B,KAAA,CAgZpC;EAAkB,SAAA,IAAA,EAAA,MAAA;EAeN,SAAA,MAAA,EAAA,KAAiB,GAAA,KAAA;EAiBpB,SAAA,QAAA,EAAA,OAAA,GAAA,MAA8B,GAAA,MAAA;EAK3B,SAAA,GAAA,EAAA,MAAA,GAAA,SAAuB;EAmBvB,SAAA,GAAA,EAAA,MAAY,GAAA,SAKR;EAkBJ,SAAA,KAAA,EAAA;;;;iBAndC;;;;;;;;;;;oBAYK;;;;;;gBAwBN;;;;;sCAoBsB;;;;;iBAqBtB,uBAAA;;IAKb;;;;iBAaa,0BAAA;;IAEZ;;;;iBAYY,6BAAA;;;;;IAKb;;;;iBAaa,iBAAA;;;;IAOb;;;;iBAaa,+BAAA;;;IAGZ;;;;iBAcY,+BAAA;;IAEZ;;;;iBAYY,gCAAA;;IAEZ;;;;iBAYY,2BAAA;;;;IAIZ;;;;iBAgBY,mBAAA;;IAA0D;;;;iBAY1D,kCAAA;;;IAGZ;;;;iBAoBY,4BAAA;+BACe;;IAE3B;;;;iBA0BY,gCAAA;;IAEZ;;;;iBAYY,qBAAA;;IAKb;;;;iBAgBa,kBAAA;;;IAGZ;;;;iBAWY,iBAAA;;;;IAIZ;;;;iBAmBY,mBAAA;;IAMb;;;;;iBAea,mBAAA;;;IAGZ;;;;;iBAYY,6BAAA;;+BAEe;6BACF;IACzB;;;;iBAeY,iBAAA;;;kBAKI;IAEjB;;cAUU,8BAAA;;;;iBAKG,uBAAA;;;kBAKI;IAEjB;;;;iBAYa,YAAA;;;kBAKI;IAEjB;;;;iBAgBa,eAAA;;;IAMb"}
1
+ {"version":3,"file":"errors.d.mts","names":[],"sources":["../src/errors.ts"],"sourcesContent":[],"mappings":";;;;;;AAOA;AAqBA;AAUa,UA/BI,gBAAA,CA+Be;EAYf,SAAA,EAAA,EAAA,KAAA;EAYK,SAAA,IAAA,EAAA,MAAA;EAwBN,SAAA,MAAA,EAAA,MAAA;EAoBsB,SAAA,QAAA,EAAA,OAAA,GAAA,MAAA,GAAA,MAAA;EApEE,SAAA,OAAA,EAAA,MAAA;EAAK,SAAA,GAAA,EAAA,MAAA,GAAA,SAAA;EAyF7B,SAAA,GAAA,EAAA,MAAA,GAAA,SAAuB;EAkBvB,SAAA,KAAA,EAAA;IAcA,SAAA,IAAA,EAAA,MAAA,GAAA,SAA6B;IAkB7B,SAAA,IAAA,EAAA,MAAiB,GAAA,SAO9B;EAaa,CAAA,GAAA,SAAA;EAoBA,SAAA,IAAA,EApMC,MAoMD,CAAA,MAAA,EAAA,OAA+B,CAAA,GAAA,SAE3C;EAYY,SAAA,OAAA,EAAA,MAAA,GAAA,SAAgC;AAchD;AAoBA;AAYA;AAuBA;AA6BgB,UA7SC,gBAAA,CA6SD;EAcA,SAAA,IAAA,EAAA,MAAA;EAqBA,SAAA,OAAA,EAAA,MAAkB;EAclB,SAAA,GAAA,CAAA,EAAA,MAAiB;AAuBjC;AAqBA;AAeA;;;AAII,cAnZS,kBAAA,SAA2B,KAAA,CAmZpC;EAAkB,SAAA,IAAA,EAAA,MAAA;EAeN,SAAA,MAAA,EAAA,KAAiB,GAAA,KAAA;EAiBpB,SAAA,QAAA,EAAA,OAAA,GAAA,MAA8B,GAAA,MAAA;EAK3B,SAAA,GAAA,EAAA,MAAA,GAAA,SAAuB;EAmBvB,SAAA,GAAA,EAAA,MAAY,GAAA,SAKR;EAkBJ,SAAA,KAAA,EAAA;;;;iBAtdC;;;;;;;;;;;oBAYK;;;;;;gBAwBN;;;;;sCAoBsB;;;;;iBAqBtB,uBAAA;;IAKb;;;;iBAaa,0BAAA;;IAEZ;;;;iBAYY,6BAAA;;;;;IAKb;;;;iBAaa,iBAAA;;;;IAOb;;;;iBAaa,+BAAA;;;;IAIZ;;;;iBAgBY,+BAAA;;IAEZ;;;;iBAYY,gCAAA;;IAEZ;;;;iBAYY,2BAAA;;;;IAIZ;;;;iBAgBY,mBAAA;;IAA0D;;;;iBAY1D,kCAAA;;;IAGZ;;;;iBAoBY,4BAAA;+BACe;;IAE3B;;;;iBA0BY,gCAAA;;IAEZ;;;;iBAYY,qBAAA;;IAKb;;;;iBAgBa,kBAAA;;;IAGZ;;;;iBAWY,iBAAA;;;;IAIZ;;;;iBAmBY,mBAAA;;IAMb;;;;;iBAea,mBAAA;;;IAGZ;;;;;iBAYY,6BAAA;;+BAEe;6BACF;IACzB;;;;iBAeY,iBAAA;;;kBAKI;IAEjB;;cAUU,8BAAA;;;;iBAKG,uBAAA;;;kBAKI;IAEjB;;;;iBAYa,YAAA;;;kBAKI;IAEjB;;;;iBAgBa,eAAA;;;IAMb"}
package/dist/errors.mjs CHANGED
@@ -107,7 +107,7 @@ function errorFileNotFound(filePath, options) {
107
107
  * Database connection is required but not provided.
108
108
  */
109
109
  function errorDatabaseConnectionRequired(options) {
110
- const runHint = options?.commandName ? `Run \`prisma-next ${options.commandName} --db <url>\`` : "Provide `--db <url>`";
110
+ const runHint = options?.retryCommand ? `Run \`${options.retryCommand}\`` : options?.commandName ? `Run \`prisma-next ${options.commandName} --db <url>\`` : "Provide `--db <url>`";
111
111
  return new CliStructuredError("4005", "Database connection is required", {
112
112
  domain: "CLI",
113
113
  why: options?.why ?? "Database connection is required for this command",
@@ -188,7 +188,7 @@ function errorMigrationPlanningFailed(options) {
188
188
  return new CliStructuredError("4020", "Migration planning failed", {
189
189
  domain: "CLI",
190
190
  why: computedWhy,
191
- fix: conflictFixes.length > 0 ? conflictFixes.join("\n") : "Use `db schema-verify` to inspect conflicts, or ensure the database is empty",
191
+ fix: conflictFixes.length > 0 ? conflictFixes.join("\n") : "Use `db verify --schema-only` to inspect conflicts, or ensure the database is empty",
192
192
  meta: { conflicts: options.conflicts },
193
193
  docsUrl: "https://prisma-next.dev/docs/cli/db-init"
194
194
  });
@@ -1 +1 @@
1
- {"version":3,"file":"errors.mjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { SchemaIssue, VerifyDatabaseSchemaResult } from './types';\n\n/**\n * CLI error envelope for output formatting.\n * This is the serialized form of a CliStructuredError.\n */\nexport interface CliErrorEnvelope {\n readonly ok: false;\n readonly code: string;\n readonly domain: string;\n readonly severity: 'error' | 'warn' | 'info';\n readonly summary: string;\n readonly why: string | undefined;\n readonly fix: string | undefined;\n readonly where:\n | {\n readonly path: string | undefined;\n readonly line: number | undefined;\n }\n | undefined;\n readonly meta: Record<string, unknown> | undefined;\n readonly docsUrl: string | undefined;\n}\n\n/**\n * Minimal conflict data structure expected by CLI output.\n */\nexport interface CliErrorConflict {\n readonly kind: string;\n readonly summary: string;\n readonly why?: string;\n}\n\n/**\n * Structured CLI error that contains all information needed for error envelopes.\n * Call sites throw these errors with full context.\n */\nexport class CliStructuredError extends Error {\n readonly code: string;\n readonly domain: 'CLI' | 'RTM';\n readonly severity: 'error' | 'warn' | 'info';\n readonly why: string | undefined;\n readonly fix: string | undefined;\n readonly where:\n | {\n readonly path: string | undefined;\n readonly line: number | undefined;\n }\n | undefined;\n readonly meta: Record<string, unknown> | undefined;\n readonly docsUrl: string | undefined;\n\n constructor(\n code: string,\n summary: string,\n options?: {\n readonly domain?: 'CLI' | 'RTM';\n readonly severity?: 'error' | 'warn' | 'info';\n readonly why?: string;\n readonly fix?: string;\n readonly where?: { readonly path?: string; readonly line?: number };\n readonly meta?: Record<string, unknown>;\n readonly docsUrl?: string;\n },\n ) {\n super(summary);\n this.name = 'CliStructuredError';\n this.code = code;\n this.domain = options?.domain ?? 'CLI';\n this.severity = options?.severity ?? 'error';\n this.why = options?.why;\n this.fix = options?.fix === options?.why ? undefined : options?.fix;\n this.where = options?.where\n ? {\n path: options.where.path,\n line: options.where.line,\n }\n : undefined;\n this.meta = options?.meta;\n this.docsUrl = options?.docsUrl;\n }\n\n /**\n * Converts this error to a CLI error envelope for output formatting.\n */\n toEnvelope(): CliErrorEnvelope {\n const codePrefix = this.domain === 'CLI' ? 'PN-CLI-' : 'PN-RTM-';\n return {\n ok: false as const,\n code: `${codePrefix}${this.code}`,\n domain: this.domain,\n severity: this.severity,\n summary: this.message,\n why: this.why,\n fix: this.fix,\n where: this.where,\n meta: this.meta,\n docsUrl: this.docsUrl,\n };\n }\n\n /**\n * Type guard to check if an error is a CliStructuredError.\n * Uses duck-typing to work across module boundaries where instanceof may fail.\n */\n static is(error: unknown): error is CliStructuredError {\n if (!(error instanceof Error)) {\n return false;\n }\n const candidate = error as CliStructuredError;\n return (\n candidate.name === 'CliStructuredError' &&\n typeof candidate.code === 'string' &&\n (candidate.domain === 'CLI' || candidate.domain === 'RTM') &&\n typeof candidate.toEnvelope === 'function'\n );\n }\n}\n\n// ============================================================================\n// Config Errors (PN-CLI-4001-4007)\n// ============================================================================\n\n/**\n * Config file not found or missing.\n */\nexport function errorConfigFileNotFound(\n configPath?: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4001', 'Config file not found', {\n domain: 'CLI',\n ...(options?.why ? { why: options.why } : { why: 'Config file not found' }),\n fix: \"Run 'prisma-next init' to create a config file\",\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n ...(configPath ? { where: { path: configPath } } : {}),\n });\n}\n\n/**\n * Contract configuration missing from config.\n */\nexport function errorContractConfigMissing(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4002', 'Contract configuration missing', {\n domain: 'CLI',\n why: options?.why ?? 'The contract configuration is required for emit',\n fix: 'Add contract configuration to your prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/contract-emit',\n });\n}\n\n/**\n * Contract validation failed.\n */\nexport function errorContractValidationFailed(\n reason: string,\n options?: {\n readonly where?: { readonly path?: string; readonly line?: number };\n },\n): CliStructuredError {\n return new CliStructuredError('4003', 'Contract validation failed', {\n domain: 'CLI',\n why: reason,\n fix: 'Re-run `prisma-next contract emit`, or fix the contract file and try again',\n docsUrl: 'https://prisma-next.dev/docs/contracts',\n ...(options?.where ? { where: options.where } : {}),\n });\n}\n\n/**\n * File not found.\n */\nexport function errorFileNotFound(\n filePath: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly docsUrl?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4004', 'File not found', {\n domain: 'CLI',\n why: options?.why ?? `File not found: ${filePath}`,\n fix: options?.fix ?? 'Check that the file path is correct',\n where: { path: filePath },\n ...(options?.docsUrl ? { docsUrl: options.docsUrl } : {}),\n });\n}\n\n/**\n * Database connection is required but not provided.\n */\nexport function errorDatabaseConnectionRequired(options?: {\n readonly why?: string;\n readonly commandName?: string;\n}): CliStructuredError {\n const runHint = options?.commandName\n ? `Run \\`prisma-next ${options.commandName} --db <url>\\``\n : 'Provide `--db <url>`';\n return new CliStructuredError('4005', 'Database connection is required', {\n domain: 'CLI',\n why: options?.why ?? 'Database connection is required for this command',\n fix: `${runHint}, or set \\`db: { connection: \"postgres://…\" }\\` in prisma-next.config.ts`,\n });\n}\n\n/**\n * Query runner factory is required but not provided in config.\n */\nexport function errorQueryRunnerFactoryRequired(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4006', 'Query runner factory is required', {\n domain: 'CLI',\n why: options?.why ?? 'Config.db.queryRunnerFactory is required for db verify',\n fix: 'Add db.queryRunnerFactory to prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-verify',\n });\n}\n\n/**\n * Family verify.readMarker is required but not provided.\n */\nexport function errorFamilyReadMarkerSqlRequired(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4007', 'Family readMarker() is required', {\n domain: 'CLI',\n why: options?.why ?? 'Family verify.readMarker is required for db verify',\n fix: 'Ensure family.verify.readMarker() is exported by your family package',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-verify',\n });\n}\n\n/**\n * JSON output format not supported.\n */\nexport function errorJsonFormatNotSupported(options: {\n readonly command: string;\n readonly format: string;\n readonly supportedFormats: readonly string[];\n}): CliStructuredError {\n return new CliStructuredError('4008', 'Unsupported JSON format', {\n domain: 'CLI',\n why: `The ${options.command} command does not support --json ${options.format}`,\n fix: `Use --json ${options.supportedFormats.join(' or ')}, or omit --json for human output`,\n meta: {\n command: options.command,\n format: options.format,\n supportedFormats: options.supportedFormats,\n },\n });\n}\n\n/**\n * Driver is required for DB-connected commands but not provided.\n */\nexport function errorDriverRequired(options?: { readonly why?: string }): CliStructuredError {\n return new CliStructuredError('4010', 'Driver is required for DB-connected commands', {\n domain: 'CLI',\n why: options?.why ?? 'Config.driver is required for DB-connected commands',\n fix: 'Add a control-plane driver to prisma-next.config.ts (e.g. import a driver descriptor and set `driver: postgresDriver`)',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n });\n}\n\n/**\n * Contract requires extension packs that are not provided by config descriptors.\n */\nexport function errorContractMissingExtensionPacks(options: {\n readonly missingExtensionPacks: readonly string[];\n readonly providedComponentIds: readonly string[];\n}): CliStructuredError {\n const missing = [...options.missingExtensionPacks].sort();\n return new CliStructuredError('4011', 'Missing extension packs in config', {\n domain: 'CLI',\n why:\n missing.length === 1\n ? `Contract requires extension pack '${missing[0]}', but CLI config does not provide a matching descriptor.`\n : `Contract requires extension packs ${missing.map((p) => `'${p}'`).join(', ')}, but CLI config does not provide matching descriptors.`,\n fix: 'Add the missing extension descriptors to `extensions` in prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n meta: {\n missingExtensionPacks: missing,\n providedComponentIds: [...options.providedComponentIds].sort(),\n },\n });\n}\n\n/**\n * Migration planning failed due to conflicts.\n */\nexport function errorMigrationPlanningFailed(options: {\n readonly conflicts: readonly CliErrorConflict[];\n readonly why?: string;\n}): CliStructuredError {\n // Build \"why\" from conflict summaries - these contain the actual problem description\n const conflictSummaries = options.conflicts.map((c) => c.summary);\n const computedWhy = options.why ?? conflictSummaries.join('\\n');\n\n // Build \"fix\" from conflict \"why\" fields - these contain actionable advice\n const conflictFixes = options.conflicts\n .map((c) => c.why)\n .filter((why): why is string => typeof why === 'string');\n const computedFix =\n conflictFixes.length > 0\n ? conflictFixes.join('\\n')\n : 'Use `db schema-verify` to inspect conflicts, or ensure the database is empty';\n\n return new CliStructuredError('4020', 'Migration planning failed', {\n domain: 'CLI',\n why: computedWhy,\n fix: computedFix,\n meta: { conflicts: options.conflicts },\n docsUrl: 'https://prisma-next.dev/docs/cli/db-init',\n });\n}\n\n/**\n * Target does not support migrations (missing createPlanner/createRunner).\n */\nexport function errorTargetMigrationNotSupported(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4021', 'Target does not support migrations', {\n domain: 'CLI',\n why: options?.why ?? 'The configured target does not provide migration planner/runner',\n fix: 'Select a target that provides migrations (it must export `target.migrations` for db init)',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-init',\n });\n}\n\n/**\n * Config validation error (missing required fields).\n */\nexport function errorConfigValidation(\n field: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4009', 'Config validation error', {\n domain: 'CLI',\n why: options?.why ?? `Config must have a \"${field}\" field`,\n fix: 'Check your prisma-next.config.ts and ensure all required fields are provided',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n });\n}\n\n// ============================================================================\n// Runtime Errors (PN-RTM-3000-3030)\n// ============================================================================\n\n/**\n * Contract marker not found in database.\n */\nexport function errorMarkerMissing(options?: {\n readonly why?: string;\n readonly dbUrl?: string;\n}): CliStructuredError {\n return new CliStructuredError('3001', 'Database not signed', {\n domain: 'RTM',\n why: options?.why ?? 'No database signature (marker) found',\n fix: 'Run `prisma-next db sign --db <url>` to sign the database',\n });\n}\n\n/**\n * Contract hash does not match database marker.\n */\nexport function errorHashMismatch(options?: {\n readonly why?: string;\n readonly expected?: string;\n readonly actual?: string;\n}): CliStructuredError {\n return new CliStructuredError('3002', 'Hash mismatch', {\n domain: 'RTM',\n why: options?.why ?? 'Contract hash does not match database marker',\n fix: 'Migrate database or re-sign if intentional',\n ...(options?.expected || options?.actual\n ? {\n meta: {\n ...(options.expected ? { expected: options.expected } : {}),\n ...(options.actual ? { actual: options.actual } : {}),\n },\n }\n : {}),\n });\n}\n\n/**\n * Contract target does not match config target.\n */\nexport function errorTargetMismatch(\n expected: string,\n actual: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('3003', 'Target mismatch', {\n domain: 'RTM',\n why:\n options?.why ??\n `Contract target does not match config target (expected: ${expected}, actual: ${actual})`,\n fix: 'Align contract target and config target',\n meta: { expected, actual },\n });\n}\n\n/**\n * Database marker is required but not found.\n * Used by commands that require a pre-existing marker as a precondition.\n */\nexport function errorMarkerRequired(options?: {\n readonly why?: string;\n readonly fix?: string;\n}): CliStructuredError {\n return new CliStructuredError('3010', 'Database must be signed first', {\n domain: 'RTM',\n why: options?.why ?? 'No database signature (marker) found',\n fix: options?.fix ?? 'Run `prisma-next db init` first to sign the database',\n });\n}\n\n/**\n * Schema verification found mismatches between the database and the contract.\n * The full verification tree is preserved in `meta.verificationResult`.\n */\nexport function errorSchemaVerificationFailed(options: {\n readonly summary: string;\n readonly verificationResult: VerifyDatabaseSchemaResult;\n readonly issues?: readonly SchemaIssue[];\n}): CliStructuredError {\n return new CliStructuredError('3004', options.summary, {\n domain: 'RTM',\n why: 'Database schema does not satisfy the contract',\n fix: 'Run `prisma-next db update` to reconcile, or adjust your contract to match the database',\n meta: {\n verificationResult: options.verificationResult,\n ...ifDefined('issues', options.issues),\n },\n });\n}\n\n/**\n * Migration runner failed during execution.\n */\nexport function errorRunnerFailed(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError('3020', summary, {\n domain: 'RTM',\n why: options?.why ?? 'Migration runner failed',\n fix: options?.fix ?? 'Inspect the reported conflict and reconcile schema drift',\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n/** Error code for destructive changes that require explicit confirmation. */\nexport const ERROR_CODE_DESTRUCTIVE_CHANGES = '3030';\n\n/**\n * Destructive operations require explicit confirmation via -y/--yes.\n */\nexport function errorDestructiveChanges(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError(ERROR_CODE_DESTRUCTIVE_CHANGES, summary, {\n domain: 'RTM',\n why: options?.why ?? 'Planned operations include destructive changes that require confirmation',\n fix: options?.fix ?? 'Re-run with `-y` to apply, or use `--dry-run` to preview first',\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n/**\n * Generic runtime error.\n */\nexport function errorRuntime(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError('3000', summary, {\n domain: 'RTM',\n ...(options?.why ? { why: options.why } : { why: 'Verification failed' }),\n ...(options?.fix ? { fix: options.fix } : { fix: 'Check contract and database state' }),\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n// ============================================================================\n// Generic Error\n// ============================================================================\n\n/**\n * Generic unexpected error.\n */\nexport function errorUnexpected(\n message: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4999', 'Unexpected error', {\n domain: 'CLI',\n why: options?.why ?? message,\n fix: options?.fix ?? 'Check the error message and try again',\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"errors.mjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["import { ifDefined } from '@prisma-next/utils/defined';\nimport type { SchemaIssue, VerifyDatabaseSchemaResult } from './types';\n\n/**\n * CLI error envelope for output formatting.\n * This is the serialized form of a CliStructuredError.\n */\nexport interface CliErrorEnvelope {\n readonly ok: false;\n readonly code: string;\n readonly domain: string;\n readonly severity: 'error' | 'warn' | 'info';\n readonly summary: string;\n readonly why: string | undefined;\n readonly fix: string | undefined;\n readonly where:\n | {\n readonly path: string | undefined;\n readonly line: number | undefined;\n }\n | undefined;\n readonly meta: Record<string, unknown> | undefined;\n readonly docsUrl: string | undefined;\n}\n\n/**\n * Minimal conflict data structure expected by CLI output.\n */\nexport interface CliErrorConflict {\n readonly kind: string;\n readonly summary: string;\n readonly why?: string;\n}\n\n/**\n * Structured CLI error that contains all information needed for error envelopes.\n * Call sites throw these errors with full context.\n */\nexport class CliStructuredError extends Error {\n readonly code: string;\n readonly domain: 'CLI' | 'RTM';\n readonly severity: 'error' | 'warn' | 'info';\n readonly why: string | undefined;\n readonly fix: string | undefined;\n readonly where:\n | {\n readonly path: string | undefined;\n readonly line: number | undefined;\n }\n | undefined;\n readonly meta: Record<string, unknown> | undefined;\n readonly docsUrl: string | undefined;\n\n constructor(\n code: string,\n summary: string,\n options?: {\n readonly domain?: 'CLI' | 'RTM';\n readonly severity?: 'error' | 'warn' | 'info';\n readonly why?: string;\n readonly fix?: string;\n readonly where?: { readonly path?: string; readonly line?: number };\n readonly meta?: Record<string, unknown>;\n readonly docsUrl?: string;\n },\n ) {\n super(summary);\n this.name = 'CliStructuredError';\n this.code = code;\n this.domain = options?.domain ?? 'CLI';\n this.severity = options?.severity ?? 'error';\n this.why = options?.why;\n this.fix = options?.fix === options?.why ? undefined : options?.fix;\n this.where = options?.where\n ? {\n path: options.where.path,\n line: options.where.line,\n }\n : undefined;\n this.meta = options?.meta;\n this.docsUrl = options?.docsUrl;\n }\n\n /**\n * Converts this error to a CLI error envelope for output formatting.\n */\n toEnvelope(): CliErrorEnvelope {\n const codePrefix = this.domain === 'CLI' ? 'PN-CLI-' : 'PN-RTM-';\n return {\n ok: false as const,\n code: `${codePrefix}${this.code}`,\n domain: this.domain,\n severity: this.severity,\n summary: this.message,\n why: this.why,\n fix: this.fix,\n where: this.where,\n meta: this.meta,\n docsUrl: this.docsUrl,\n };\n }\n\n /**\n * Type guard to check if an error is a CliStructuredError.\n * Uses duck-typing to work across module boundaries where instanceof may fail.\n */\n static is(error: unknown): error is CliStructuredError {\n if (!(error instanceof Error)) {\n return false;\n }\n const candidate = error as CliStructuredError;\n return (\n candidate.name === 'CliStructuredError' &&\n typeof candidate.code === 'string' &&\n (candidate.domain === 'CLI' || candidate.domain === 'RTM') &&\n typeof candidate.toEnvelope === 'function'\n );\n }\n}\n\n// ============================================================================\n// Config Errors (PN-CLI-4001-4007)\n// ============================================================================\n\n/**\n * Config file not found or missing.\n */\nexport function errorConfigFileNotFound(\n configPath?: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4001', 'Config file not found', {\n domain: 'CLI',\n ...(options?.why ? { why: options.why } : { why: 'Config file not found' }),\n fix: \"Run 'prisma-next init' to create a config file\",\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n ...(configPath ? { where: { path: configPath } } : {}),\n });\n}\n\n/**\n * Contract configuration missing from config.\n */\nexport function errorContractConfigMissing(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4002', 'Contract configuration missing', {\n domain: 'CLI',\n why: options?.why ?? 'The contract configuration is required for emit',\n fix: 'Add contract configuration to your prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/contract-emit',\n });\n}\n\n/**\n * Contract validation failed.\n */\nexport function errorContractValidationFailed(\n reason: string,\n options?: {\n readonly where?: { readonly path?: string; readonly line?: number };\n },\n): CliStructuredError {\n return new CliStructuredError('4003', 'Contract validation failed', {\n domain: 'CLI',\n why: reason,\n fix: 'Re-run `prisma-next contract emit`, or fix the contract file and try again',\n docsUrl: 'https://prisma-next.dev/docs/contracts',\n ...(options?.where ? { where: options.where } : {}),\n });\n}\n\n/**\n * File not found.\n */\nexport function errorFileNotFound(\n filePath: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly docsUrl?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4004', 'File not found', {\n domain: 'CLI',\n why: options?.why ?? `File not found: ${filePath}`,\n fix: options?.fix ?? 'Check that the file path is correct',\n where: { path: filePath },\n ...(options?.docsUrl ? { docsUrl: options.docsUrl } : {}),\n });\n}\n\n/**\n * Database connection is required but not provided.\n */\nexport function errorDatabaseConnectionRequired(options?: {\n readonly why?: string;\n readonly commandName?: string;\n readonly retryCommand?: string;\n}): CliStructuredError {\n const runHint = options?.retryCommand\n ? `Run \\`${options.retryCommand}\\``\n : options?.commandName\n ? `Run \\`prisma-next ${options.commandName} --db <url>\\``\n : 'Provide `--db <url>`';\n return new CliStructuredError('4005', 'Database connection is required', {\n domain: 'CLI',\n why: options?.why ?? 'Database connection is required for this command',\n fix: `${runHint}, or set \\`db: { connection: \"postgres://…\" }\\` in prisma-next.config.ts`,\n });\n}\n\n/**\n * Query runner factory is required but not provided in config.\n */\nexport function errorQueryRunnerFactoryRequired(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4006', 'Query runner factory is required', {\n domain: 'CLI',\n why: options?.why ?? 'Config.db.queryRunnerFactory is required for db verify',\n fix: 'Add db.queryRunnerFactory to prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-verify',\n });\n}\n\n/**\n * Family verify.readMarker is required but not provided.\n */\nexport function errorFamilyReadMarkerSqlRequired(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4007', 'Family readMarker() is required', {\n domain: 'CLI',\n why: options?.why ?? 'Family verify.readMarker is required for db verify',\n fix: 'Ensure family.verify.readMarker() is exported by your family package',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-verify',\n });\n}\n\n/**\n * JSON output format not supported.\n */\nexport function errorJsonFormatNotSupported(options: {\n readonly command: string;\n readonly format: string;\n readonly supportedFormats: readonly string[];\n}): CliStructuredError {\n return new CliStructuredError('4008', 'Unsupported JSON format', {\n domain: 'CLI',\n why: `The ${options.command} command does not support --json ${options.format}`,\n fix: `Use --json ${options.supportedFormats.join(' or ')}, or omit --json for human output`,\n meta: {\n command: options.command,\n format: options.format,\n supportedFormats: options.supportedFormats,\n },\n });\n}\n\n/**\n * Driver is required for DB-connected commands but not provided.\n */\nexport function errorDriverRequired(options?: { readonly why?: string }): CliStructuredError {\n return new CliStructuredError('4010', 'Driver is required for DB-connected commands', {\n domain: 'CLI',\n why: options?.why ?? 'Config.driver is required for DB-connected commands',\n fix: 'Add a control-plane driver to prisma-next.config.ts (e.g. import a driver descriptor and set `driver: postgresDriver`)',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n });\n}\n\n/**\n * Contract requires extension packs that are not provided by config descriptors.\n */\nexport function errorContractMissingExtensionPacks(options: {\n readonly missingExtensionPacks: readonly string[];\n readonly providedComponentIds: readonly string[];\n}): CliStructuredError {\n const missing = [...options.missingExtensionPacks].sort();\n return new CliStructuredError('4011', 'Missing extension packs in config', {\n domain: 'CLI',\n why:\n missing.length === 1\n ? `Contract requires extension pack '${missing[0]}', but CLI config does not provide a matching descriptor.`\n : `Contract requires extension packs ${missing.map((p) => `'${p}'`).join(', ')}, but CLI config does not provide matching descriptors.`,\n fix: 'Add the missing extension descriptors to `extensions` in prisma-next.config.ts',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n meta: {\n missingExtensionPacks: missing,\n providedComponentIds: [...options.providedComponentIds].sort(),\n },\n });\n}\n\n/**\n * Migration planning failed due to conflicts.\n */\nexport function errorMigrationPlanningFailed(options: {\n readonly conflicts: readonly CliErrorConflict[];\n readonly why?: string;\n}): CliStructuredError {\n // Build \"why\" from conflict summaries - these contain the actual problem description\n const conflictSummaries = options.conflicts.map((c) => c.summary);\n const computedWhy = options.why ?? conflictSummaries.join('\\n');\n\n // Build \"fix\" from conflict \"why\" fields - these contain actionable advice\n const conflictFixes = options.conflicts\n .map((c) => c.why)\n .filter((why): why is string => typeof why === 'string');\n const computedFix =\n conflictFixes.length > 0\n ? conflictFixes.join('\\n')\n : 'Use `db verify --schema-only` to inspect conflicts, or ensure the database is empty';\n\n return new CliStructuredError('4020', 'Migration planning failed', {\n domain: 'CLI',\n why: computedWhy,\n fix: computedFix,\n meta: { conflicts: options.conflicts },\n docsUrl: 'https://prisma-next.dev/docs/cli/db-init',\n });\n}\n\n/**\n * Target does not support migrations (missing createPlanner/createRunner).\n */\nexport function errorTargetMigrationNotSupported(options?: {\n readonly why?: string;\n}): CliStructuredError {\n return new CliStructuredError('4021', 'Target does not support migrations', {\n domain: 'CLI',\n why: options?.why ?? 'The configured target does not provide migration planner/runner',\n fix: 'Select a target that provides migrations (it must export `target.migrations` for db init)',\n docsUrl: 'https://prisma-next.dev/docs/cli/db-init',\n });\n}\n\n/**\n * Config validation error (missing required fields).\n */\nexport function errorConfigValidation(\n field: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4009', 'Config validation error', {\n domain: 'CLI',\n why: options?.why ?? `Config must have a \"${field}\" field`,\n fix: 'Check your prisma-next.config.ts and ensure all required fields are provided',\n docsUrl: 'https://prisma-next.dev/docs/cli/config',\n });\n}\n\n// ============================================================================\n// Runtime Errors (PN-RTM-3000-3030)\n// ============================================================================\n\n/**\n * Contract marker not found in database.\n */\nexport function errorMarkerMissing(options?: {\n readonly why?: string;\n readonly dbUrl?: string;\n}): CliStructuredError {\n return new CliStructuredError('3001', 'Database not signed', {\n domain: 'RTM',\n why: options?.why ?? 'No database signature (marker) found',\n fix: 'Run `prisma-next db sign --db <url>` to sign the database',\n });\n}\n\n/**\n * Contract hash does not match database marker.\n */\nexport function errorHashMismatch(options?: {\n readonly why?: string;\n readonly expected?: string;\n readonly actual?: string;\n}): CliStructuredError {\n return new CliStructuredError('3002', 'Hash mismatch', {\n domain: 'RTM',\n why: options?.why ?? 'Contract hash does not match database marker',\n fix: 'Migrate database or re-sign if intentional',\n ...(options?.expected || options?.actual\n ? {\n meta: {\n ...(options.expected ? { expected: options.expected } : {}),\n ...(options.actual ? { actual: options.actual } : {}),\n },\n }\n : {}),\n });\n}\n\n/**\n * Contract target does not match config target.\n */\nexport function errorTargetMismatch(\n expected: string,\n actual: string,\n options?: {\n readonly why?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('3003', 'Target mismatch', {\n domain: 'RTM',\n why:\n options?.why ??\n `Contract target does not match config target (expected: ${expected}, actual: ${actual})`,\n fix: 'Align contract target and config target',\n meta: { expected, actual },\n });\n}\n\n/**\n * Database marker is required but not found.\n * Used by commands that require a pre-existing marker as a precondition.\n */\nexport function errorMarkerRequired(options?: {\n readonly why?: string;\n readonly fix?: string;\n}): CliStructuredError {\n return new CliStructuredError('3010', 'Database must be signed first', {\n domain: 'RTM',\n why: options?.why ?? 'No database signature (marker) found',\n fix: options?.fix ?? 'Run `prisma-next db init` first to sign the database',\n });\n}\n\n/**\n * Schema verification found mismatches between the database and the contract.\n * The full verification tree is preserved in `meta.verificationResult`.\n */\nexport function errorSchemaVerificationFailed(options: {\n readonly summary: string;\n readonly verificationResult: VerifyDatabaseSchemaResult;\n readonly issues?: readonly SchemaIssue[];\n}): CliStructuredError {\n return new CliStructuredError('3004', options.summary, {\n domain: 'RTM',\n why: 'Database schema does not satisfy the contract',\n fix: 'Run `prisma-next db update` to reconcile, or adjust your contract to match the database',\n meta: {\n verificationResult: options.verificationResult,\n ...ifDefined('issues', options.issues),\n },\n });\n}\n\n/**\n * Migration runner failed during execution.\n */\nexport function errorRunnerFailed(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError('3020', summary, {\n domain: 'RTM',\n why: options?.why ?? 'Migration runner failed',\n fix: options?.fix ?? 'Inspect the reported conflict and reconcile schema drift',\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n/** Error code for destructive changes that require explicit confirmation. */\nexport const ERROR_CODE_DESTRUCTIVE_CHANGES = '3030';\n\n/**\n * Destructive operations require explicit confirmation via -y/--yes.\n */\nexport function errorDestructiveChanges(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError(ERROR_CODE_DESTRUCTIVE_CHANGES, summary, {\n domain: 'RTM',\n why: options?.why ?? 'Planned operations include destructive changes that require confirmation',\n fix: options?.fix ?? 'Re-run with `-y` to apply, or use `--dry-run` to preview first',\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n/**\n * Generic runtime error.\n */\nexport function errorRuntime(\n summary: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n readonly meta?: Record<string, unknown>;\n },\n): CliStructuredError {\n return new CliStructuredError('3000', summary, {\n domain: 'RTM',\n ...(options?.why ? { why: options.why } : { why: 'Verification failed' }),\n ...(options?.fix ? { fix: options.fix } : { fix: 'Check contract and database state' }),\n ...(options?.meta ? { meta: options.meta } : {}),\n });\n}\n\n// ============================================================================\n// Generic Error\n// ============================================================================\n\n/**\n * Generic unexpected error.\n */\nexport function errorUnexpected(\n message: string,\n options?: {\n readonly why?: string;\n readonly fix?: string;\n },\n): CliStructuredError {\n return new CliStructuredError('4999', 'Unexpected error', {\n domain: 'CLI',\n why: options?.why ?? message,\n fix: options?.fix ?? 'Check the error message and try again',\n });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,23 +1,23 @@
1
1
  {
2
2
  "name": "@prisma-next/core-control-plane",
3
- "version": "0.3.0-dev.84",
3
+ "version": "0.3.0-dev.85",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "description": "Control-plane migration/emission primitives and structured error utilities",
7
7
  "dependencies": {
8
8
  "arktype": "^2.1.26",
9
9
  "prettier": "^3.3.3",
10
- "@prisma-next/utils": "0.3.0-dev.84",
11
- "@prisma-next/contract": "0.3.0-dev.84",
12
- "@prisma-next/operations": "0.3.0-dev.84"
10
+ "@prisma-next/contract": "0.3.0-dev.85",
11
+ "@prisma-next/operations": "0.3.0-dev.85",
12
+ "@prisma-next/utils": "0.3.0-dev.85"
13
13
  },
14
14
  "devDependencies": {
15
15
  "tsdown": "0.18.4",
16
16
  "typescript": "5.9.3",
17
17
  "vitest": "4.0.17",
18
+ "@prisma-next/tsconfig": "0.0.0",
18
19
  "@prisma-next/test-utils": "0.0.1",
19
- "@prisma-next/tsdown": "0.0.0",
20
- "@prisma-next/tsconfig": "0.0.0"
20
+ "@prisma-next/tsdown": "0.0.0"
21
21
  },
22
22
  "files": [
23
23
  "dist",
package/src/errors.ts CHANGED
@@ -198,10 +198,13 @@ export function errorFileNotFound(
198
198
  export function errorDatabaseConnectionRequired(options?: {
199
199
  readonly why?: string;
200
200
  readonly commandName?: string;
201
+ readonly retryCommand?: string;
201
202
  }): CliStructuredError {
202
- const runHint = options?.commandName
203
- ? `Run \`prisma-next ${options.commandName} --db <url>\``
204
- : 'Provide `--db <url>`';
203
+ const runHint = options?.retryCommand
204
+ ? `Run \`${options.retryCommand}\``
205
+ : options?.commandName
206
+ ? `Run \`prisma-next ${options.commandName} --db <url>\``
207
+ : 'Provide `--db <url>`';
205
208
  return new CliStructuredError('4005', 'Database connection is required', {
206
209
  domain: 'CLI',
207
210
  why: options?.why ?? 'Database connection is required for this command',
@@ -310,7 +313,7 @@ export function errorMigrationPlanningFailed(options: {
310
313
  const computedFix =
311
314
  conflictFixes.length > 0
312
315
  ? conflictFixes.join('\n')
313
- : 'Use `db schema-verify` to inspect conflicts, or ensure the database is empty';
316
+ : 'Use `db verify --schema-only` to inspect conflicts, or ensure the database is empty';
314
317
 
315
318
  return new CliStructuredError('4020', 'Migration planning failed', {
316
319
  domain: 'CLI',