@prisma-next/cli 0.4.0-dev.2 → 0.4.0-dev.4

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 (44) hide show
  1. package/README.md +16 -0
  2. package/dist/cli.mjs +4 -11
  3. package/dist/cli.mjs.map +1 -1
  4. package/dist/{client-DiUkJAeN.mjs → client-tdnbk0OR.mjs} +9 -2
  5. package/dist/{client-DiUkJAeN.mjs.map → client-tdnbk0OR.mjs.map} +1 -1
  6. package/dist/commands/contract-emit.mjs +1 -6
  7. package/dist/commands/contract-infer.mjs +1 -7
  8. package/dist/commands/db-init.mjs +2 -3
  9. package/dist/commands/db-init.mjs.map +1 -1
  10. package/dist/commands/db-schema.mjs +1 -4
  11. package/dist/commands/db-schema.mjs.map +1 -1
  12. package/dist/commands/db-sign.mjs +1 -2
  13. package/dist/commands/db-sign.mjs.map +1 -1
  14. package/dist/commands/db-update.mjs +2 -3
  15. package/dist/commands/db-update.mjs.map +1 -1
  16. package/dist/commands/db-verify.mjs +1 -2
  17. package/dist/commands/db-verify.mjs.map +1 -1
  18. package/dist/commands/migration-apply.mjs +1 -2
  19. package/dist/commands/migration-apply.mjs.map +1 -1
  20. package/dist/commands/migration-status.mjs +1 -6
  21. package/dist/contract-emit-CGpb33vs.mjs +4 -0
  22. package/dist/{contract-emit-Zm_sd1wQ.mjs → contract-emit-CRoS1nx5.mjs} +9 -3
  23. package/dist/contract-emit-CRoS1nx5.mjs.map +1 -0
  24. package/dist/{contract-emit-D2wDXfyo.mjs → contract-emit-Ctn6mH9H.mjs} +2 -2
  25. package/dist/{contract-emit-D2wDXfyo.mjs.map → contract-emit-Ctn6mH9H.mjs.map} +1 -1
  26. package/dist/{contract-infer-DozZT511.mjs → contract-infer-Ba1SE57Q.mjs} +2 -2
  27. package/dist/{contract-infer-DozZT511.mjs.map → contract-infer-Ba1SE57Q.mjs.map} +1 -1
  28. package/dist/exports/control-api.mjs +2 -4
  29. package/dist/exports/index.mjs +1 -6
  30. package/dist/exports/index.mjs.map +1 -1
  31. package/dist/{init-6Pvm_esG.mjs → init-Dx5uJ-6Q.mjs} +7 -7
  32. package/dist/{init-6Pvm_esG.mjs.map → init-Dx5uJ-6Q.mjs.map} +1 -1
  33. package/dist/{inspect-live-schema-BYnhztxZ.mjs → inspect-live-schema-gYQiWfpl.mjs} +2 -2
  34. package/dist/{inspect-live-schema-BYnhztxZ.mjs.map → inspect-live-schema-gYQiWfpl.mjs.map} +1 -1
  35. package/dist/{migration-command-scaffold-CntCcntR.mjs → migration-command-scaffold-x4n_ZhAh.mjs} +2 -2
  36. package/dist/{migration-command-scaffold-CntCcntR.mjs.map → migration-command-scaffold-x4n_ZhAh.mjs.map} +1 -1
  37. package/dist/{migration-status-CJANY4yr.mjs → migration-status-DyVDf5NI.mjs} +2 -2
  38. package/dist/{migration-status-CJANY4yr.mjs.map → migration-status-DyVDf5NI.mjs.map} +1 -1
  39. package/package.json +16 -16
  40. package/src/commands/init/init.ts +5 -5
  41. package/src/control-api/client.ts +6 -1
  42. package/src/control-api/operations/contract-emit.ts +7 -2
  43. package/dist/contract-emit-Zm_sd1wQ.mjs.map +0 -1
  44. package/dist/contract-emit-kN-IkKTE.mjs +0 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prisma-next/cli",
