@cedarjs/pg 0.1.0-alpha.1 → 0.2.0-alpha.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 (121) hide show
  1. package/README.md +276 -25
  2. package/dist/cli.cjs +60 -14
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.mjs +59 -13
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/{constants-CNZn5Xro.cjs → constants-Ct8myrEn.cjs} +2 -2
  7. package/dist/{constants-BY97wXjA.mjs.map → constants-Ct8myrEn.cjs.map} +1 -1
  8. package/dist/{constants-BY97wXjA.mjs → constants-NLR0U4NR.mjs} +2 -2
  9. package/dist/{constants-CNZn5Xro.cjs.map → constants-NLR0U4NR.mjs.map} +1 -1
  10. package/dist/dev-env.cjs +12 -0
  11. package/dist/dev-env.cjs.map +1 -0
  12. package/dist/dev-env.d.cts +1 -0
  13. package/dist/dev-env.d.mts +1 -0
  14. package/dist/dev-env.mjs +14 -0
  15. package/dist/dev-env.mjs.map +1 -0
  16. package/dist/index.cjs +50 -10
  17. package/dist/index.cjs.map +1 -0
  18. package/dist/index.d.cts +168 -82
  19. package/dist/index.d.mts +168 -82
  20. package/dist/index.mjs +32 -2
  21. package/dist/index.mjs.map +1 -0
  22. package/dist/jest-teardown.cjs +18 -0
  23. package/dist/jest-teardown.cjs.map +1 -0
  24. package/dist/jest-teardown.d.cts +13 -0
  25. package/dist/jest-teardown.d.mts +14 -0
  26. package/dist/jest-teardown.mjs +18 -0
  27. package/dist/jest-teardown.mjs.map +1 -0
  28. package/dist/jest-template.cjs +41 -0
  29. package/dist/jest-template.cjs.map +1 -0
  30. package/dist/jest-template.d.cts +28 -0
  31. package/dist/jest-template.d.mts +28 -0
  32. package/dist/jest-template.mjs +35 -0
  33. package/dist/jest-template.mjs.map +1 -0
  34. package/dist/jest.cjs +12 -15
  35. package/dist/jest.cjs.map +1 -1
  36. package/dist/jest.d.cts +10 -7
  37. package/dist/jest.d.mts +10 -6
  38. package/dist/jest.mjs +12 -10
  39. package/dist/jest.mjs.map +1 -1
  40. package/dist/lease-B3TuX92y.d.mts +24 -0
  41. package/dist/lease-BSBBpaR4.mjs +201 -0
  42. package/dist/lease-BSBBpaR4.mjs.map +1 -0
  43. package/dist/lease-Bq9wKwQa.cjs +272 -0
  44. package/dist/lease-Bq9wKwQa.cjs.map +1 -0
  45. package/dist/lease-t4I9JahV.d.cts +24 -0
  46. package/dist/lifecycle-BOo6xBjD.mjs +684 -0
  47. package/dist/lifecycle-BOo6xBjD.mjs.map +1 -0
  48. package/dist/lifecycle-DEJ4GgWV.cjs +856 -0
  49. package/dist/lifecycle-DEJ4GgWV.cjs.map +1 -0
  50. package/dist/load-dev-env-7UjMHhw7.mjs +10 -0
  51. package/dist/load-dev-env-7UjMHhw7.mjs.map +1 -0
  52. package/dist/load-dev-env-cII6N4ZP.cjs +15 -0
  53. package/dist/load-dev-env-cII6N4ZP.cjs.map +1 -0
  54. package/dist/load-mode-env-B0qO9DZx.cjs +39 -0
  55. package/dist/load-mode-env-B0qO9DZx.cjs.map +1 -0
  56. package/dist/load-mode-env-C8gy4v9V.mjs +28 -0
  57. package/dist/load-mode-env-C8gy4v9V.mjs.map +1 -0
  58. package/dist/load-test-env-C34wpkIX.mjs +18 -0
  59. package/dist/load-test-env-C34wpkIX.mjs.map +1 -0
  60. package/dist/load-test-env-CkdUjTpV.cjs +23 -0
  61. package/dist/load-test-env-CkdUjTpV.cjs.map +1 -0
  62. package/dist/naming-C2nGVxPk.d.cts +39 -0
  63. package/dist/naming-C2nGVxPk.d.mts +39 -0
  64. package/dist/nx.cjs +26 -17
  65. package/dist/nx.cjs.map +1 -1
  66. package/dist/nx.d.cts +9 -20
  67. package/dist/nx.d.mts +9 -20
  68. package/dist/nx.mjs +20 -18
  69. package/dist/nx.mjs.map +1 -1
  70. package/dist/tasks-Caud9yHr.cjs +67 -0
  71. package/dist/tasks-Caud9yHr.cjs.map +1 -0
  72. package/dist/tasks-CjaZRi_G.d.mts +19 -0
  73. package/dist/tasks-DdQoP9We.d.cts +19 -0
  74. package/dist/tasks-KherHLac.mjs +38 -0
  75. package/dist/tasks-KherHLac.mjs.map +1 -0
  76. package/dist/template-CGw3C1Ob.mjs +88 -0
  77. package/dist/template-CGw3C1Ob.mjs.map +1 -0
  78. package/dist/template-D0gJ_MS2.cjs +105 -0
  79. package/dist/template-D0gJ_MS2.cjs.map +1 -0
  80. package/dist/template-mode-BkEs9LnY.cjs +91 -0
  81. package/dist/template-mode-BkEs9LnY.cjs.map +1 -0
  82. package/dist/template-mode-CcxV_Iju.d.cts +28 -0
  83. package/dist/template-mode-CcxV_Iju.d.mts +28 -0
  84. package/dist/template-mode-IjlFOG4O.mjs +80 -0
  85. package/dist/template-mode-IjlFOG4O.mjs.map +1 -0
  86. package/dist/test-env.cjs +16 -0
  87. package/dist/test-env.cjs.map +1 -0
  88. package/dist/test-env.d.cts +1 -0
  89. package/dist/test-env.d.mts +1 -0
  90. package/dist/test-env.mjs +18 -0
  91. package/dist/test-env.mjs.map +1 -0
  92. package/dist/vite-plus.cjs +8 -33
  93. package/dist/vite-plus.cjs.map +1 -1
  94. package/dist/vite-plus.d.cts +4 -48
  95. package/dist/vite-plus.d.mts +4 -48
  96. package/dist/vite-plus.mjs +5 -30
  97. package/dist/vite-plus.mjs.map +1 -1
  98. package/dist/vitest-template.cjs +48 -0
  99. package/dist/vitest-template.cjs.map +1 -0
  100. package/dist/vitest-template.d.cts +31 -0
  101. package/dist/vitest-template.d.mts +31 -0
  102. package/dist/vitest-template.mjs +42 -0
  103. package/dist/vitest-template.mjs.map +1 -0
  104. package/dist/vitest.cjs +10 -10
  105. package/dist/vitest.cjs.map +1 -1
  106. package/dist/vitest.d.cts +7 -3
  107. package/dist/vitest.d.mts +7 -2
  108. package/dist/vitest.mjs +10 -5
  109. package/dist/vitest.mjs.map +1 -1
  110. package/package.json +36 -12
  111. package/scripts/autopg-version +1 -0
  112. package/scripts/ci-install-autopg.sh +73 -0
  113. package/scripts/postinstall.js +35 -9
  114. package/dist/lifecycle-BGYtVXtx.cjs +0 -743
  115. package/dist/lifecycle-BGYtVXtx.cjs.map +0 -1
  116. package/dist/lifecycle-CT_8AWPv.mjs +0 -577
  117. package/dist/lifecycle-CT_8AWPv.mjs.map +0 -1
  118. package/dist/tasks-13P6tMth.mjs +0 -16
  119. package/dist/tasks-13P6tMth.mjs.map +0 -1
  120. package/dist/tasks-B8ryV9xo.cjs +0 -21
  121. package/dist/tasks-B8ryV9xo.cjs.map +0 -1
