@cedarjs/pg 0.1.0-alpha.1 → 0.2.0-beta.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 (129) hide show
  1. package/README.md +361 -89
  2. package/dist/cli.cjs +131 -35
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.mjs +118 -22
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/dev-env.cjs +12 -0
  7. package/dist/dev-env.cjs.map +1 -0
  8. package/dist/dev-env.d.cts +1 -0
  9. package/dist/dev-env.d.mts +1 -0
  10. package/dist/dev-env.mjs +14 -0
  11. package/dist/dev-env.mjs.map +1 -0
  12. package/dist/index.cjs +51 -10
  13. package/dist/index.cjs.map +1 -0
  14. package/dist/index.d.cts +198 -84
  15. package/dist/index.d.mts +198 -84
  16. package/dist/index.mjs +32 -2
  17. package/dist/index.mjs.map +1 -0
  18. package/dist/jest-teardown.cjs +18 -0
  19. package/dist/jest-teardown.cjs.map +1 -0
  20. package/dist/jest-teardown.d.cts +13 -0
  21. package/dist/jest-teardown.d.mts +14 -0
  22. package/dist/jest-teardown.mjs +18 -0
  23. package/dist/jest-teardown.mjs.map +1 -0
  24. package/dist/jest-template.cjs +44 -0
  25. package/dist/jest-template.cjs.map +1 -0
  26. package/dist/jest-template.d.cts +31 -0
  27. package/dist/jest-template.d.mts +31 -0
  28. package/dist/jest-template.mjs +38 -0
  29. package/dist/jest-template.mjs.map +1 -0
  30. package/dist/jest.cjs +12 -15
  31. package/dist/jest.cjs.map +1 -1
  32. package/dist/jest.d.cts +10 -7
  33. package/dist/jest.d.mts +10 -6
  34. package/dist/jest.mjs +12 -10
  35. package/dist/jest.mjs.map +1 -1
  36. package/dist/lease-B3TuX92y.d.mts +24 -0
  37. package/dist/lease-DS1SX8U_.mjs +221 -0
  38. package/dist/lease-DS1SX8U_.mjs.map +1 -0
  39. package/dist/lease-WlmOnNDi.cjs +310 -0
  40. package/dist/lease-WlmOnNDi.cjs.map +1 -0
  41. package/dist/lease-t4I9JahV.d.cts +24 -0
  42. package/dist/lifecycle-BbrvFQvg.cjs +953 -0
  43. package/dist/lifecycle-BbrvFQvg.cjs.map +1 -0
  44. package/dist/lifecycle-BvIx0xqq.mjs +781 -0
  45. package/dist/lifecycle-BvIx0xqq.mjs.map +1 -0
  46. package/dist/load-dev-env-BULkXyen.mjs +10 -0
  47. package/dist/load-dev-env-BULkXyen.mjs.map +1 -0
  48. package/dist/load-dev-env-Bl6Ddv1U.cjs +15 -0
  49. package/dist/load-dev-env-Bl6Ddv1U.cjs.map +1 -0
  50. package/dist/load-mode-env-CX9vd56X.cjs +39 -0
  51. package/dist/load-mode-env-CX9vd56X.cjs.map +1 -0
  52. package/dist/load-mode-env-Ce9ujisN.mjs +28 -0
  53. package/dist/load-mode-env-Ce9ujisN.mjs.map +1 -0
  54. package/dist/load-test-env-BqtA6V-d.mjs +18 -0
  55. package/dist/load-test-env-BqtA6V-d.mjs.map +1 -0
  56. package/dist/load-test-env-Dcgh6YHV.cjs +23 -0
  57. package/dist/load-test-env-Dcgh6YHV.cjs.map +1 -0
  58. package/dist/naming-C2nGVxPk.d.cts +39 -0
  59. package/dist/naming-C2nGVxPk.d.mts +39 -0
  60. package/dist/nx.cjs +25 -18
  61. package/dist/nx.cjs.map +1 -1
  62. package/dist/nx.d.cts +9 -20
  63. package/dist/nx.d.mts +9 -20
  64. package/dist/nx.mjs +18 -18
  65. package/dist/nx.mjs.map +1 -1
  66. package/dist/status-4Uz6A3LB.cjs +31 -0
  67. package/dist/status-4Uz6A3LB.cjs.map +1 -0
  68. package/dist/status-Dcnpgnlz.mjs +26 -0
  69. package/dist/status-Dcnpgnlz.mjs.map +1 -0
  70. package/dist/studio-DIFw1qWC.mjs +173 -0
  71. package/dist/studio-DIFw1qWC.mjs.map +1 -0
  72. package/dist/studio-oJE30_PO.cjs +208 -0
  73. package/dist/studio-oJE30_PO.cjs.map +1 -0
  74. package/dist/tasks-CNHvvlsN.cjs +67 -0
  75. package/dist/tasks-CNHvvlsN.cjs.map +1 -0
  76. package/dist/tasks-CjaZRi_G.d.mts +19 -0
  77. package/dist/tasks-D5iWIdlo.mjs +38 -0
  78. package/dist/tasks-D5iWIdlo.mjs.map +1 -0
  79. package/dist/tasks-DdQoP9We.d.cts +19 -0
  80. package/dist/template-BiJ-0TIF.mjs +88 -0
  81. package/dist/template-BiJ-0TIF.mjs.map +1 -0
  82. package/dist/template-CXMpODzK.cjs +105 -0
  83. package/dist/template-CXMpODzK.cjs.map +1 -0
  84. package/dist/template-mode-BTUsdBtA.mjs +94 -0
  85. package/dist/template-mode-BTUsdBtA.mjs.map +1 -0
  86. package/dist/template-mode-CzyVwHsi.d.cts +31 -0
  87. package/dist/template-mode-CzyVwHsi.d.mts +31 -0
  88. package/dist/template-mode-JTOxrEgE.cjs +105 -0
  89. package/dist/template-mode-JTOxrEgE.cjs.map +1 -0
  90. package/dist/test-env.cjs +16 -0
  91. package/dist/test-env.cjs.map +1 -0
  92. package/dist/test-env.d.cts +1 -0
  93. package/dist/test-env.d.mts +1 -0
  94. package/dist/test-env.mjs +18 -0
  95. package/dist/test-env.mjs.map +1 -0
  96. package/dist/vite-plus.cjs +113 -35
  97. package/dist/vite-plus.cjs.map +1 -1
  98. package/dist/vite-plus.d.cts +26 -46
  99. package/dist/vite-plus.d.mts +26 -46
  100. package/dist/vite-plus.mjs +110 -32
  101. package/dist/vite-plus.mjs.map +1 -1
  102. package/dist/vitest-template.cjs +48 -0
  103. package/dist/vitest-template.cjs.map +1 -0
  104. package/dist/vitest-template.d.cts +31 -0
  105. package/dist/vitest-template.d.mts +31 -0
  106. package/dist/vitest-template.mjs +42 -0
  107. package/dist/vitest-template.mjs.map +1 -0
  108. package/dist/vitest.cjs +10 -10
  109. package/dist/vitest.cjs.map +1 -1
  110. package/dist/vitest.d.cts +7 -3
  111. package/dist/vitest.d.mts +7 -2
  112. package/dist/vitest.mjs +10 -5
  113. package/dist/vitest.mjs.map +1 -1
  114. package/package.json +46 -13
  115. package/scripts/autopg-version +1 -0
  116. package/scripts/ci-install-autopg.sh +73 -0
  117. package/scripts/postinstall.js +35 -9
  118. package/dist/constants-BY97wXjA.mjs +0 -24
  119. package/dist/constants-BY97wXjA.mjs.map +0 -1
  120. package/dist/constants-CNZn5Xro.cjs +0 -41
  121. package/dist/constants-CNZn5Xro.cjs.map +0 -1
  122. package/dist/lifecycle-BGYtVXtx.cjs +0 -743
  123. package/dist/lifecycle-BGYtVXtx.cjs.map +0 -1
  124. package/dist/lifecycle-CT_8AWPv.mjs +0 -577
  125. package/dist/lifecycle-CT_8AWPv.mjs.map +0 -1
  126. package/dist/tasks-13P6tMth.mjs +0 -16
  127. package/dist/tasks-13P6tMth.mjs.map +0 -1
  128. package/dist/tasks-B8ryV9xo.cjs +0 -21
  129. package/dist/tasks-B8ryV9xo.cjs.map +0 -1