3
- "version": "0.4.0-dev.2",
3
+ "version": "0.4.0-dev.4",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "files": [
@@ -24,28 +24,28 @@
24
24
  "string-width": "^8.2.0",
25
25
  "strip-ansi": "^7.1.2",
26
26
  "wrap-ansi": "^10.0.0",
27
- "@prisma-next/emitter": "0.4.0-dev.2",
28
- "@prisma-next/config": "0.4.0-dev.2",
29
- "@prisma-next/errors": "0.4.0-dev.2",
30
- "@prisma-next/contract": "0.4.0-dev.2",
31
- "@prisma-next/migration-tools": "0.4.0-dev.2",
32
- "@prisma-next/psl-printer": "0.4.0-dev.2",
33
- "@prisma-next/utils": "0.4.0-dev.2",
34
- "@prisma-next/framework-components": "0.4.0-dev.2"
27
+ "@prisma-next/config": "0.4.0-dev.4",
28
+ "@prisma-next/emitter": "0.4.0-dev.4",
29
+ "@prisma-next/contract": "0.4.0-dev.4",
30
+ "@prisma-next/errors": "0.4.0-dev.4",
31
+ "@prisma-next/framework-components": "0.4.0-dev.4",
32
+ "@prisma-next/migration-tools": "0.4.0-dev.4",
33
+ "@prisma-next/utils": "0.4.0-dev.4",
34
+ "@prisma-next/psl-printer": "0.4.0-dev.4"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "24.10.4",
38
38
  "tsdown": "0.18.4",
39
39
  "typescript": "5.9.3",
40
40
  "vitest": "4.0.17",
41
- "@prisma-next/sql-contract-emitter": "0.4.0-dev.2",
42
- "@prisma-next/sql-contract": "0.4.0-dev.2",
43
- "@prisma-next/sql-operations": "0.4.0-dev.2",
44
- "@prisma-next/sql-contract-ts": "0.4.0-dev.2",
45
- "@prisma-next/sql-runtime": "0.4.0-dev.2",
46
- "@prisma-next/tsdown": "0.0.0",
41
+ "@prisma-next/sql-contract": "0.4.0-dev.4",
42
+ "@prisma-next/sql-contract-emitter": "0.4.0-dev.4",
43
+ "@prisma-next/sql-contract-ts": "0.4.0-dev.4",
44
+ "@prisma-next/sql-operations": "0.4.0-dev.4",
47
45
  "@prisma-next/test-utils": "0.0.1",
48
- "@prisma-next/tsconfig": "0.0.0"
46
+ "@prisma-next/tsconfig": "0.0.0",
47
+ "@prisma-next/tsdown": "0.0.0",
48
+ "@prisma-next/sql-runtime": "0.4.0-dev.4"
49
49
  },
50
50
  "exports": {
51
51
  ".": {
@@ -147,7 +147,7 @@ export async function runInit(baseDir: string, options: InitOptions): Promise<vo
147
147
  '',
148
148
  ' 1. Install dependencies:',
149
149
  ` ${pm} ${formatAddArgs(pm, [pkg, 'dotenv']).join(' ')}`,
150
- ` ${pm} ${formatAddDevArgs(pm, ['@prisma-next/cli']).join(' ')}`,
150
+ ` ${pm} ${formatAddDevArgs(pm, ['prisma-next']).join(' ')}`,
151
151
  '',
152
152
  ' 2. Emit the contract:',
153
153
  ` ${emitCommand}`,
@@ -161,11 +161,11 @@ export async function runInit(baseDir: string, options: InitOptions): Promise<vo
161
161
 
162
162
  const exec = promisify(execFile);
163
163
 
164
- spinner.start(`Installing ${pkg}, dotenv, and @prisma-next/cli...`);
164
+ spinner.start(`Installing ${pkg}, dotenv, and prisma-next...`);
165
165
  try {
166
166
  await exec(pm, formatAddArgs(pm, [pkg, 'dotenv']), { cwd: baseDir });
167
- await exec(pm, formatAddDevArgs(pm, ['@prisma-next/cli']), { cwd: baseDir });
168
- spinner.stop(`Installed ${pkg}, dotenv, and @prisma-next/cli`);
167
+ await exec(pm, formatAddDevArgs(pm, ['prisma-next']), { cwd: baseDir });
168
+ spinner.stop(`Installed ${pkg}, dotenv, and prisma-next`);
169
169
  installSucceeded = true;
170
170
  } catch (err) {
171
171
  spinner.stop('Installation failed');
@@ -178,7 +178,7 @@ export async function runInit(baseDir: string, options: InitOptions): Promise<vo
178
178
  '',
179
179
  'Run manually:',
180
180
  ` ${pm} ${formatAddArgs(pm, [pkg, 'dotenv']).join(' ')}`,
181
- ` ${pm} ${formatAddDevArgs(pm, ['@prisma-next/cli']).join(' ')}`,
181
+ ` ${pm} ${formatAddDevArgs(pm, ['prisma-next']).join(' ')}`,
182
182
  ].join('\n'),
183
183
  );
184
184
  }
@@ -489,8 +489,13 @@ class ControlClientImpl implements ControlClient {
489
489
  });
490
490
 