package/dist/cli.mjs CHANGED
@@ -1,24 +1,32 @@
1
1
  #!/usr/bin/env node
2
- import { S as readLease, a as urlFromLease, g as resolveWorktreeIdentity, i as gc, n as ensure, t as dispose } from "./lifecycle-CT_8AWPv.mjs";
3
- import { t as CLI_NAME } from "./constants-BY97wXjA.mjs";
2
+ import { a as urlFromLease, i as gc, r as dispose, t as acquire } from "./lifecycle-BOo6xBjD.mjs";
3
+ import { t as CLI_NAME } from "./constants-NLR0U4NR.mjs";
4
+ import { f as resolveWorktreeIdentity, l as readLease } from "./lease-BSBBpaR4.mjs";
5
+ import { spawn } from "node:child_process";
4
6
  //#region src/cli.ts
5
7
  function printHelp() {
6
8
  process.stdout.write(`${CLI_NAME}: worktree-isolated local Postgres (via autopg)
7
9
 
8
10
  Usage:
9
- ${CLI_NAME} ensure --mode=dev|test [--root <path>] [--json] [--print-env]
11
+ ${CLI_NAME} acquire --mode=dev|test [--root <path>] [--force] [--json] [--print-env]
12
+ ${CLI_NAME} run --mode=dev|test [--root <path>] [--force] -- <cmd…>
10
13
  ${CLI_NAME} dispose [--mode=dev|test] [--root <path>]
11
14
  ${CLI_NAME} gc [--json]
12
15
  ${CLI_NAME} print-url [--mode=dev|test] [--root <path>]
13
16
  ${CLI_NAME} --help
14
17
 
15
18
  Modes:
16
- dev Keep DB across restarts (default for ensure if omitted: dev)
19
+ dev Keep DB across restarts (default when --mode omitted)
17
20
  test Drop DB on dispose / test teardown
18
21
 
22
+ run:
23
+ Acquire, set DATABASE_URL (+ TEST_DATABASE_URL in test) on the child, exec <cmd…>.
24
+ --force sets CEDAR_PG_FORCE (escape hatch); child env overwrite is always on.
25
+
19
26
  Env:
20
- AUTOPG_BIN Path to autopg binary
21
- CEDAR_PG=0 Disable adapters that auto-ensure
27
+ AUTOPG_BIN Path to autopg binary
28
+ CEDAR_PG=0 Disable adapters that auto-acquire
29
+ CEDAR_PG_FORCE=1 Ignore external-URL escape hatch (same as --force)
22
30
  `);
23
31
  }
