@cedarjs/pg 0.2.0-beta.0 → 0.3.0

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 (87) hide show
  1. package/README.md +112 -63
  2. package/dist/cli.cjs +15 -9
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.mjs +15 -9
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/index.cjs +3 -3
  7. package/dist/index.d.cts +54 -11
  8. package/dist/index.d.mts +54 -11
  9. package/dist/index.mjs +3 -3
  10. package/dist/jest-teardown.cjs +1 -1
  11. package/dist/jest-teardown.mjs +1 -1
  12. package/dist/jest-template.cjs +5 -3
  13. package/dist/jest-template.cjs.map +1 -1
  14. package/dist/jest-template.d.cts +5 -3
  15. package/dist/jest-template.d.mts +5 -3
  16. package/dist/jest-template.mjs +5 -3
  17. package/dist/jest-template.mjs.map +1 -1
  18. package/dist/jest.cjs +1 -1
  19. package/dist/jest.mjs +1 -1
  20. package/dist/{lifecycle-BvIx0xqq.mjs → lifecycle-2BZgSVz2.mjs} +423 -132
  21. package/dist/lifecycle-2BZgSVz2.mjs.map +1 -0
  22. package/dist/{lifecycle-BbrvFQvg.cjs → lifecycle-BCeM96tI.cjs} +438 -135
  23. package/dist/lifecycle-BCeM96tI.cjs.map +1 -0
  24. package/dist/{naming-C2nGVxPk.d.cts → naming-Df4fz_Fb.d.cts} +3 -2
  25. package/dist/{naming-C2nGVxPk.d.mts → naming-Df4fz_Fb.d.mts} +3 -2
  26. package/dist/{status-Dcnpgnlz.mjs → status-B68SGSKx.mjs} +2 -2
  27. package/dist/{status-Dcnpgnlz.mjs.map → status-B68SGSKx.mjs.map} +1 -1
  28. package/dist/{status-4Uz6A3LB.cjs → status-Z_BYdxzI.cjs} +2 -2
  29. package/dist/{status-4Uz6A3LB.cjs.map → status-Z_BYdxzI.cjs.map} +1 -1
  30. package/dist/{studio-DIFw1qWC.mjs → studio-Bi6SU9jE.mjs} +54 -6
  31. package/dist/studio-Bi6SU9jE.mjs.map +1 -0
  32. package/dist/{studio-oJE30_PO.cjs → studio-CdWIdnxr.cjs} +78 -6
  33. package/dist/studio-CdWIdnxr.cjs.map +1 -0
  34. package/dist/{template-CXMpODzK.cjs → template-Cd77H7Cr.cjs} +21 -18
  35. package/dist/template-Cd77H7Cr.cjs.map +1 -0
  36. package/dist/{template-BiJ-0TIF.mjs → template-DlqHL8Go.mjs} +21 -18
  37. package/dist/template-DlqHL8Go.mjs.map +1 -0
  38. package/dist/template-mode-BqV3GjXI.d.cts +48 -0
  39. package/dist/template-mode-BqV3GjXI.d.mts +48 -0
  40. package/dist/template-mode-DK5cAlv9.mjs +81 -0
  41. package/dist/template-mode-DK5cAlv9.mjs.map +1 -0
  42. package/dist/template-mode-DMO5-z7O.cjs +92 -0
  43. package/dist/template-mode-DMO5-z7O.cjs.map +1 -0
  44. package/dist/vite-plus.cjs +9 -9
  45. package/dist/vite-plus.cjs.map +1 -1
  46. package/dist/vite-plus.d.cts +17 -2
  47. package/dist/vite-plus.d.mts +17 -2
  48. package/dist/vite-plus.mjs +5 -5
  49. package/dist/vite-plus.mjs.map +1 -1
  50. package/dist/vitest-template.cjs +6 -3
  51. package/dist/vitest-template.cjs.map +1 -1
  52. package/dist/vitest-template.d.cts +6 -3
  53. package/dist/vitest-template.d.mts +6 -3
  54. package/dist/vitest-template.mjs +6 -3
  55. package/dist/vitest-template.mjs.map +1 -1
  56. package/dist/vitest.cjs +1 -1
  57. package/dist/vitest.mjs +1 -1
  58. package/package.json +2 -7
  59. package/scripts/autopg-version +1 -1
  60. package/scripts/ci-install-autopg.sh +7 -2
  61. package/scripts/postinstall.js +41 -13
  62. package/dist/lease-B3TuX92y.d.mts +0 -24
  63. package/dist/lease-t4I9JahV.d.cts +0 -24
  64. package/dist/lifecycle-BbrvFQvg.cjs.map +0 -1
  65. package/dist/lifecycle-BvIx0xqq.mjs.map +0 -1
  66. package/dist/nx.cjs +0 -42
  67. package/dist/nx.cjs.map +0 -1
  68. package/dist/nx.d.cts +0 -15
  69. package/dist/nx.d.mts +0 -15
  70. package/dist/nx.mjs +0 -34
  71. package/dist/nx.mjs.map +0 -1
  72. package/dist/studio-DIFw1qWC.mjs.map +0 -1
  73. package/dist/studio-oJE30_PO.cjs.map +0 -1
  74. package/dist/tasks-CNHvvlsN.cjs +0 -67
  75. package/dist/tasks-CNHvvlsN.cjs.map +0 -1
  76. package/dist/tasks-CjaZRi_G.d.mts +0 -19
  77. package/dist/tasks-D5iWIdlo.mjs +0 -38
  78. package/dist/tasks-D5iWIdlo.mjs.map +0 -1
  79. package/dist/tasks-DdQoP9We.d.cts +0 -19
  80. package/dist/template-BiJ-0TIF.mjs.map +0 -1
  81. package/dist/template-CXMpODzK.cjs.map +0 -1
  82. package/dist/template-mode-BTUsdBtA.mjs +0 -94
  83. package/dist/template-mode-BTUsdBtA.mjs.map +0 -1
  84. package/dist/template-mode-CzyVwHsi.d.cts +0 -31
  85. package/dist/template-mode-CzyVwHsi.d.mts +0 -31
  86. package/dist/template-mode-JTOxrEgE.cjs +0 -105
  87. package/dist/template-mode-JTOxrEgE.cjs.map +0 -1