package/dist/cli.cjs CHANGED
@@ -1,24 +1,39 @@
1
1
  #!/usr/bin/env node
2
- const require_lifecycle = require("./lifecycle-BGYtVXtx.cjs");
3
- const require_constants = require("./constants-CNZn5Xro.cjs");
2
+ const require_lifecycle = require("./lifecycle-BbrvFQvg.cjs");
3
+ const require_lease = require("./lease-WlmOnNDi.cjs");
4
+ const require_status = require("./status-4Uz6A3LB.cjs");
5
+ const require_studio = require("./studio-oJE30_PO.cjs");
4
6
  //#region src/cli.ts
5
7
  function printHelp() {
6
- process.stdout.write(`${require_constants.CLI_NAME}: worktree-isolated local Postgres (via autopg)
8
+ process.stdout.write(`${require_lease.CLI_NAME}: worktree-isolated local Postgres (via autopg)
7
9
 
8
10
  Usage:
9
- ${require_constants.CLI_NAME} ensure --mode=dev|test [--root <path>] [--json] [--print-env]
10
- ${require_constants.CLI_NAME} dispose [--mode=dev|test] [--root <path>]
11
- ${require_constants.CLI_NAME} gc [--json]
12
- ${require_constants.CLI_NAME} print-url [--mode=dev|test] [--root <path>]
13
- ${require_constants.CLI_NAME} --help
11
+ ${require_lease.CLI_NAME} acquire --mode=dev|test [--root <path>] [--force] [--json] [--print-env]
12
+ ${require_lease.CLI_NAME} run --mode=dev|test [--root <path>] [--force] -- <cmd…>
13
+ ${require_lease.CLI_NAME} dispose [--mode=dev|test] [--root <path>]
14
+ ${require_lease.CLI_NAME} gc [--json]
15
+ ${require_lease.CLI_NAME} print-url [--mode=dev|test] [--root <path>]
16
+ ${require_lease.CLI_NAME} status [--mode=dev|test] [--root <path>] [--json]
17
+ ${require_lease.CLI_NAME} studio [--mode=dev|test] [--root <path>] [--prisma|--drizzle]
18
+ ${require_lease.CLI_NAME} --help
14
19
 
15
20
  Modes:
16
- dev Keep DB across restarts (default for ensure if omitted: dev)
21
+ dev Keep DB across restarts (default when --mode omitted)
17
22
  test Drop DB on dispose / test teardown
18
23
 
24
+ run:
25
+ Acquire, set DATABASE_URL (+ TEST_DATABASE_URL in test) on the child, exec <cmd…>.
26
+ --force sets CEDAR_PG_FORCE (escape hatch); child env overwrite is always on.
27
+
28
+ status / studio:
29
+ Read-only lease inspection (no acquire). studio runs Prisma or Drizzle Kit Studio
30
+ attached (stdio + exit code) with DATABASE_URL from the lease. Detects from cwd
31
+ up to the worktree (auto; --prisma / --drizzle to force).
32
+
19
33
  Env:
20
- AUTOPG_BIN Path to autopg binary
21
- CEDAR_PG=0 Disable adapters that auto-ensure
34
+ AUTOPG_BIN Path to autopg binary
35
+ CEDAR_PG=0 Disable adapters that auto-acquire
36
+ CEDAR_PG_FORCE=1 Ignore external-URL escape hatch (same as --force)
22
37
  `);
23
38
  }
24
39
  function parseMode(value) {
@@ -29,19 +44,90 @@ function parseArgs(argv) {
29
44
  const out = {};
30
45
  const rest = [...argv];
31
46
  out.cmd = rest.shift();
32
- for (let i = 0; i < rest.length; i++) {
33
- const a = rest[i];
47
+ const dash = rest.indexOf("--");
48
+ let flagArgs = rest;
49
+ if (dash >= 0) {
50
+ flagArgs = rest.slice(0, dash);
51
+ out.child = rest.slice(dash + 1);
52
+ }
53
+ for (let i = 0; i < flagArgs.length; i++) {
54
+ const a = flagArgs[i];
34
55
  if (a === "--help" || a === "-h") out.help = true;
35
56
  else if (a === "--json") out.json = true;
36
57
  else if (a === "--print-env") out.printEnv = true;
58
+ else if (a === "--force") out.force = true;
59
+ else if (a === "--prisma") out.prisma = true;
60
+ else if (a === "--drizzle") out.drizzle = true;
37
61
  else if (a.startsWith("--mode=")) out.mode = parseMode(a.slice(7));
38
- else if (a === "--mode") out.mode = parseMode(rest[++i]);
62
+ else if (a === "--mode") out.mode = parseMode(flagArgs[++i]);
39
63
  else if (a.startsWith("--root=")) out.root = a.slice(7);
40
- else if (a === "--root") out.root = rest[++i];
64
+ else if (a === "--root") out.root = flagArgs[++i];
41
65
  else throw new Error(`unknown argument: ${a}`);
42
66
  }
43
67
  return out;
44
68
  }
69
+ function studioPrefer(args) {
70
+ if (args.prisma && args.drizzle) throw new Error("pass only one of --prisma or --drizzle");
71
+ if (args.prisma) return "prisma";
72
+ if (args.drizzle) return "drizzle";
73
+ }
74
+ function writeLines(stream, lines) {
75
+ for (const line of lines) stream.write(`${line}\n`);
76
+ }
77
+ function runChild(command, env) {
78
+ const [file, ...args] = command;
79
+ if (!file) throw new Error(`run requires a command after -- (e.g. ${require_lease.CLI_NAME} run --mode=dev -- yarn dev)`);
80
+ return require_studio.runAttached(file, args, { env });
81
+ }
82
+ function cmdPrintUrl(args) {
83
+ const status = require_status.resolveDevStatus({
84
+ root: args.root,
85
+ mode: args.mode
86
+ });
87
+ if (!status.ok) {
88
+ writeLines(process.stderr, require_studio.formatDevStatus(status));
89
+ return 2;
90
+ }
91
+ process.stdout.write(`${status.databaseUrl}\n`);
92
+ return 0;
93
+ }
94
+ function cmdStatus(args) {
95
+ const status = require_status.resolveDevStatus({
96
+ root: args.root,
97
+ mode: args.mode
98
+ });
99
+ if (args.json) {
100
+ process.stdout.write(`${JSON.stringify(status, null, 2)}\n`);
101
+ return status.ok ? 0 : 2;
102
+ }
103
+ writeLines(process.stdout, require_studio.formatDevStatus(status));
104
+ return status.ok ? 0 : 2;
105
+ }
106
+ async function cmdStudio(args) {
107
+ const prefer = studioPrefer(args);
108
+ const status = require_status.resolveDevStatus({
109
+ root: args.root,
110
+ mode: args.mode
111
+ });
112
+ if (!status.ok) {
113
+ writeLines(process.stderr, require_studio.formatDevStatus(status));
114
+ return 2;
115
+ }
116
+ const studio = require_studio.detectStudio({
117
+ root: status.root,
118
+ cwd: process.cwd(),
119
+ prefer
120
+ });
121
+ if (!studio) {
122
+ process.stderr.write(`${require_lease.CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)\n`);
123
+ return 1;
124
+ }
125
+ process.stdout.write(`${require_lease.CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(" ")})\n`);
126
+ return require_studio.runStudio({
127
+ databaseUrl: status.databaseUrl,
128
+ studio
129
+ });
130
+ }
45
131
  async function main() {
46
132
  const argv = process.argv.slice(2);
47
133
  if (argv.length === 0 || argv[0] === "help" || argv[0] === "--help" || argv[0] === "-h") {
@@ -54,9 +140,10 @@ async function main() {
54
140
  return 0;
55
141
  }
56
142
  try {
57
- if (args.cmd === "ensure") {
143
+ if (args.cmd === "acquire") {
144
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
58
145
  const mode = args.mode ?? "dev";
59
- const result = await require_lifecycle.ensure({
146
+ const result = await require_lifecycle.acquire({
60
147
  root: args.root,
61
148
  mode,
62
149
  setEnv: true
@@ -67,6 +154,7 @@ async function main() {
67
154
  }
68
155
  if (args.json) process.stdout.write(`${JSON.stringify({
69
156
  databaseUrl: result.databaseUrl,
157
+ adminUrl: result.adminUrl,
70
158
  databaseName: result.databaseName,
71
159
  roleName: result.roleName,
72
160
  repoSlug: result.repoSlug,
@@ -77,11 +165,26 @@ async function main() {
77
165
  root: result.root
78
166
  }, null, 2)}\n`);
79
167
  else if (!args.printEnv) {
80
- process.stdout.write(`${require_constants.CLI_NAME}: ${result.databaseName} (${result.repoSlug}/${result.worktreeSlug} ${result.mode})\n`);
168
+ process.stdout.write(`${require_lease.CLI_NAME}: ${result.databaseName} (${result.repoSlug}/${result.worktreeSlug} ${result.mode})\n`);
81
169
  process.stdout.write(`${result.databaseUrl}\n`);
82
170
  }
83
171
  return 0;
84
172
  }
173
+ if (args.cmd === "run") {
174
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
175
+ const mode = args.mode ?? "dev";
176
+ const result = await require_lifecycle.acquire({
177
+ root: args.root,
178
+ mode,
179
+ setEnv: true
180
+ });
181
+ const childEnv = {
182
+ ...process.env,
183
+ DATABASE_URL: result.databaseUrl
184
+ };
185
+ if (mode === "test") childEnv.TEST_DATABASE_URL = result.databaseUrl;
186
+ return await runChild(args.child ?? [], childEnv);
187
+ }
85
188
  if (args.cmd === "dispose") {
86
189
  const mode = args.mode ?? "test";
87
190
  const result = await require_lifecycle.dispose({
@@ -89,41 +192,34 @@ async function main() {
89
192
  mode
90
193
  });
91
194
  if (result.dropped) {
92
- process.stdout.write(`${require_constants.CLI_NAME}: disposed ${mode} (${result.databaseName})\n`);
195
+ process.stdout.write(`${require_lease.CLI_NAME}: disposed ${mode} (${result.databaseName})\n`);
93
196
  return 0;
94
197
  }
95
198
  if (result.reason === "no-lease") {
96
- process.stdout.write(`${require_constants.CLI_NAME}: nothing to dispose for ${mode} (no lease)\n`);
199
+ process.stdout.write(`${require_lease.CLI_NAME}: nothing to dispose for ${mode} (no lease)\n`);
97
200
  return 0;
98
201
  }
99
- process.stderr.write(`${require_constants.CLI_NAME}: could not dispose ${mode}: autopg host unavailable (lease kept for retry)\n`);
202
+ process.stderr.write(`${require_lease.CLI_NAME}: could not dispose ${mode}: autopg host unavailable (lease kept for retry)\n`);
100
203
  return 1;
101
204
  }
102
205
  if (args.cmd === "gc") {
103
206
  const result = await require_lifecycle.gc();
104
207
  if (args.json) process.stdout.write(`${JSON.stringify(result)}\n`);
105
208
  else {
106
- process.stdout.write(`${require_constants.CLI_NAME} gc: dropped ${result.dropped.length} database(s)\n`);
209
+ process.stdout.write(`${require_lease.CLI_NAME} gc: dropped ${result.dropped.length} database(s)\n`);
107
210
  for (const name of result.dropped) process.stdout.write(` ${name}\n`);
108
211
  }
109
212
  return 0;
110
213
  }
111
- if (args.cmd === "print-url") {
112
- const mode = args.mode ?? "dev";
113
- const lease = require_lifecycle.readLease(require_lifecycle.resolveWorktreeIdentity(args.root).root, mode);
114
- if (!lease) {
115
- process.stderr.write(`${require_constants.CLI_NAME}: no ${mode} lease; run \`${require_constants.CLI_NAME} ensure --mode=${mode}\` first\n`);
116
- return 2;
117
- }
118
- process.stdout.write(`${require_lifecycle.urlFromLease(lease)}\n`);
119
- return 0;
120
- }
121
- process.stderr.write(`${require_constants.CLI_NAME}: unknown command ${args.cmd}\n`);
214
+ if (args.cmd === "print-url") return cmdPrintUrl(args);
215
+ if (args.cmd === "status") return cmdStatus(args);
216
+ if (args.cmd === "studio") return await cmdStudio(args);
217
+ process.stderr.write(`${require_lease.CLI_NAME}: unknown command ${args.cmd}\n`);
122
218
  printHelp();
