prisma-next 0.5.0-dev.2 → 0.5.0-dev.21

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 (111) hide show
  1. package/dist/agent-skill-mongo.md +63 -31
  2. package/dist/agent-skill-postgres.md +1 -1
  3. package/dist/{cli-errors-C0JhVj0c.d.mts → cli-errors-BJLUczXT.d.mts} +1 -0
  4. package/dist/cli-errors-By1iVE3z.mjs +34 -0
  5. package/dist/cli-errors-By1iVE3z.mjs.map +1 -0
  6. package/dist/cli.mjs +127 -13
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/{client-TG7rbCWT.mjs → client-enZIahga.mjs} +20 -5
  9. package/dist/client-enZIahga.mjs.map +1 -0
  10. package/dist/commands/contract-emit.d.mts.map +1 -1
  11. package/dist/commands/contract-emit.mjs +7 -2
  12. package/dist/commands/contract-infer.mjs +8 -2
  13. package/dist/commands/db-init.mjs +9 -8
  14. package/dist/commands/db-init.mjs.map +1 -1
  15. package/dist/commands/db-schema.mjs +8 -5
  16. package/dist/commands/db-schema.mjs.map +1 -1
  17. package/dist/commands/db-sign.mjs +8 -7
  18. package/dist/commands/db-sign.mjs.map +1 -1
  19. package/dist/commands/db-update.mjs +9 -8
  20. package/dist/commands/db-update.mjs.map +1 -1
  21. package/dist/commands/db-verify.mjs +10 -9
  22. package/dist/commands/db-verify.mjs.map +1 -1
  23. package/dist/commands/migration-apply.d.mts +1 -1
  24. package/dist/commands/migration-apply.d.mts.map +1 -1
  25. package/dist/commands/migration-apply.mjs +15 -38
  26. package/dist/commands/migration-apply.mjs.map +1 -1
  27. package/dist/commands/migration-new.d.mts.map +1 -1
  28. package/dist/commands/migration-new.mjs +24 -28
  29. package/dist/commands/migration-new.mjs.map +1 -1
  30. package/dist/commands/migration-plan.d.mts +6 -3
  31. package/dist/commands/migration-plan.d.mts.map +1 -1
  32. package/dist/commands/migration-plan.mjs +38 -38
  33. package/dist/commands/migration-plan.mjs.map +1 -1
  34. package/dist/commands/migration-ref.d.mts +6 -4
  35. package/dist/commands/migration-ref.d.mts.map +1 -1
  36. package/dist/commands/migration-ref.mjs +31 -40
  37. package/dist/commands/migration-ref.mjs.map +1 -1
  38. package/dist/commands/migration-show.d.mts +4 -4
  39. package/dist/commands/migration-show.d.mts.map +1 -1
  40. package/dist/commands/migration-show.mjs +19 -26
  41. package/dist/commands/migration-show.mjs.map +1 -1
  42. package/dist/commands/migration-status.d.mts +5 -4
  43. package/dist/commands/migration-status.d.mts.map +1 -1
  44. package/dist/commands/migration-status.mjs +7 -2
  45. package/dist/{config-loader-_W4T21X1.mjs → config-loader-ih8ViDb_.mjs} +2 -2
  46. package/dist/config-loader-ih8ViDb_.mjs.map +1 -0
  47. package/dist/config-loader.mjs +1 -1
  48. package/dist/contract-emit-DS5NzZh2.mjs +6 -0
  49. package/dist/contract-emit-DWtGQYCD.mjs +150 -0
  50. package/dist/contract-emit-DWtGQYCD.mjs.map +1 -0
  51. package/dist/contract-emit-RZBWzkop.mjs +329 -0
  52. package/dist/contract-emit-RZBWzkop.mjs.map +1 -0
  53. package/dist/{contract-enrichment-CGW6mm-E.mjs → contract-enrichment-4Ptgw3Pe.mjs} +1 -1
  54. package/dist/{contract-enrichment-CGW6mm-E.mjs.map → contract-enrichment-4Ptgw3Pe.mjs.map} +1 -1
  55. package/dist/{contract-infer-BP3DrGgz.mjs → contract-infer-BjzkcwQt.mjs} +5 -5
  56. package/dist/{contract-infer-BP3DrGgz.mjs.map → contract-infer-BjzkcwQt.mjs.map} +1 -1
  57. package/dist/exports/control-api.d.mts +41 -16
  58. package/dist/exports/control-api.d.mts.map +1 -1
  59. package/dist/exports/control-api.mjs +7 -5
  60. package/dist/exports/index.mjs +8 -3
  61. package/dist/exports/index.mjs.map +1 -1
  62. package/dist/exports/init-output.d.mts +39 -0
  63. package/dist/exports/init-output.d.mts.map +1 -0
  64. package/dist/exports/init-output.mjs +3 -0
  65. package/dist/{extract-operation-statements-DZUJNmL3.mjs → extract-operation-statements-CU-Pp4-N.mjs} +2 -2
  66. package/dist/{extract-operation-statements-DZUJNmL3.mjs.map → extract-operation-statements-CU-Pp4-N.mjs.map} +1 -1
  67. package/dist/{extract-sql-ddl-DDMX-9mz.mjs → extract-sql-ddl-Bm0Mm0IT.mjs} +1 -1
  68. package/dist/{extract-sql-ddl-DDMX-9mz.mjs.map → extract-sql-ddl-Bm0Mm0IT.mjs.map} +1 -1
  69. package/dist/{framework-components-DfZKQBQ2.mjs → framework-components-Bgcre3Z6.mjs} +2 -2
  70. package/dist/{framework-components-DfZKQBQ2.mjs.map → framework-components-Bgcre3Z6.mjs.map} +1 -1
  71. package/dist/init-C-H-if1m.mjs +2062 -0
  72. package/dist/init-C-H-if1m.mjs.map +1 -0
  73. package/dist/{inspect-live-schema-DWzf4Q_m.mjs → inspect-live-schema-QklSDLt_.mjs} +6 -6
  74. package/dist/{inspect-live-schema-DWzf4Q_m.mjs.map → inspect-live-schema-QklSDLt_.mjs.map} +1 -1
  75. package/dist/migration-cli.mjs +15 -8
  76. package/dist/migration-cli.mjs.map +1 -1
  77. package/dist/{migration-command-scaffold-CLMD302g.mjs → migration-command-scaffold-BfloSWPZ.mjs} +7 -7
  78. package/dist/{migration-command-scaffold-CLMD302g.mjs.map → migration-command-scaffold-BfloSWPZ.mjs.map} +1 -1
  79. package/dist/{migration-status-B0HLF7So.mjs → migration-status-C5VYA5r9.mjs} +21 -35
  80. package/dist/migration-status-C5VYA5r9.mjs.map +1 -0
  81. package/dist/{migrations-B0dOQlk0.mjs → migrations-CSaDHNpB.mjs} +3 -3
  82. package/dist/migrations-CSaDHNpB.mjs.map +1 -0
  83. package/dist/output-BiO7kt87.mjs +103 -0
  84. package/dist/output-BiO7kt87.mjs.map +1 -0
  85. package/dist/{progress-adapter-B-YvmcDu.mjs → progress-adapter-DgRGldpT.mjs} +1 -1
  86. package/dist/{progress-adapter-B-YvmcDu.mjs.map → progress-adapter-DgRGldpT.mjs.map} +1 -1
  87. package/dist/quick-reference-mongo.md +34 -13
  88. package/dist/quick-reference-postgres.md +11 -9
  89. package/dist/{result-handler-CIyu0Pdt.mjs → result-handler-BmVh8AeV.mjs} +12 -93
  90. package/dist/result-handler-BmVh8AeV.mjs.map +1 -0
  91. package/dist/{terminal-ui-C5k88MmW.mjs → terminal-ui-u2YgKghu.mjs} +76 -2
  92. package/dist/terminal-ui-u2YgKghu.mjs.map +1 -0
  93. package/dist/{verify-BxiVp50b.mjs → verify-BumcH6Ry.mjs} +2 -2
  94. package/dist/{verify-BxiVp50b.mjs.map → verify-BumcH6Ry.mjs.map} +1 -1
  95. package/package.json +11 -10
  96. package/dist/cli-errors-DHq6GQGu.mjs +0 -5
  97. package/dist/client-TG7rbCWT.mjs.map +0 -1
  98. package/dist/config-loader-_W4T21X1.mjs.map +0 -1
  99. package/dist/contract-emit-CNYyzJwF.mjs +0 -195
  100. package/dist/contract-emit-CNYyzJwF.mjs.map +0 -1
  101. package/dist/contract-emit-CQfj7xJn.mjs +0 -122
  102. package/dist/contract-emit-CQfj7xJn.mjs.map +0 -1
  103. package/dist/contract-emit-fhNwwhkQ.mjs +0 -4
  104. package/dist/init-CQfo_4Ro.mjs +0 -430
  105. package/dist/init-CQfo_4Ro.mjs.map +0 -1
  106. package/dist/migration-status-B0HLF7So.mjs.map +0 -1
  107. package/dist/migrations-B0dOQlk0.mjs.map +0 -1
  108. package/dist/result-handler-CIyu0Pdt.mjs.map +0 -1
  109. package/dist/terminal-ui-C5k88MmW.mjs.map +0 -1
  110. package/dist/validate-contract-deps-esa-VQ0h.mjs +0 -37
  111. package/dist/validate-contract-deps-esa-VQ0h.mjs.map +0 -1