24
32
  function parseMode(value) {
@@ -29,19 +37,40 @@ function parseArgs(argv) {
29
37
  const out = {};
30
38
  const rest = [...argv];
31
39
  out.cmd = rest.shift();
32
- for (let i = 0; i < rest.length; i++) {
33
- const a = rest[i];
40
+ const dash = rest.indexOf("--");
41
+ let flagArgs = rest;
42
+ if (dash >= 0) {
43
+ flagArgs = rest.slice(0, dash);
44
+ out.child = rest.slice(dash + 1);
45
+ }
46
+ for (let i = 0; i < flagArgs.length; i++) {
47
+ const a = flagArgs[i];
34
48
  if (a === "--help" || a === "-h") out.help = true;
35
49
  else if (a === "--json") out.json = true;
36
50
  else if (a === "--print-env") out.printEnv = true;
51
+ else if (a === "--force") out.force = true;
37
52
  else if (a.startsWith("--mode=")) out.mode = parseMode(a.slice(7));
38
- else if (a === "--mode") out.mode = parseMode(rest[++i]);
53
+ else if (a === "--mode") out.mode = parseMode(flagArgs[++i]);
39
54
  else if (a.startsWith("--root=")) out.root = a.slice(7);
40
- else if (a === "--root") out.root = rest[++i];
55
+ else if (a === "--root") out.root = flagArgs[++i];
41
56
  else throw new Error(`unknown argument: ${a}`);
42
57
  }
43
58
  return out;
44
59
  }
60
+ function runChild(command, env) {
61
+ const [file, ...args] = command;
62
+ if (!file) throw new Error(`run requires a command after -- (e.g. ${CLI_NAME} run --mode=dev -- yarn dev)`);
63
+ return new Promise((resolve, reject) => {
64
+ const child = spawn(file, args, {
65
+ stdio: "inherit",
66
+ env
67
+ });
68
+ child.on("error", reject);
69
+ child.on("exit", (code, signal) => {
70
+ resolve(signal ? 1 : code ?? 1);
71
+ });
72
+ });
73
+ }
45
74
  async function main() {
46
75
  const argv = process.argv.slice(2);
47
76
  if (argv.length === 0 || argv[0] === "help" || argv[0] === "--help" || argv[0] === "-h") {
@@ -54,9 +83,10 @@ async function main() {
54
83
  return 0;
55
84
  }
56
85
  try {
57
- if (args.cmd === "ensure") {
86
+ if (args.cmd === "acquire") {
87
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
58
88
  const mode = args.mode ?? "dev";
59
- const result = await ensure({
89
+ const result = await acquire({
60
90
  root: args.root,
61
91
  mode,
62
92
  setEnv: true
@@ -67,6 +97,7 @@ async function main() {
67
97
  }
68
98
  if (args.json) process.stdout.write(`${JSON.stringify({
69
99
  databaseUrl: result.databaseUrl,
100
+ adminUrl: result.adminUrl,
70
101
  databaseName: result.databaseName,
71
102
  roleName: result.roleName,
72
103
  repoSlug: result.repoSlug,
@@ -82,6 +113,21 @@ async function main() {
82
113
  }
83
114
  return 0;
84
115
  }
116
+ if (args.cmd === "run") {
117
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
118
+ const mode = args.mode ?? "dev";
119
+ const result = await acquire({
120
+ root: args.root,
121
+ mode,
122
+ setEnv: true
123
+ });
124
+ const childEnv = {
125
+ ...process.env,
126
+ DATABASE_URL: result.databaseUrl
127
+ };
128
+ if (mode === "test") childEnv.TEST_DATABASE_URL = result.databaseUrl;
129
+ return await runChild(args.child ?? [], childEnv);
130
+ }
85
131
  if (args.cmd === "dispose") {
86
132
  const mode = args.mode ?? "test";
87
133
  const result = await dispose({
@@ -112,7 +158,7 @@ async function main() {
112
158
  const mode = args.mode ?? "dev";
113
159
  const lease = readLease(resolveWorktreeIdentity(args.root).root, mode);
114
160
  if (!lease) {
115
- process.stderr.write(`${CLI_NAME}: no ${mode} lease; run \`${CLI_NAME} ensure --mode=${mode}\` first\n`);
161
+ process.stderr.write(`${CLI_NAME}: no ${mode} lease; run \`${CLI_NAME} acquire --mode=${mode}\` first\n`);
116
162
  return 2;
117
163
  }
118
164
  process.stdout.write(`${urlFromLease(lease)}\n`);
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { CLI_NAME } from \"./core/constants.ts\";\nimport { ensure, dispose, gc, urlFromLease } from \"./core/lifecycle.ts\";\nimport { resolveWorktreeIdentity } from \"./core/worktree.ts\";\nimport { readLease } from \"./core/lease.ts\";\nimport type { DbMode } from \"./core/naming.ts\";\n\nfunction printHelp(): void {\n process.stdout.write(`${CLI_NAME}: worktree-isolated local Postgres (via autopg)\n\nUsage:\n ${CLI_NAME} ensure --mode=dev|test [--root <path>] [--json] [--print-env]\n ${CLI_NAME} dispose [--mode=dev|test] [--root <path>]\n ${CLI_NAME} gc [--json]\n ${CLI_NAME} print-url [--mode=dev|test] [--root <path>]\n ${CLI_NAME} --help\n\nModes:\n dev Keep DB across restarts (default for ensure if omitted: dev)\n test Drop DB on dispose / test teardown\n\nEnv:\n AUTOPG_BIN Path to autopg binary\n CEDAR_PG=0 Disable adapters that auto-ensure\n`);\n}\n\nfunction parseMode(value: string | undefined): DbMode {\n if (value === \"dev\" || value === \"test\") return value;\n throw new Error(\"--mode must be dev or test\");\n}\n\nfunction parseArgs(argv: string[]) {\n const out: {\n cmd?: string;\n mode?: DbMode;\n root?: string;\n json?: boolean;\n printEnv?: boolean;\n help?: boolean;\n } = {};\n const rest = [...argv];\n out.cmd = rest.shift();\n for (let i = 0; i < rest.length; i++) {\n const a = rest[i]!;\n if (a === \"--help\" || a === \"-h\") out.help = true;\n else if (a === \"--json\") out.json = true;\n else if (a === \"--print-env\") out.printEnv = true;\n else if (a.startsWith(\"--mode=\")) out.mode = parseMode(a.slice(7));\n else if (a === \"--mode\") out.mode = parseMode(rest[++i]);\n else if (a.startsWith(\"--root=\")) out.root = a.slice(7);\n else if (a === \"--root\") out.root = rest[++i];\n else throw new Error(`unknown argument: ${a}`);\n }\n return out;\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n if (argv.length === 0 || argv[0] === \"help\" || argv[0] === \"--help\" || argv[0] === \"-h\") {\n printHelp();\n return 0;\n }\n const args = parseArgs(argv);\n if (args.help) {\n printHelp();\n return 0;\n }\n\n try {\n if (args.cmd === \"ensure\") {\n const mode = args.mode ?? \"dev\";\n const result = await ensure({\n root: args.root,\n mode,\n setEnv: true,\n });\n if (args.printEnv) {\n process.stdout.write(`DATABASE_URL=${result.databaseUrl}\\n`);\n if (mode === \"test\") {\n process.stdout.write(`TEST_DATABASE_URL=${result.databaseUrl}\\n`);\n }\n }\n if (args.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n databaseUrl: result.databaseUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n repoSlug: result.repoSlug,\n worktreeSlug: result.worktreeSlug,\n pathHash: result.pathHash,\n mode: result.mode,\n port: result.port,\n root: result.root,\n },\n null,\n 2,\n )}\\n`,\n );\n } else if (!args.printEnv) {\n process.stdout.write(\n `${CLI_NAME}: ${result.databaseName} (${result.repoSlug}/${result.worktreeSlug} ${result.mode})\\n`,\n );\n process.stdout.write(`${result.databaseUrl}\\n`);\n }\n return 0;\n }\n\n if (args.cmd === \"dispose\") {\n const mode = args.mode ?? \"test\";\n const result = await dispose({ root: args.root, mode });\n if (result.dropped) {\n process.stdout.write(`${CLI_NAME}: disposed ${mode} (${result.databaseName})\\n`);\n return 0;\n }\n if (result.reason === \"no-lease\") {\n process.stdout.write(`${CLI_NAME}: nothing to dispose for ${mode} (no lease)\\n`);\n return 0;\n }\n process.stderr.write(\n `${CLI_NAME}: could not dispose ${mode}: autopg host unavailable (lease kept for retry)\\n`,\n );\n return 1;\n }\n\n if (args.cmd === \"gc\") {\n const result = await gc();\n if (args.json) {\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n process.stdout.write(`${CLI_NAME} gc: dropped ${result.dropped.length} database(s)\\n`);\n for (const name of result.dropped) process.stdout.write(` ${name}\\n`);\n }\n return 0;\n }\n\n if (args.cmd === \"print-url\") {\n const mode = args.mode ?? \"dev\";\n const identity = resolveWorktreeIdentity(args.root);\n const lease = readLease(identity.root, mode);\n if (!lease) {\n process.stderr.write(\n `${CLI_NAME}: no ${mode} lease; run \\`${CLI_NAME} ensure --mode=${mode}\\` first\\n`,\n );\n return 2;\n }\n process.stdout.write(`${urlFromLease(lease)}\\n`);\n return 0;\n }\n\n process.stderr.write(`${CLI_NAME}: unknown command ${args.cmd}\\n`);\n printHelp();\n return 64;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${CLI_NAME}: ${message}\\n`);\n return 1;\n }\n}\n\nmain()\n .then((code) => {\n process.exit(code);\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${CLI_NAME}: ${message}\\n`);\n process.exit(1);\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { spawn } from \"node:child_process\";\nimport { CLI_NAME } from \"./core/constants.ts\";\nimport { acquire, dispose, gc, urlFromLease } from \"./core/lifecycle.ts\";\nimport { resolveWorktreeIdentity } from \"./core/worktree.ts\";\nimport { readLease } from \"./core/lease.ts\";\nimport type { DbMode } from \"./core/naming.ts\";\n\nfunction printHelp(): void {\n process.stdout.write(`${CLI_NAME}: worktree-isolated local Postgres (via autopg)\n\nUsage:\n ${CLI_NAME} acquire --mode=dev|test [--root <path>] [--force] [--json] [--print-env]\n ${CLI_NAME} run --mode=dev|test [--root <path>] [--force] -- <cmd…>\n ${CLI_NAME} dispose [--mode=dev|test] [--root <path>]\n ${CLI_NAME} gc [--json]\n ${CLI_NAME} print-url [--mode=dev|test] [--root <path>]\n ${CLI_NAME} --help\n\nModes:\n dev Keep DB across restarts (default when --mode omitted)\n test Drop DB on dispose / test teardown\n\nrun:\n Acquire, set DATABASE_URL (+ TEST_DATABASE_URL in test) on the child, exec <cmd…>.\n --force sets CEDAR_PG_FORCE (escape hatch); child env overwrite is always on.\n\nEnv:\n AUTOPG_BIN Path to autopg binary\n CEDAR_PG=0 Disable adapters that auto-acquire\n CEDAR_PG_FORCE=1 Ignore external-URL escape hatch (same as --force)\n`);\n}\n\nfunction parseMode(value: string | undefined): DbMode {\n if (value === \"dev\" || value === \"test\") return value;\n throw new Error(\"--mode must be dev or test\");\n}\n\ntype ParsedArgs = {\n cmd?: string;\n mode?: DbMode;\n root?: string;\n json?: boolean;\n printEnv?: boolean;\n force?: boolean;\n help?: boolean;\n child?: string[];\n};\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const out: ParsedArgs = {};\n const rest = [...argv];\n out.cmd = rest.shift();\n\n const dash = rest.indexOf(\"--\");\n let flagArgs = rest;\n if (dash >= 0) {\n flagArgs = rest.slice(0, dash);\n out.child = rest.slice(dash + 1);\n }\n\n for (let i = 0; i < flagArgs.length; i++) {\n const a = flagArgs[i]!;\n if (a === \"--help\" || a === \"-h\") out.help = true;\n else if (a === \"--json\") out.json = true;\n else if (a === \"--print-env\") out.printEnv = true;\n else if (a === \"--force\") out.force = true;\n else if (a.startsWith(\"--mode=\")) out.mode = parseMode(a.slice(7));\n else if (a === \"--mode\") out.mode = parseMode(flagArgs[++i]);\n else if (a.startsWith(\"--root=\")) out.root = a.slice(7);\n else if (a === \"--root\") out.root = flagArgs[++i];\n else throw new Error(`unknown argument: ${a}`);\n }\n return out;\n}\n\nfunction runChild(command: string[], env: NodeJS.ProcessEnv): Promise<number> {\n const [file, ...args] = command;\n if (!file) {\n throw new Error(\n `run requires a command after -- (e.g. ${CLI_NAME} run --mode=dev -- yarn dev)`,\n );\n }\n return new Promise((resolve, reject) => {\n const child = spawn(file, args, { stdio: \"inherit\", env });\n child.on(\"error\", reject);\n child.on(\"exit\", (code, signal) => {\n resolve(signal ? 1 : (code ?? 1));\n });\n });\n}\n\nasync function main(): Promise<number> {\n const argv = process.argv.slice(2);\n if (argv.length === 0 || argv[0] === \"help\" || argv[0] === \"--help\" || argv[0] === \"-h\") {\n printHelp();\n return 0;\n }\n const args = parseArgs(argv);\n if (args.help) {\n printHelp();\n return 0;\n }\n\n try {\n if (args.cmd === \"acquire\") {\n if (args.force) process.env.CEDAR_PG_FORCE = \"1\";\n const mode = args.mode ?? \"dev\";\n const result = await acquire({\n root: args.root,\n mode,\n setEnv: true,\n });\n if (args.printEnv) {\n process.stdout.write(`DATABASE_URL=${result.databaseUrl}\\n`);\n if (mode === \"test\") {\n process.stdout.write(`TEST_DATABASE_URL=${result.databaseUrl}\\n`);\n }\n }\n if (args.json) {\n process.stdout.write(\n `${JSON.stringify(\n {\n databaseUrl: result.databaseUrl,\n adminUrl: result.adminUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n repoSlug: result.repoSlug,\n worktreeSlug: result.worktreeSlug,\n pathHash: result.pathHash,\n mode: result.mode,\n port: result.port,\n root: result.root,\n },\n null,\n 2,\n )}\\n`,\n );\n } else if (!args.printEnv) {\n process.stdout.write(\n `${CLI_NAME}: ${result.databaseName} (${result.repoSlug}/${result.worktreeSlug} ${result.mode})\\n`,\n );\n process.stdout.write(`${result.databaseUrl}\\n`);\n }\n return 0;\n }\n\n if (args.cmd === \"run\") {\n if (args.force) process.env.CEDAR_PG_FORCE = \"1\";\n const mode = args.mode ?? \"dev\";\n const result = await acquire({\n root: args.root,\n mode,\n setEnv: true,\n });\n const childEnv: NodeJS.ProcessEnv = {\n ...process.env,\n DATABASE_URL: result.databaseUrl,\n };\n if (mode === \"test\") childEnv.TEST_DATABASE_URL = result.databaseUrl;\n return await runChild(args.child ?? [], childEnv);\n }\n\n if (args.cmd === \"dispose\") {\n const mode = args.mode ?? \"test\";\n const result = await dispose({ root: args.root, mode });\n if (result.dropped) {\n process.stdout.write(`${CLI_NAME}: disposed ${mode} (${result.databaseName})\\n`);\n return 0;\n }\n if (result.reason === \"no-lease\") {\n process.stdout.write(`${CLI_NAME}: nothing to dispose for ${mode} (no lease)\\n`);\n return 0;\n }\n process.stderr.write(\n `${CLI_NAME}: could not dispose ${mode}: autopg host unavailable (lease kept for retry)\\n`,\n );\n return 1;\n }\n\n if (args.cmd === \"gc\") {\n const result = await gc();\n if (args.json) {\n process.stdout.write(`${JSON.stringify(result)}\\n`);\n } else {\n process.stdout.write(`${CLI_NAME} gc: dropped ${result.dropped.length} database(s)\\n`);\n for (const name of result.dropped) process.stdout.write(` ${name}\\n`);\n }\n return 0;\n }\n\n if (args.cmd === \"print-url\") {\n const mode = args.mode ?? \"dev\";\n const identity = resolveWorktreeIdentity(args.root);\n const lease = readLease(identity.root, mode);\n if (!lease) {\n process.stderr.write(\n `${CLI_NAME}: no ${mode} lease; run \\`${CLI_NAME} acquire --mode=${mode}\\` first\\n`,\n );\n return 2;\n }\n process.stdout.write(`${urlFromLease(lease)}\\n`);\n return 0;\n }\n\n process.stderr.write(`${CLI_NAME}: unknown command ${args.cmd}\\n`);\n printHelp();\n return 64;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${CLI_NAME}: ${message}\\n`);\n return 1;\n }\n}\n\nmain()\n .then((code) => {\n process.exit(code);\n })\n .catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`${CLI_NAME}: ${message}\\n`);\n process.exit(1);\n });\n"],"mappings":"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"}
@@ -14,7 +14,7 @@ const CLI_NAME = "cedarpg";
14
14
  */
15
15
  const STATE_DIRNAME = ".cedarpg";
16
16
  /**
17
- * Password scheme v1 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + databaseName).
17
+ * Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + roleName).
18
18
  * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.
19
19
  */
20
20
  const PASSWORD_SALT_PREFIX = "cedar-pg";
@@ -38,4 +38,4 @@ Object.defineProperty(exports, "STATE_DIRNAME", {
38
38
  }
39
39
  });
40
40
 
41
- //# sourceMappingURL=constants-CNZn5Xro.cjs.map
41
+ //# sourceMappingURL=constants-Ct8myrEn.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants-BY97wXjA.mjs","names":[],"sources":["../src/core/constants.ts"],"sourcesContent":["/**\n * Product identity vs frozen crypto.\n *\n * State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under\n * autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).\n * Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.\n */\n\n/** User-facing CLI binary (`package.json` bin) and log prefix */\nexport const CLI_NAME = \"cedarpg\";\n\n/**\n * Worktree-local state dir and home-registry parent (`~/.cedarpg/registry`).\n * Frozen for lease/gc discovery after first alpha consumers appear.\n */\nexport const STATE_DIRNAME = \".cedarpg\";\n\n/**\n * Password scheme v1 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\\0` + databaseName).\n * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.\n */\nexport const PASSWORD_SALT_PREFIX = \"cedar-pg\";\n"],"mappings":";;;;;;;;;AASA,MAAa,WAAW;;;;;AAMxB,MAAa,gBAAgB;;;;;AAM7B,MAAa,uBAAuB"}
1
+ {"version":3,"file":"constants-Ct8myrEn.cjs","names":[],"sources":["../src/core/constants.ts"],"sourcesContent":["/**\n * Product identity vs frozen crypto.\n *\n * State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under\n * autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).\n * Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.\n */\n\n/** User-facing CLI binary (`package.json` bin) and log prefix */\nexport const CLI_NAME = \"cedarpg\";\n\n/**\n * Worktree-local state dir and home-registry parent (`~/.cedarpg/registry`).\n * Frozen for lease/gc discovery after first alpha consumers appear.\n */\nexport const STATE_DIRNAME = \".cedarpg\";\n\n/**\n * Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\\0` + roleName).\n * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.\n */\nexport const PASSWORD_SALT_PREFIX = \"cedar-pg\";\n"],"mappings":";;;;;;;;;AASA,MAAa,WAAW;;;;;AAMxB,MAAa,gBAAgB;;;;;AAM7B,MAAa,uBAAuB"}
@@ -14,11 +14,11 @@ const CLI_NAME = "cedarpg";
14
14
  */
15
15
  const STATE_DIRNAME = ".cedarpg";
16
16
  /**
17
- * Password scheme v1 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + databaseName).
17
+ * Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + roleName).
18
18
  * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.
19
19
  */
20
20
  const PASSWORD_SALT_PREFIX = "cedar-pg";
21
21
  //#endregion
22
22
  export { PASSWORD_SALT_PREFIX as n, STATE_DIRNAME as r, CLI_NAME as t };
23
23
 
24
- //# sourceMappingURL=constants-BY97wXjA.mjs.map
24
+ //# sourceMappingURL=constants-NLR0U4NR.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants-CNZn5Xro.cjs","names":[],"sources":["../src/core/constants.ts"],"sourcesContent":["/**\n * Product identity vs frozen crypto.\n *\n * State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under\n * autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).\n * Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.\n */\n\n/** User-facing CLI binary (`package.json` bin) and log prefix */\nexport const CLI_NAME = \"cedarpg\";\n\n/**\n * Worktree-local state dir and home-registry parent (`~/.cedarpg/registry`).\n * Frozen for lease/gc discovery after first alpha consumers appear.\n */\nexport const STATE_DIRNAME = \".cedarpg\";\n\n/**\n * Password scheme v1 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\\0` + databaseName).\n * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.\n */\nexport const PASSWORD_SALT_PREFIX = \"cedar-pg\";\n"],"mappings":";;;;;;;;;AASA,MAAa,WAAW;;;;;AAMxB,MAAa,gBAAgB;;;;;AAM7B,MAAa,uBAAuB"}
1
+ {"version":3,"file":"constants-NLR0U4NR.mjs","names":[],"sources":["../src/core/constants.ts"],"sourcesContent":["/**\n * Product identity vs frozen crypto.\n *\n * State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under\n * autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).\n * Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.\n */\n\n/** User-facing CLI binary (`package.json` bin) and log prefix */\nexport const CLI_NAME = \"cedarpg\";\n\n/**\n * Worktree-local state dir and home-registry parent (`~/.cedarpg/registry`).\n * Frozen for lease/gc discovery after first alpha consumers appear.\n */\nexport const STATE_DIRNAME = \".cedarpg\";\n\n/**\n * Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\\0` + roleName).\n * Opaque; independent of STATE_DIRNAME / CLI_NAME. Bump ROLE_PASSWORD_SCHEME to change.\n */\nexport const PASSWORD_SALT_PREFIX = \"cedar-pg\";\n"],"mappings":";;;;;;;;;AASA,MAAa,WAAW;;;;;AAMxB,MAAa,gBAAgB;;;;;AAM7B,MAAa,uBAAuB"}
@@ -0,0 +1,12 @@
1
+ //#region src/adapters/dev-env.ts
2
+ /**
3
+ * `setupFiles`-style entry: load `.cedarpg/dev.env` with overwrite.
4
+ *
5
+ * ```ts
6
+ * import "@cedarjs/pg/dev-env";
7
+ * ```
8
+ */
9
+ require("./load-dev-env-cII6N4ZP.cjs").loadDevEnv({ overwrite: true });
10
+ //#endregion
11
+
12
+ //# sourceMappingURL=dev-env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-env.cjs","names":["loadDevEnv"],"sources":["../src/adapters/dev-env.ts"],"sourcesContent":["import { loadDevEnv } from \"./load-dev-env.ts\";\n\n/**\n * `setupFiles`-style entry: load `.cedarpg/dev.env` with overwrite.\n *\n * ```ts\n * import \"@cedarjs/pg/dev-env\";\n * ```\n */\nloadDevEnv({ overwrite: true });\n"],"mappings":";;;;;;;;qCASAA,CAAAA,CAAAA,WAAW,EAAE,WAAW,KAAK,CAAC"}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1 @@
1
+ export {}
@@ -0,0 +1,14 @@
1
+ import { t as loadDevEnv } from "./load-dev-env-7UjMHhw7.mjs";
2
+ //#region src/adapters/dev-env.ts
3
+ /**
4
+ * `setupFiles`-style entry: load `.cedarpg/dev.env` with overwrite.
5
+ *
6
+ * ```ts
7
+ * import "@cedarjs/pg/dev-env";
8
+ * ```
9
+ */
10
+ loadDevEnv({ overwrite: true });
11
+ //#endregion
12
+ export {};
13
+
14
+ //# sourceMappingURL=dev-env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-env.mjs","names":[],"sources":["../src/adapters/dev-env.ts"],"sourcesContent":["import { loadDevEnv } from \"./load-dev-env.ts\";\n\n/**\n * `setupFiles`-style entry: load `.cedarpg/dev.env` with overwrite.\n *\n * ```ts\n * import \"@cedarjs/pg/dev-env\";\n * ```\n */\nloadDevEnv({ overwrite: true });\n"],"mappings":";;;;;;;;;AASA,WAAW,EAAE,WAAW,KAAK,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,26 +1,66 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_lifecycle = require("./lifecycle-BGYtVXtx.cjs");
2
+ const require_lifecycle = require("./lifecycle-DEJ4GgWV.cjs");
3
+ const require_constants = require("./constants-Ct8myrEn.cjs");
4
+ const require_lease = require("./lease-Bq9wKwQa.cjs");
5
+ const require_template = require("./template-D0gJ_MS2.cjs");
6
+ const require_load_test_env = require("./load-test-env-CkdUjTpV.cjs");
7
+ const require_load_dev_env = require("./load-dev-env-cII6N4ZP.cjs");
8
+ //#region src/adapters/acquire-task.ts
9
+ /** Run acquireIfNeeded, then optional afterAcquire (migrate / db:ready). */
10
+ function createAcquireTask(options) {
11
+ return async () => {
12
+ const result = await require_lifecycle.acquireIfNeeded({
13
+ root: options.root,
14
+ mode: options.mode,
15
+ setEnv: options.setEnv !== false,
16
+ force: options.force
17
+ });
18
+ if (result.status !== "acquired" || !options.afterAcquire) return;
19
+ await options.afterAcquire({
20
+ databaseUrl: result.databaseUrl,
21
+ adminUrl: result.adminUrl,
22
+ databaseName: result.databaseName,
23
+ roleName: result.roleName,
24
+ root: result.root,
25
+ mode: result.mode,
26
+ port: result.port
27
+ });
28
+ };
29
+ }
30
+ //#endregion
31
+ exports.CLI_NAME = require_constants.CLI_NAME;
3
32
  exports.INSTALL_HINT = require_lifecycle.INSTALL_HINT;
4
33
  exports.ROLE_PASSWORD_SCHEME = require_lifecycle.ROLE_PASSWORD_SCHEME;
34
+ exports.STATE_DIRNAME = require_constants.STATE_DIRNAME;
35
+ exports.acquire = require_lifecycle.acquire;
36
+ exports.acquireIfNeeded = require_lifecycle.acquireIfNeeded;
37
+ exports.applyDatabaseUrlEnv = require_lifecycle.applyDatabaseUrlEnv;
38
+ exports.buildCloneDatabaseName = require_lifecycle.buildCloneDatabaseName;
5
39
  exports.buildDatabaseName = require_lifecycle.buildDatabaseName;
6
40
  exports.buildDatabaseUrl = require_lifecycle.buildDatabaseUrl;
7
41
  exports.buildRoleName = require_lifecycle.buildRoleName;
42
+ exports.cloneFromTemplate = require_template.cloneFromTemplate;
43
+ exports.cloneFromTemplateIfNeeded = require_template.cloneFromTemplateIfNeeded;
44
+ exports.createAcquireTask = createAcquireTask;
8
45
  exports.discoverHost = require_lifecycle.discoverHost;
9
46
  exports.dispose = require_lifecycle.dispose;
10
- exports.ensure = require_lifecycle.ensure;
11
- exports.ensureHostRunning = require_lifecycle.ensureHostRunning;
12
- exports.ensureIfNeeded = require_lifecycle.ensureIfNeeded;
47
+ exports.envFilePath = require_lease.envFilePath;
13
48
  exports.gc = require_lifecycle.gc;
14
49
  exports.isCedarPgManagedUrl = require_lifecycle.isCedarPgManagedUrl;
15
50
  exports.isExternalDatabaseEscapeHatch = require_lifecycle.isExternalDatabaseEscapeHatch;
16
- exports.isOrphanLease = require_lifecycle.isOrphanLease;
51
+ exports.isOrphanLease = require_lease.isOrphanLease;
52
+ exports.loadDevEnv = require_load_dev_env.loadDevEnv;
53
+ exports.loadTestEnv = require_load_test_env.loadTestEnv;
54
+ exports.markTemplate = require_template.markTemplate;
17
55
  exports.parseHostStatus = require_lifecycle.parseHostStatus;
18
- exports.parseLease = require_lifecycle.parseLease;
19
- exports.readLease = require_lifecycle.readLease;
56
+ exports.parseLease = require_lease.parseLease;
57
+ exports.readLease = require_lease.readLease;
20
58
  exports.requireAutopgBin = require_lifecycle.requireAutopgBin;
59
+ exports.resolveAcquireSkip = require_lifecycle.resolveAcquireSkip;
21
60
  exports.resolveAutopgBin = require_lifecycle.resolveAutopgBin;
22
- exports.resolveEnsureSkip = require_lifecycle.resolveEnsureSkip;
23
- exports.resolveRoot = require_lifecycle.resolveRoot;
24
- exports.resolveWorktreeIdentity = require_lifecycle.resolveWorktreeIdentity;
61
+ exports.resolveRoot = require_lease.resolveRoot;
62
+ exports.resolveWorktreeIdentity = require_lease.resolveWorktreeIdentity;
25
63
  exports.rolePasswordFor = require_lifecycle.rolePasswordFor;
26
64
  exports.urlFromLease = require_lifecycle.urlFromLease;
65
+
66
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["acquireIfNeeded"],"sources":["../src/adapters/acquire-task.ts"],"sourcesContent":["import { acquireIfNeeded, type AcquireResult } from \"../core/lifecycle.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\n\nexport type AcquireTaskContext = Pick<\n AcquireResult,\n \"databaseUrl\" | \"adminUrl\" | \"databaseName\" | \"roleName\" | \"root\" | \"mode\" | \"port\"\n>;\n\nexport type CreateAcquireTaskOptions = {\n mode: DbMode;\n root?: string;\n /** Ignore external-URL escape hatch (`CEDAR_PG_FORCE=1` also works). */\n force?: boolean;\n setEnv?: boolean;\n /** App-owned migrate/seed after a successful acquire. */\n afterAcquire?: (ctx: AcquireTaskContext) => void | Promise<void>;\n};\n\n/** Run acquireIfNeeded, then optional afterAcquire (migrate / db:ready). */\nexport function createAcquireTask(options: CreateAcquireTaskOptions): () => Promise<void> {\n return async () => {\n const result = await acquireIfNeeded({\n root: options.root,\n mode: options.mode,\n setEnv: options.setEnv !== false,\n force: options.force,\n });\n if (result.status !== \"acquired\" || !options.afterAcquire) return;\n await options.afterAcquire({\n databaseUrl: result.databaseUrl,\n adminUrl: result.adminUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n root: result.root,\n mode: result.mode,\n port: result.port,\n });\n };\n}\n"],"mappings":";;;;;;;;;AAmBA,SAAgB,kBAAkB,SAAwD;CACxF,OAAO,YAAY;EACjB,MAAM,SAAS,MAAMA,kBAAAA,gBAAgB;GACnC,MAAM,QAAQ;GACd,MAAM,QAAQ;GACd,QAAQ,QAAQ,WAAW;GAC3B,OAAO,QAAQ;EACjB,CAAC;EACD,IAAI,OAAO,WAAW,cAAc,CAAC,QAAQ,cAAc;EAC3D,MAAM,QAAQ,aAAa;GACzB,aAAa,OAAO;GACpB,UAAU,OAAO;GACjB,cAAc,OAAO;GACrB,UAAU,OAAO;GACjB,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,OAAO;EACf,CAAC;CACH;AACF"}