123
219
  return 64;
124
220
  } catch (err) {
125
221
  const message = err instanceof Error ? err.message : String(err);
126
- process.stderr.write(`${require_constants.CLI_NAME}: ${message}\n`);
222
+ process.stderr.write(`${require_lease.CLI_NAME}: ${message}\n`);
127
223
  return 1;
128
224
  }
129
225
  }
@@ -131,7 +227,7 @@ main().then((code) => {
131
227
  process.exit(code);
132
228
  }).catch((err) => {
133
229
  const message = err instanceof Error ? err.message : String(err);
134
- process.stderr.write(`${require_constants.CLI_NAME}: ${message}\n`);
230
+ process.stderr.write(`${require_lease.CLI_NAME}: ${message}\n`);
135
231
  process.exit(1);
136
232
  });
137
233
  //#endregion
package/dist/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.cjs","names":["CLI_NAME","ensure","dispose","gc","readLease","resolveWorktreeIdentity","urlFromLease"],"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.cjs","names":["CLI_NAME","runAttached","resolveDevStatus","formatDevStatus","detectStudio","runStudio","acquire","dispose","gc"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { CLI_NAME } from \"./core/constants.ts\";\nimport { acquire, dispose, gc } from \"./core/lifecycle.ts\";\nimport { resolveDevStatus } from \"./core/status.ts\";\nimport type { DbMode } from \"./core/naming.ts\";\nimport { runAttached } from \"./adapters/child.ts\";\nimport { formatDevStatus } from \"./adapters/status-format.ts\";\nimport { detectStudio, runStudio, type StudioKind } from \"./adapters/studio.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} status [--mode=dev|test] [--root <path>] [--json]\n ${CLI_NAME} studio [--mode=dev|test] [--root <path>] [--prisma|--drizzle]\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\nstatus / studio:\n Read-only lease inspection (no acquire). studio runs Prisma or Drizzle Kit Studio\n attached (stdio + exit code) with DATABASE_URL from the lease. Detects from cwd\n up to the worktree (auto; --prisma / --drizzle to force).\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 prisma?: boolean;\n drizzle?: 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 === \"--prisma\") out.prisma = true;\n else if (a === \"--drizzle\") out.drizzle = 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 studioPrefer(args: ParsedArgs): StudioKind | undefined {\n if (args.prisma && args.drizzle) {\n throw new Error(\"pass only one of --prisma or --drizzle\");\n }\n if (args.prisma) return \"prisma\";\n if (args.drizzle) return \"drizzle\";\n return undefined;\n}\n\nfunction writeLines(stream: NodeJS.WriteStream, lines: string[]): void {\n for (const line of lines) stream.write(`${line}\\n`);\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 runAttached(file, args, { env });\n}\n\nfunction cmdPrintUrl(args: ParsedArgs): number {\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (!status.ok) {\n writeLines(process.stderr, formatDevStatus(status));\n return 2;\n }\n process.stdout.write(`${status.databaseUrl}\\n`);\n return 0;\n}\n\nfunction cmdStatus(args: ParsedArgs): number {\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (args.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return status.ok ? 0 : 2;\n }\n writeLines(process.stdout, formatDevStatus(status));\n return status.ok ? 0 : 2;\n}\n\nasync function cmdStudio(args: ParsedArgs): Promise<number> {\n const prefer = studioPrefer(args);\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (!status.ok) {\n writeLines(process.stderr, formatDevStatus(status));\n return 2;\n }\n const studio = detectStudio({ root: status.root, cwd: process.cwd(), prefer });\n if (!studio) {\n process.stderr.write(\n `${CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)\\n`,\n );\n return 1;\n }\n process.stdout.write(\n `${CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(\" \")})\\n`,\n );\n return runStudio({ databaseUrl: status.databaseUrl, studio });\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 return cmdPrintUrl(args);\n }\n\n if (args.cmd === \"status\") {\n return cmdStatus(args);\n }\n\n if (args.cmd === \"studio\") {\n return await cmdStudio(args);\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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"}
package/dist/cli.mjs CHANGED
@@ -1,24 +1,39 @@
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 { i as gc, r as dispose, t as acquire } from "./lifecycle-BvIx0xqq.mjs";
3
+ import { p as CLI_NAME } from "./lease-DS1SX8U_.mjs";
4
+ import { t as resolveDevStatus } from "./status-Dcnpgnlz.mjs";
5
+ import { a as formatDevStatus, o as runAttached, r as runStudio, t as detectStudio } from "./studio-DIFw1qWC.mjs";
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>]
16
+ ${CLI_NAME} status [--mode=dev|test] [--root <path>] [--json]
17
+ ${CLI_NAME} studio [--mode=dev|test] [--root <path>] [--prisma|--drizzle]
13
18
  ${CLI_NAME} --help
