@prisma-next/cli 0.3.0-dev.3 → 0.3.0-dev.31

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 (101) hide show
  1. package/README.md +111 -27
  2. package/dist/{chunk-BZMBKEEQ.js → chunk-AGOTG4L3.js} +44 -76
  3. package/dist/chunk-AGOTG4L3.js.map +1 -0
  4. package/dist/chunk-HLLI4YL7.js +180 -0
  5. package/dist/chunk-HLLI4YL7.js.map +1 -0
  6. package/dist/chunk-VG2R7DGF.js +735 -0
  7. package/dist/chunk-VG2R7DGF.js.map +1 -0
  8. package/dist/cli.d.ts +2 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +1502 -968
  11. package/dist/cli.js.map +1 -1
  12. package/dist/commands/contract-emit.d.ts +2 -4
  13. package/dist/commands/contract-emit.d.ts.map +1 -0
  14. package/dist/commands/contract-emit.js +3 -2
  15. package/dist/commands/db-init.d.ts +2 -4
  16. package/dist/commands/db-init.d.ts.map +1 -0
  17. package/dist/commands/db-init.js +205 -289
  18. package/dist/commands/db-init.js.map +1 -1
  19. package/dist/commands/db-introspect.d.ts +2 -4
  20. package/dist/commands/db-introspect.d.ts.map +1 -0
  21. package/dist/commands/db-introspect.js +108 -143
  22. package/dist/commands/db-introspect.js.map +1 -1
  23. package/dist/commands/db-schema-verify.d.ts +2 -4
  24. package/dist/commands/db-schema-verify.d.ts.map +1 -0
  25. package/dist/commands/db-schema-verify.js +120 -113
  26. package/dist/commands/db-schema-verify.js.map +1 -1
  27. package/dist/commands/db-sign.d.ts +2 -4
  28. package/dist/commands/db-sign.d.ts.map +1 -0
  29. package/dist/commands/db-sign.js +152 -156
  30. package/dist/commands/db-sign.js.map +1 -1
  31. package/dist/commands/db-verify.d.ts +2 -4
  32. package/dist/commands/db-verify.d.ts.map +1 -0
  33. package/dist/commands/db-verify.js +142 -122
  34. package/dist/commands/db-verify.js.map +1 -1
  35. package/dist/config-loader.d.ts +3 -5
  36. package/dist/config-loader.d.ts.map +1 -0
  37. package/dist/control-api/client.d.ts +13 -0
  38. package/dist/control-api/client.d.ts.map +1 -0
  39. package/dist/control-api/operations/db-init.d.ts +29 -0
  40. package/dist/control-api/operations/db-init.d.ts.map +1 -0
  41. package/dist/control-api/types.d.ts +387 -0
  42. package/dist/control-api/types.d.ts.map +1 -0
  43. package/dist/exports/config-types.d.ts +3 -0
  44. package/dist/exports/config-types.d.ts.map +1 -0
  45. package/dist/exports/config-types.js.map +1 -0
  46. package/dist/exports/control-api.d.ts +13 -0
  47. package/dist/exports/control-api.d.ts.map +1 -0
  48. package/dist/exports/control-api.js +7 -0
  49. package/dist/exports/control-api.js.map +1 -0
  50. package/dist/exports/index.d.ts +4 -0
  51. package/dist/exports/index.d.ts.map +1 -0
  52. package/dist/{index.js → exports/index.js} +4 -3
  53. package/dist/exports/index.js.map +1 -0
  54. package/dist/{index.d.ts → load-ts-contract.d.ts} +4 -8
  55. package/dist/load-ts-contract.d.ts.map +1 -0
  56. package/dist/utils/cli-errors.d.ts +7 -0
  57. package/dist/utils/cli-errors.d.ts.map +1 -0
  58. package/dist/utils/command-helpers.d.ts +12 -0
  59. package/dist/utils/command-helpers.d.ts.map +1 -0
  60. package/dist/utils/framework-components.d.ts +70 -0
  61. package/dist/utils/framework-components.d.ts.map +1 -0
  62. package/dist/utils/global-flags.d.ts +25 -0
  63. package/dist/utils/global-flags.d.ts.map +1 -0
  64. package/dist/utils/output.d.ts +142 -0
  65. package/dist/utils/output.d.ts.map +1 -0
  66. package/dist/utils/progress-adapter.d.ts +26 -0
  67. package/dist/utils/progress-adapter.d.ts.map +1 -0
  68. package/dist/utils/result-handler.d.ts +15 -0
  69. package/dist/utils/result-handler.d.ts.map +1 -0
  70. package/package.json +30 -26
  71. package/src/cli.ts +260 -0
  72. package/src/commands/contract-emit.ts +259 -0
  73. package/src/commands/db-init.ts +360 -0
  74. package/src/commands/db-introspect.ts +227 -0
  75. package/src/commands/db-schema-verify.ts +238 -0
  76. package/src/commands/db-sign.ts +279 -0
  77. package/src/commands/db-verify.ts +258 -0
  78. package/src/config-loader.ts +76 -0
  79. package/src/control-api/client.ts +589 -0
  80. package/src/control-api/operations/db-init.ts +281 -0
  81. package/src/control-api/types.ts +461 -0
  82. package/src/exports/config-types.ts +6 -0
  83. package/src/exports/control-api.ts +46 -0
  84. package/src/exports/index.ts +4 -0
  85. package/src/load-ts-contract.ts +217 -0
  86. package/src/utils/cli-errors.ts +26 -0
  87. package/src/utils/command-helpers.ts +26 -0
  88. package/src/utils/framework-components.ts +177 -0
  89. package/src/utils/global-flags.ts +75 -0
  90. package/src/utils/output.ts +1471 -0
  91. package/src/utils/progress-adapter.ts +86 -0
  92. package/src/utils/result-handler.ts +44 -0
  93. package/dist/chunk-464LNZCE.js +0 -134
  94. package/dist/chunk-464LNZCE.js.map +0 -1
  95. package/dist/chunk-BZMBKEEQ.js.map +0 -1
  96. package/dist/chunk-ZKYEJROM.js +0 -94
  97. package/dist/chunk-ZKYEJROM.js.map +0 -1
  98. package/dist/config-types.d.ts +0 -1
  99. package/dist/config-types.js.map +0 -1
  100. package/dist/index.js.map +0 -1
  101. /package/dist/{config-types.js → exports/config-types.js} +0 -0