package/dist/nx.cjs DELETED
@@ -1,42 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_lease = require("./lease-WlmOnNDi.cjs");
3
- const require_tasks = require("./tasks-CNHvvlsN.cjs");
4
- //#region src/adapters/nx.ts
5
- /**
6
- * Nx targets. `dependsOn` does not forward acquire env (unlike Vite+ `env: [...]`).
7
- * Canonical shape: `createAcquireTask` / `db:ready`, then wrap children with
8
- * `cedarpg run --mode=dev --force -- <cmd>`. Avoid concurrent acquire/run on the
9
- * same worktree. Secondary: `envFile` → `.cedarpg/<mode>.env` (still loses to
10
- * ambient `.env` without force/overwrite).
11
- *
12
- * ```json
13
- * {
14
- * "targets": {
15
- * "db:ready": { "command": "tsx tools/db-ready.ts", "cache": false },
16
- * "dev": {
17
- * "dependsOn": ["db:ready"],
18
- * "command": "cedarpg run --mode=dev --force -- yarn tsx scripts/apiServer/dev.ts"
19
- * }
20
- * }
21
- * }
22
- * ```
23
- */
24
- /** Relative path for Nx `envFile` / dotenv. */
25
- function relativeEnvFile(mode) {
26
- return `${require_lease.STATE_DIRNAME}/${mode}.env`;
27
- }
28
- /** @deprecated Prefer `cedarPgNxTargets()`. */
29
- function nxTargetHints(bin = require_lease.CLI_NAME) {
30
- return Object.fromEntries(Object.entries(require_tasks.cedarPgLifecycleTargets({ bin })).map(([name, def]) => [name, { command: def.command }]));
31
- }
32
- //#endregion
33
- exports.CEDAR_PG_NX_ACQUIRE_DEV = require_tasks.CEDAR_PG_TASK_ACQUIRE_DEV;
34
- exports.CEDAR_PG_NX_ACQUIRE_TEST = require_tasks.CEDAR_PG_TASK_ACQUIRE_TEST;
35
- exports.CEDAR_PG_NX_DISPOSE_TEST = require_tasks.CEDAR_PG_TASK_DISPOSE_TEST;
36
- exports.cedarPgNxTargets = require_tasks.cedarPgLifecycleTargets;
37
- exports.cedarPgRunCommand = require_tasks.cedarPgRunCommand;
38
- exports.envFilePath = require_lease.envFilePath;
39
- exports.nxTargetHints = nxTargetHints;
40
- exports.relativeEnvFile = relativeEnvFile;
41
-
42
- //# sourceMappingURL=nx.cjs.map
package/dist/nx.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"nx.cjs","names":["STATE_DIRNAME","CLI_NAME","cedarPgLifecycleTargets"],"sources":["../src/adapters/nx.ts"],"sourcesContent":["/**\n * Nx targets. `dependsOn` does not forward acquire env (unlike Vite+ `env: [...]`).\n * Canonical shape: `createAcquireTask` / `db:ready`, then wrap children with\n * `cedarpg run --mode=dev --force -- <cmd>`. Avoid concurrent acquire/run on the\n * same worktree. Secondary: `envFile` → `.cedarpg/<mode>.env` (still loses to\n * ambient `.env` without force/overwrite).\n *\n * ```json\n * {\n * \"targets\": {\n * \"db:ready\": { \"command\": \"tsx tools/db-ready.ts\", \"cache\": false },\n * \"dev\": {\n * \"dependsOn\": [\"db:ready\"],\n * \"command\": \"cedarpg run --mode=dev --force -- yarn tsx scripts/apiServer/dev.ts\"\n * }\n * }\n * }\n * ```\n */\n\nimport { CLI_NAME, STATE_DIRNAME } from \"../core/constants.ts\";\nimport { envFilePath } from \"../core/lease.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\nimport {\n cedarPgLifecycleTargets,\n cedarPgRunCommand,\n type CedarPgLifecycleTarget,\n type CedarPgLifecycleTargetsOptions,\n CEDAR_PG_TASK_DISPOSE_TEST,\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n} from \"./tasks.ts\";\n\nexport {\n CEDAR_PG_TASK_ACQUIRE_DEV as CEDAR_PG_NX_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST as CEDAR_PG_NX_ACQUIRE_TEST,\n CEDAR_PG_TASK_DISPOSE_TEST as CEDAR_PG_NX_DISPOSE_TEST,\n cedarPgLifecycleTargets as cedarPgNxTargets,\n cedarPgRunCommand,\n envFilePath,\n};\n\n/** Relative path for Nx `envFile` / dotenv. */\nexport function relativeEnvFile(mode: DbMode): string {\n return `${STATE_DIRNAME}/${mode}.env`;\n}\n\nexport type NxTargetHint = CedarPgLifecycleTarget;\nexport type CedarPgNxTargetsOptions = CedarPgLifecycleTargetsOptions;\n\n/** @deprecated Prefer `cedarPgNxTargets()`. */\nexport function nxTargetHints(bin = CLI_NAME): Record<string, { command: string }> {\n return Object.fromEntries(\n Object.entries(cedarPgLifecycleTargets({ bin })).map(([name, def]) => [\n name,\n { command: def.command },\n ]),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgB,gBAAgB,MAAsB;CACpD,OAAO,GAAGA,cAAAA,cAAc,GAAG,KAAK;AAClC;;AAMA,SAAgB,cAAc,MAAMC,cAAAA,UAA+C;CACjF,OAAO,OAAO,YACZ,OAAO,QAAQC,cAAAA,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CACpE,MACA,EAAE,SAAS,IAAI,QAAQ,CACzB,CAAC,CACH;AACF"}
package/dist/nx.d.cts DELETED
@@ -1,15 +0,0 @@
1
- import { t as DbMode } from "./naming-C2nGVxPk.cjs";
2
- import { n as envFilePath } from "./lease-t4I9JahV.cjs";
3
- import { a as CedarPgLifecycleTargetsOptions, i as CedarPgLifecycleTarget, n as CEDAR_PG_TASK_ACQUIRE_TEST, o as cedarPgLifecycleTargets, r as CEDAR_PG_TASK_DISPOSE_TEST, s as cedarPgRunCommand, t as CEDAR_PG_TASK_ACQUIRE_DEV } from "./tasks-DdQoP9We.cjs";
4
- //#region src/adapters/nx.d.ts
5
- /** Relative path for Nx `envFile` / dotenv. */
6
- declare function relativeEnvFile(mode: DbMode): string;
7
- type NxTargetHint = CedarPgLifecycleTarget;
8
- type CedarPgNxTargetsOptions = CedarPgLifecycleTargetsOptions;
9
- /** @deprecated Prefer `cedarPgNxTargets()`. */
10
- declare function nxTargetHints(bin?: string): Record<string, {
11
- command: string;
12
- }>;
13
- //#endregion
14
- export { CEDAR_PG_TASK_ACQUIRE_DEV as CEDAR_PG_NX_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST as CEDAR_PG_NX_ACQUIRE_TEST, CEDAR_PG_TASK_DISPOSE_TEST as CEDAR_PG_NX_DISPOSE_TEST, CedarPgNxTargetsOptions, NxTargetHint, cedarPgLifecycleTargets as cedarPgNxTargets, cedarPgRunCommand, envFilePath, nxTargetHints, relativeEnvFile };
15
- //# sourceMappingURL=nx.d.cts.map
package/dist/nx.d.mts DELETED
@@ -1,15 +0,0 @@
1
- import { t as DbMode } from "./naming-C2nGVxPk.mjs";
2
- import { n as envFilePath } from "./lease-B3TuX92y.mjs";
3
- import { a as CedarPgLifecycleTargetsOptions, i as CedarPgLifecycleTarget, n as CEDAR_PG_TASK_ACQUIRE_TEST, o as cedarPgLifecycleTargets, r as CEDAR_PG_TASK_DISPOSE_TEST, s as cedarPgRunCommand, t as CEDAR_PG_TASK_ACQUIRE_DEV } from "./tasks-CjaZRi_G.mjs";
4
- //#region src/adapters/nx.d.ts
5
- /** Relative path for Nx `envFile` / dotenv. */
6
- declare function relativeEnvFile(mode: DbMode): string;
7
- type NxTargetHint = CedarPgLifecycleTarget;
8
- type CedarPgNxTargetsOptions = CedarPgLifecycleTargetsOptions;
9
- /** @deprecated Prefer `cedarPgNxTargets()`. */
10
- declare function nxTargetHints(bin?: string): Record<string, {
11
- command: string;
12
- }>;
13
- //#endregion
14
- export { CEDAR_PG_TASK_ACQUIRE_DEV as CEDAR_PG_NX_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST as CEDAR_PG_NX_ACQUIRE_TEST, CEDAR_PG_TASK_DISPOSE_TEST as CEDAR_PG_NX_DISPOSE_TEST, CedarPgNxTargetsOptions, NxTargetHint, cedarPgLifecycleTargets as cedarPgNxTargets, cedarPgRunCommand, envFilePath, nxTargetHints, relativeEnvFile };
15
- //# sourceMappingURL=nx.d.mts.map
package/dist/nx.mjs DELETED
@@ -1,34 +0,0 @@
1
- import { h as STATE_DIRNAME, p as CLI_NAME, t as envFilePath } from "./lease-DS1SX8U_.mjs";
2
- import { a as cedarPgRunCommand, i as cedarPgLifecycleTargets, n as CEDAR_PG_TASK_ACQUIRE_TEST, r as CEDAR_PG_TASK_DISPOSE_TEST, t as CEDAR_PG_TASK_ACQUIRE_DEV } from "./tasks-D5iWIdlo.mjs";
3
- //#region src/adapters/nx.ts
4
- /**
5
- * Nx targets. `dependsOn` does not forward acquire env (unlike Vite+ `env: [...]`).
6
- * Canonical shape: `createAcquireTask` / `db:ready`, then wrap children with
7
- * `cedarpg run --mode=dev --force -- <cmd>`. Avoid concurrent acquire/run on the
8
- * same worktree. Secondary: `envFile` → `.cedarpg/<mode>.env` (still loses to
9
- * ambient `.env` without force/overwrite).
10
- *
11
- * ```json
12
- * {
13
- * "targets": {
14
- * "db:ready": { "command": "tsx tools/db-ready.ts", "cache": false },
15
- * "dev": {
16
- * "dependsOn": ["db:ready"],
17
- * "command": "cedarpg run --mode=dev --force -- yarn tsx scripts/apiServer/dev.ts"
18
- * }
19
- * }
20
- * }
21
- * ```
22
- */
23
- /** Relative path for Nx `envFile` / dotenv. */
24
- function relativeEnvFile(mode) {
25
- return `${STATE_DIRNAME}/${mode}.env`;
26
- }
27
- /** @deprecated Prefer `cedarPgNxTargets()`. */
28
- function nxTargetHints(bin = CLI_NAME) {
29
- return Object.fromEntries(Object.entries(cedarPgLifecycleTargets({ bin })).map(([name, def]) => [name, { command: def.command }]));
30
- }
31
- //#endregion
32
- export { CEDAR_PG_TASK_ACQUIRE_DEV as CEDAR_PG_NX_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST as CEDAR_PG_NX_ACQUIRE_TEST, CEDAR_PG_TASK_DISPOSE_TEST as CEDAR_PG_NX_DISPOSE_TEST, cedarPgLifecycleTargets as cedarPgNxTargets, cedarPgRunCommand, envFilePath, nxTargetHints, relativeEnvFile };
33
-
34
- //# sourceMappingURL=nx.mjs.map
package/dist/nx.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"nx.mjs","names":[],"sources":["../src/adapters/nx.ts"],"sourcesContent":["/**\n * Nx targets. `dependsOn` does not forward acquire env (unlike Vite+ `env: [...]`).\n * Canonical shape: `createAcquireTask` / `db:ready`, then wrap children with\n * `cedarpg run --mode=dev --force -- <cmd>`. Avoid concurrent acquire/run on the\n * same worktree. Secondary: `envFile` → `.cedarpg/<mode>.env` (still loses to\n * ambient `.env` without force/overwrite).\n *\n * ```json\n * {\n * \"targets\": {\n * \"db:ready\": { \"command\": \"tsx tools/db-ready.ts\", \"cache\": false },\n * \"dev\": {\n * \"dependsOn\": [\"db:ready\"],\n * \"command\": \"cedarpg run --mode=dev --force -- yarn tsx scripts/apiServer/dev.ts\"\n * }\n * }\n * }\n * ```\n */\n\nimport { CLI_NAME, STATE_DIRNAME } from \"../core/constants.ts\";\nimport { envFilePath } from \"../core/lease.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\nimport {\n cedarPgLifecycleTargets,\n cedarPgRunCommand,\n type CedarPgLifecycleTarget,\n type CedarPgLifecycleTargetsOptions,\n CEDAR_PG_TASK_DISPOSE_TEST,\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n} from \"./tasks.ts\";\n\nexport {\n CEDAR_PG_TASK_ACQUIRE_DEV as CEDAR_PG_NX_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST as CEDAR_PG_NX_ACQUIRE_TEST,\n CEDAR_PG_TASK_DISPOSE_TEST as CEDAR_PG_NX_DISPOSE_TEST,\n cedarPgLifecycleTargets as cedarPgNxTargets,\n cedarPgRunCommand,\n envFilePath,\n};\n\n/** Relative path for Nx `envFile` / dotenv. */\nexport function relativeEnvFile(mode: DbMode): string {\n return `${STATE_DIRNAME}/${mode}.env`;\n}\n\nexport type NxTargetHint = CedarPgLifecycleTarget;\nexport type CedarPgNxTargetsOptions = CedarPgLifecycleTargetsOptions;\n\n/** @deprecated Prefer `cedarPgNxTargets()`. */\nexport function nxTargetHints(bin = CLI_NAME): Record<string, { command: string }> {\n return Object.fromEntries(\n Object.entries(cedarPgLifecycleTargets({ bin })).map(([name, def]) => [\n name,\n { command: def.command },\n ]),\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgB,gBAAgB,MAAsB;CACpD,OAAO,GAAG,cAAc,GAAG,KAAK;AAClC;;AAMA,SAAgB,cAAc,MAAM,UAA+C;CACjF,OAAO,OAAO,YACZ,OAAO,QAAQ,wBAAwB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CACpE,MACA,EAAE,SAAS,IAAI,QAAQ,CACzB,CAAC,CACH;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio-DIFw1qWC.mjs","names":[],"sources":["../src/adapters/child.ts","../src/adapters/status-format.ts","../src/adapters/studio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\n\nexport type RunAttachedOptions = {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n shell?: boolean;\n};\n\n/** Attached child: inherit stdio, resolve with exit code (signal → 1). */\nexport function runAttached(\n command: string,\n args: string[],\n options: RunAttachedOptions = {},\n): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: \"inherit\",\n cwd: options.cwd,\n env: options.env,\n shell: options.shell,\n });\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => {\n resolve(signal ? 1 : (code ?? 1));\n });\n });\n}\n","import { CLI_NAME } from \"../core/constants.ts\";\nimport type { DevStatus } from \"../core/status.ts\";\nimport { CEDAR_PG_TASK_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST } from \"./tasks.ts\";\n\n/** Human-readable lines for the Vite panel / `cedarpg status`. */\nexport function formatDevStatus(status: DevStatus): string[] {\n if (!status.ok) {\n const task = status.mode === \"test\" ? CEDAR_PG_TASK_ACQUIRE_TEST : CEDAR_PG_TASK_ACQUIRE_DEV;\n return [\n `${CLI_NAME}: no ${status.mode} lease at ${status.root}`,\n ` run \\`${CLI_NAME} acquire --mode=${status.mode}\\` (or depend on ${task})`,\n ];\n }\n const { lease, databaseUrl, envPath } = status;\n return [\n `${CLI_NAME}: ${lease.databaseName} (${lease.repoSlug}/${lease.worktreeSlug} ${lease.mode})`,\n ` port ${lease.port}`,\n ` DATABASE_URL ${databaseUrl}`,\n ` env ${envPath}`,\n ];\n}\n","import { createRequire } from \"node:module\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { runAttached } from \"./child.ts\";\n\nexport type StudioKind = \"prisma\" | \"drizzle\";\n\nconst STUDIO_PACKAGE: Record<StudioKind, string> = {\n prisma: \"prisma\",\n drizzle: \"drizzle-kit\",\n};\n\nconst AUTO_ORDER: StudioKind[] = [\"prisma\", \"drizzle\"];\n\nexport type DetectStudioOptions = {\n /** Worktree / lease root — directory walk stops here. */\n root: string;\n /** App package to start the walk (Nx `apps/…`). Defaults to `root`. */\n cwd?: string;\n /** Force a kind. Omit to auto-detect (nearest package; prisma if both). */\n prefer?: StudioKind;\n};\n\nexport type DetectedStudio = {\n kind: StudioKind;\n command: string;\n args: string[];\n /** Directory to spawn in (where the ORM package / config was found). */\n cwd: string;\n /** True when falling back to `npx`. */\n shell: boolean;\n};\n\ntype PkgJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n};\n\nfunction readPackageJson(dir: string): PkgJson | null {\n const file = join(dir, \"package.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf8\")) as PkgJson;\n } catch {\n return null;\n }\n}\n\nfunction hasDep(pkg: PkgJson | null, name: string): boolean {\n if (!pkg) return false;\n return Boolean(\n pkg.dependencies?.[name] || pkg.devDependencies?.[name] || pkg.optionalDependencies?.[name],\n );\n}\n\nfunction tryResolveBin(dir: string, packageName: string): string | null {\n try {\n const require = createRequire(pathToFileURL(join(dir, \"package.json\")).href);\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const binField = pkg.bin;\n let rel: string | undefined;\n if (typeof binField === \"string\") rel = binField;\n else if (binField && typeof binField === \"object\") {\n rel = binField[packageName] ?? Object.values(binField)[0];\n }\n if (!rel) return null;\n const abs = join(dirname(pkgJsonPath), rel);\n return existsSync(abs) ? abs : null;\n } catch {\n return null;\n }\n}\n\nfunction npxStudio(kind: StudioKind, cwd: string): DetectedStudio {\n return {\n kind,\n command: \"npx\",\n args: [STUDIO_PACKAGE[kind], \"studio\"],\n cwd,\n shell: true,\n };\n}\n\n/** Local bin, else declared dep → npx, else null. Resolves the bin at most once. */\nfunction studioAt(kind: StudioKind, dir: string): DetectedStudio | null {\n const pkg = STUDIO_PACKAGE[kind];\n const bin = tryResolveBin(dir, pkg);\n if (bin) return { kind, command: bin, args: [\"studio\"], cwd: dir, shell: false };\n if (hasDep(readPackageJson(dir), pkg)) return npxStudio(kind, dir);\n return null;\n}\n\nfunction isInside(dir: string, ancestor: string): boolean {\n const rel = relative(ancestor, dir);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\n/** `start` up to `stop` (inclusive) when `start` is inside the worktree; otherwise only `start`. */\nfunction searchDirs(start: string, stop: string): string[] {\n if (!isInside(start, stop)) return [start];\n const dirs: string[] = [];\n let dir = start;\n for (;;) {\n dirs.push(dir);\n if (dir === stop) return dirs;\n const parent = dirname(dir);\n if (parent === dir) return dirs;\n dir = parent;\n }\n}\n\n/**\n * Detect Prisma Studio or Drizzle Kit Studio, walking from `cwd` up to the worktree `root`.\n *\n * Auto: nearest directory wins, prisma before drizzle in that directory; no npx fallback.\n * Forced `prefer`: same nearest walk for that kind only, then npx at `cwd`.\n */\nexport function detectStudio(options: DetectStudioOptions): DetectedStudio | null {\n const stop = resolve(options.root);\n const start = resolve(options.cwd ?? options.root);\n const dirs = searchDirs(start, stop);\n const kinds = options.prefer ? [options.prefer] : AUTO_ORDER;\n\n for (const dir of dirs) {\n for (const kind of kinds) {\n const hit = studioAt(kind, dir);\n if (hit) return hit;\n }\n }\n return options.prefer ? npxStudio(options.prefer, start) : null;\n}\n\nexport type SpawnStudioOptions = {\n databaseUrl: string;\n studio: DetectedStudio;\n};\n\nfunction spawnStudio(options: SpawnStudioOptions, spawnOpts: SpawnOptions): ChildProcess {\n const { databaseUrl, studio } = options;\n return spawn(studio.command, studio.args, {\n cwd: studio.cwd,\n env: { ...process.env, DATABASE_URL: databaseUrl },\n ...spawnOpts,\n shell: studio.shell,\n });\n}\n\n/**\n * Detached Studio for the Vite shortcut. Caller attaches `error` / `exit` on the\n * returned process (spawn failures emit on a later tick).\n */\nexport function openStudio(options: SpawnStudioOptions): ChildProcess {\n const child = spawnStudio(options, { detached: true, stdio: \"ignore\" });\n child.unref();\n return child;\n}\n\n/** Attached Studio for `cedarpg studio`: inherit stdio, resolve with the child's exit code. */\nexport function runStudio(options: SpawnStudioOptions): Promise<number> {\n const { databaseUrl, studio } = options;\n return runAttached(studio.command, studio.args, {\n cwd: studio.cwd,\n env: { ...process.env, DATABASE_URL: databaseUrl },\n shell: studio.shell,\n });\n}\n\nexport function studioChildRunning(child: ChildProcess | undefined): boolean {\n return Boolean(child && child.exitCode === null && !child.killed);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"studio-oJE30_PO.cjs","names":["CEDAR_PG_TASK_ACQUIRE_TEST","CEDAR_PG_TASK_ACQUIRE_DEV","CLI_NAME"],"sources":["../src/adapters/child.ts","../src/adapters/status-format.ts","../src/adapters/studio.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\n\nexport type RunAttachedOptions = {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n shell?: boolean;\n};\n\n/** Attached child: inherit stdio, resolve with exit code (signal → 1). */\nexport function runAttached(\n command: string,\n args: string[],\n options: RunAttachedOptions = {},\n): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: \"inherit\",\n cwd: options.cwd,\n env: options.env,\n shell: options.shell,\n });\n child.once(\"error\", reject);\n child.once(\"exit\", (code, signal) => {\n resolve(signal ? 1 : (code ?? 1));\n });\n });\n}\n","import { CLI_NAME } from \"../core/constants.ts\";\nimport type { DevStatus } from \"../core/status.ts\";\nimport { CEDAR_PG_TASK_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST } from \"./tasks.ts\";\n\n/** Human-readable lines for the Vite panel / `cedarpg status`. */\nexport function formatDevStatus(status: DevStatus): string[] {\n if (!status.ok) {\n const task = status.mode === \"test\" ? CEDAR_PG_TASK_ACQUIRE_TEST : CEDAR_PG_TASK_ACQUIRE_DEV;\n return [\n `${CLI_NAME}: no ${status.mode} lease at ${status.root}`,\n ` run \\`${CLI_NAME} acquire --mode=${status.mode}\\` (or depend on ${task})`,\n ];\n }\n const { lease, databaseUrl, envPath } = status;\n return [\n `${CLI_NAME}: ${lease.databaseName} (${lease.repoSlug}/${lease.worktreeSlug} ${lease.mode})`,\n ` port ${lease.port}`,\n ` DATABASE_URL ${databaseUrl}`,\n ` env ${envPath}`,\n ];\n}\n","import { createRequire } from \"node:module\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { runAttached } from \"./child.ts\";\n\nexport type StudioKind = \"prisma\" | \"drizzle\";\n\nconst STUDIO_PACKAGE: Record<StudioKind, string> = {\n prisma: \"prisma\",\n drizzle: \"drizzle-kit\",\n};\n\nconst AUTO_ORDER: StudioKind[] = [\"prisma\", \"drizzle\"];\n\nexport type DetectStudioOptions = {\n /** Worktree / lease root — directory walk stops here. */\n root: string;\n /** App package to start the walk (Nx `apps/…`). Defaults to `root`. */\n cwd?: string;\n /** Force a kind. Omit to auto-detect (nearest package; prisma if both). */\n prefer?: StudioKind;\n};\n\nexport type DetectedStudio = {\n kind: StudioKind;\n command: string;\n args: string[];\n /** Directory to spawn in (where the ORM package / config was found). */\n cwd: string;\n /** True when falling back to `npx`. */\n shell: boolean;\n};\n\ntype PkgJson = {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n};\n\nfunction readPackageJson(dir: string): PkgJson | null {\n const file = join(dir, \"package.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf8\")) as PkgJson;\n } catch {\n return null;\n }\n}\n\nfunction hasDep(pkg: PkgJson | null, name: string): boolean {\n if (!pkg) return false;\n return Boolean(\n pkg.dependencies?.[name] || pkg.devDependencies?.[name] || pkg.optionalDependencies?.[name],\n );\n}\n\nfunction tryResolveBin(dir: string, packageName: string): string | null {\n try {\n const require = createRequire(pathToFileURL(join(dir, \"package.json\")).href);\n const pkgJsonPath = require.resolve(`${packageName}/package.json`);\n const pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\")) as {\n bin?: string | Record<string, string>;\n };\n const binField = pkg.bin;\n let rel: string | undefined;\n if (typeof binField === \"string\") rel = binField;\n else if (binField && typeof binField === \"object\") {\n rel = binField[packageName] ?? Object.values(binField)[0];\n }\n if (!rel) return null;\n const abs = join(dirname(pkgJsonPath), rel);\n return existsSync(abs) ? abs : null;\n } catch {\n return null;\n }\n}\n\nfunction npxStudio(kind: StudioKind, cwd: string): DetectedStudio {\n return {\n kind,\n command: \"npx\",\n args: [STUDIO_PACKAGE[kind], \"studio\"],\n cwd,\n shell: true,\n };\n}\n\n/** Local bin, else declared dep → npx, else null. Resolves the bin at most once. */\nfunction studioAt(kind: StudioKind, dir: string): DetectedStudio | null {\n const pkg = STUDIO_PACKAGE[kind];\n const bin = tryResolveBin(dir, pkg);\n if (bin) return { kind, command: bin, args: [\"studio\"], cwd: dir, shell: false };\n if (hasDep(readPackageJson(dir), pkg)) return npxStudio(kind, dir);\n return null;\n}\n\nfunction isInside(dir: string, ancestor: string): boolean {\n const rel = relative(ancestor, dir);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n\n/** `start` up to `stop` (inclusive) when `start` is inside the worktree; otherwise only `start`. */\nfunction searchDirs(start: string, stop: string): string[] {\n if (!isInside(start, stop)) return [start];\n const dirs: string[] = [];\n let dir = start;\n for (;;) {\n dirs.push(dir);\n if (dir === stop) return dirs;\n const parent = dirname(dir);\n if (parent === dir) return dirs;\n dir = parent;\n }\n}\n\n/**\n * Detect Prisma Studio or Drizzle Kit Studio, walking from `cwd` up to the worktree `root`.\n *\n * Auto: nearest directory wins, prisma before drizzle in that directory; no npx fallback.\n * Forced `prefer`: same nearest walk for that kind only, then npx at `cwd`.\n */\nexport function detectStudio(options: DetectStudioOptions): DetectedStudio | null {\n const stop = resolve(options.root);\n const start = resolve(options.cwd ?? options.root);\n const dirs = searchDirs(start, stop);\n const kinds = options.prefer ? [options.prefer] : AUTO_ORDER;\n\n for (const dir of dirs) {\n for (const kind of kinds) {\n const hit = studioAt(kind, dir);\n if (hit) return hit;\n }\n }\n return options.prefer ? npxStudio(options.prefer, start) : null;\n}\n\nexport type SpawnStudioOptions = {\n databaseUrl: string;\n studio: DetectedStudio;\n};\n\nfunction spawnStudio(options: SpawnStudioOptions, spawnOpts: SpawnOptions): ChildProcess {\n const { databaseUrl, studio } = options;\n return spawn(studio.command, studio.args, {\n cwd: studio.cwd,\n env: { ...process.env, DATABASE_URL: databaseUrl },\n ...spawnOpts,\n shell: studio.shell,\n });\n}\n\n/**\n * Detached Studio for the Vite shortcut. Caller attaches `error` / `exit` on the\n * returned process (spawn failures emit on a later tick).\n */\nexport function openStudio(options: SpawnStudioOptions): ChildProcess {\n const child = spawnStudio(options, { detached: true, stdio: \"ignore\" });\n child.unref();\n return child;\n}\n\n/** Attached Studio for `cedarpg studio`: inherit stdio, resolve with the child's exit code. */\nexport function runStudio(options: SpawnStudioOptions): Promise<number> {\n const { databaseUrl, studio } = options;\n return runAttached(studio.command, studio.args, {\n cwd: studio.cwd,\n env: { ...process.env, DATABASE_URL: databaseUrl },\n shell: studio.shell,\n });\n}\n\nexport function studioChildRunning(child: ChildProcess | undefined): boolean {\n return Boolean(child && child.exitCode === null && !child.killed);\n}\n"],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- const require_lease = require("./lease-WlmOnNDi.cjs");
2
- //#region src/adapters/tasks.ts
3
- /** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */
4
- const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
5
- const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
6
- const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
7
- function cedarPgCommands(bin = require_lease.CLI_NAME) {
8
- return {
9
- acquireDev: `${bin} acquire --mode=dev`,
10
- acquireTest: `${bin} acquire --mode=test --print-env`,
11
- disposeTest: `${bin} dispose --mode=test`
12
- };
13
- }
14
- function cedarPgLifecycleTargets(options = {}) {
15
- const cmds = cedarPgCommands(options.bin ?? "cedarpg");
16
- const targets = {
17
- [CEDAR_PG_TASK_ACQUIRE_DEV]: {
18
- command: cmds.acquireDev,
19
- cache: false
20
- },
21
- [CEDAR_PG_TASK_ACQUIRE_TEST]: {
22
- command: cmds.acquireTest,
23
- cache: false
24
- }
25
- };
26
- if (options.includeDisposeTest !== false) targets[CEDAR_PG_TASK_DISPOSE_TEST] = {
27
- command: cmds.disposeTest,
28
- cache: false
29
- };
30
- return targets;
31
- }
32
- function cedarPgRunCommand(mode, command, bin = require_lease.CLI_NAME) {
33
- return `${bin} run --mode=${mode} -- ${command}`;
34
- }
35
- //#endregion
36
- Object.defineProperty(exports, "CEDAR_PG_TASK_ACQUIRE_DEV", {
37
- enumerable: true,
38
- get: function() {
39
- return CEDAR_PG_TASK_ACQUIRE_DEV;
40
- }
41
- });
42
- Object.defineProperty(exports, "CEDAR_PG_TASK_ACQUIRE_TEST", {
43
- enumerable: true,
44
- get: function() {
45
- return CEDAR_PG_TASK_ACQUIRE_TEST;
46
- }
47
- });
48
- Object.defineProperty(exports, "CEDAR_PG_TASK_DISPOSE_TEST", {
49
- enumerable: true,
50
- get: function() {
51
- return CEDAR_PG_TASK_DISPOSE_TEST;
52
- }
53
- });
54
- Object.defineProperty(exports, "cedarPgLifecycleTargets", {
55
- enumerable: true,
56
- get: function() {
57
- return cedarPgLifecycleTargets;
58
- }
59
- });
60
- Object.defineProperty(exports, "cedarPgRunCommand", {
61
- enumerable: true,
62
- get: function() {
63
- return cedarPgRunCommand;
64
- }
65
- });
66
-
67
- //# sourceMappingURL=tasks-CNHvvlsN.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-CNHvvlsN.cjs","names":["CLI_NAME"],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\n\nexport const CEDAR_PG_TASK_ACQUIRE_DEV = \"db:acquire\";\nexport const CEDAR_PG_TASK_ACQUIRE_TEST = \"db:acquire-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgCommands = {\n acquireDev: string;\n acquireTest: string;\n disposeTest: string;\n};\n\nexport type CedarPgLifecycleTarget = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgLifecycleTargetsOptions = {\n bin?: string;\n /** Include dispose-test target (default: true). */\n includeDisposeTest?: boolean;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n acquireDev: `${bin} acquire --mode=dev`,\n acquireTest: `${bin} acquire --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n\nexport function cedarPgLifecycleTargets(\n options: CedarPgLifecycleTargetsOptions = {},\n): Record<string, CedarPgLifecycleTarget> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const targets: Record<string, CedarPgLifecycleTarget> = {\n [CEDAR_PG_TASK_ACQUIRE_DEV]: { command: cmds.acquireDev, cache: false },\n [CEDAR_PG_TASK_ACQUIRE_TEST]: { command: cmds.acquireTest, cache: false },\n };\n if (options.includeDisposeTest !== false) {\n targets[CEDAR_PG_TASK_DISPOSE_TEST] = { command: cmds.disposeTest, cache: false };\n }\n return targets;\n}\n\nexport function cedarPgRunCommand(mode: DbMode, command: string, bin = CLI_NAME): string {\n return `${bin} run --mode=${mode} -- ${command}`;\n}\n"],"mappings":";;;AAKA,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAmB1C,SAAgB,gBAAgB,MAAMA,cAAAA,UAA2B;CAC/D,OAAO;EACL,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;EACpB,aAAa,GAAG,IAAI;CACtB;AACF;AAEA,SAAgB,wBACd,UAA0C,CAAC,GACH;CACxC,MAAM,OAAO,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,UAAkD;GACrD,4BAA4B;GAAE,SAAS,KAAK;GAAY,OAAO;EAAM;GACrE,6BAA6B;GAAE,SAAS,KAAK;GAAa,OAAO;EAAM;CAC1E;CACA,IAAI,QAAQ,uBAAuB,OACjC,QAAQ,8BAA8B;EAAE,SAAS,KAAK;EAAa,OAAO;CAAM;CAElF,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAc,SAAiB,MAAMA,cAAAA,UAAkB;CACvF,OAAO,GAAG,IAAI,cAAc,KAAK,MAAM;AACzC"}
@@ -1,19 +0,0 @@
1
- import { t as DbMode } from "./naming-C2nGVxPk.mjs";
2
- //#region src/adapters/tasks.d.ts
3
- declare const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
4
- declare const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
5
- declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
6
- type CedarPgLifecycleTarget = {
7
- command: string;
8
- cache?: boolean;
9
- };
10
- type CedarPgLifecycleTargetsOptions = {
11
- bin?: string;
12
- /** Include dispose-test target (default: true). */
13
- includeDisposeTest?: boolean;
14
- };
15
- declare function cedarPgLifecycleTargets(options?: CedarPgLifecycleTargetsOptions): Record<string, CedarPgLifecycleTarget>;
16
- declare function cedarPgRunCommand(mode: DbMode, command: string, bin?: string): string;
17
- //#endregion
18
- export { CedarPgLifecycleTargetsOptions as a, CedarPgLifecycleTarget as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, cedarPgLifecycleTargets as o, CEDAR_PG_TASK_DISPOSE_TEST as r, cedarPgRunCommand as s, CEDAR_PG_TASK_ACQUIRE_DEV as t };
19
- //# sourceMappingURL=tasks-CjaZRi_G.d.mts.map
@@ -1,38 +0,0 @@
1
- import { p as CLI_NAME } from "./lease-DS1SX8U_.mjs";
2
- //#region src/adapters/tasks.ts
3
- /** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */
4
- const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
5
- const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
6
- const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
7
- function cedarPgCommands(bin = CLI_NAME) {
8
- return {
9
- acquireDev: `${bin} acquire --mode=dev`,
10
- acquireTest: `${bin} acquire --mode=test --print-env`,
11
- disposeTest: `${bin} dispose --mode=test`
12
- };
13
- }
14
- function cedarPgLifecycleTargets(options = {}) {
15
- const cmds = cedarPgCommands(options.bin ?? "cedarpg");
16
- const targets = {
17
- [CEDAR_PG_TASK_ACQUIRE_DEV]: {
18
- command: cmds.acquireDev,
19
- cache: false
20
- },
21
- [CEDAR_PG_TASK_ACQUIRE_TEST]: {
22
- command: cmds.acquireTest,
23
- cache: false
24
- }
25
- };
26
- if (options.includeDisposeTest !== false) targets[CEDAR_PG_TASK_DISPOSE_TEST] = {
27
- command: cmds.disposeTest,
28
- cache: false
29
- };
30
- return targets;
31
- }
32
- function cedarPgRunCommand(mode, command, bin = CLI_NAME) {
33
- return `${bin} run --mode=${mode} -- ${command}`;
34
- }
35
- //#endregion
36
- export { cedarPgRunCommand as a, cedarPgLifecycleTargets as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, CEDAR_PG_TASK_DISPOSE_TEST as r, CEDAR_PG_TASK_ACQUIRE_DEV as t };
37
-
38
- //# sourceMappingURL=tasks-D5iWIdlo.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks-D5iWIdlo.mjs","names":[],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\n\nexport const CEDAR_PG_TASK_ACQUIRE_DEV = \"db:acquire\";\nexport const CEDAR_PG_TASK_ACQUIRE_TEST = \"db:acquire-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgCommands = {\n acquireDev: string;\n acquireTest: string;\n disposeTest: string;\n};\n\nexport type CedarPgLifecycleTarget = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgLifecycleTargetsOptions = {\n bin?: string;\n /** Include dispose-test target (default: true). */\n includeDisposeTest?: boolean;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n acquireDev: `${bin} acquire --mode=dev`,\n acquireTest: `${bin} acquire --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n\nexport function cedarPgLifecycleTargets(\n options: CedarPgLifecycleTargetsOptions = {},\n): Record<string, CedarPgLifecycleTarget> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const targets: Record<string, CedarPgLifecycleTarget> = {\n [CEDAR_PG_TASK_ACQUIRE_DEV]: { command: cmds.acquireDev, cache: false },\n [CEDAR_PG_TASK_ACQUIRE_TEST]: { command: cmds.acquireTest, cache: false },\n };\n if (options.includeDisposeTest !== false) {\n targets[CEDAR_PG_TASK_DISPOSE_TEST] = { command: cmds.disposeTest, cache: false };\n }\n return targets;\n}\n\nexport function cedarPgRunCommand(mode: DbMode, command: string, bin = CLI_NAME): string {\n return `${bin} run --mode=${mode} -- ${command}`;\n}\n"],"mappings":";;;AAKA,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAmB1C,SAAgB,gBAAgB,MAAM,UAA2B;CAC/D,OAAO;EACL,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;EACpB,aAAa,GAAG,IAAI;CACtB;AACF;AAEA,SAAgB,wBACd,UAA0C,CAAC,GACH;CACxC,MAAM,OAAO,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,UAAkD;GACrD,4BAA4B;GAAE,SAAS,KAAK;GAAY,OAAO;EAAM;GACrE,6BAA6B;GAAE,SAAS,KAAK;GAAa,OAAO;EAAM;CAC1E;CACA,IAAI,QAAQ,uBAAuB,OACjC,QAAQ,8BAA8B;EAAE,SAAS,KAAK;EAAa,OAAO;CAAM;CAElF,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAc,SAAiB,MAAM,UAAkB;CACvF,OAAO,GAAG,IAAI,cAAc,KAAK,MAAM;AACzC"}
@@ -1,19 +0,0 @@
1
- import { t as DbMode } from "./naming-C2nGVxPk.cjs";
2
- //#region src/adapters/tasks.d.ts
3
- declare const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
4
- declare const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
5
- declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
6
- type CedarPgLifecycleTarget = {
7
- command: string;
8
- cache?: boolean;
9
- };
10
- type CedarPgLifecycleTargetsOptions = {
11
- bin?: string;
12
- /** Include dispose-test target (default: true). */
13
- includeDisposeTest?: boolean;
14
- };
15
- declare function cedarPgLifecycleTargets(options?: CedarPgLifecycleTargetsOptions): Record<string, CedarPgLifecycleTarget>;
16
- declare function cedarPgRunCommand(mode: DbMode, command: string, bin?: string): string;
17
- //#endregion
18
- export { CedarPgLifecycleTargetsOptions as a, CedarPgLifecycleTarget as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, cedarPgLifecycleTargets as o, CEDAR_PG_TASK_DISPOSE_TEST as r, cedarPgRunCommand as s, CEDAR_PG_TASK_ACQUIRE_DEV as t };
19
- //# sourceMappingURL=tasks-DdQoP9We.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-BiJ-0TIF.mjs","names":[],"sources":["../src/core/template.ts"],"sourcesContent":["import { buildCloneDatabaseName, type DbMode } from \"./naming.ts\";\nimport { readLease } from \"./lease.ts\";\nimport { applyDatabaseUrlEnv, runIfNeeded, type ResolveAcquireSkipInput } from \"./policy.ts\";\nimport { resolveWorktreeIdentity } from \"./worktree.ts\";\nimport {\n buildDatabaseUrl,\n cloneDatabaseFromTemplate,\n dropDatabase,\n setDatabaseIsTemplate,\n} from \"../providers/autopg.ts\";\nimport { ensureHostRunning } from \"../providers/host.ts\";\n\nasync function resolveAdminUrl(adminUrl?: string): Promise<string> {\n return adminUrl ?? (await ensureHostRunning()).adminUrl;\n}\n\nexport type MarkTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n};\n\n/**\n * After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.\n * Requires a lease from `acquire` (no datname override).\n */\nexport async function markTemplate(\n options: MarkTemplateOptions,\n): Promise<{ databaseName: string; adminUrl: string }> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire before markTemplate`);\n }\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n await setDatabaseIsTemplate({\n adminUrl,\n databaseName: lease.databaseName,\n isTemplate: true,\n });\n return { databaseName: lease.databaseName, adminUrl };\n}\n\nexport type CloneFromTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n /**\n * Suffix for the clone datname (e.g. Jest worker id).\n * Defaults to `<pid>_<base36 time>`.\n */\n name?: string;\n /**\n * Inject DATABASE_URL / TEST_DATABASE_URL for this clone (default false).\n * Host `cloneFromTemplateIfNeeded` defaults true; worker adapters pass true explicitly.\n */\n setEnv?: boolean;\n};\n\nexport type CloneResult = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n templateName: string;\n port: number;\n /**\n * DROP this clone only (leaves TEMPLATE + role if still owned elsewhere).\n * Not suite teardown — use role-scoped `dispose` for that.\n */\n dropClone: () => Promise<void>;\n};\n\n/**\n * Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).\n * Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).\n * Provider rejects when the leased DB is not marked TEMPLATE.\n * Port comes from the lease; admin URL is passed through or rediscovered.\n */\nexport async function cloneFromTemplate(options: CloneFromTemplateOptions): Promise<CloneResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);\n }\n\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;\n const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);\n\n await cloneDatabaseFromTemplate({\n adminUrl,\n templateName: lease.databaseName,\n databaseName,\n roleName: lease.roleName,\n });\n\n const databaseUrl = buildDatabaseUrl({\n port: lease.port,\n databaseName,\n roleName: lease.roleName,\n });\n\n if (options.setEnv) {\n applyDatabaseUrlEnv(databaseUrl, { mode });\n }\n\n const roleName = lease.roleName;\n\n return {\n databaseUrl,\n adminUrl,\n databaseName,\n roleName,\n templateName: lease.databaseName,\n port: lease.port,\n dropClone: async () => {\n await dropDatabase({ adminUrl, databaseName, roleName });\n },\n };\n}\n\nexport type CloneFromTemplateIfNeededOptions = CloneFromTemplateOptions & ResolveAcquireSkipInput;\n\nexport type CloneFromTemplateIfNeededResult =\n | { status: \"skipped\"; reason: \"disabled\" }\n | { status: \"skipped\"; reason: \"external-url\"; databaseUrl: string }\n | ({ status: \"cloned\" } & CloneResult);\n\n/**\n * Resolve skip policy then clone. Host entry for worker adapters (same skip\n * semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.\n */\nexport async function cloneFromTemplateIfNeeded(\n options: CloneFromTemplateIfNeededOptions,\n): Promise<CloneFromTemplateIfNeededResult> {\n const outcome = await runIfNeeded(options, () =>\n cloneFromTemplate({\n ...options,\n setEnv: options.setEnv !== false,\n }),\n );\n if (outcome.status === \"skipped\") return outcome;\n return { status: \"cloned\", ...outcome.value };\n}\n"],"mappings":";;;AAYA,eAAe,gBAAgB,UAAoC;CACjE,OAAO,aAAa,MAAM,kBAAkB,EAAA,CAAG;AACjD;;;;;AAaA,eAAsB,aACpB,SACqD;CACrD,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,wCAAwC;CAErE,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,sBAAsB;EAC1B;EACA,cAAc,MAAM;EACpB,YAAY;CACd,CAAC;CACD,OAAO;EAAE,cAAc,MAAM;EAAc;CAAS;AACtD;;;;;;;AAuCA,eAAsB,kBAAkB,SAAyD;CAC/F,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,4DAA4D;CAGzF,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;CACvE,MAAM,eAAe,uBAAuB,MAAM,cAAc,MAAM;CAEtE,MAAM,0BAA0B;EAC9B;EACA,cAAc,MAAM;EACpB;EACA,UAAU,MAAM;CAClB,CAAC;CAED,MAAM,cAAc,iBAAiB;EACnC,MAAM,MAAM;EACZ;EACA,UAAU,MAAM;CAClB,CAAC;CAED,IAAI,QAAQ,QACV,oBAAoB,aAAa,EAAE,KAAK,CAAC;CAG3C,MAAM,WAAW,MAAM;CAEvB,OAAO;EACL;EACA;EACA;EACA;EACA,cAAc,MAAM;EACpB,MAAM,MAAM;EACZ,WAAW,YAAY;GACrB,MAAM,aAAa;IAAE;IAAU;IAAc;GAAS,CAAC;EACzD;CACF;AACF;;;;;AAaA,eAAsB,0BACpB,SAC0C;CAC1C,MAAM,UAAU,MAAM,YAAY,eAChC,kBAAkB;EAChB,GAAG;EACH,QAAQ,QAAQ,WAAW;CAC7B,CAAC,CACH;CACA,IAAI,QAAQ,WAAW,WAAW,OAAO;CACzC,OAAO;EAAE,QAAQ;EAAU,GAAG,QAAQ;CAAM;AAC9C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-CXMpODzK.cjs","names":["ensureHostRunning","resolveWorktreeIdentity","readLease","setDatabaseIsTemplate","buildCloneDatabaseName","cloneDatabaseFromTemplate","buildDatabaseUrl","dropDatabase","runIfNeeded"],"sources":["../src/core/template.ts"],"sourcesContent":["import { buildCloneDatabaseName, type DbMode } from \"./naming.ts\";\nimport { readLease } from \"./lease.ts\";\nimport { applyDatabaseUrlEnv, runIfNeeded, type ResolveAcquireSkipInput } from \"./policy.ts\";\nimport { resolveWorktreeIdentity } from \"./worktree.ts\";\nimport {\n buildDatabaseUrl,\n cloneDatabaseFromTemplate,\n dropDatabase,\n setDatabaseIsTemplate,\n} from \"../providers/autopg.ts\";\nimport { ensureHostRunning } from \"../providers/host.ts\";\n\nasync function resolveAdminUrl(adminUrl?: string): Promise<string> {\n return adminUrl ?? (await ensureHostRunning()).adminUrl;\n}\n\nexport type MarkTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n};\n\n/**\n * After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.\n * Requires a lease from `acquire` (no datname override).\n */\nexport async function markTemplate(\n options: MarkTemplateOptions,\n): Promise<{ databaseName: string; adminUrl: string }> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire before markTemplate`);\n }\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n await setDatabaseIsTemplate({\n adminUrl,\n databaseName: lease.databaseName,\n isTemplate: true,\n });\n return { databaseName: lease.databaseName, adminUrl };\n}\n\nexport type CloneFromTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n /**\n * Suffix for the clone datname (e.g. Jest worker id).\n * Defaults to `<pid>_<base36 time>`.\n */\n name?: string;\n /**\n * Inject DATABASE_URL / TEST_DATABASE_URL for this clone (default false).\n * Host `cloneFromTemplateIfNeeded` defaults true; worker adapters pass true explicitly.\n */\n setEnv?: boolean;\n};\n\nexport type CloneResult = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n templateName: string;\n port: number;\n /**\n * DROP this clone only (leaves TEMPLATE + role if still owned elsewhere).\n * Not suite teardown — use role-scoped `dispose` for that.\n */\n dropClone: () => Promise<void>;\n};\n\n/**\n * Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).\n * Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).\n * Provider rejects when the leased DB is not marked TEMPLATE.\n * Port comes from the lease; admin URL is passed through or rediscovered.\n */\nexport async function cloneFromTemplate(options: CloneFromTemplateOptions): Promise<CloneResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);\n }\n\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;\n const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);\n\n await cloneDatabaseFromTemplate({\n adminUrl,\n templateName: lease.databaseName,\n databaseName,\n roleName: lease.roleName,\n });\n\n const databaseUrl = buildDatabaseUrl({\n port: lease.port,\n databaseName,\n roleName: lease.roleName,\n });\n\n if (options.setEnv) {\n applyDatabaseUrlEnv(databaseUrl, { mode });\n }\n\n const roleName = lease.roleName;\n\n return {\n databaseUrl,\n adminUrl,\n databaseName,\n roleName,\n templateName: lease.databaseName,\n port: lease.port,\n dropClone: async () => {\n await dropDatabase({ adminUrl, databaseName, roleName });\n },\n };\n}\n\nexport type CloneFromTemplateIfNeededOptions = CloneFromTemplateOptions & ResolveAcquireSkipInput;\n\nexport type CloneFromTemplateIfNeededResult =\n | { status: \"skipped\"; reason: \"disabled\" }\n | { status: \"skipped\"; reason: \"external-url\"; databaseUrl: string }\n | ({ status: \"cloned\" } & CloneResult);\n\n/**\n * Resolve skip policy then clone. Host entry for worker adapters (same skip\n * semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.\n */\nexport async function cloneFromTemplateIfNeeded(\n options: CloneFromTemplateIfNeededOptions,\n): Promise<CloneFromTemplateIfNeededResult> {\n const outcome = await runIfNeeded(options, () =>\n cloneFromTemplate({\n ...options,\n setEnv: options.setEnv !== false,\n }),\n );\n if (outcome.status === \"skipped\") return outcome;\n return { status: \"cloned\", ...outcome.value };\n}\n"],"mappings":";;;AAYA,eAAe,gBAAgB,UAAoC;CACjE,OAAO,aAAa,MAAMA,kBAAAA,kBAAkB,EAAA,CAAG;AACjD;;;;;AAaA,eAAsB,aACpB,SACqD;CACrD,MAAM,WAAWC,cAAAA,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQC,cAAAA,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,wCAAwC;CAErE,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAMC,kBAAAA,sBAAsB;EAC1B;EACA,cAAc,MAAM;EACpB,YAAY;CACd,CAAC;CACD,OAAO;EAAE,cAAc,MAAM;EAAc;CAAS;AACtD;;;;;;;AAuCA,eAAsB,kBAAkB,SAAyD;CAC/F,MAAM,WAAWF,cAAAA,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQC,cAAAA,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,4DAA4D;CAGzF,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;CACvE,MAAM,eAAeE,kBAAAA,uBAAuB,MAAM,cAAc,MAAM;CAEtE,MAAMC,kBAAAA,0BAA0B;EAC9B;EACA,cAAc,MAAM;EACpB;EACA,UAAU,MAAM;CAClB,CAAC;CAED,MAAM,cAAcC,kBAAAA,iBAAiB;EACnC,MAAM,MAAM;EACZ;EACA,UAAU,MAAM;CAClB,CAAC;CAED,IAAI,QAAQ,QACV,kBAAA,oBAAoB,aAAa,EAAE,KAAK,CAAC;CAG3C,MAAM,WAAW,MAAM;CAEvB,OAAO;EACL;EACA;EACA;EACA;EACA,cAAc,MAAM;EACpB,MAAM,MAAM;EACZ,WAAW,YAAY;GACrB,MAAMC,kBAAAA,aAAa;IAAE;IAAU;IAAc;GAAS,CAAC;EACzD;CACF;AACF;;;;;AAaA,eAAsB,0BACpB,SAC0C;CAC1C,MAAM,UAAU,MAAMC,kBAAAA,YAAY,eAChC,kBAAkB;EAChB,GAAG;EACH,QAAQ,QAAQ,WAAW;CAC7B,CAAC,CACH;CACA,IAAI,QAAQ,WAAW,WAAW,OAAO;CACzC,OAAO;EAAE,QAAQ;EAAU,GAAG,QAAQ;CAAM;AAC9C"}
@@ -1,94 +0,0 @@
1
- import { n as acquireIfNeeded, r as dispose } from "./lifecycle-BvIx0xqq.mjs";
2
- import { n as cloneFromTemplateIfNeeded, r as markTemplate } from "./template-BiJ-0TIF.mjs";
3
- //#region src/adapters/template-mode.ts
4
- /**
5
- * Runner orchestration: acquire → migrate → markTemplate.
6
- * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure
7
- * best-effort disposes the lease so Vitest (no separate teardown) does not leak.
8
- * Programmatic apps that do not need a migrate hook should call core
9
- * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.
10
- */
11
- async function setupTemplateMode(options) {
12
- const result = await acquireIfNeeded({
13
- root: options.root,
14
- mode: "test",
15
- setEnv: options.setEnv !== false
16
- });
17
- if (result.status !== "acquired") return result;
18
- try {
19
- await options.migrate({
20
- databaseUrl: result.databaseUrl,
21
- adminUrl: result.adminUrl,
22
- databaseName: result.databaseName,
23
- roleName: result.roleName
24
- });
25
- await markTemplate({
26
- root: result.root,
27
- mode: "test",
28
- adminUrl: result.adminUrl
29
- });
30
- } catch (err) {
31
- try {
32
- await dispose({
33
- root: result.root,
34
- mode: "test"
35
- });
36
- } catch {}
37
- const detail = err instanceof Error ? err.message : String(err);
38
- throw new Error(`template setup failed after acquire; cleaned up lease DB (${result.databaseName}). Fix the error and re-run: ${detail}`, { cause: err });
39
- }
40
- return result;
41
- }
42
- /** Survives Jest `setupFiles` module reloads (module-scoped `let` does not). */
43
- const CLONE_WORKER_MEMO = Symbol.for("@cedarjs/pg/cloneWorkerDatabase");
44
- function readCloneWorkerMemo() {
45
- return globalThis[CLONE_WORKER_MEMO];
46
- }
47
- function writeCloneWorkerMemo(memo) {
48
- const g = globalThis;
49
- if (memo === void 0) delete g[CLONE_WORKER_MEMO];
50
- else g[CLONE_WORKER_MEMO] = memo;
51
- }
52
- function resolveWorkerName(options) {
53
- return options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);
54
- }
55
- function workerOptionsKey(root, name) {
56
- return `${root ?? ""}\0${name}`;
57
- }
58
- /**
59
- * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
60
- * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
61
- * First call wins for `root`/`name`; conflicting later calls throw.
62
- *
63
- * Memo lives on `globalThis` so Jest `setupFiles` (module reload per file) still
64
- * shares one clone per worker. `setupFilesAfterEnv` + `beforeAll` also works.
65
- */
66
- function cloneWorkerDatabase(options = {}) {
67
- const name = resolveWorkerName(options);
68
- const key = workerOptionsKey(options.root, name);
69
- const existing = readCloneWorkerMemo();
70
- if (existing) {
71
- if (existing.key !== key) throw new Error(`cloneWorkerDatabase already started with different root/name (first: ${JSON.stringify(existing.key)}, now: ${JSON.stringify(key)})`);
72
- return existing.promise;
73
- }
74
- const promise = (async () => {
75
- await cloneFromTemplateIfNeeded({
76
- root: options.root,
77
- mode: "test",
78
- name,
79
- setEnv: true
80
- });
81
- })().catch((err) => {
82
- writeCloneWorkerMemo(void 0);
83
- throw err;
84
- });
85
- writeCloneWorkerMemo({
86
- promise,
87
- key
88
- });
89
- return promise;
90
- }
91
- //#endregion
92
- export { setupTemplateMode as n, cloneWorkerDatabase as t };
93
-
94
- //# sourceMappingURL=template-mode-BTUsdBtA.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-mode-BTUsdBtA.mjs","names":[],"sources":["../src/adapters/template-mode.ts"],"sourcesContent":["import { dispose, acquireIfNeeded, type AcquireIfNeededResult } from \"../core/lifecycle.ts\";\nimport { cloneFromTemplateIfNeeded, markTemplate } from \"../core/template.ts\";\n\nexport type TemplateMigrateContext = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n};\n\nexport type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;\n\nexport type SetupTemplateModeOptions = {\n root?: string;\n /** App-owned migrate; runs once, then `markTemplate`. Required. */\n migrate: TemplateMigrateFn;\n setEnv?: boolean;\n};\n\n/**\n * Runner orchestration: acquire → migrate → markTemplate.\n * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure\n * best-effort disposes the lease so Vitest (no separate teardown) does not leak.\n * Programmatic apps that do not need a migrate hook should call core\n * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.\n */\nexport async function setupTemplateMode(\n options: SetupTemplateModeOptions,\n): Promise<AcquireIfNeededResult> {\n const result = await acquireIfNeeded({\n root: options.root,\n mode: \"test\",\n setEnv: options.setEnv !== false,\n });\n if (result.status !== \"acquired\") return result;\n\n try {\n await options.migrate({\n databaseUrl: result.databaseUrl,\n adminUrl: result.adminUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n });\n await markTemplate({\n root: result.root,\n mode: \"test\",\n adminUrl: result.adminUrl,\n });\n } catch (err) {\n try {\n await dispose({ root: result.root, mode: \"test\" });\n } catch {\n // best-effort: leave lease for dispose/gc retry\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(\n `template setup failed after acquire; cleaned up lease DB (${result.databaseName}). ` +\n `Fix the error and re-run: ${detail}`,\n { cause: err },\n );\n }\n\n return result;\n}\n\nexport type CloneWorkerDatabaseOptions = {\n root?: string;\n /** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */\n name?: string;\n};\n\n/** Survives Jest `setupFiles` module reloads (module-scoped `let` does not). */\nconst CLONE_WORKER_MEMO = Symbol.for(\"@cedarjs/pg/cloneWorkerDatabase\");\n\ntype CloneWorkerMemo = {\n promise: Promise<void>;\n key: string;\n};\n\ntype GlobalWithCloneWorkerMemo = typeof globalThis & {\n [CLONE_WORKER_MEMO]?: CloneWorkerMemo;\n};\n\nfunction readCloneWorkerMemo(): CloneWorkerMemo | undefined {\n return (globalThis as GlobalWithCloneWorkerMemo)[CLONE_WORKER_MEMO];\n}\n\nfunction writeCloneWorkerMemo(memo: CloneWorkerMemo | undefined): void {\n const g = globalThis as GlobalWithCloneWorkerMemo;\n if (memo === undefined) delete g[CLONE_WORKER_MEMO];\n else g[CLONE_WORKER_MEMO] = memo;\n}\n\nfunction resolveWorkerName(options: CloneWorkerDatabaseOptions): string {\n return (\n options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid)\n );\n}\n\nfunction workerOptionsKey(root: string | undefined, name: string): string {\n return `${root ?? \"\"}\\0${name}`;\n}\n\n/**\n * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).\n * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.\n * First call wins for `root`/`name`; conflicting later calls throw.\n *\n * Memo lives on `globalThis` so Jest `setupFiles` (module reload per file) still\n * shares one clone per worker. `setupFilesAfterEnv` + `beforeAll` also works.\n */\nexport function cloneWorkerDatabase(options: CloneWorkerDatabaseOptions = {}): Promise<void> {\n const name = resolveWorkerName(options);\n const key = workerOptionsKey(options.root, name);\n const existing = readCloneWorkerMemo();\n if (existing) {\n if (existing.key !== key) {\n throw new Error(\n `cloneWorkerDatabase already started with different root/name ` +\n `(first: ${JSON.stringify(existing.key)}, now: ${JSON.stringify(key)})`,\n );\n }\n return existing.promise;\n }\n const promise = (async () => {\n await cloneFromTemplateIfNeeded({\n root: options.root,\n mode: \"test\",\n name,\n setEnv: true,\n });\n })().catch((err) => {\n writeCloneWorkerMemo(undefined);\n throw err;\n });\n writeCloneWorkerMemo({ promise, key });\n return promise;\n}\n"],"mappings":";;;;;;;;;;AA0BA,eAAsB,kBACpB,SACgC;CAChC,MAAM,SAAS,MAAM,gBAAgB;EACnC,MAAM,QAAQ;EACd,MAAM;EACN,QAAQ,QAAQ,WAAW;CAC7B,CAAC;CACD,IAAI,OAAO,WAAW,YAAY,OAAO;CAEzC,IAAI;EACF,MAAM,QAAQ,QAAQ;GACpB,aAAa,OAAO;GACpB,UAAU,OAAO;GACjB,cAAc,OAAO;GACrB,UAAU,OAAO;EACnB,CAAC;EACD,MAAM,aAAa;GACjB,MAAM,OAAO;GACb,MAAM;GACN,UAAU,OAAO;EACnB,CAAC;CACH,SAAS,KAAK;EACZ,IAAI;GACF,MAAM,QAAQ;IAAE,MAAM,OAAO;IAAM,MAAM;GAAO,CAAC;EACnD,QAAQ,CAER;EACA,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EAC9D,MAAM,IAAI,MACR,6DAA6D,OAAO,aAAa,+BAClD,UAC/B,EAAE,OAAO,IAAI,CACf;CACF;CAEA,OAAO;AACT;;AASA,MAAM,oBAAoB,OAAO,IAAI,iCAAiC;AAWtE,SAAS,sBAAmD;CAC1D,OAAQ,WAAyC;AACnD;AAEA,SAAS,qBAAqB,MAAyC;CACrE,MAAM,IAAI;CACV,IAAI,SAAS,KAAA,GAAW,OAAO,EAAE;MAC5B,EAAE,qBAAqB;AAC9B;AAEA,SAAS,kBAAkB,SAA6C;CACtE,OACE,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,GAAG;AAElG;AAEA,SAAS,iBAAiB,MAA0B,MAAsB;CACxE,OAAO,GAAG,QAAQ,GAAG,IAAI;AAC3B;;;;;;;;;AAUA,SAAgB,oBAAoB,UAAsC,CAAC,GAAkB;CAC3F,MAAM,OAAO,kBAAkB,OAAO;CACtC,MAAM,MAAM,iBAAiB,QAAQ,MAAM,IAAI;CAC/C,MAAM,WAAW,oBAAoB;CACrC,IAAI,UAAU;EACZ,IAAI,SAAS,QAAQ,KACnB,MAAM,IAAI,MACR,wEACa,KAAK,UAAU,SAAS,GAAG,EAAE,SAAS,KAAK,UAAU,GAAG,EAAE,EACzE;EAEF,OAAO,SAAS;CAClB;CACA,MAAM,WAAW,YAAY;EAC3B,MAAM,0BAA0B;GAC9B,MAAM,QAAQ;GACd,MAAM;GACN;GACA,QAAQ;EACV,CAAC;CACH,EAAA,CAAG,CAAC,CAAC,OAAO,QAAQ;EAClB,qBAAqB,KAAA,CAAS;EAC9B,MAAM;CACR,CAAC;CACD,qBAAqB;EAAE;EAAS;CAAI,CAAC;CACrC,OAAO;AACT"}
@@ -1,31 +0,0 @@
1
- //#region src/adapters/template-mode.d.ts
2
- type TemplateMigrateContext = {
3
- databaseUrl: string;
4
- adminUrl: string;
5
- databaseName: string;
6
- roleName: string;
7
- };
8
- type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
9
- type SetupTemplateModeOptions = {
10
- root?: string;
11
- /** App-owned migrate; runs once, then `markTemplate`. Required. */
12
- migrate: TemplateMigrateFn;
13
- setEnv?: boolean;
14
- };
15
- type CloneWorkerDatabaseOptions = {
16
- root?: string;
17
- /** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
18
- name?: string;
19
- };
20
- /**
21
- * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
22
- * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
23
- * First call wins for `root`/`name`; conflicting later calls throw.
24
- *
25
- * Memo lives on `globalThis` so Jest `setupFiles` (module reload per file) still
26
- * shares one clone per worker. `setupFilesAfterEnv` + `beforeAll` also works.
27
- */
28
- declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
29
- //#endregion
30
- export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
31
- //# sourceMappingURL=template-mode-CzyVwHsi.d.cts.map
@@ -1,31 +0,0 @@
1
- //#region src/adapters/template-mode.d.ts
2
- type TemplateMigrateContext = {
3
- databaseUrl: string;
4
- adminUrl: string;
5
- databaseName: string;
6
- roleName: string;
7
- };
8
- type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
9
- type SetupTemplateModeOptions = {
10
- root?: string;
11
- /** App-owned migrate; runs once, then `markTemplate`. Required. */
12
- migrate: TemplateMigrateFn;
13
- setEnv?: boolean;
14
- };
15
- type CloneWorkerDatabaseOptions = {
16
- root?: string;
17
- /** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
18
- name?: string;
19
- };
20
- /**
21
- * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
22
- * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
23
- * First call wins for `root`/`name`; conflicting later calls throw.
24
- *
25
- * Memo lives on `globalThis` so Jest `setupFiles` (module reload per file) still
26
- * shares one clone per worker. `setupFilesAfterEnv` + `beforeAll` also works.
27
- */
28
- declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
29
- //#endregion
30
- export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
31
- //# sourceMappingURL=template-mode-CzyVwHsi.d.mts.map