14
19
 
15
20
  Modes:
16
- dev Keep DB across restarts (default for ensure if omitted: dev)
21
+ dev Keep DB across restarts (default when --mode omitted)
17
22
  test Drop DB on dispose / test teardown
18
23
 
24
+ run:
25
+ Acquire, set DATABASE_URL (+ TEST_DATABASE_URL in test) on the child, exec <cmd…>.
26
+ --force sets CEDAR_PG_FORCE (escape hatch); child env overwrite is always on.
27
+
28
+ status / studio:
29
+ Read-only lease inspection (no acquire). studio runs Prisma or Drizzle Kit Studio
30
+ attached (stdio + exit code) with DATABASE_URL from the lease. Detects from cwd
31
+ up to the worktree (auto; --prisma / --drizzle to force).
32
+
19
33
  Env:
20
- AUTOPG_BIN Path to autopg binary
21
- CEDAR_PG=0 Disable adapters that auto-ensure
34
+ AUTOPG_BIN Path to autopg binary
35
+ CEDAR_PG=0 Disable adapters that auto-acquire
36
+ CEDAR_PG_FORCE=1 Ignore external-URL escape hatch (same as --force)
22
37
  `);
23
38
  }
24
39
  function parseMode(value) {
@@ -29,19 +44,90 @@ function parseArgs(argv) {
29
44
  const out = {};
30
45
  const rest = [...argv];
31
46
  out.cmd = rest.shift();
32
- for (let i = 0; i < rest.length; i++) {
33
- const a = rest[i];
47
+ const dash = rest.indexOf("--");
48
+ let flagArgs = rest;
49
+ if (dash >= 0) {
50
+ flagArgs = rest.slice(0, dash);
51
+ out.child = rest.slice(dash + 1);
52
+ }
53
+ for (let i = 0; i < flagArgs.length; i++) {
54
+ const a = flagArgs[i];
34
55
  if (a === "--help" || a === "-h") out.help = true;
35
56
  else if (a === "--json") out.json = true;
36
57
  else if (a === "--print-env") out.printEnv = true;
58
+ else if (a === "--force") out.force = true;
59
+ else if (a === "--prisma") out.prisma = true;
60
+ else if (a === "--drizzle") out.drizzle = true;
37
61
  else if (a.startsWith("--mode=")) out.mode = parseMode(a.slice(7));
38
- else if (a === "--mode") out.mode = parseMode(rest[++i]);
62
+ else if (a === "--mode") out.mode = parseMode(flagArgs[++i]);
39
63
  else if (a.startsWith("--root=")) out.root = a.slice(7);
40
- else if (a === "--root") out.root = rest[++i];
64
+ else if (a === "--root") out.root = flagArgs[++i];
41
65
  else throw new Error(`unknown argument: ${a}`);
42
66
  }
43
67
  return out;
44
68
  }
69
+ function studioPrefer(args) {
70
+ if (args.prisma && args.drizzle) throw new Error("pass only one of --prisma or --drizzle");
71
+ if (args.prisma) return "prisma";
72
+ if (args.drizzle) return "drizzle";
73
+ }
74
+ function writeLines(stream, lines) {
75
+ for (const line of lines) stream.write(`${line}\n`);
76
+ }
77
+ function runChild(command, env) {
78
+ const [file, ...args] = command;
79
+ if (!file) throw new Error(`run requires a command after -- (e.g. ${CLI_NAME} run --mode=dev -- yarn dev)`);
80
+ return runAttached(file, args, { env });
81
+ }
82
+ function cmdPrintUrl(args) {
83
+ const status = resolveDevStatus({
84
+ root: args.root,
85
+ mode: args.mode
86
+ });
87
+ if (!status.ok) {
88
+ writeLines(process.stderr, formatDevStatus(status));
89
+ return 2;
90
+ }
91
+ process.stdout.write(`${status.databaseUrl}\n`);
92
+ return 0;
93
+ }
94
+ function cmdStatus(args) {
95
+ const status = resolveDevStatus({
96
+ root: args.root,
97
+ mode: args.mode
98
+ });
99
+ if (args.json) {
100
+ process.stdout.write(`${JSON.stringify(status, null, 2)}\n`);
101
+ return status.ok ? 0 : 2;
102
+ }
103
+ writeLines(process.stdout, formatDevStatus(status));
104
+ return status.ok ? 0 : 2;
105
+ }
106
+ async function cmdStudio(args) {
107
+ const prefer = studioPrefer(args);
108
+ const status = resolveDevStatus({
109
+ root: args.root,
110
+ mode: args.mode
111
+ });
112
+ if (!status.ok) {
113
+ writeLines(process.stderr, formatDevStatus(status));
114
+ return 2;
115
+ }
116
+ const studio = detectStudio({
117
+ root: status.root,
118
+ cwd: process.cwd(),
119
+ prefer
120
+ });
121
+ if (!studio) {
122
+ process.stderr.write(`${CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)\n`);
123
+ return 1;
124
+ }
125
+ process.stdout.write(`${CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(" ")})\n`);
126
+ return runStudio({
127
+ databaseUrl: status.databaseUrl,
128
+ studio
129
+ });
130
+ }
45
131
  async function main() {
46
132
  const argv = process.argv.slice(2);
47
133
  if (argv.length === 0 || argv[0] === "help" || argv[0] === "--help" || argv[0] === "-h") {
@@ -54,9 +140,10 @@ async function main() {
54
140
  return 0;
55
141
  }
56
142
  try {
57
- if (args.cmd === "ensure") {
143
+ if (args.cmd === "acquire") {
144
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
58
145
  const mode = args.mode ?? "dev";
59
- const result = await ensure({
146
+ const result = await acquire({
60
147
  root: args.root,
61
148
  mode,
62
149
  setEnv: true
@@ -67,6 +154,7 @@ async function main() {
67
154
  }
68
155
  if (args.json) process.stdout.write(`${JSON.stringify({
69
156
  databaseUrl: result.databaseUrl,
157
+ adminUrl: result.adminUrl,
70
158
  databaseName: result.databaseName,
71
159
  roleName: result.roleName,
72
160
  repoSlug: result.repoSlug,
@@ -82,6 +170,21 @@ async function main() {
82
170
  }
83
171
  return 0;
84
172
  }
173
+ if (args.cmd === "run") {
174
+ if (args.force) process.env.CEDAR_PG_FORCE = "1";
175
+ const mode = args.mode ?? "dev";
176
+ const result = await acquire({
177
+ root: args.root,
178
+ mode,
179
+ setEnv: true
180
+ });
181
+ const childEnv = {
182
+ ...process.env,
183
+ DATABASE_URL: result.databaseUrl
184
+ };
185
+ if (mode === "test") childEnv.TEST_DATABASE_URL = result.databaseUrl;
186
+ return await runChild(args.child ?? [], childEnv);
187
+ }
85
188
  if (args.cmd === "dispose") {
86
189
  const mode = args.mode ?? "test";
87
190
  const result = await dispose({
@@ -108,16 +211,9 @@ async function main() {
108
211
  }
109
212
  return 0;
110
213
  }
111
- if (args.cmd === "print-url") {
112
- const mode = args.mode ?? "dev";
113
- const lease = readLease(resolveWorktreeIdentity(args.root).root, mode);
114
- if (!lease) {
115
- process.stderr.write(`${CLI_NAME}: no ${mode} lease; run \`${CLI_NAME} ensure --mode=${mode}\` first\n`);
116
- return 2;
117
- }
118
- process.stdout.write(`${urlFromLease(lease)}\n`);
119
- return 0;
120
- }
214
+ if (args.cmd === "print-url") return cmdPrintUrl(args);
215
+ if (args.cmd === "status") return cmdStatus(args);
216
+ if (args.cmd === "studio") return await cmdStudio(args);
121
217
  process.stderr.write(`${CLI_NAME}: unknown command ${args.cmd}\n`);
122
218
  printHelp();
123
219
  return 64;
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 { CLI_NAME } from \"./core/constants.ts\";\nimport { acquire, dispose, gc } from \"./core/lifecycle.ts\";\nimport { resolveDevStatus } from \"./core/status.ts\";\nimport type { DbMode } from \"./core/naming.ts\";\nimport { runAttached } from \"./adapters/child.ts\";\nimport { formatDevStatus } from \"./adapters/status-format.ts\";\nimport { detectStudio, runStudio, type StudioKind } from \"./adapters/studio.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} status [--mode=dev|test] [--root <path>] [--json]\n ${CLI_NAME} studio [--mode=dev|test] [--root <path>] [--prisma|--drizzle]\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\nstatus / studio:\n Read-only lease inspection (no acquire). studio runs Prisma or Drizzle Kit Studio\n attached (stdio + exit code) with DATABASE_URL from the lease. Detects from cwd\n up to the worktree (auto; --prisma / --drizzle to force).\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 prisma?: boolean;\n drizzle?: 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 === \"--prisma\") out.prisma = true;\n else if (a === \"--drizzle\") out.drizzle = 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 studioPrefer(args: ParsedArgs): StudioKind | undefined {\n if (args.prisma && args.drizzle) {\n throw new Error(\"pass only one of --prisma or --drizzle\");\n }\n if (args.prisma) return \"prisma\";\n if (args.drizzle) return \"drizzle\";\n return undefined;\n}\n\nfunction writeLines(stream: NodeJS.WriteStream, lines: string[]): void {\n for (const line of lines) stream.write(`${line}\\n`);\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 runAttached(file, args, { env });\n}\n\nfunction cmdPrintUrl(args: ParsedArgs): number {\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (!status.ok) {\n writeLines(process.stderr, formatDevStatus(status));\n return 2;\n }\n process.stdout.write(`${status.databaseUrl}\\n`);\n return 0;\n}\n\nfunction cmdStatus(args: ParsedArgs): number {\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (args.json) {\n process.stdout.write(`${JSON.stringify(status, null, 2)}\\n`);\n return status.ok ? 0 : 2;\n }\n writeLines(process.stdout, formatDevStatus(status));\n return status.ok ? 0 : 2;\n}\n\nasync function cmdStudio(args: ParsedArgs): Promise<number> {\n const prefer = studioPrefer(args);\n const status = resolveDevStatus({ root: args.root, mode: args.mode });\n if (!status.ok) {\n writeLines(process.stderr, formatDevStatus(status));\n return 2;\n }\n const studio = detectStudio({ root: status.root, cwd: process.cwd(), prefer });\n if (!studio) {\n process.stderr.write(\n `${CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)\\n`,\n );\n return 1;\n }\n process.stdout.write(\n `${CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(\" \")})\\n`,\n );\n return runStudio({ databaseUrl: status.databaseUrl, studio });\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 return cmdPrintUrl(args);\n }\n\n if (args.cmd === \"status\") {\n return cmdStatus(args);\n }\n\n if (args.cmd === \"studio\") {\n return await cmdStudio(args);\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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"}
@@ -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-Bl6Ddv1U.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-BULkXyen.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"}