@@ -0,0 +1,180 @@
1
+ import {
2
+ createProgressAdapter,
3
+ formatCommandHelp,
4
+ formatEmitJson,
5
+ formatEmitOutput,
6
+ formatStyledHeader,
7
+ formatSuccessMessage,
8
+ handleResult,
9
+ parseGlobalFlags,
10
+ setCommandDescriptions
11
+ } from "./chunk-AGOTG4L3.js";
12
+ import {
13
+ loadConfig
14
+ } from "./chunk-HWYQOCAJ.js";
15
+ import {
16
+ CliStructuredError,
17
+ createControlClient,
18
+ errorRuntime,
19
+ errorUnexpected
20
+ } from "./chunk-VG2R7DGF.js";
21
+
22
+ // src/commands/contract-emit.ts
23
+ import { mkdirSync, writeFileSync } from "fs";
24
+ import { dirname, relative, resolve } from "path";
25
+ import { errorContractConfigMissing } from "@prisma-next/core-control-plane/errors";
26
+ import { notOk, ok } from "@prisma-next/utils/result";
27
+ import { Command } from "commander";
28
+ function mapEmitFailure(failure) {
29
+ if (failure.code === "CONTRACT_SOURCE_INVALID") {
30
+ return errorRuntime(failure.summary, {
31
+ why: failure.why ?? "Contract source is invalid",
32
+ fix: "Check your contract source configuration in prisma-next.config.ts"
33
+ });
34
+ }
35
+ if (failure.code === "EMIT_FAILED") {
36
+ return errorRuntime(failure.summary, {
37
+ why: failure.why ?? "Failed to emit contract",
38
+ fix: "Check your contract configuration and ensure the source is valid"
39
+ });
40
+ }
41
+ const exhaustive = failure.code;
42
+ throw new Error(`Unhandled EmitFailure code: ${exhaustive}`);
43
+ }
44
+ async function executeContractEmitCommand(options, flags, startTime) {
45
+ let config;
46
+ try {
47
+ config = await loadConfig(options.config);
48
+ } catch (error) {
49
+ if (error instanceof CliStructuredError) {
50
+ return notOk(error);
51
+ }
52
+ return notOk(
53
+ errorUnexpected(error instanceof Error ? error.message : String(error), {
54
+ why: "Failed to load config"
55
+ })
56
+ );
57
+ }
58
+ if (!config.contract) {
59
+ return notOk(
60
+ errorContractConfigMissing({
61
+ why: "Config.contract is required for emit. Define it in your config: contract: { source: ..., output: ..., types: ... }"
62
+ })
63
+ );
64
+ }
65
+ const contractConfig = config.contract;
66
+ if (!contractConfig.output || !contractConfig.types) {
67
+ return notOk(
68
+ errorContractConfigMissing({
69
+ why: "Contract config must have output and types paths. This should not happen if defineConfig() was used."
70
+ })
71
+ );
72
+ }
73
+ const outputJsonPath = resolve(contractConfig.output);
74
+ const outputDtsPath = resolve(contractConfig.types);
75
+ if (flags.json !== "object" && !flags.quiet) {
76
+ const configPath = options.config ? relative(process.cwd(), resolve(options.config)) : "prisma-next.config.ts";
77
+ const contractPath = relative(process.cwd(), outputJsonPath);
78
+ const typesPath = relative(process.cwd(), outputDtsPath);
79
+ const header = formatStyledHeader({
80
+ command: "contract emit",
81
+ description: "Write your contract to JSON and sign it",
82
+ url: "https://pris.ly/contract-emit",
83
+ details: [
84
+ { label: "config", value: configPath },
85
+ { label: "contract", value: contractPath },
86
+ { label: "types", value: typesPath }
87
+ ],
88
+ flags
89
+ });
90
+ console.log(header);
91
+ }
92
+ const client = createControlClient({
93
+ family: config.family,
94
+ target: config.target,
95
+ adapter: config.adapter,
96
+ extensionPacks: config.extensionPacks ?? []
97
+ });
98
+ const onProgress = createProgressAdapter({ flags });
99
+ try {
100
+ const source = typeof contractConfig.source === "function" ? { kind: "loader", load: contractConfig.source } : { kind: "value", value: contractConfig.source };
101
+ const result = await client.emit({
102
+ contractConfig: {
103
+ source,
104
+ output: outputJsonPath,
105
+ types: outputDtsPath
106
+ },
107
+ onProgress
108
+ });
109
+ if (!result.ok) {
110
+ return notOk(mapEmitFailure(result.failure));
111
+ }
112
+ mkdirSync(dirname(outputJsonPath), { recursive: true });
113
+ mkdirSync(dirname(outputDtsPath), { recursive: true });
114
+ writeFileSync(outputJsonPath, result.value.contractJson, "utf-8");
115
+ writeFileSync(outputDtsPath, result.value.contractDts, "utf-8");
116
+ if (!flags.quiet && flags.json !== "object" && process.stdout.isTTY) {
117
+ console.log("");
118
+ }
119
+ const emitResult = {
120
+ coreHash: result.value.coreHash,
121
+ profileHash: result.value.profileHash,
122
+ outDir: dirname(outputJsonPath),
123
+ files: {
124
+ json: outputJsonPath,
125
+ dts: outputDtsPath
126
+ },
127
+ timings: { total: Date.now() - startTime }
128
+ };
129
+ return ok(emitResult);
130
+ } catch (error) {
131
+ if (CliStructuredError.is(error)) {
132
+ return notOk(error);
133
+ }
134
+ return notOk(
135
+ errorUnexpected("Unexpected error during contract emit", {
136
+ why: error instanceof Error ? error.message : String(error)
137
+ })
138
+ );
139
+ } finally {
140
+ await client.close();
141
+ }
142
+ }
143
+ function createContractEmitCommand() {
144
+ const command = new Command("emit");
145
+ setCommandDescriptions(
146
+ command,
147
+ "Write your contract to JSON and sign it",
148
+ "Reads your contract source (TypeScript or Prisma schema) and emits contract.json and\ncontract.d.ts. The contract.json contains the canonical contract structure, and\ncontract.d.ts provides TypeScript types for type-safe query building."
149
+ );
150
+ command.configureHelp({
151
+ formatHelp: (cmd) => {
152
+ const flags = parseGlobalFlags({});
153
+ return formatCommandHelp({ command: cmd, flags });
154
+ }
155
+ }).option("--config <path>", "Path to prisma-next.config.ts").option("--json [format]", "Output as JSON (object or ndjson)", false).option("-q, --quiet", "Quiet mode: errors only").option("-v, --verbose", "Verbose output: debug info, timings").option("-vv, --trace", "Trace output: deep internals, stack traces").option("--timestamps", "Add timestamps to output").option("--color", "Force color output").option("--no-color", "Disable color output").action(async (options) => {
156
+ const flags = parseGlobalFlags(options);
157
+ const startTime = Date.now();
158
+ const result = await executeContractEmitCommand(options, flags, startTime);
159
+ const exitCode = handleResult(result, flags, (emitResult) => {
160
+ if (flags.json === "object") {
161
+ console.log(formatEmitJson(emitResult));
162
+ } else {
163
+ const output = formatEmitOutput(emitResult, flags);
164
+ if (output) {
165
+ console.log(output);
166
+ }
167
+ if (!flags.quiet) {
168
+ console.log(formatSuccessMessage(flags));
169
+ }
170
+ }
171
+ });
172
+ process.exit(exitCode);
173
+ });
174
+ return command;
175
+ }
176
+
177
+ export {
178
+ createContractEmitCommand
179
+ };
180
+ //# sourceMappingURL=chunk-HLLI4YL7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/contract-emit.ts"],"sourcesContent":["import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, relative, resolve } from 'node:path';\nimport { errorContractConfigMissing } from '@prisma-next/core-control-plane/errors';\nimport { notOk, ok, type Result } from '@prisma-next/utils/result';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config-loader';\nimport { createControlClient } from '../control-api/client';\nimport type { EmitContractSource, EmitFailure } from '../control-api/types';\nimport { CliStructuredError, errorRuntime, errorUnexpected } from '../utils/cli-errors';\nimport { setCommandDescriptions } from '../utils/command-helpers';\nimport { type GlobalFlags, parseGlobalFlags } from '../utils/global-flags';\nimport {\n type EmitContractResult,\n formatCommandHelp,\n formatEmitJson,\n formatEmitOutput,\n formatStyledHeader,\n formatSuccessMessage,\n} from '../utils/output';\nimport { createProgressAdapter } from '../utils/progress-adapter';\nimport { handleResult } from '../utils/result-handler';\n\ninterface ContractEmitOptions {\n readonly config?: string;\n readonly json?: string | boolean;\n readonly quiet?: boolean;\n readonly q?: boolean;\n readonly verbose?: boolean;\n readonly v?: boolean;\n readonly vv?: boolean;\n readonly trace?: boolean;\n readonly timestamps?: boolean;\n readonly color?: boolean;\n readonly 'no-color'?: boolean;\n}\n\n/**\n * Maps an EmitFailure to a CliStructuredError for consistent error handling.\n */\nfunction mapEmitFailure(failure: EmitFailure): CliStructuredError {\n if (failure.code === 'CONTRACT_SOURCE_INVALID') {\n return errorRuntime(failure.summary, {\n why: failure.why ?? 'Contract source is invalid',\n fix: 'Check your contract source configuration in prisma-next.config.ts',\n });\n }\n\n if (failure.code === 'EMIT_FAILED') {\n return errorRuntime(failure.summary, {\n why: failure.why ?? 'Failed to emit contract',\n fix: 'Check your contract configuration and ensure the source is valid',\n });\n }\n\n // Exhaustive check - TypeScript will error if a new code is added but not handled\n const exhaustive: never = failure.code;\n throw new Error(`Unhandled EmitFailure code: ${exhaustive}`);\n}\n\n/**\n * Executes the contract emit command and returns a structured Result.\n */\nasync function executeContractEmitCommand(\n options: ContractEmitOptions,\n flags: GlobalFlags,\n startTime: number,\n): Promise<Result<EmitContractResult, CliStructuredError>> {\n // Load config\n let config: Awaited<ReturnType<typeof loadConfig>>;\n try {\n config = await loadConfig(options.config);\n } catch (error) {\n // Convert thrown CliStructuredError to Result\n if (error instanceof CliStructuredError) {\n return notOk(error);\n }\n return notOk(\n errorUnexpected(error instanceof Error ? error.message : String(error), {\n why: 'Failed to load config',\n }),\n );\n }\n\n // Resolve contract from config\n if (!config.contract) {\n return notOk(\n errorContractConfigMissing({\n why: 'Config.contract is required for emit. Define it in your config: contract: { source: ..., output: ..., types: ... }',\n }),\n );\n }\n\n // Contract config is already normalized by defineConfig() with defaults applied\n const contractConfig = config.contract;\n\n // Resolve artifact paths from config (already normalized by defineConfig() with defaults)\n if (!contractConfig.output || !contractConfig.types) {\n return notOk(\n errorContractConfigMissing({\n why: 'Contract config must have output and types paths. This should not happen if defineConfig() was used.',\n }),\n );\n }\n const outputJsonPath = resolve(contractConfig.output);\n const outputDtsPath = resolve(contractConfig.types);\n\n // Output header (only for human-readable output)\n if (flags.json !== 'object' && !flags.quiet) {\n // Normalize config path for display (match contract path format - no ./ prefix)\n const configPath = options.config\n ? relative(process.cwd(), resolve(options.config))\n : 'prisma-next.config.ts';\n // Convert absolute paths to relative paths for display\n const contractPath = relative(process.cwd(), outputJsonPath);\n const typesPath = relative(process.cwd(), outputDtsPath);\n const header = formatStyledHeader({\n command: 'contract emit',\n description: 'Write your contract to JSON and sign it',\n url: 'https://pris.ly/contract-emit',\n details: [\n { label: 'config', value: configPath },\n { label: 'contract', value: contractPath },\n { label: 'types', value: typesPath },\n ],\n flags,\n });\n console.log(header);\n }\n\n // Create control client (no driver needed for emit)\n const client = createControlClient({\n family: config.family,\n target: config.target,\n adapter: config.adapter,\n extensionPacks: config.extensionPacks ?? [],\n });\n\n // Create progress adapter\n const onProgress = createProgressAdapter({ flags });\n\n try {\n // Convert user config source to discriminated union\n // Type assertion is safe: we check typeof to determine if it's a function\n const source: EmitContractSource =\n typeof contractConfig.source === 'function'\n ? { kind: 'loader', load: contractConfig.source as () => unknown | Promise<unknown> }\n : { kind: 'value', value: contractConfig.source };\n\n // Call emit with progress callback\n const result = await client.emit({\n contractConfig: {\n source,\n output: outputJsonPath,\n types: outputDtsPath,\n },\n onProgress,\n });\n\n // Handle failures by mapping to CLI structured error\n if (!result.ok) {\n return notOk(mapEmitFailure(result.failure));\n }\n\n // Create directories if needed\n mkdirSync(dirname(outputJsonPath), { recursive: true });\n mkdirSync(dirname(outputDtsPath), { recursive: true });\n\n // Write the results to files\n writeFileSync(outputJsonPath, result.value.contractJson, 'utf-8');\n writeFileSync(outputDtsPath, result.value.contractDts, 'utf-8');\n\n // Add blank line after all async operations if spinners were shown\n if (!flags.quiet && flags.json !== 'object' && process.stdout.isTTY) {\n console.log('');\n }\n\n // Convert success result to CLI output format\n const emitResult: EmitContractResult = {\n coreHash: result.value.coreHash,\n profileHash: result.value.profileHash,\n outDir: dirname(outputJsonPath),\n files: {\n json: outputJsonPath,\n dts: outputDtsPath,\n },\n timings: { total: Date.now() - startTime },\n };\n\n return ok(emitResult);\n } catch (error) {\n // Use static type guard to work across module boundaries\n if (CliStructuredError.is(error)) {\n return notOk(error);\n }\n\n // Wrap unexpected errors\n return notOk(\n errorUnexpected('Unexpected error during contract emit', {\n why: error instanceof Error ? error.message : String(error),\n }),\n );\n } finally {\n await client.close();\n }\n}\n\nexport function createContractEmitCommand(): Command {\n const command = new Command('emit');\n setCommandDescriptions(\n command,\n 'Write your contract to JSON and sign it',\n 'Reads your contract source (TypeScript or Prisma schema) and emits contract.json and\\n' +\n 'contract.d.ts. The contract.json contains the canonical contract structure, and\\n' +\n 'contract.d.ts provides TypeScript types for type-safe query building.',\n );\n command\n .configureHelp({\n formatHelp: (cmd) => {\n const flags = parseGlobalFlags({});\n return formatCommandHelp({ command: cmd, flags });\n },\n })\n .option('--config <path>', 'Path to prisma-next.config.ts')\n .option('--json [format]', 'Output as JSON (object or ndjson)', false)\n .option('-q, --quiet', 'Quiet mode: errors only')\n .option('-v, --verbose', 'Verbose output: debug info, timings')\n .option('-vv, --trace', 'Trace output: deep internals, stack traces')\n .option('--timestamps', 'Add timestamps to output')\n .option('--color', 'Force color output')\n .option('--no-color', 'Disable color output')\n .action(async (options: ContractEmitOptions) => {\n const flags = parseGlobalFlags(options);\n const startTime = Date.now();\n\n const result = await executeContractEmitCommand(options, flags, startTime);\n\n // Handle result - formats output and returns exit code\n const exitCode = handleResult(result, flags, (emitResult) => {\n // Output based on flags\n if (flags.json === 'object') {\n // JSON output to stdout\n console.log(formatEmitJson(emitResult));\n } else {\n // Human-readable output to stdout\n const output = formatEmitOutput(emitResult, flags);\n if (output) {\n console.log(output);\n }\n // Output success message\n if (!flags.quiet) {\n console.log(formatSuccessMessage(flags));\n }\n }\n });\n process.exit(exitCode);\n });\n\n return command;\n}\n"],"mappings":"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","names":[]}