491
491
  try {
492
+ const stack = this.stack!;
492
493
  const sourceContext = {
493
- composedExtensionPacks: (this.options.extensionPacks ?? []).map((p) => p.id),
494
+ composedExtensionPacks: stack.extensionPacks.map((p) => p.id),
495
+ scalarTypeDescriptors: stack.scalarTypeDescriptors,
496
+ authoringContributions: stack.authoringContributions,
497
+ codecLookup: stack.codecLookup,
498
+ controlMutationDefaults: stack.controlMutationDefaults,
494
499
  };
495
500
  const providerResult = await contractConfig.sourceProvider(sourceContext);
496
501
  if (!providerResult.ok) {
@@ -94,8 +94,14 @@ export async function executeContractEmit(
94
94
  // Colocate .d.ts with .json (contract.json → contract.d.ts)
95
95
  const outputDtsPath = `${outputJsonPath.slice(0, -5)}.d.ts`;
96
96
 
97
+ const stack = createControlStack(config);
98
+
97
99
  const sourceContext = {
98
- composedExtensionPacks: (config.extensionPacks ?? []).map((p) => p.id),
100
+ composedExtensionPacks: stack.extensionPacks.map((p) => p.id),
101
+ scalarTypeDescriptors: stack.scalarTypeDescriptors,
102
+ authoringContributions: stack.authoringContributions,
103
+ codecLookup: stack.codecLookup,
104
+ controlMutationDefaults: stack.controlMutationDefaults,
99
105
  };
100
106
 
101
107
  let providerResult: Awaited<ReturnType<typeof contractConfig.source>>;
@@ -143,7 +149,6 @@ export async function executeContractEmit(
143
149
  });
144
150
  }
145
151
 
146
- const stack = createControlStack(config);
147
152
  const familyInstance = config.family.create(stack);
148
153
 
149
154
  const rawComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract-emit-Zm_sd1wQ.mjs","names":["providerResult: Awaited<ReturnType<typeof contractConfig.source>>"],"sources":["../src/control-api/operations/contract-emit.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport type { Contract } from '@prisma-next/contract/types';\nimport { emit } from '@prisma-next/emitter';\nimport { createControlStack } from '@prisma-next/framework-components/control';\nimport { abortable } from '@prisma-next/utils/abortable';\nimport { ifDefined } from '@prisma-next/utils/defined';\nimport { dirname, isAbsolute, join, resolve } from 'pathe';\nimport { loadConfig } from '../../config-loader';\nimport { errorContractConfigMissing, errorRuntime } from '../../utils/cli-errors';\nimport { assertFrameworkComponentsCompatible } from '../../utils/framework-components';\nimport { enrichContract } from '../contract-enrichment';\nimport type { ContractEmitOptions, ContractEmitResult } from '../types';\n\ninterface ProviderFailureLike {\n readonly summary: string;\n readonly diagnostics: readonly unknown[];\n readonly meta?: unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isAbortError(error: unknown): boolean {\n return isRecord(error) && typeof error['name'] === 'string' && error['name'] === 'AbortError';\n}\n\nfunction isProviderFailureLike(value: unknown): value is ProviderFailureLike {\n return (\n isRecord(value) && typeof value['summary'] === 'string' && Array.isArray(value['diagnostics'])\n );\n}\n\n/**\n * Executes the contract emit operation.\n *\n * This is an offline operation that:\n * 1. Loads the Prisma Next config from the specified path\n * 2. Resolves the contract source from config\n * 3. Creates a control plane stack and family instance\n * 4. Emits contract artifacts (JSON and DTS)\n * 5. Writes files to the paths specified in config\n *\n * Supports AbortSignal for cancellation, enabling \"last change wins\" behavior.\n *\n * @param options - Options including configPath and optional signal\n * @returns File paths and hashes of emitted artifacts\n * @throws If config loading fails, contract is invalid, or file I/O fails\n * @throws signal.reason if cancelled via AbortSignal (typically DOMException with name 'AbortError')\n */\nexport async function executeContractEmit(\n options: ContractEmitOptions,\n): Promise<ContractEmitResult> {\n const { configPath, signal = new AbortController().signal } = options;\n const unlessAborted = abortable(signal);\n\n // Load config using the existing config loader\n const config = await unlessAborted(loadConfig(configPath));\n\n // Validate contract config is present\n if (!config.contract) {\n throw errorContractConfigMissing({\n why: 'Config.contract is required for emit. Define it in your config: contract: { source: ..., output: ... }',\n });\n }\n\n const contractConfig = config.contract;\n\n // Validate output path is present and ends with .json\n if (!contractConfig.output) {\n throw errorContractConfigMissing({\n why: 'Contract config must have output path. This should not happen if defineConfig() was used.',\n });\n }\n if (!contractConfig.output.endsWith('.json')) {\n throw errorContractConfigMissing({\n why: 'Contract config output path must end with .json (e.g., \"src/prisma/contract.json\")',\n });\n }\n\n // Validate source exists and is callable\n if (typeof contractConfig.source !== 'function') {\n throw errorContractConfigMissing({\n why: 'Contract config must include a valid source provider function',\n });\n }\n\n // Normalize configPath and resolve artifact paths relative to config file directory\n const normalizedConfigPath = resolve(configPath);\n const configDir = dirname(normalizedConfigPath);\n const outputJsonPath = isAbsolute(contractConfig.output)\n ? contractConfig.output\n : join(configDir, contractConfig.output);\n // Colocate .d.ts with .json (contract.json → contract.d.ts)\n const outputDtsPath = `${outputJsonPath.slice(0, -5)}.d.ts`;\n\n const sourceContext = {\n composedExtensionPacks: (config.extensionPacks ?? []).map((p) => p.id),\n };\n\n let providerResult: Awaited<ReturnType<typeof contractConfig.source>>;\n try {\n providerResult = await unlessAborted(contractConfig.source(sourceContext));\n } catch (error) {\n if (signal.aborted || isAbortError(error)) {\n throw error;\n }\n throw errorRuntime('Failed to resolve contract source', {\n why: error instanceof Error ? error.message : String(error),\n fix: 'Ensure contract.source resolves to ok(Contract) or returns structured diagnostics.',\n });\n }\n\n if (!isRecord(providerResult) || typeof providerResult.ok !== 'boolean') {\n throw errorRuntime('Failed to resolve contract source', {\n why: 'Contract source provider returned malformed result shape.',\n fix: 'Ensure contract.source resolves to ok(Contract) or notOk({ summary, diagnostics }).',\n });\n }\n\n if (providerResult.ok && !('value' in providerResult)) {\n throw errorRuntime('Failed to resolve contract source', {\n why: 'Contract source provider returned malformed success result: missing value.',\n fix: 'Ensure contract.source success payload is ok(Contract).',\n });\n }\n\n if (!providerResult.ok && !isProviderFailureLike(providerResult.failure)) {\n throw errorRuntime('Failed to resolve contract source', {\n why: 'Contract source provider returned malformed failure result: expected summary and diagnostics.',\n fix: 'Ensure contract.source failure payload is notOk({ summary, diagnostics, meta? }).',\n });\n }\n\n if (!providerResult.ok) {\n throw errorRuntime('Failed to resolve contract source', {\n why: providerResult.failure.summary,\n fix: 'Fix contract source diagnostics and return ok(Contract).',\n meta: {\n diagnostics: providerResult.failure.diagnostics,\n ...ifDefined('providerMeta', providerResult.failure.meta),\n },\n });\n }\n\n const stack = createControlStack(config);\n const familyInstance = config.family.create(stack);\n\n const rawComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];\n const frameworkComponents = assertFrameworkComponentsCompatible(\n config.family.familyId,\n config.target.targetId,\n rawComponents,\n );\n const enrichedIR = enrichContract(providerResult.value as Contract, frameworkComponents);\n\n familyInstance.validateContract(enrichedIR);\n const emitResult = await unlessAborted(emit(enrichedIR, stack, config.family.emission));\n\n // Create directory if needed and write files (both colocated)\n await unlessAborted(mkdir(dirname(outputJsonPath), { recursive: true }));\n await unlessAborted(writeFile(outputJsonPath, emitResult.contractJson, 'utf-8'));\n await unlessAborted(writeFile(outputDtsPath, emitResult.contractDts, 'utf-8'));\n\n // Validate that contract.d.ts type imports are resolvable\n const { validateContractDeps } = await import('../../utils/validate-contract-deps');\n const depsValidation = validateContractDeps(emitResult.contractDts, dirname(outputDtsPath));\n if (depsValidation.warning) {\n process.stderr.write(`\\n⚠ ${depsValidation.warning}\\n`);\n }\n\n return {\n storageHash: emitResult.storageHash,\n ...ifDefined('executionHash', emitResult.executionHash),\n profileHash: emitResult.profileHash,\n files: {\n json: outputJsonPath,\n dts: outputDtsPath,\n },\n };\n}\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import "./config-loader-C4VXKl8f.mjs";
2
- import "./cli-errors-BDCYR5ap.mjs";
3
- import "./framework-components-BAsliT4V.mjs";
4
- import { t as executeContractEmit } from "./contract-emit-Zm_sd1wQ.mjs";
5
-
6
- export { executeContractEmit };