@@ -1,122 +0,0 @@
1
- import { t as loadConfig } from "./config-loader-_W4T21X1.mjs";
2
- import { i as errorContractConfigMissing, m as errorRuntime } from "./cli-errors-DHq6GQGu.mjs";
3
- import { t as assertFrameworkComponentsCompatible } from "./framework-components-DfZKQBQ2.mjs";
4
- import { t as enrichContract } from "./contract-enrichment-CGW6mm-E.mjs";
5
- import { emit, getEmittedArtifactPaths } from "@prisma-next/emitter";
6
- import { dirname } from "pathe";
7
- import { ifDefined } from "@prisma-next/utils/defined";
8
- import { createControlStack } from "@prisma-next/framework-components/control";
9
- import { mkdir, writeFile } from "node:fs/promises";
10
- import { abortable } from "@prisma-next/utils/abortable";
11
-
12
- //#region src/control-api/operations/contract-emit.ts
13
- function isRecord(value) {
14
- return typeof value === "object" && value !== null;
15
- }
16
- function isAbortError(error) {
17
- return isRecord(error) && typeof error["name"] === "string" && error["name"] === "AbortError";
18
- }
19
- function isProviderFailureLike(value) {
20
- return isRecord(value) && typeof value["summary"] === "string" && Array.isArray(value["diagnostics"]);
21
- }
22
- /**
23
- * Executes the contract emit operation.
24
- *
25
- * This is an offline operation that:
26
- * 1. Loads the Prisma Next config from the specified path
27
- * 2. Resolves the contract source from config
28
- * 3. Creates a control plane stack and family instance
29
- * 4. Emits contract artifacts (JSON and DTS)
30
- * 5. Writes files to the paths specified in config
31
- *
32
- * Supports AbortSignal for cancellation, enabling "last change wins" behavior.
33
- *
34
- * @param options - Options including configPath and optional signal
35
- * @returns File paths and hashes of emitted artifacts
36
- * @throws If config loading fails, contract is invalid, or file I/O fails
37
- * @throws signal.reason if cancelled via AbortSignal (typically DOMException with name 'AbortError')
38
- */
39
- async function executeContractEmit(options) {
40
- const { configPath, signal = new AbortController().signal } = options;
41
- const unlessAborted = abortable(signal);
42
- const config = await unlessAborted(loadConfig(configPath));
43
- if (!config.contract) throw errorContractConfigMissing({ why: "Config.contract is required for emit. Define it in your config: contract: { source: ..., output: ... }" });
44
- const contractConfig = config.contract;
45
- if (!contractConfig.output) throw errorContractConfigMissing({ why: "Contract config must have output path. This should not happen if defineConfig() was used." });
46
- if (typeof contractConfig.source?.load !== "function") throw errorContractConfigMissing({ why: "Contract config must include a valid source provider object" });
47
- let outputPaths;
48
- try {
49
- outputPaths = getEmittedArtifactPaths(contractConfig.output);
50
- } catch (error) {
51
- throw errorContractConfigMissing({ why: error instanceof Error ? error.message : String(error) });
52
- }
53
- const { jsonPath: outputJsonPath, dtsPath: outputDtsPath } = outputPaths;
54
- const stack = createControlStack(config);
55
- const sourceContext = {
56
- composedExtensionPacks: stack.extensionPacks.map((p) => p.id),
57
- scalarTypeDescriptors: stack.scalarTypeDescriptors,
58
- authoringContributions: stack.authoringContributions,
59
- codecLookup: stack.codecLookup,
60
- controlMutationDefaults: stack.controlMutationDefaults,
61
- resolvedInputs: contractConfig.source.inputs ?? []
62
- };
63
- let providerResult;
64
- try {
65
- providerResult = await unlessAborted(contractConfig.source.load(sourceContext));
66
- } catch (error) {
67
- if (signal.aborted || isAbortError(error)) throw error;
68
- throw errorRuntime("Failed to resolve contract source", {
69
- why: error instanceof Error ? error.message : String(error),
70
- fix: "Ensure contract.source.load resolves to ok(Contract) or returns structured diagnostics."
71
- });
72
- }
73
- if (!isRecord(providerResult) || typeof providerResult.ok !== "boolean") throw errorRuntime("Failed to resolve contract source", {
74
- why: "Contract source provider returned malformed result shape.",
75
- fix: "Ensure contract.source.load resolves to ok(Contract) or notOk({ summary, diagnostics })."
76
- });
77
- if (providerResult.ok && !("value" in providerResult)) throw errorRuntime("Failed to resolve contract source", {
78
- why: "Contract source provider returned malformed success result: missing value.",
79
- fix: "Ensure contract.source.load success payload is ok(Contract)."
80
- });
81
- if (!providerResult.ok && !isProviderFailureLike(providerResult.failure)) throw errorRuntime("Failed to resolve contract source", {
82
- why: "Contract source provider returned malformed failure result: expected summary and diagnostics.",
83
- fix: "Ensure contract.source.load failure payload is notOk({ summary, diagnostics, meta? })."
84
- });
85
- if (!providerResult.ok) throw errorRuntime("Failed to resolve contract source", {
86
- why: providerResult.failure.summary,
87
- fix: "Fix contract source diagnostics and return ok(Contract).",
88
- meta: {
89
- diagnostics: providerResult.failure.diagnostics,
90
- ...ifDefined("providerMeta", providerResult.failure.meta)
91
- }
92
- });
93
- const familyInstance = config.family.create(stack);
94
- const rawComponents = [
95
- config.target,
96
- config.adapter,
97
- ...config.extensionPacks ?? []
98
- ];
99
- const frameworkComponents = assertFrameworkComponentsCompatible(config.family.familyId, config.target.targetId, rawComponents);
100
- const enrichedIR = enrichContract(providerResult.value, frameworkComponents);
101
- familyInstance.validateContract(enrichedIR);
102
- const emitResult = await unlessAborted(emit(enrichedIR, stack, config.family.emission, { outputJsonPath }));
103
- await unlessAborted(mkdir(dirname(outputJsonPath), { recursive: true }));
104
- await unlessAborted(writeFile(outputJsonPath, emitResult.contractJson, "utf-8"));
105
- await unlessAborted(writeFile(outputDtsPath, emitResult.contractDts, "utf-8"));
106
- const { validateContractDeps } = await import("./validate-contract-deps-esa-VQ0h.mjs");
107
- const depsValidation = validateContractDeps(emitResult.contractDts, dirname(outputDtsPath));
108
- if (depsValidation.warning) process.stderr.write(`\n⚠ ${depsValidation.warning}\n`);
109
- return {
110
- storageHash: emitResult.storageHash,
111
- ...ifDefined("executionHash", emitResult.executionHash),
112
- profileHash: emitResult.profileHash,
113
- files: {
114
- json: outputJsonPath,
115
- dts: outputDtsPath
116
- }
117
- };
118
- }
119
-
120
- //#endregion
121
- export { executeContractEmit as t };
122
- //# sourceMappingURL=contract-emit-CQfj7xJn.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract-emit-CQfj7xJn.mjs","names":["outputPaths: ReturnType<typeof getEmittedArtifactPaths>","providerResult: Awaited<ReturnType<typeof contractConfig.source.load>>"],"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, getEmittedArtifactPaths } 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 } 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\n // Validate source exists and is callable\n if (typeof contractConfig.source?.load !== 'function') {\n throw errorContractConfigMissing({\n why: 'Contract config must include a valid source provider object',\n });\n }\n\n let outputPaths: ReturnType<typeof getEmittedArtifactPaths>;\n try {\n outputPaths = getEmittedArtifactPaths(contractConfig.output);\n } catch (error) {\n throw errorContractConfigMissing({\n why: error instanceof Error ? error.message : String(error),\n });\n }\n const { jsonPath: outputJsonPath, dtsPath: outputDtsPath } = outputPaths;\n\n const stack = createControlStack(config);\n\n const sourceContext = {\n composedExtensionPacks: stack.extensionPacks.map((p) => p.id),\n scalarTypeDescriptors: stack.scalarTypeDescriptors,\n authoringContributions: stack.authoringContributions,\n codecLookup: stack.codecLookup,\n controlMutationDefaults: stack.controlMutationDefaults,\n resolvedInputs: contractConfig.source.inputs ?? [],\n };\n\n let providerResult: Awaited<ReturnType<typeof contractConfig.source.load>>;\n try {\n providerResult = await unlessAborted(contractConfig.source.load(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.load 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.load 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.load 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.load 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 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(\n emit(enrichedIR, stack, config.family.emission, {\n outputJsonPath: outputJsonPath,\n }),\n );\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,4 +0,0 @@
1
- import "./config-loader-_W4T21X1.mjs";
2
- import { t as executeContractEmit } from "./contract-emit-CQfj7xJn.mjs";
3
-
4
- export { executeContractEmit };
@@ -1,430 +0,0 @@
1
- import { t as TerminalUI } from "./terminal-ui-C5k88MmW.mjs";
2
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
- import { dirname, extname, isAbsolute, join, normalize } from "pathe";
4
- import * as clack from "@clack/prompts";
5
- import { execFile } from "node:child_process";
6
- import { promisify } from "node:util";
7
- import { detect } from "package-manager-detector/detect";
8
-
9
- //#region src/commands/init/detect-package-manager.ts
10
- const KNOWN = new Set([
11
- "pnpm",
12
- "npm",
13
- "yarn",
14
- "bun",
15
- "deno"
16
- ]);
17
- async function detectPackageManager(cwd) {
18
- const result = await detect({ cwd });
19
- if (result && KNOWN.has(result.name)) return result.name;
20
- return "npm";
21
- }
22
- function hasProjectManifest(cwd) {
23
- return existsSync(join(cwd, "package.json")) || existsSync(join(cwd, "deno.json")) || existsSync(join(cwd, "deno.jsonc"));
24
- }
25
- function formatRunCommand(pm, bin, args) {
26
- if (pm === "npm") return `npx ${bin} ${args}`;
27
- if (pm === "deno") return `deno run npm:${bin} ${args}`;
28
- return `${pm} ${bin} ${args}`;
29
- }
30
- function formatAddArgs(pm, packages) {
31
- if (pm === "deno") return ["add", ...packages.map((p) => `npm:${p}`)];
32
- return ["add", ...packages];
33
- }
34
- function formatAddDevArgs(pm, packages) {
35
- if (pm === "deno") return [
36
- "add",
37
- "--dev",
38
- ...packages.map((p) => `npm:${p}`)
39
- ];
40
- return [
41
- "add",
42
- "-D",
43
- ...packages
44
- ];
45
- }
46
-
47
- //#endregion
48
- //#region src/commands/init/templates/render.ts
49
- function renderTemplate(templateFile, variableNames, vars) {
50
- let result = readFileSync(join(import.meta.dirname, templateFile), "utf-8");
51
- for (const key of variableNames) {
52
- const value = vars[key];
53
- if (value === void 0) throw new Error(`Template variable '${key}' is not defined`);
54
- result = result.replaceAll(`{{${key}}}`, value);
55
- }
56
- return result;
57
- }
58
-
59
- //#endregion
60
- //#region src/commands/init/templates/agent-skill.ts
61
- const variables$1 = [
62
- "schemaPath",
63
- "schemaDir",
64
- "dbImportPath",
65
- "pkgRun"
66
- ];
67
- function agentSkillMd(target, schemaPath, pkgRun) {
68
- const schemaDir = dirname(schemaPath);
69
- const vars = {
70
- schemaPath,
71
- schemaDir,
72
- dbImportPath: `./${schemaDir}/db`,
73
- pkgRun
74
- };
75
- return renderTemplate(`agent-skill-${target}.md`, variables$1, vars);
76
- }
77
-
78
- //#endregion
79
- //#region src/commands/init/templates/code-templates.ts
80
- function targetPackageName(target) {
81
- return target === "postgres" ? "@prisma-next/postgres" : "@prisma-next/mongo";
82
- }
83
- function defaultSchemaPath(authoring) {
84
- if (authoring === "typescript") return "prisma/contract.ts";
85
- return "prisma/contract.prisma";
86
- }
87
- function starterSchema(target, authoring) {
88
- if (authoring === "typescript") return target === "mongo" ? starterSchemaTsMongo() : starterSchemaTsPostgres();
89
- return target === "mongo" ? starterSchemaPslMongo() : starterSchemaPslPostgres();
90
- }
91
- function starterSchemaPslPostgres() {
92
- return `model User {
93
- id Int @id @default(autoincrement())
94
- email String @unique
95
- name String?
96
- posts Post[]
97
- createdAt DateTime @default(now())
98
- }
99
-
100
- model Post {
101
- id Int @id @default(autoincrement())
102
- title String
103
- content String?
104
- author User @relation(fields: [authorId], references: [id])
105
- authorId Int
106
- createdAt DateTime @default(now())
107
- }
108
- `;
109
- }
110
- function starterSchemaPslMongo() {
111
- return `model User {
112
- id ObjectId @id @map("_id")
113
- email String @unique
114
- name String?
115
- posts Post[]
116
- @@map("users")
117
- }
118
-
119
- model Post {
120
- id ObjectId @id @map("_id")
121
- title String
122
- content String?
123
- author User @relation(fields: [authorId], references: [id])
124
- authorId ObjectId
125
- @@map("posts")
126
- }
127
- `;
128
- }
129
- function starterSchemaTsPostgres() {
130
- return `import sqlFamily from '@prisma-next/family-sql/pack';
131
- import { defineContract } from '@prisma-next/sql-contract-ts/contract-builder';
132
- import postgresPack from '@prisma-next/target-postgres/pack';
133
-
134
- export const contract = defineContract(
135
- { family: sqlFamily, target: postgresPack },
136
- ({ field, model, rel }) => ({
137
- models: {
138
- User: model('User', {
139
- fields: {
140
- id: field.id.uuidv7(),
141
- email: field.text().unique(),
142
- name: field.text().optional(),
143
- createdAt: field.createdAt(),
144
- },
145
- }).relations({
146
- posts: rel.hasMany('Post', { by: 'authorId' }),
147
- }),
148
-
149
- Post: model('Post', {
150
- fields: {
151
- id: field.id.uuidv7(),
152
- title: field.text(),
153
- content: field.text().optional(),
154
- authorId: field.uuid(),
155
- createdAt: field.createdAt(),
156
- },
157
- }).relations({
158
- author: rel.belongsTo('User', { from: 'authorId', to: 'id' }),
159
- }),
160
- },
161
- }),
162
- );
163
- `;
164
- }
165
- function starterSchemaTsMongo() {
166
- return `import mongoFamily from '@prisma-next/family-mongo/pack';
167
- import { defineContract, field, model, rel } from '@prisma-next/mongo-contract-ts/contract-builder';
168
- import mongoTarget from '@prisma-next/target-mongo/pack';
169
-
170
- const User = model('User', {
171
- collection: 'users',
172
- fields: {
173
- _id: field.objectId(),
174
- email: field.string(),
175
- name: field.string().optional(),
176
- },
177
- });
178
-
179
- const Post = model('Post', {
180
- collection: 'posts',
181
- fields: {
182
- _id: field.objectId(),
183
- title: field.string(),
184
- content: field.string().optional(),
185
- authorId: field.objectId(),
186
- },
187
- relations: {
188
- author: rel.belongsTo(User, { from: 'authorId', to: User.ref('_id') }),
189
- },
190
- });
191
-
192
- export const contract = defineContract({
193
- family: mongoFamily,
194
- target: mongoTarget,
195
- models: { User, Post },
196
- });
197
- `;
198
- }
199
- function configFile(target, contractPath) {
200
- return `import 'dotenv/config';
201
- import { defineConfig } from '${targetPackageName(target)}/config';
202
-
203
- export default defineConfig({
204
- contract: ${JSON.stringify(contractPath)},
205
- db: {
206
- connection: process.env['DATABASE_URL']!,
207
- },
208
- });
209
- `;
210
- }
211
- function dbFile(target) {
212
- if (target === "postgres") return `import postgres from '@prisma-next/postgres/runtime';
213
- import type { Contract } from './contract.d';
214
- import contractJson from './contract.json' with { type: 'json' };
215
-
216
- export const db = postgres<Contract>({ contractJson });
217
- `;
218
- return `import mongo from '@prisma-next/mongo/runtime';
219
- import type { Contract } from './contract.d';
220
- import contractJson from './contract.json' with { type: 'json' };
221
-
222
- export const db = mongo<Contract>({ contractJson });
223
- `;
224
- }
225
-
226
- //#endregion
227
- //#region src/commands/init/templates/quick-reference.ts
228
- const variables = [
229
- "schemaPath",
230
- "schemaDir",
231
- "dbImportPath",
232
- "pkgRun"
233
- ];
234
- function quickReferenceMd(target, schemaPath, pkgRun) {
235
- const schemaDir = dirname(schemaPath);
236
- const vars = {
237
- schemaPath,
238
- schemaDir,
239
- dbImportPath: `./${schemaDir}/db`,
240
- pkgRun
241
- };
242
- return renderTemplate(`quick-reference-${target}.md`, variables, vars);
243
- }
244
-
245
- //#endregion
246
- //#region src/commands/init/templates/tsconfig.ts
247
- const REQUIRED_COMPILER_OPTIONS = {
248
- module: "preserve",
249
- moduleResolution: "bundler",
250
- resolveJsonModule: true
251
- };
252
- function defaultTsConfig() {
253
- return JSON.stringify({
254
- compilerOptions: {
255
- target: "ES2022",
256
- ...REQUIRED_COMPILER_OPTIONS,
257
- strict: true,
258
- skipLibCheck: true,
259
- esModuleInterop: true,
260
- outDir: "dist"
261
- },
262
- include: ["**/*.ts"]
263
- }, null, 2);
264
- }
265
- function mergeTsConfig(existing) {
266
- const config = JSON.parse(existing);
267
- const compilerOptions = config["compilerOptions"] ?? {};
268
- for (const [key, value] of Object.entries(REQUIRED_COMPILER_OPTIONS)) compilerOptions[key] = value;
269
- config["compilerOptions"] = compilerOptions;
270
- return JSON.stringify(config, null, 2);
271
- }
272
-
273
- //#endregion
274
- //#region src/commands/init/init.ts
275
- async function runInit(baseDir, options) {
276
- const ui = new TerminalUI();
277
- clack.intro("prisma-next init", { output: process.stderr });
278
- if (!hasProjectManifest(baseDir)) {
279
- ui.error("No package.json or deno.json found. Initialize your project first (e.g. npm init or deno init), then re-run prisma-next init.");
280
- process.exit(1);
281
- }
282
- const pm = await detectPackageManager(baseDir);
283
- const pkgRun = formatRunCommand(pm, "prisma-next", "").trimEnd();
284
- if (existsSync(join(baseDir, "prisma-next.config.ts"))) {
285
- const reinit = await clack.confirm({
286
- message: "This project is already initialized. Re-initialize? This will overwrite all generated files.",
287
- initialValue: false,
288
- output: process.stderr
289
- });
290
- if (clack.isCancel(reinit) || !reinit) {
291
- clack.cancel("Init cancelled.", { output: process.stderr });
292
- process.exit(0);
293
- }
294
- }
295
- const targetResult = await clack.select({
296
- message: "What database are you using?",
297
- options: [{
298
- value: "postgres",
299
- label: "PostgreSQL"
300
- }, {
301
- value: "mongo",
302
- label: "MongoDB"
303
- }],
304
- output: process.stderr
305
- });
306
- if (clack.isCancel(targetResult)) {
307
- clack.cancel("Init cancelled.", { output: process.stderr });
308
- process.exit(0);
309
- }
310
- const target = targetResult;
311
- const authoringResult = await clack.select({
312
- message: "How do you want to write your schema?",
313
- options: [{
314
- value: "psl",
315
- label: "Prisma Schema Language (.prisma)"
316
- }, {
317
- value: "typescript",
318
- label: "TypeScript (.ts)"
319
- }],
320
- output: process.stderr
321
- });
322
- if (clack.isCancel(authoringResult)) {
323
- clack.cancel("Init cancelled.", { output: process.stderr });
324
- process.exit(0);
325
- }
326
- const authoring = authoringResult;
327
- const schemaPathResult = await clack.text({
328
- message: "Where should the schema file go?",
329
- initialValue: defaultSchemaPath(authoring),
330
- validate(value = "") {
331
- const trimmed = value.trim();
332
- if (trimmed.length === 0) return "Path cannot be empty";
333
- if (trimmed.endsWith("/") || trimmed.endsWith("\\")) return "Path must be a file, not a directory";
334
- if (!extname(trimmed)) return "Path must include a file extension (e.g. .prisma or .ts)";
335
- },
336
- output: process.stderr
337
- });
338
- if (clack.isCancel(schemaPathResult)) {
339
- clack.cancel("Init cancelled.", { output: process.stderr });
340
- process.exit(0);
341
- }
342
- const schemaPath = normalize(schemaPathResult.trim());
343
- const schemaDir = dirname(schemaPath);
344
- const configPath = isAbsolute(schemaPath) ? schemaPath : `./${schemaPath}`;
345
- const files = [
346
- {
347
- path: schemaPath,
348
- content: starterSchema(target, authoring)
349
- },
350
- {
351
- path: "prisma-next.config.ts",
352
- content: configFile(target, configPath)
353
- },
354
- {
355
- path: join(schemaDir, "db.ts"),
356
- content: dbFile(target)
357
- },
358
- {
359
- path: "prisma-next.md",
360
- content: quickReferenceMd(target, schemaPath, pkgRun)
361
- },
362
- {
363
- path: ".agents/skills/prisma-next/SKILL.md",
364
- content: agentSkillMd(target, schemaPath, pkgRun)
365
- }
366
- ];
367
- for (const file of files) {
368
- const fullPath = join(baseDir, file.path);
369
- mkdirSync(dirname(fullPath), { recursive: true });
370
- writeFileSync(fullPath, file.content, "utf-8");
371
- }
372
- const tsconfigPath = join(baseDir, "tsconfig.json");
373
- if (existsSync(tsconfigPath)) {
374
- writeFileSync(tsconfigPath, mergeTsConfig(readFileSync(tsconfigPath, "utf-8")), "utf-8");
375
- ui.log("Updated tsconfig.json with required compiler options.");
376
- } else writeFileSync(tsconfigPath, defaultTsConfig(), "utf-8");
377
- const emitCommand = formatRunCommand(pm, "prisma-next", "contract emit");
378
- if (options.noInstall) {
379
- const pkg = targetPackageName(target);
380
- ui.note([
381
- "Run the following commands to complete setup:",
382
- "",
383
- " 1. Install dependencies:",
384
- ` ${pm} ${formatAddArgs(pm, [pkg, "dotenv"]).join(" ")}`,
385
- ` ${pm} ${formatAddDevArgs(pm, ["prisma-next"]).join(" ")}`,
386
- "",
387
- " 2. Emit the contract:",
388
- ` ${emitCommand}`
389
- ].join("\n"), "Manual steps");
390
- } else {
391
- const pkg = targetPackageName(target);
392
- const spinner = ui.spinner();
393
- let installSucceeded = false;
394
- const exec = promisify(execFile);
395
- spinner.start(`Installing ${pkg}, dotenv, and prisma-next...`);
396
- try {
397
- await exec(pm, formatAddArgs(pm, [pkg, "dotenv"]), { cwd: baseDir });
398
- await exec(pm, formatAddDevArgs(pm, ["prisma-next"]), { cwd: baseDir });
399
- spinner.stop(`Installed ${pkg}, dotenv, and prisma-next`);
400
- installSucceeded = true;
401
- } catch (err) {
402
- spinner.stop("Installation failed");
403
- const stderr = err instanceof Error && "stderr" in err ? err.stderr : "";
404
- ui.warn([
405
- "Could not install dependencies automatically.",
406
- ...stderr ? [` ${stderr.trim()}`] : [],
407
- "",
408
- "Run manually:",
409
- ` ${pm} ${formatAddArgs(pm, [pkg, "dotenv"]).join(" ")}`,
410
- ` ${pm} ${formatAddDevArgs(pm, ["prisma-next"]).join(" ")}`
411
- ].join("\n"));
412
- }
413
- if (installSucceeded) {
414
- spinner.start("Emitting contract...");
415
- try {
416
- const { executeContractEmit } = await import("./contract-emit-fhNwwhkQ.mjs");
417
- await executeContractEmit({ configPath: join(baseDir, "prisma-next.config.ts") });
418
- spinner.stop("Contract emitted");
419
- } catch {
420
- spinner.stop("Contract emission failed");
421
- ui.warn(["Could not emit contract automatically. Run manually:", ` ${emitCommand}`].join("\n"));
422
- }
423
- }
424
- }
425
- clack.outro("Done! Open prisma-next.md to get started.", { output: process.stderr });
426
- }
427
-
428
- //#endregion
429
- export { runInit };
430
- //# sourceMappingURL=init-CQfo_4Ro.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-CQfo_4Ro.mjs","names":["KNOWN: ReadonlySet<string>","variables","vars: TemplateVars","vars: TemplateVars","REQUIRED_COMPILER_OPTIONS: Record<string, string | boolean>","files: FileEntry[]"],"sources":["../src/commands/init/detect-package-manager.ts","../src/commands/init/templates/render.ts","../src/commands/init/templates/agent-skill.ts","../src/commands/init/templates/code-templates.ts","../src/commands/init/templates/quick-reference.ts","../src/commands/init/templates/tsconfig.ts","../src/commands/init/init.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { detect } from 'package-manager-detector/detect';\nimport { join } from 'pathe';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun' | 'deno';\n\nconst KNOWN: ReadonlySet<string> = new Set<PackageManager>(['pnpm', 'npm', 'yarn', 'bun', 'deno']);\n\nexport async function detectPackageManager(cwd: string): Promise<PackageManager> {\n const result = await detect({ cwd });\n if (result && KNOWN.has(result.name)) {\n return result.name as PackageManager;\n }\n return 'npm';\n}\n\nexport function hasProjectManifest(cwd: string): boolean {\n return (\n existsSync(join(cwd, 'package.json')) ||\n existsSync(join(cwd, 'deno.json')) ||\n existsSync(join(cwd, 'deno.jsonc'))\n );\n}\n\nexport function formatRunCommand(pm: PackageManager, bin: string, args: string): string {\n if (pm === 'npm') {\n return `npx ${bin} ${args}`;\n }\n if (pm === 'deno') {\n return `deno run npm:${bin} ${args}`;\n }\n return `${pm} ${bin} ${args}`;\n}\n\nexport function formatAddArgs(pm: PackageManager, packages: string[]): string[] {\n if (pm === 'deno') {\n return ['add', ...packages.map((p) => `npm:${p}`)];\n }\n return ['add', ...packages];\n}\n\nexport function formatAddDevArgs(pm: PackageManager, packages: string[]): string[] {\n if (pm === 'deno') {\n return ['add', '--dev', ...packages.map((p) => `npm:${p}`)];\n }\n return ['add', '-D', ...packages];\n}\n","import { readFileSync } from 'node:fs';\nimport { join } from 'pathe';\n\nexport function renderTemplate(\n templateFile: string,\n variableNames: readonly string[],\n vars: Record<string, string>,\n): string {\n const templatePath = join(import.meta.dirname, templateFile);\n const raw = readFileSync(templatePath, 'utf-8');\n let result = raw;\n for (const key of variableNames) {\n const value = vars[key];\n if (value === undefined) {\n throw new Error(`Template variable '${key}' is not defined`);\n }\n result = result.replaceAll(`{{${key}}}`, value);\n }\n return result;\n}\n","import { dirname } from 'pathe';\nimport type { TargetId } from './code-templates';\nimport { renderTemplate } from './render';\n\nexport const variables = ['schemaPath', 'schemaDir', 'dbImportPath', 'pkgRun'] as const;\n\ntype TemplateVars = Record<(typeof variables)[number], string>;\n\nexport function agentSkillMd(target: TargetId, schemaPath: string, pkgRun: string): string {\n const schemaDir = dirname(schemaPath);\n const vars: TemplateVars = {\n schemaPath,\n schemaDir,\n dbImportPath: `./${schemaDir}/db`,\n pkgRun,\n };\n const templateFile = `agent-skill-${target}.md`;\n return renderTemplate(templateFile, variables, vars);\n}\n","export type TargetId = 'postgres' | 'mongo';\nexport type AuthoringId = 'psl' | 'typescript';\n\nexport function targetPackageName(target: TargetId): string {\n return target === 'postgres' ? '@prisma-next/postgres' : '@prisma-next/mongo';\n}\n\nexport function targetLabel(target: TargetId): string {\n return target === 'postgres' ? 'PostgreSQL' : 'MongoDB';\n}\n\nexport function defaultSchemaPath(authoring: AuthoringId): string {\n if (authoring === 'typescript') {\n return 'prisma/contract.ts';\n }\n return 'prisma/contract.prisma';\n}\n\nexport function starterSchema(target: TargetId, authoring: AuthoringId): string {\n if (authoring === 'typescript') {\n return target === 'mongo' ? starterSchemaTsMongo() : starterSchemaTsPostgres();\n }\n return target === 'mongo' ? starterSchemaPslMongo() : starterSchemaPslPostgres();\n}\n\nfunction starterSchemaPslPostgres(): string {\n return `model User {\n id Int @id @default(autoincrement())\n email String @unique\n name String?\n posts Post[]\n createdAt DateTime @default(now())\n}\n\nmodel Post {\n id Int @id @default(autoincrement())\n title String\n content String?\n author User @relation(fields: [authorId], references: [id])\n authorId Int\n createdAt DateTime @default(now())\n}\n`;\n}\n\nfunction starterSchemaPslMongo(): string {\n return `model User {\n id ObjectId @id @map(\"_id\")\n email String @unique\n name String?\n posts Post[]\n @@map(\"users\")\n}\n\nmodel Post {\n id ObjectId @id @map(\"_id\")\n title String\n content String?\n author User @relation(fields: [authorId], references: [id])\n authorId ObjectId\n @@map(\"posts\")\n}\n`;\n}\n\nfunction starterSchemaTsPostgres(): string {\n return `import sqlFamily from '@prisma-next/family-sql/pack';\nimport { defineContract } from '@prisma-next/sql-contract-ts/contract-builder';\nimport postgresPack from '@prisma-next/target-postgres/pack';\n\nexport const contract = defineContract(\n { family: sqlFamily, target: postgresPack },\n ({ field, model, rel }) => ({\n models: {\n User: model('User', {\n fields: {\n id: field.id.uuidv7(),\n email: field.text().unique(),\n name: field.text().optional(),\n createdAt: field.createdAt(),\n },\n }).relations({\n posts: rel.hasMany('Post', { by: 'authorId' }),\n }),\n\n Post: model('Post', {\n fields: {\n id: field.id.uuidv7(),\n title: field.text(),\n content: field.text().optional(),\n authorId: field.uuid(),\n createdAt: field.createdAt(),\n },\n }).relations({\n author: rel.belongsTo('User', { from: 'authorId', to: 'id' }),\n }),\n },\n }),\n);\n`;\n}\n\nfunction starterSchemaTsMongo(): string {\n return `import mongoFamily from '@prisma-next/family-mongo/pack';\nimport { defineContract, field, model, rel } from '@prisma-next/mongo-contract-ts/contract-builder';\nimport mongoTarget from '@prisma-next/target-mongo/pack';\n\nconst User = model('User', {\n collection: 'users',\n fields: {\n _id: field.objectId(),\n email: field.string(),\n name: field.string().optional(),\n },\n});\n\nconst Post = model('Post', {\n collection: 'posts',\n fields: {\n _id: field.objectId(),\n title: field.string(),\n content: field.string().optional(),\n authorId: field.objectId(),\n },\n relations: {\n author: rel.belongsTo(User, { from: 'authorId', to: User.ref('_id') }),\n },\n});\n\nexport const contract = defineContract({\n family: mongoFamily,\n target: mongoTarget,\n models: { User, Post },\n});\n`;\n}\n\nexport function configFile(target: TargetId, contractPath: string): string {\n const pkg = targetPackageName(target);\n return `import 'dotenv/config';\nimport { defineConfig } from '${pkg}/config';\n\nexport default defineConfig({\n contract: ${JSON.stringify(contractPath)},\n db: {\n connection: process.env['DATABASE_URL']!,\n },\n});\n`;\n}\n\nexport function dbFile(target: TargetId): string {\n if (target === 'postgres') {\n return `import postgres from '@prisma-next/postgres/runtime';\nimport type { Contract } from './contract.d';\nimport contractJson from './contract.json' with { type: 'json' };\n\nexport const db = postgres<Contract>({ contractJson });\n`;\n }\n\n return `import mongo from '@prisma-next/mongo/runtime';\nimport type { Contract } from './contract.d';\nimport contractJson from './contract.json' with { type: 'json' };\n\nexport const db = mongo<Contract>({ contractJson });\n`;\n}\n","import { dirname } from 'pathe';\nimport type { TargetId } from './code-templates';\nimport { renderTemplate } from './render';\n\nexport const variables = ['schemaPath', 'schemaDir', 'dbImportPath', 'pkgRun'] as const;\n\ntype TemplateVars = Record<(typeof variables)[number], string>;\n\nexport function quickReferenceMd(target: TargetId, schemaPath: string, pkgRun: string): string {\n const schemaDir = dirname(schemaPath);\n const vars: TemplateVars = {\n schemaPath,\n schemaDir,\n dbImportPath: `./${schemaDir}/db`,\n pkgRun,\n };\n const templateFile = `quick-reference-${target}.md`;\n return renderTemplate(templateFile, variables, vars);\n}\n","export const REQUIRED_COMPILER_OPTIONS: Record<string, string | boolean> = {\n module: 'preserve',\n moduleResolution: 'bundler',\n resolveJsonModule: true,\n};\n\nexport function defaultTsConfig(): string {\n return JSON.stringify(\n {\n compilerOptions: {\n target: 'ES2022',\n ...REQUIRED_COMPILER_OPTIONS,\n strict: true,\n skipLibCheck: true,\n esModuleInterop: true,\n outDir: 'dist',\n },\n include: ['**/*.ts'],\n },\n null,\n 2,\n );\n}\n\nexport function mergeTsConfig(existing: string): string {\n const config = JSON.parse(existing) as Record<string, unknown>;\n const compilerOptions = (config['compilerOptions'] ?? {}) as Record<string, unknown>;\n\n for (const [key, value] of Object.entries(REQUIRED_COMPILER_OPTIONS)) {\n compilerOptions[key] = value;\n }\n\n config['compilerOptions'] = compilerOptions;\n return JSON.stringify(config, null, 2);\n}\n","import { execFile } from 'node:child_process';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { promisify } from 'node:util';\nimport * as clack from '@clack/prompts';\nimport { dirname, extname, isAbsolute, join, normalize } from 'pathe';\nimport { TerminalUI } from '../../utils/terminal-ui';\nimport {\n detectPackageManager,\n formatAddArgs,\n formatAddDevArgs,\n formatRunCommand,\n hasProjectManifest,\n} from './detect-package-manager';\nimport { agentSkillMd } from './templates/agent-skill';\nimport {\n type AuthoringId,\n configFile,\n dbFile,\n defaultSchemaPath,\n starterSchema,\n type TargetId,\n targetPackageName,\n} from './templates/code-templates';\nimport { quickReferenceMd } from './templates/quick-reference';\nimport { defaultTsConfig, mergeTsConfig } from './templates/tsconfig';\n\nexport interface InitOptions {\n readonly noInstall?: boolean;\n}\n\ninterface FileEntry {\n readonly path: string;\n readonly content: string;\n}\n\nexport async function runInit(baseDir: string, options: InitOptions): Promise<void> {\n const ui = new TerminalUI();\n\n clack.intro('prisma-next init', { output: process.stderr });\n\n if (!hasProjectManifest(baseDir)) {\n ui.error(\n 'No package.json or deno.json found. Initialize your project first (e.g. npm init or deno init), then re-run prisma-next init.',\n );\n process.exit(1);\n }\n\n const pm = await detectPackageManager(baseDir);\n const pkgRun = formatRunCommand(pm, 'prisma-next', '').trimEnd();\n\n if (existsSync(join(baseDir, 'prisma-next.config.ts'))) {\n const reinit = await clack.confirm({\n message:\n 'This project is already initialized. Re-initialize? This will overwrite all generated files.',\n initialValue: false,\n output: process.stderr,\n });\n if (clack.isCancel(reinit) || !reinit) {\n clack.cancel('Init cancelled.', { output: process.stderr });\n process.exit(0);\n }\n }\n\n const targetResult = await clack.select({\n message: 'What database are you using?',\n options: [\n { value: 'postgres' as TargetId, label: 'PostgreSQL' },\n { value: 'mongo' as TargetId, label: 'MongoDB' },\n ],\n output: process.stderr,\n });\n if (clack.isCancel(targetResult)) {\n clack.cancel('Init cancelled.', { output: process.stderr });\n process.exit(0);\n }\n const target = targetResult as TargetId;\n\n const authoringResult = await clack.select({\n message: 'How do you want to write your schema?',\n options: [\n { value: 'psl' as AuthoringId, label: 'Prisma Schema Language (.prisma)' },\n { value: 'typescript' as AuthoringId, label: 'TypeScript (.ts)' },\n ],\n output: process.stderr,\n });\n if (clack.isCancel(authoringResult)) {\n clack.cancel('Init cancelled.', { output: process.stderr });\n process.exit(0);\n }\n const authoring = authoringResult as AuthoringId;\n\n const schemaPathResult = await clack.text({\n message: 'Where should the schema file go?',\n initialValue: defaultSchemaPath(authoring),\n validate(value = '') {\n const trimmed = value.trim();\n if (trimmed.length === 0) return 'Path cannot be empty';\n if (trimmed.endsWith('/') || trimmed.endsWith('\\\\'))\n return 'Path must be a file, not a directory';\n if (!extname(trimmed)) return 'Path must include a file extension (e.g. .prisma or .ts)';\n return undefined;\n },\n output: process.stderr,\n });\n if (clack.isCancel(schemaPathResult)) {\n clack.cancel('Init cancelled.', { output: process.stderr });\n process.exit(0);\n }\n const schemaPath = normalize((schemaPathResult as string).trim());\n\n const schemaDir = dirname(schemaPath);\n const configPath = isAbsolute(schemaPath) ? schemaPath : `./${schemaPath}`;\n\n const files: FileEntry[] = [\n { path: schemaPath, content: starterSchema(target, authoring) },\n { path: 'prisma-next.config.ts', content: configFile(target, configPath) },\n { path: join(schemaDir, 'db.ts'), content: dbFile(target) },\n { path: 'prisma-next.md', content: quickReferenceMd(target, schemaPath, pkgRun) },\n {\n path: '.agents/skills/prisma-next/SKILL.md',\n content: agentSkillMd(target, schemaPath, pkgRun),\n },\n ];\n\n for (const file of files) {\n const fullPath = join(baseDir, file.path);\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, file.content, 'utf-8');\n }\n\n const tsconfigPath = join(baseDir, 'tsconfig.json');\n if (existsSync(tsconfigPath)) {\n const existing = readFileSync(tsconfigPath, 'utf-8');\n writeFileSync(tsconfigPath, mergeTsConfig(existing), 'utf-8');\n ui.log('Updated tsconfig.json with required compiler options.');\n } else {\n writeFileSync(tsconfigPath, defaultTsConfig(), 'utf-8');\n }\n\n const emitCommand = formatRunCommand(pm, 'prisma-next', 'contract emit');\n\n if (options.noInstall) {\n const pkg = targetPackageName(target);\n ui.note(\n [\n 'Run the following commands to complete setup:',\n '',\n ' 1. Install dependencies:',\n ` ${pm} ${formatAddArgs(pm, [pkg, 'dotenv']).join(' ')}`,\n ` ${pm} ${formatAddDevArgs(pm, ['prisma-next']).join(' ')}`,\n '',\n ' 2. Emit the contract:',\n ` ${emitCommand}`,\n ].join('\\n'),\n 'Manual steps',\n );\n } else {\n const pkg = targetPackageName(target);\n const spinner = ui.spinner();\n let installSucceeded = false;\n\n const exec = promisify(execFile);\n\n spinner.start(`Installing ${pkg}, dotenv, and prisma-next...`);\n try {\n await exec(pm, formatAddArgs(pm, [pkg, 'dotenv']), { cwd: baseDir });\n await exec(pm, formatAddDevArgs(pm, ['prisma-next']), { cwd: baseDir });\n spinner.stop(`Installed ${pkg}, dotenv, and prisma-next`);\n installSucceeded = true;\n } catch (err) {\n spinner.stop('Installation failed');\n const stderr =\n err instanceof Error && 'stderr' in err ? (err as { stderr: string }).stderr : '';\n ui.warn(\n [\n 'Could not install dependencies automatically.',\n ...(stderr ? [` ${stderr.trim()}`] : []),\n '',\n 'Run manually:',\n ` ${pm} ${formatAddArgs(pm, [pkg, 'dotenv']).join(' ')}`,\n ` ${pm} ${formatAddDevArgs(pm, ['prisma-next']).join(' ')}`,\n ].join('\\n'),\n );\n }\n\n if (installSucceeded) {\n spinner.start('Emitting contract...');\n try {\n const { executeContractEmit } = await import('../../control-api/operations/contract-emit');\n const configFilePath = join(baseDir, 'prisma-next.config.ts');\n await executeContractEmit({ configPath: configFilePath });\n spinner.stop('Contract emitted');\n } catch {\n spinner.stop('Contract emission failed');\n ui.warn(\n ['Could not emit contract automatically. Run manually:', ` ${emitCommand}`].join('\\n'),\n );\n }\n }\n }\n\n clack.outro('Done! Open prisma-next.md to get started.', { output: process.stderr });\n}\n"],"mappings":"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"}