prisma-next 0.5.0-dev.7 → 0.5.0-dev.71

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 (129) hide show
  1. package/dist/cli-errors-D3_sMh2K.mjs +33 -0
  2. package/dist/cli-errors-D3_sMh2K.mjs.map +1 -0
  3. package/dist/cli-errors-QH8kf-C2.d.mts +3 -0
  4. package/dist/cli.mjs +16 -78
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/client-0ZX24FXF.mjs +1398 -0
  7. package/dist/client-0ZX24FXF.mjs.map +1 -0
  8. package/dist/commands/contract-emit.d.mts.map +1 -1
  9. package/dist/commands/contract-emit.mjs +2 -4
  10. package/dist/commands/contract-infer.d.mts.map +1 -1
  11. package/dist/commands/contract-infer.mjs +2 -4
  12. package/dist/commands/db-init.d.mts.map +1 -1
  13. package/dist/commands/db-init.mjs +14 -13
  14. package/dist/commands/db-init.mjs.map +1 -1
  15. package/dist/commands/db-schema.d.mts.map +1 -1
  16. package/dist/commands/db-schema.mjs +5 -7
  17. package/dist/commands/db-schema.mjs.map +1 -1
  18. package/dist/commands/db-sign.d.mts.map +1 -1
  19. package/dist/commands/db-sign.mjs +8 -9
  20. package/dist/commands/db-sign.mjs.map +1 -1
  21. package/dist/commands/db-update.d.mts.map +1 -1
  22. package/dist/commands/db-update.mjs +13 -13
  23. package/dist/commands/db-update.mjs.map +1 -1
  24. package/dist/commands/db-verify.d.mts.map +1 -1
  25. package/dist/commands/db-verify.mjs +1 -321
  26. package/dist/commands/migration-apply.d.mts +5 -2
  27. package/dist/commands/migration-apply.d.mts.map +1 -1
  28. package/dist/commands/migration-apply.mjs +64 -66
  29. package/dist/commands/migration-apply.mjs.map +1 -1
  30. package/dist/commands/migration-new.d.mts +0 -1
  31. package/dist/commands/migration-new.d.mts.map +1 -1
  32. package/dist/commands/migration-new.mjs +33 -40
  33. package/dist/commands/migration-new.mjs.map +1 -1
  34. package/dist/commands/migration-plan.d.mts +14 -5
  35. package/dist/commands/migration-plan.d.mts.map +1 -1
  36. package/dist/commands/migration-plan.mjs +1 -347
  37. package/dist/commands/migration-ref.d.mts +1 -1
  38. package/dist/commands/migration-ref.d.mts.map +1 -1
  39. package/dist/commands/migration-ref.mjs +7 -12
  40. package/dist/commands/migration-ref.mjs.map +1 -1
  41. package/dist/commands/migration-show.d.mts +13 -7
  42. package/dist/commands/migration-show.d.mts.map +1 -1
  43. package/dist/commands/migration-show.mjs +34 -36
  44. package/dist/commands/migration-show.mjs.map +1 -1
  45. package/dist/commands/migration-status.d.mts +23 -5
  46. package/dist/commands/migration-status.d.mts.map +1 -1
  47. package/dist/commands/migration-status.mjs +2 -4
  48. package/dist/{config-loader-C25b63rJ.mjs → config-loader-B6sJjXTv.mjs} +3 -5
  49. package/dist/config-loader-B6sJjXTv.mjs.map +1 -0
  50. package/dist/config-loader.d.mts +0 -1
  51. package/dist/config-loader.d.mts.map +1 -1
  52. package/dist/config-loader.mjs +2 -3
  53. package/dist/contract-emit-B3ChISB_.mjs +338 -0
  54. package/dist/contract-emit-B3ChISB_.mjs.map +1 -0
  55. package/dist/contract-emit-DkMqO7f2.mjs +148 -0
  56. package/dist/contract-emit-DkMqO7f2.mjs.map +1 -0
  57. package/dist/{contract-enrichment-CAOELa-H.mjs → contract-enrichment-CF6ogEJ_.mjs} +4 -6
  58. package/dist/contract-enrichment-CF6ogEJ_.mjs.map +1 -0
  59. package/dist/{contract-infer-D9cC3rJm.mjs → contract-infer-BDKAE0B0.mjs} +12 -22
  60. package/dist/contract-infer-BDKAE0B0.mjs.map +1 -0
  61. package/dist/db-verify-B4TdDKOI.mjs +403 -0
  62. package/dist/db-verify-B4TdDKOI.mjs.map +1 -0
  63. package/dist/exports/config-types.mjs +1 -2
  64. package/dist/exports/control-api.d.mts +287 -29
  65. package/dist/exports/control-api.d.mts.map +1 -1
  66. package/dist/exports/control-api.mjs +4 -6
  67. package/dist/exports/index.d.mts.map +1 -1
  68. package/dist/exports/index.mjs +28 -30
  69. package/dist/exports/index.mjs.map +1 -1
  70. package/dist/exports/init-output.d.mts +2 -4
  71. package/dist/exports/init-output.d.mts.map +1 -1
  72. package/dist/exports/init-output.mjs +2 -3
  73. package/dist/{framework-components-Cr--XBKy.mjs → framework-components-gwAHl7ml.mjs} +3 -4
  74. package/dist/{framework-components-Cr--XBKy.mjs.map → framework-components-gwAHl7ml.mjs.map} +1 -1
  75. package/dist/{init-C5220SY9.mjs → init-Deo7U8_U.mjs} +26 -35
  76. package/dist/init-Deo7U8_U.mjs.map +1 -0
  77. package/dist/{inspect-live-schema-yrHAvG71.mjs → inspect-live-schema-BAgQMYpD.mjs} +10 -11
  78. package/dist/inspect-live-schema-BAgQMYpD.mjs.map +1 -0
  79. package/dist/migration-cli.d.mts +41 -12
  80. package/dist/migration-cli.d.mts.map +1 -1
  81. package/dist/migration-cli.mjs +309 -86
  82. package/dist/migration-cli.mjs.map +1 -1
  83. package/dist/{migration-command-scaffold-B3B09et6.mjs → migration-command-scaffold-B8J702Uh.mjs} +8 -9
  84. package/dist/migration-command-scaffold-B8J702Uh.mjs.map +1 -0
  85. package/dist/migration-plan-BcKNnTM7.mjs +530 -0
  86. package/dist/migration-plan-BcKNnTM7.mjs.map +1 -0
  87. package/dist/{migration-status-DUMiH8_G.mjs → migration-status-CjwB2of-.mjs} +117 -64
  88. package/dist/migration-status-CjwB2of-.mjs.map +1 -0
  89. package/dist/{migrations-Bo5WtTla.mjs → migrations-CIK94AJf.mjs} +43 -23
  90. package/dist/migrations-CIK94AJf.mjs.map +1 -0
  91. package/dist/{output-BpcQrnnq.mjs → output-DnjfCC_u.mjs} +9 -3
  92. package/dist/output-DnjfCC_u.mjs.map +1 -0
  93. package/dist/{progress-adapter-DvQWB1nK.mjs → progress-adapter-xASh41wr.mjs} +2 -2
  94. package/dist/{progress-adapter-DvQWB1nK.mjs.map → progress-adapter-xASh41wr.mjs.map} +1 -1
  95. package/dist/{result-handler-Ba3zWQsI.mjs → result-handler-DWb1rFS-.mjs} +52 -27
  96. package/dist/result-handler-DWb1rFS-.mjs.map +1 -0
  97. package/dist/{terminal-ui-C3ZLwQxK.mjs → terminal-ui-zaRDhJnP.mjs} +2 -6
  98. package/dist/{terminal-ui-C3ZLwQxK.mjs.map → terminal-ui-zaRDhJnP.mjs.map} +1 -1
  99. package/dist/{verify-Bkycc-Tf.mjs → verify-BEIa9638.mjs} +3 -4
  100. package/dist/verify-BEIa9638.mjs.map +1 -0
  101. package/package.json +19 -17
  102. package/dist/cli-errors-BFYgBH3L.d.mts +0 -4
  103. package/dist/cli-errors-Cd79vmTH.mjs +0 -5
  104. package/dist/client-CrsnY58k.mjs +0 -997
  105. package/dist/client-CrsnY58k.mjs.map +0 -1
  106. package/dist/commands/db-verify.mjs.map +0 -1
  107. package/dist/commands/migration-plan.mjs.map +0 -1
  108. package/dist/config-loader-C25b63rJ.mjs.map +0 -1
  109. package/dist/contract-emit--feXyNd7.mjs +0 -4
  110. package/dist/contract-emit-NJ01hiiv.mjs +0 -195
  111. package/dist/contract-emit-NJ01hiiv.mjs.map +0 -1
  112. package/dist/contract-emit-V5SSitUT.mjs +0 -122
  113. package/dist/contract-emit-V5SSitUT.mjs.map +0 -1
  114. package/dist/contract-enrichment-CAOELa-H.mjs.map +0 -1
  115. package/dist/contract-infer-D9cC3rJm.mjs.map +0 -1
  116. package/dist/extract-operation-statements-DsFfxXVZ.mjs +0 -13
  117. package/dist/extract-operation-statements-DsFfxXVZ.mjs.map +0 -1
  118. package/dist/extract-sql-ddl-D9UbZDyz.mjs +0 -26
  119. package/dist/extract-sql-ddl-D9UbZDyz.mjs.map +0 -1
  120. package/dist/init-C5220SY9.mjs.map +0 -1
  121. package/dist/inspect-live-schema-yrHAvG71.mjs.map +0 -1
  122. package/dist/migration-command-scaffold-B3B09et6.mjs.map +0 -1
  123. package/dist/migration-status-DUMiH8_G.mjs.map +0 -1
  124. package/dist/migrations-Bo5WtTla.mjs.map +0 -1
  125. package/dist/output-BpcQrnnq.mjs.map +0 -1
  126. package/dist/result-handler-Ba3zWQsI.mjs.map +0 -1
  127. package/dist/validate-contract-deps-B_Cs29TL.mjs +0 -37
  128. package/dist/validate-contract-deps-B_Cs29TL.mjs.map +0 -1
  129. package/dist/verify-Bkycc-Tf.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["value","disallowedImports: string[]","contract: unknown"],"sources":["../../src/load-ts-contract.ts"],"sourcesContent":["import { existsSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { Plugin } from 'esbuild';\nimport { build } from 'esbuild';\nimport { join } from 'pathe';\n\nexport interface LoadTsContractOptions {\n readonly allowlist?: ReadonlyArray<string>;\n}\n\nconst DEFAULT_ALLOWLIST = ['@prisma-next/*', 'node:crypto'];\n\nfunction isAllowedImport(importPath: string, allowlist: ReadonlyArray<string>): boolean {\n for (const pattern of allowlist) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(`${prefix}/`)) {\n return true;\n }\n } else if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1);\n if (importPath.startsWith(prefix)) {\n return true;\n }\n } else if (importPath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nfunction validatePurity(value: unknown): void {\n if (typeof value !== 'object' || value === null) {\n return;\n }\n\n const path = new WeakSet();\n\n function check(value: unknown): void {\n if (value === null || typeof value !== 'object') {\n return;\n }\n\n if (path.has(value)) {\n throw new Error('Contract export contains circular references');\n }\n path.add(value);\n\n try {\n for (const key in value) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && (descriptor.get || descriptor.set)) {\n throw new Error(`Contract export contains getter/setter at key \"${key}\"`);\n }\n if (descriptor && typeof descriptor.value === 'function') {\n throw new Error(`Contract export contains function at key \"${key}\"`);\n }\n check((value as Record<string, unknown>)[key]);\n }\n } finally {\n path.delete(value);\n }\n }\n\n try {\n check(value);\n JSON.stringify(value);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('getter') || error.message.includes('circular')) {\n throw error;\n }\n throw new Error(`Contract export is not JSON-serializable: ${error.message}`);\n }\n throw new Error('Contract export is not JSON-serializable');\n }\n}\n\nfunction createImportAllowlistPlugin(allowlist: ReadonlyArray<string>, entryPath: string): Plugin {\n return {\n name: 'import-allowlist',\n setup(build) {\n build.onResolve({ filter: /.*/ }, (args) => {\n if (args.kind === 'entry-point') {\n return undefined;\n }\n if (args.path.startsWith('.') || args.path.startsWith('/')) {\n return undefined;\n }\n const isFromEntryPoint = args.importer === entryPath || args.importer === '<stdin>';\n if (isFromEntryPoint && !isAllowedImport(args.path, allowlist)) {\n return {\n path: args.path,\n external: true,\n };\n }\n return undefined;\n });\n },\n };\n}\n\n/**\n * Loads a contract from a TypeScript file and returns it as Contract.\n *\n * **Responsibility: Parsing Only**\n * This function loads and parses a TypeScript contract file. It does NOT normalize the contract.\n * The contract should already be normalized if it was built using the contract builder.\n *\n * Normalization must happen in the contract builder when the contract is created.\n * This function only validates that the contract is JSON-serializable and returns it as-is.\n *\n * @param entryPath - Path to the TypeScript contract file\n * @param options - Optional configuration (import allowlist)\n * @returns The contract as Contract (should already be normalized)\n * @throws Error if the contract cannot be loaded or is not JSON-serializable\n */\nexport async function loadContractFromTs(\n entryPath: string,\n options?: LoadTsContractOptions,\n): Promise<Contract> {\n const allowlist = options?.allowlist ?? DEFAULT_ALLOWLIST;\n\n if (!existsSync(entryPath)) {\n throw new Error(`Contract file not found: ${entryPath}`);\n }\n\n const tempFile = join(\n tmpdir(),\n `prisma-next-contract-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n try {\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'es2022',\n outfile: tempFile,\n write: false,\n metafile: true,\n plugins: [createImportAllowlistPlugin(allowlist, entryPath)],\n logLevel: 'error',\n });\n\n if (result.errors.length > 0) {\n const errorMessages = result.errors.map((e: { text: string }) => e.text).join('\\n');\n throw new Error(`Failed to bundle contract file: ${errorMessages}`);\n }\n\n if (!result.outputFiles || result.outputFiles.length === 0) {\n throw new Error('No output files generated from bundling');\n }\n\n const disallowedImports: string[] = [];\n if (result.metafile) {\n const inputs = result.metafile.inputs;\n for (const [, inputData] of Object.entries(inputs)) {\n const imports =\n (inputData as { imports?: Array<{ path: string; external?: boolean }> }).imports || [];\n for (const imp of imports) {\n if (\n imp.external &&\n !imp.path.startsWith('.') &&\n !imp.path.startsWith('/') &&\n !isAllowedImport(imp.path, allowlist)\n ) {\n disallowedImports.push(imp.path);\n }\n }\n }\n }\n\n if (disallowedImports.length > 0) {\n throw new Error(\n `Disallowed imports detected. Only imports matching the allowlist are permitted:\\n Allowlist: ${allowlist.join(', ')}\\n Disallowed imports: ${disallowedImports.join(', ')}\\n\\nOnly @prisma-next/* packages are allowed in contract files.`,\n );\n }\n\n const bundleContent = result.outputFiles[0]?.text;\n if (bundleContent === undefined) {\n throw new Error('Bundle content is undefined');\n }\n writeFileSync(tempFile, bundleContent, 'utf-8');\n\n const module = (await import(/* @vite-ignore */ pathToFileURL(tempFile).href)) as {\n default?: unknown;\n contract?: unknown;\n };\n unlinkSync(tempFile);\n\n let contract: unknown;\n\n if (module.default !== undefined) {\n contract = module.default;\n } else if (module.contract !== undefined) {\n contract = module.contract;\n } else {\n throw new Error(\n `Contract file must export a contract as default export or named export 'contract'. Found exports: ${Object.keys(module as Record<string, unknown>).join(', ') || 'none'}`,\n );\n }\n\n if (typeof contract !== 'object' || contract === null) {\n throw new Error(`Contract export must be an object, got ${typeof contract}`);\n }\n\n validatePurity(contract);\n\n return contract as Contract;\n } catch (error) {\n try {\n if (tempFile) {\n unlinkSync(tempFile);\n }\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to load contract from ${entryPath}: ${String(error)}`);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["resolvePath"],"sources":["../../src/load-ts-contract.ts"],"sourcesContent":["import { existsSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { pathToFileURL } from 'node:url';\nimport type { Contract } from '@prisma-next/contract/types';\nimport type { Plugin } from 'esbuild';\nimport { build } from 'esbuild';\nimport { join, resolve as resolvePath } from 'pathe';\n\nexport interface LoadTsContractOptions {\n readonly allowlist?: ReadonlyArray<string>;\n}\n\nconst DEFAULT_ALLOWLIST = ['@prisma-next/*', 'node:crypto'];\n\nfunction isAllowedImport(importPath: string, allowlist: ReadonlyArray<string>): boolean {\n for (const pattern of allowlist) {\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2);\n if (importPath === prefix || importPath.startsWith(`${prefix}/`)) {\n return true;\n }\n } else if (pattern.endsWith('*')) {\n const prefix = pattern.slice(0, -1);\n if (importPath.startsWith(prefix)) {\n return true;\n }\n } else if (importPath === pattern) {\n return true;\n }\n }\n return false;\n}\n\nfunction validatePurity(value: unknown): void {\n if (typeof value !== 'object' || value === null) {\n return;\n }\n\n const path = new WeakSet();\n\n function check(value: unknown): void {\n if (value === null || typeof value !== 'object') {\n return;\n }\n\n if (path.has(value)) {\n throw new Error('Contract export contains circular references');\n }\n path.add(value);\n\n try {\n for (const key in value) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor && (descriptor.get || descriptor.set)) {\n throw new Error(`Contract export contains getter/setter at key \"${key}\"`);\n }\n if (descriptor && typeof descriptor.value === 'function') {\n throw new Error(`Contract export contains function at key \"${key}\"`);\n }\n check((value as Record<string, unknown>)[key]);\n }\n } finally {\n path.delete(value);\n }\n }\n\n try {\n check(value);\n JSON.stringify(value);\n } catch (error) {\n if (error instanceof Error) {\n if (error.message.includes('getter') || error.message.includes('circular')) {\n throw error;\n }\n throw new Error(`Contract export is not JSON-serializable: ${error.message}`);\n }\n throw new Error('Contract export is not JSON-serializable');\n }\n}\n\nfunction createImportAllowlistPlugin(\n allowlist: ReadonlyArray<string>,\n entryPath: string,\n collected: Set<string>,\n): Plugin {\n // Match against several path forms that esbuild may use as the importer:\n // the absolute resolved entry, the value the caller passed (which may be\n // relative), and the conventional `<stdin>` placeholder. This is more\n // forgiving than `===` against a single form, which broke when esbuild\n // resolved the entry to an absolute path while the caller passed a\n // relative one (or vice versa).\n const entryAbs = resolvePath(entryPath);\n function isFromEntry(importer: string): boolean {\n return importer === entryAbs || importer === entryPath || importer === '<stdin>';\n }\n return {\n name: 'import-allowlist',\n setup(build) {\n build.onResolve({ filter: /.*/ }, (args) => {\n if (args.kind === 'entry-point') {\n return undefined;\n }\n if (args.path.startsWith('.') || args.path.startsWith('/')) {\n return undefined;\n }\n if (isFromEntry(args.importer) && !isAllowedImport(args.path, allowlist)) {\n collected.add(args.path);\n return {\n path: args.path,\n external: true,\n };\n }\n return undefined;\n });\n },\n };\n}\n\n/**\n * Loads a contract from a TypeScript file and returns it as Contract.\n *\n * **Responsibility: Parsing Only**\n * This function loads and parses a TypeScript contract file. It does NOT normalize the contract.\n * The contract should already be normalized if it was built using the contract builder.\n *\n * Normalization must happen in the contract builder when the contract is created.\n * This function only validates that the contract is JSON-serializable and returns it as-is.\n *\n * @param entryPath - Path to the TypeScript contract file\n * @param options - Optional configuration (import allowlist)\n * @returns The contract as Contract (should already be normalized)\n * @throws Error if the contract cannot be loaded or is not JSON-serializable\n */\nexport async function loadContractFromTs(\n entryPath: string,\n options?: LoadTsContractOptions,\n): Promise<Contract> {\n const allowlist = options?.allowlist ?? DEFAULT_ALLOWLIST;\n\n if (!existsSync(entryPath)) {\n throw new Error(`Contract file not found: ${entryPath}`);\n }\n\n const tempFile = join(\n tmpdir(),\n `prisma-next-contract-${Date.now()}-${Math.random().toString(36).slice(2)}.mjs`,\n );\n\n // Disallowed imports are collected by the allowlist resolver plugin itself,\n // which has the `importer` context to distinguish entry-direct imports from\n // transitive imports made inside allowlisted (`@prisma-next/*`) dependencies.\n // The metafile is intentionally not re-walked: it would surface internal\n // `node:*` imports inside framework code as false positives.\n const disallowedFromEntry = new Set<string>();\n\n try {\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'es2022',\n outfile: tempFile,\n write: false,\n metafile: true,\n plugins: [createImportAllowlistPlugin(allowlist, entryPath, disallowedFromEntry)],\n logLevel: 'error',\n });\n\n if (result.errors.length > 0) {\n const errorMessages = result.errors.map((e: { text: string }) => e.text).join('\\n');\n throw new Error(`Failed to bundle contract file: ${errorMessages}`);\n }\n\n if (!result.outputFiles || result.outputFiles.length === 0) {\n throw new Error('No output files generated from bundling');\n }\n\n if (disallowedFromEntry.size > 0) {\n throw new Error(\n `Disallowed imports detected. Only imports matching the allowlist are permitted:\\n Allowlist: ${allowlist.join(', ')}\\n Disallowed imports: ${[...disallowedFromEntry].join(', ')}`,\n );\n }\n\n const bundleContent = result.outputFiles[0]?.text;\n if (bundleContent === undefined) {\n throw new Error('Bundle content is undefined');\n }\n writeFileSync(tempFile, bundleContent, 'utf-8');\n\n const module = (await import(/* @vite-ignore */ pathToFileURL(tempFile).href)) as {\n default?: unknown;\n contract?: unknown;\n };\n unlinkSync(tempFile);\n\n let contract: unknown;\n\n if (module.default !== undefined) {\n contract = module.default;\n } else if (module.contract !== undefined) {\n contract = module.contract;\n } else {\n throw new Error(\n `Contract file must export a contract as default export or named export 'contract'. Found exports: ${Object.keys(module as Record<string, unknown>).join(', ') || 'none'}`,\n );\n }\n\n if (typeof contract !== 'object' || contract === null) {\n throw new Error(`Contract export must be an object, got ${typeof contract}`);\n }\n\n validatePurity(contract);\n\n return contract as Contract;\n } catch (error) {\n try {\n if (tempFile) {\n unlinkSync(tempFile);\n }\n } catch {\n // Ignore cleanup errors\n }\n\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(`Failed to load contract from ${entryPath}: ${String(error)}`);\n }\n}\n"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- import "@clack/prompts";
2
- import * as arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
1
+ import * as _$arktype_internal_variants_object_ts0 from "arktype/internal/variants/object.ts";
3
2
 
4
3
  //#region src/commands/init/output.d.ts
5
-
6
4
  /**
7
5
  * arktype schema for the structured success document `init --json` writes
8
6
  * to stdout (FR1.5). The same shape backs the human-readable outro
@@ -17,7 +15,7 @@ import * as arktype_internal_variants_object_ts0 from "arktype/internal/variants
17
15
  * Error envelopes (`CliErrorEnvelope`) carry `ok: false` so consumers can
18
16
  * branch with `if (doc.ok)` without inspecting the rest of the structure.
19
17
  */
20
- declare const InitOutputSchema: arktype_internal_variants_object_ts0.ObjectType<{
18
+ declare const InitOutputSchema: _$arktype_internal_variants_object_ts0.ObjectType<{
21
19
  ok: true;
22
20
  target: "postgres" | "mongodb";
23
21
  authoring: "psl" | "typescript";
@@ -1 +1 @@
1
- {"version":3,"file":"init-output.d.mts","names":[],"sources":["../../src/commands/init/output.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkBA;AAwBA;;;;;;;;;;;cAxBa,kBAsBX,oCAAA,CAtB2B;;;;;;;;;;;;;;;;KAwBjB,UAAA,UAAoB,gBAAA,CAAiB"}
1
+ {"version":3,"file":"init-output.d.mts","names":[],"sources":["../../src/commands/init/output.ts"],"mappings":";;;;;AAkBA;;;;;;;;;;;;cAAa,gBAAA,EAsBX,sCAAA,CAtB2B,UAAA;;;;;;;;;;;;;;;;KAwBjB,UAAA,UAAoB,gBAAA,CAAiB,KAAA"}
@@ -1,3 +1,2 @@
1
- import { t as InitOutputSchema } from "../output-BpcQrnnq.mjs";
2
-
3
- export { InitOutputSchema };
1
+ import { t as InitOutputSchema } from "../output-DnjfCC_u.mjs";
2
+ export { InitOutputSchema };
@@ -1,6 +1,5 @@
1
- import { r as errorConfigValidation } from "./cli-errors-Cd79vmTH.mjs";
1
+ import { r as errorConfigValidation } from "./cli-errors-D3_sMh2K.mjs";
2
2
  import "@prisma-next/framework-components/components";
3
-
4
3
  //#region src/utils/framework-components.ts
5
4
  /**
6
5
  * Asserts that all framework components are compatible with the expected family and target.
@@ -53,7 +52,7 @@ function assertFrameworkComponentsCompatible(expectedFamilyId, expectedTargetId,
53
52
  }
54
53
  return frameworkComponents;
55
54
  }
56
-
57
55
  //#endregion
58
56
  export { assertFrameworkComponentsCompatible as t };
59
- //# sourceMappingURL=framework-components-Cr--XBKy.mjs.map
57
+
58
+ //# sourceMappingURL=framework-components-gwAHl7ml.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"framework-components-Cr--XBKy.mjs","names":[],"sources":["../src/utils/framework-components.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport {\n checkContractComponentRequirements,\n type TargetBoundComponentDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type { ControlStack } from '@prisma-next/framework-components/control';\nimport { errorConfigValidation, errorContractMissingExtensionPacks } from './cli-errors';\n\n/**\n * Asserts that all framework components are compatible with the expected family and target.\n *\n * This function validates that each component in the framework components array:\n * - Has kind 'target', 'adapter', 'extension', or 'driver'\n * - Has familyId matching expectedFamilyId\n * - Has targetId matching expectedTargetId\n *\n * This validation happens at the CLI composition boundary, before passing components\n * to typed planner/runner instances. It fills the gap between runtime validation\n * (via `validateConfig()`) and compile-time type enforcement.\n *\n * @param expectedFamilyId - The expected family ID (e.g., 'sql')\n * @param expectedTargetId - The expected target ID (e.g., 'postgres')\n * @param frameworkComponents - Array of framework components to validate\n * @returns The same array typed as TargetBoundComponentDescriptor\n * @throws CliStructuredError if any component is incompatible\n *\n * @example\n * ```ts\n * const config = await loadConfig();\n * const frameworkComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];\n *\n * // Validate and type-narrow components before passing to planner\n * const typedComponents = assertFrameworkComponentsCompatible(\n * config.family.familyId,\n * config.target.targetId,\n * frameworkComponents\n * );\n *\n * const planner = target.migrations.createPlanner(familyInstance);\n * planner.plan({ contract, schema, policy, frameworkComponents: typedComponents });\n * ```\n */\nexport function assertFrameworkComponentsCompatible<\n TFamilyId extends string,\n TTargetId extends string,\n>(\n expectedFamilyId: TFamilyId,\n expectedTargetId: TTargetId,\n frameworkComponents: ReadonlyArray<unknown>,\n): ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>> {\n for (let i = 0; i < frameworkComponents.length; i++) {\n const component = frameworkComponents[i];\n\n // Check that component is an object\n if (typeof component !== 'object' || component === null) {\n throw errorConfigValidation('frameworkComponents[]', {\n why: `Framework component at index ${i} must be an object`,\n });\n }\n\n const record = component as Record<string, unknown>;\n\n // Check kind\n if (!Object.hasOwn(record, 'kind')) {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} must have 'kind' property`,\n });\n }\n\n const kind = record['kind'];\n if (kind !== 'target' && kind !== 'adapter' && kind !== 'extension' && kind !== 'driver') {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} has invalid kind '${String(kind)}' (must be 'target', 'adapter', 'extension', or 'driver')`,\n });\n }\n\n // Check familyId\n if (!Object.hasOwn(record, 'familyId')) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'familyId' property`,\n });\n }\n\n const familyId = record['familyId'];\n if (familyId !== expectedFamilyId) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has familyId '${String(familyId)}' but expected '${expectedFamilyId}'`,\n });\n }\n\n // Check targetId\n if (!Object.hasOwn(record, 'targetId')) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'targetId' property`,\n });\n }\n\n const targetId = record['targetId'];\n if (targetId !== expectedTargetId) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has targetId '${String(targetId)}' but expected '${expectedTargetId}'`,\n });\n }\n }\n\n // Type assertion is safe because we've validated all components above\n return frameworkComponents as ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;\n}\n\n/**\n * Validates that a contract is compatible with the configured target, adapter,\n * and extension packs. Throws on family/target mismatches or missing extension packs.\n *\n * This check ensures the emitted contract matches the CLI config before running\n * commands that depend on the contract (e.g., db verify, db sign).\n *\n * @param contract - The contract to validate (must include targetFamily, target, extensionPacks).\n * @param stack - The control plane stack (target, adapter, driver, extensionPacks).\n *\n * @throws {CliStructuredError} errorConfigValidation when contract.targetFamily or contract.target\n * doesn't match the configured family/target.\n * @throws {CliStructuredError} errorContractMissingExtensionPacks when the contract requires\n * extension packs that are not provided in the config (includes all missing packs in error.meta).\n *\n * @example\n * ```ts\n * import { assertContractRequirementsSatisfied } from './framework-components';\n *\n * const config = await loadConfig();\n * const contract = await loadContractJson(config.contract.output);\n * const stack = createControlStack({ family: config.family, target: config.target, adapter: config.adapter, ... });\n *\n * // Throws if contract is incompatible with config\n * assertContractRequirementsSatisfied({ contract, stack });\n * ```\n */\nexport function assertContractRequirementsSatisfied<\n TFamilyId extends string,\n TTargetId extends string,\n>({\n contract,\n stack,\n}: {\n readonly contract: Pick<Contract, 'targetFamily' | 'target' | 'extensionPacks'>;\n readonly stack: ControlStack<TFamilyId, TTargetId>;\n}): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n ...(stack.adapter ? [stack.adapter.id] : []),\n ]);\n for (const extension of stack.extensionPacks) {\n providedComponentIds.add(extension.id);\n }\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: stack.target.familyId,\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw errorConfigValidation('contract.targetFamily', {\n why: `Contract was emitted for family '${result.familyMismatch.actual}' but CLI config is wired to '${result.familyMismatch.expected}'.`,\n });\n }\n\n if (result.targetMismatch) {\n throw errorConfigValidation('contract.target', {\n why: `Contract target '${result.targetMismatch.actual}' does not match CLI target '${result.targetMismatch.expected}'.`,\n });\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n throw errorContractMissingExtensionPacks({\n missingExtensionPacks: result.missingExtensionPackIds,\n providedComponentIds: [...providedComponentIds],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oCAId,kBACA,kBACA,qBACqE;AACrE,MAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;EACnD,MAAM,YAAY,oBAAoB;AAGtC,MAAI,OAAO,cAAc,YAAY,cAAc,KACjD,OAAM,sBAAsB,yBAAyB,EACnD,KAAK,gCAAgC,EAAE,qBACxC,CAAC;EAGJ,MAAM,SAAS;AAGf,MAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,CAChC,OAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,6BACxC,CAAC;EAGJ,MAAM,OAAO,OAAO;AACpB,MAAI,SAAS,YAAY,SAAS,aAAa,SAAS,eAAe,SAAS,SAC9E,OAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,qBAAqB,OAAO,KAAK,CAAC,4DAC1E,CAAC;AAIJ,MAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,CACpC,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;AACxB,MAAI,aAAa,iBACf,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;AAIJ,MAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,CACpC,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;AACxB,MAAI,aAAa,iBACf,OAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;;AAKN,QAAO"}
1
+ {"version":3,"file":"framework-components-gwAHl7ml.mjs","names":[],"sources":["../src/utils/framework-components.ts"],"sourcesContent":["import type { Contract } from '@prisma-next/contract/types';\nimport {\n checkContractComponentRequirements,\n type TargetBoundComponentDescriptor,\n} from '@prisma-next/framework-components/components';\nimport type { ControlStack } from '@prisma-next/framework-components/control';\nimport { errorConfigValidation, errorContractMissingExtensionPacks } from './cli-errors';\n\n/**\n * Asserts that all framework components are compatible with the expected family and target.\n *\n * This function validates that each component in the framework components array:\n * - Has kind 'target', 'adapter', 'extension', or 'driver'\n * - Has familyId matching expectedFamilyId\n * - Has targetId matching expectedTargetId\n *\n * This validation happens at the CLI composition boundary, before passing components\n * to typed planner/runner instances. It fills the gap between runtime validation\n * (via `validateConfig()`) and compile-time type enforcement.\n *\n * @param expectedFamilyId - The expected family ID (e.g., 'sql')\n * @param expectedTargetId - The expected target ID (e.g., 'postgres')\n * @param frameworkComponents - Array of framework components to validate\n * @returns The same array typed as TargetBoundComponentDescriptor\n * @throws CliStructuredError if any component is incompatible\n *\n * @example\n * ```ts\n * const config = await loadConfig();\n * const frameworkComponents = [config.target, config.adapter, ...(config.extensionPacks ?? [])];\n *\n * // Validate and type-narrow components before passing to planner\n * const typedComponents = assertFrameworkComponentsCompatible(\n * config.family.familyId,\n * config.target.targetId,\n * frameworkComponents\n * );\n *\n * const planner = target.migrations.createPlanner(familyInstance);\n * planner.plan({ contract, schema, policy, frameworkComponents: typedComponents });\n * ```\n */\nexport function assertFrameworkComponentsCompatible<\n TFamilyId extends string,\n TTargetId extends string,\n>(\n expectedFamilyId: TFamilyId,\n expectedTargetId: TTargetId,\n frameworkComponents: ReadonlyArray<unknown>,\n): ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>> {\n for (let i = 0; i < frameworkComponents.length; i++) {\n const component = frameworkComponents[i];\n\n // Check that component is an object\n if (typeof component !== 'object' || component === null) {\n throw errorConfigValidation('frameworkComponents[]', {\n why: `Framework component at index ${i} must be an object`,\n });\n }\n\n const record = component as Record<string, unknown>;\n\n // Check kind\n if (!Object.hasOwn(record, 'kind')) {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} must have 'kind' property`,\n });\n }\n\n const kind = record['kind'];\n if (kind !== 'target' && kind !== 'adapter' && kind !== 'extension' && kind !== 'driver') {\n throw errorConfigValidation('frameworkComponents[].kind', {\n why: `Framework component at index ${i} has invalid kind '${String(kind)}' (must be 'target', 'adapter', 'extension', or 'driver')`,\n });\n }\n\n // Check familyId\n if (!Object.hasOwn(record, 'familyId')) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'familyId' property`,\n });\n }\n\n const familyId = record['familyId'];\n if (familyId !== expectedFamilyId) {\n throw errorConfigValidation('frameworkComponents[].familyId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has familyId '${String(familyId)}' but expected '${expectedFamilyId}'`,\n });\n }\n\n // Check targetId\n if (!Object.hasOwn(record, 'targetId')) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) must have 'targetId' property`,\n });\n }\n\n const targetId = record['targetId'];\n if (targetId !== expectedTargetId) {\n throw errorConfigValidation('frameworkComponents[].targetId', {\n why: `Framework component at index ${i} (kind: ${String(kind)}) has targetId '${String(targetId)}' but expected '${expectedTargetId}'`,\n });\n }\n }\n\n // Type assertion is safe because we've validated all components above\n return frameworkComponents as ReadonlyArray<TargetBoundComponentDescriptor<TFamilyId, TTargetId>>;\n}\n\n/**\n * Validates that a contract is compatible with the configured target, adapter,\n * and extension packs. Throws on family/target mismatches or missing extension packs.\n *\n * This check ensures the emitted contract matches the CLI config before running\n * commands that depend on the contract (e.g., db verify, db sign).\n *\n * @param contract - The contract to validate (must include targetFamily, target, extensionPacks).\n * @param stack - The control plane stack (target, adapter, driver, extensionPacks).\n *\n * @throws {CliStructuredError} errorConfigValidation when contract.targetFamily or contract.target\n * doesn't match the configured family/target.\n * @throws {CliStructuredError} errorContractMissingExtensionPacks when the contract requires\n * extension packs that are not provided in the config (includes all missing packs in error.meta).\n *\n * @example\n * ```ts\n * import { assertContractRequirementsSatisfied } from './framework-components';\n *\n * const config = await loadConfig();\n * const contract = await loadContractJson(config.contract.output);\n * const stack = createControlStack({ family: config.family, target: config.target, adapter: config.adapter, ... });\n *\n * // Throws if contract is incompatible with config\n * assertContractRequirementsSatisfied({ contract, stack });\n * ```\n */\nexport function assertContractRequirementsSatisfied<\n TFamilyId extends string,\n TTargetId extends string,\n>({\n contract,\n stack,\n}: {\n readonly contract: Pick<Contract, 'targetFamily' | 'target' | 'extensionPacks'>;\n readonly stack: ControlStack<TFamilyId, TTargetId>;\n}): void {\n const providedComponentIds = new Set<string>([\n stack.target.id,\n ...(stack.adapter ? [stack.adapter.id] : []),\n ]);\n for (const extension of stack.extensionPacks) {\n providedComponentIds.add(extension.id);\n }\n\n const result = checkContractComponentRequirements({\n contract,\n expectedTargetFamily: stack.target.familyId,\n expectedTargetId: stack.target.targetId,\n providedComponentIds,\n });\n\n if (result.familyMismatch) {\n throw errorConfigValidation('contract.targetFamily', {\n why: `Contract was emitted for family '${result.familyMismatch.actual}' but CLI config is wired to '${result.familyMismatch.expected}'.`,\n });\n }\n\n if (result.targetMismatch) {\n throw errorConfigValidation('contract.target', {\n why: `Contract target '${result.targetMismatch.actual}' does not match CLI target '${result.targetMismatch.expected}'.`,\n });\n }\n\n if (result.missingExtensionPackIds.length > 0) {\n throw errorContractMissingExtensionPacks({\n missingExtensionPacks: result.missingExtensionPackIds,\n providedComponentIds: [...providedComponentIds],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oCAId,kBACA,kBACA,qBACqE;CACrE,KAAK,IAAI,IAAI,GAAG,IAAI,oBAAoB,QAAQ,KAAK;EACnD,MAAM,YAAY,oBAAoB;EAGtC,IAAI,OAAO,cAAc,YAAY,cAAc,MACjD,MAAM,sBAAsB,yBAAyB,EACnD,KAAK,gCAAgC,EAAE,qBACxC,CAAC;EAGJ,MAAM,SAAS;EAGf,IAAI,CAAC,OAAO,OAAO,QAAQ,OAAO,EAChC,MAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,6BACxC,CAAC;EAGJ,MAAM,OAAO,OAAO;EACpB,IAAI,SAAS,YAAY,SAAS,aAAa,SAAS,eAAe,SAAS,UAC9E,MAAM,sBAAsB,8BAA8B,EACxD,KAAK,gCAAgC,EAAE,qBAAqB,OAAO,KAAK,CAAC,4DAC1E,CAAC;EAIJ,IAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,EACpC,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,kBACf,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;EAIJ,IAAI,CAAC,OAAO,OAAO,QAAQ,WAAW,EACpC,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kCAC/D,CAAC;EAGJ,MAAM,WAAW,OAAO;EACxB,IAAI,aAAa,kBACf,MAAM,sBAAsB,kCAAkC,EAC5D,KAAK,gCAAgC,EAAE,UAAU,OAAO,KAAK,CAAC,kBAAkB,OAAO,SAAS,CAAC,kBAAkB,iBAAiB,IACrI,CAAC;;CAKN,OAAO"}
@@ -1,16 +1,14 @@
1
- import { t as CliStructuredError } from "./cli-errors-Cd79vmTH.mjs";
2
- import { i as formatErrorOutput, r as formatErrorJson, t as TerminalUI } from "./terminal-ui-C3ZLwQxK.mjs";
3
- import { a as INIT_EXIT_PRECONDITION, i as INIT_EXIT_OK, n as INIT_EXIT_INSTALL_FAILED, o as INIT_EXIT_USER_ABORTED, r as INIT_EXIT_INTERNAL_ERROR, t as INIT_EXIT_EMIT_FAILED } from "./cli.mjs";
4
- import { i as renderInitOutro, n as buildNextSteps, r as formatInitJson, t as InitOutputSchema } from "./output-BpcQrnnq.mjs";
1
+ import { t as CliStructuredError } from "./cli-errors-D3_sMh2K.mjs";
2
+ import { i as formatErrorOutput, r as formatErrorJson, t as TerminalUI } from "./terminal-ui-zaRDhJnP.mjs";
3
+ import { i as renderInitOutro, n as buildNextSteps, r as formatInitJson, t as InitOutputSchema } from "./output-DnjfCC_u.mjs";
5
4
  import { createRequire } from "node:module";
6
- import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
7
5
  import { dirname, extname, isAbsolute, join, normalize } from "pathe";
8
6
  import * as clack from "@clack/prompts";
7
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
9
8
  import { execFile } from "node:child_process";
10
9
  import { promisify } from "node:util";
11
10
  import { detect } from "package-manager-detector/detect";
12
11
  import { applyEdits, modify, parse, printParseErrorCode } from "jsonc-parser";
13
-
14
12
  //#region src/commands/init/detect-package-manager.ts
15
13
  const KNOWN = new Set([
16
14
  "pnpm",
@@ -48,7 +46,6 @@ function formatAddDevArgs(pm, packages) {
48
46
  ...packages
49
47
  ];
50
48
  }
51
-
52
49
  //#endregion
53
50
  //#region src/commands/init/detect-pnpm-catalog.ts
54
51
  /**
@@ -142,7 +139,6 @@ function stripQuotes(value) {
142
139
  }
143
140
  return value;
144
141
  }
145
-
146
142
  //#endregion
147
143
  //#region src/commands/init/errors.ts
148
144
  /**
@@ -361,7 +357,6 @@ function errorInitEmitFailed(options) {
361
357
  }
362
358
  });
363
359
  }
364
-
365
360
  //#endregion
366
361
  //#region src/commands/init/hygiene-gitattributes.ts
367
362
  /**
@@ -432,7 +427,6 @@ function mergeGitattributes(existing, required) {
432
427
  if (missing.length === 0) return null;
433
428
  return `${existing}${existing.length === 0 || existing.endsWith("\n") ? "" : "\n"}${missing.join("\n")}\n`;
434
429
  }
435
-
436
430
  //#endregion
437
431
  //#region src/commands/init/hygiene-gitignore.ts
438
432
  /**
@@ -473,7 +467,6 @@ function mergeGitignore(existing) {
473
467
  if (missing.length === 0) return null;
474
468
  return `${existing}${existing.length === 0 || existing.endsWith("\n") ? "" : "\n"}${missing.join("\n")}\n`;
475
469
  }
476
-
477
470
  //#endregion
478
471
  //#region src/commands/init/hygiene-package-scripts.ts
479
472
  const REQUIRED_SCRIPTS = [{
@@ -526,7 +519,6 @@ function mergePackageScripts(existing, required = REQUIRED_SCRIPTS) {
526
519
  warnings
527
520
  };
528
521
  }
529
-
530
522
  //#endregion
531
523
  //#region src/commands/init/templates/code-templates.ts
532
524
  function targetPackageName(target) {
@@ -621,12 +613,15 @@ export const contract = defineContract(
621
613
  \`\`\``;
622
614
  }
623
615
  function starterSchemaPslPostgres() {
624
- return `model User {
616
+ return `// use prisma-next
617
+
618
+ model User {
625
619
  id Int @id @default(autoincrement())
626
620
  email String @unique
627
621
  name String?
628
622
  posts Post[]
629
623
  createdAt DateTime @default(now())
624
+ updatedAt temporal.updatedAt()
630
625
  }
631
626
 
632
627
  model Post {
@@ -636,11 +631,14 @@ model Post {
636
631
  author User @relation(fields: [authorId], references: [id])
637
632
  authorId Int
638
633
  createdAt DateTime @default(now())
634
+ updatedAt temporal.updatedAt()
639
635
  }
640
636
  `;
641
637
  }
642
638
  function starterSchemaPslMongo() {
643
- return `model User {
639
+ return `// use prisma-next
640
+
641
+ model User {
644
642
  id ObjectId @id @map("_id")
645
643
  email String @unique
646
644
  name String?
@@ -672,7 +670,8 @@ export const contract = defineContract(
672
670
  id: field.id.uuidv7(),
673
671
  email: field.text().unique(),
674
672
  name: field.text().optional(),
675
- createdAt: field.createdAt(),
673
+ createdAt: field.temporal.createdAt(),
674
+ updatedAt: field.temporal.updatedAt(),
676
675
  },
677
676
  relations: {
678
677
  posts: rel.hasMany('Post', { by: 'authorId' }),
@@ -685,7 +684,8 @@ export const contract = defineContract(
685
684
  title: field.text(),
686
685
  content: field.text().optional(),
687
686
  authorId: field.uuid(),
688
- createdAt: field.createdAt(),
687
+ createdAt: field.temporal.createdAt(),
688
+ updatedAt: field.temporal.updatedAt(),
689
689
  },
690
690
  relations: {
691
691
  author: rel.belongsTo('User', { from: 'authorId', to: 'id' }),
@@ -763,7 +763,6 @@ export const db = mongo<Contract>({
763
763
  });
764
764
  `;
765
765
  }
766
-
767
766
  //#endregion
768
767
  //#region src/commands/init/inputs.ts
769
768
  const TARGET_ALIASES = new Map([
@@ -1002,7 +1001,6 @@ async function promptSchemaPath(authoring) {
1002
1001
  if (clack.isCancel(result)) throw errorInitUserAborted();
1003
1002
  return validateSchemaPath(result, authoring);
1004
1003
  }
1005
-
1006
1004
  //#endregion
1007
1005
  //#region src/commands/init/probe-db.ts
1008
1006
  /**
@@ -1170,7 +1168,6 @@ function requirePeer(moduleId, baseDir, overrides) {
1170
1168
  throw new DriverMissingError(`\`${moduleId}\` is not installed in this project (resolved from ${baseDir}; cause: ${causeMessage$1(err)})`);
1171
1169
  }
1172
1170
  }
1173
-
1174
1171
  //#endregion
1175
1172
  //#region src/commands/init/reinit-cleanup.ts
1176
1173
  /**
@@ -1245,7 +1242,6 @@ function removeDependency(existing, depName) {
1245
1242
  const trailingNewline = existing.endsWith("\n") ? "\n" : "";
1246
1243
  return `${JSON.stringify(parsed, null, 2)}${trailingNewline}`;
1247
1244
  }
1248
-
1249
1245
  //#endregion
1250
1246
  //#region src/commands/init/templates/render.ts
1251
1247
  function renderTemplate(templateFile, variableNames, vars) {
@@ -1257,7 +1253,6 @@ function renderTemplate(templateFile, variableNames, vars) {
1257
1253
  }
1258
1254
  return result;
1259
1255
  }
1260
-
1261
1256
  //#endregion
1262
1257
  //#region src/commands/init/templates/agent-skill.ts
1263
1258
  const variables$1 = [
@@ -1288,7 +1283,6 @@ function agentSkillMd(target, authoring, schemaPath, pkgRun) {
1288
1283
  };
1289
1284
  return renderTemplate(`agent-skill-${target}.md`, variables$1, vars);
1290
1285
  }
1291
-
1292
1286
  //#endregion
1293
1287
  //#region src/commands/init/templates/env.ts
1294
1288
  /**
@@ -1360,7 +1354,6 @@ function envExampleContent(target) {
1360
1354
  function envFileContent(target) {
1361
1355
  return envPlaceholderBody(target);
1362
1356
  }
1363
-
1364
1357
  //#endregion
1365
1358
  //#region src/commands/init/templates/quick-reference.ts
1366
1359
  const variables = [
@@ -1402,7 +1395,6 @@ function requirementsBlock(target) {
1402
1395
  "- The CLI never connects to your database without explicit consent. Pass `--probe-db` to `prisma-next init` if you want `init` to verify the server version itself."
1403
1396
  ].join("\n");
1404
1397
  }
1405
-
1406
1398
  //#endregion
1407
1399
  //#region src/commands/init/templates/tsconfig.ts
1408
1400
  /**
@@ -1545,7 +1537,6 @@ function mergeTypesArray(existing) {
1545
1537
  for (const required of REQUIRED_COMPILER_OPTIONS_TYPES) if (!result.includes(required)) result.push(required);
1546
1538
  return result;
1547
1539
  }
1548
-
1549
1540
  //#endregion
1550
1541
  //#region src/commands/init/init.ts
1551
1542
  /**
@@ -1782,7 +1773,7 @@ async function runInit(baseDir, runOptions) {
1782
1773
  renderInitOutro(ui, output, flags);
1783
1774
  if (!flags.quiet) clack.outro("Done. Open prisma-next.md to get started.", { output: process.stderr });
1784
1775
  }
1785
- return INIT_EXIT_OK;
1776
+ return 0;
1786
1777
  }
1787
1778
  /**
1788
1779
  * Renders a structured CLI error to the right channel and returns the exit
@@ -1822,12 +1813,12 @@ function exitCodeForError(error) {
1822
1813
  case "5005":
1823
1814
  case "5010":
1824
1815
  case "5011":
1825
- case "5012": return INIT_EXIT_PRECONDITION;
1826
- case "5006": return INIT_EXIT_USER_ABORTED;
1827
- case "5007": return INIT_EXIT_INSTALL_FAILED;
1828
- case "5008": return INIT_EXIT_EMIT_FAILED;
1829
- case "5009": return INIT_EXIT_INTERNAL_ERROR;
1830
- default: return INIT_EXIT_INTERNAL_ERROR;
1816
+ case "5012": return 2;
1817
+ case "5006": return 3;
1818
+ case "5007": return 4;
1819
+ case "5008": return 5;
1820
+ case "5009": return 1;
1821
+ default: return 1;
1831
1822
  }
1832
1823
  }
1833
1824
  /**
@@ -2040,7 +2031,7 @@ async function runEmit(ctx) {
2040
2031
  const spinner = ctx.ui.spinner();
2041
2032
  spinner.start("Emitting contract...");
2042
2033
  try {
2043
- const { executeContractEmit } = await import("./contract-emit--feXyNd7.mjs");
2034
+ const { executeContractEmit } = await import("./contract-emit-B3ChISB_.mjs").then((n) => n.t);
2044
2035
  await executeContractEmit({ configPath: join(ctx.baseDir, "prisma-next.config.ts") });
2045
2036
  spinner.stop("Contract emitted");
2046
2037
  } catch (err) {
@@ -2056,7 +2047,7 @@ function causeMessage(err) {
2056
2047
  if (err instanceof Error) return err.message;
2057
2048
  return String(err);
2058
2049
  }
2059
-
2060
2050
  //#endregion
2061
2051
  export { runInit };
2062
- //# sourceMappingURL=init-C5220SY9.mjs.map
2052
+
2053
+ //# sourceMappingURL=init-Deo7U8_U.mjs.map