@cedarjs/pg 0.1.0-alpha.0 → 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.
- package/README.md +281 -30
- package/dist/cli.cjs +62 -16
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +61 -15
- package/dist/cli.mjs.map +1 -1
- package/dist/{constants-B7sCf4fg.cjs → constants-Ct8myrEn.cjs} +4 -4
- package/dist/constants-Ct8myrEn.cjs.map +1 -0
- package/dist/{constants-YnHDwShD.mjs → constants-NLR0U4NR.mjs} +4 -4
- package/dist/constants-NLR0U4NR.mjs.map +1 -0
- package/dist/dev-env.cjs +12 -0
- package/dist/dev-env.cjs.map +1 -0
- package/dist/dev-env.d.cts +1 -0
- package/dist/dev-env.d.mts +1 -0
- package/dist/dev-env.mjs +14 -0
- package/dist/dev-env.mjs.map +1 -0
- package/dist/index.cjs +50 -10
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +168 -82
- package/dist/index.d.mts +168 -82
- package/dist/index.mjs +32 -2
- package/dist/index.mjs.map +1 -0
- package/dist/jest-teardown.cjs +18 -0
- package/dist/jest-teardown.cjs.map +1 -0
- package/dist/jest-teardown.d.cts +13 -0
- package/dist/jest-teardown.d.mts +14 -0
- package/dist/jest-teardown.mjs +18 -0
- package/dist/jest-teardown.mjs.map +1 -0
- package/dist/jest-template.cjs +41 -0
- package/dist/jest-template.cjs.map +1 -0
- package/dist/jest-template.d.cts +28 -0
- package/dist/jest-template.d.mts +28 -0
- package/dist/jest-template.mjs +35 -0
- package/dist/jest-template.mjs.map +1 -0
- package/dist/jest.cjs +12 -15
- package/dist/jest.cjs.map +1 -1
- package/dist/jest.d.cts +10 -7
- package/dist/jest.d.mts +10 -6
- package/dist/jest.mjs +12 -10
- package/dist/jest.mjs.map +1 -1
- package/dist/lease-B3TuX92y.d.mts +24 -0
- package/dist/lease-BSBBpaR4.mjs +201 -0
- package/dist/lease-BSBBpaR4.mjs.map +1 -0
- package/dist/lease-Bq9wKwQa.cjs +272 -0
- package/dist/lease-Bq9wKwQa.cjs.map +1 -0
- package/dist/lease-t4I9JahV.d.cts +24 -0
- package/dist/lifecycle-BOo6xBjD.mjs +684 -0
- package/dist/lifecycle-BOo6xBjD.mjs.map +1 -0
- package/dist/lifecycle-DEJ4GgWV.cjs +856 -0
- package/dist/lifecycle-DEJ4GgWV.cjs.map +1 -0
- package/dist/load-dev-env-7UjMHhw7.mjs +10 -0
- package/dist/load-dev-env-7UjMHhw7.mjs.map +1 -0
- package/dist/load-dev-env-cII6N4ZP.cjs +15 -0
- package/dist/load-dev-env-cII6N4ZP.cjs.map +1 -0
- package/dist/load-mode-env-B0qO9DZx.cjs +39 -0
- package/dist/load-mode-env-B0qO9DZx.cjs.map +1 -0
- package/dist/load-mode-env-C8gy4v9V.mjs +28 -0
- package/dist/load-mode-env-C8gy4v9V.mjs.map +1 -0
- package/dist/load-test-env-C34wpkIX.mjs +18 -0
- package/dist/load-test-env-C34wpkIX.mjs.map +1 -0
- package/dist/load-test-env-CkdUjTpV.cjs +23 -0
- package/dist/load-test-env-CkdUjTpV.cjs.map +1 -0
- package/dist/naming-C2nGVxPk.d.cts +39 -0
- package/dist/naming-C2nGVxPk.d.mts +39 -0
- package/dist/nx.cjs +26 -17
- package/dist/nx.cjs.map +1 -1
- package/dist/nx.d.cts +9 -20
- package/dist/nx.d.mts +9 -20
- package/dist/nx.mjs +20 -18
- package/dist/nx.mjs.map +1 -1
- package/dist/tasks-Caud9yHr.cjs +67 -0
- package/dist/tasks-Caud9yHr.cjs.map +1 -0
- package/dist/tasks-CjaZRi_G.d.mts +19 -0
- package/dist/tasks-DdQoP9We.d.cts +19 -0
- package/dist/tasks-KherHLac.mjs +38 -0
- package/dist/tasks-KherHLac.mjs.map +1 -0
- package/dist/template-CGw3C1Ob.mjs +88 -0
- package/dist/template-CGw3C1Ob.mjs.map +1 -0
- package/dist/template-D0gJ_MS2.cjs +105 -0
- package/dist/template-D0gJ_MS2.cjs.map +1 -0
- package/dist/template-mode-BkEs9LnY.cjs +91 -0
- package/dist/template-mode-BkEs9LnY.cjs.map +1 -0
- package/dist/template-mode-CcxV_Iju.d.cts +28 -0
- package/dist/template-mode-CcxV_Iju.d.mts +28 -0
- package/dist/template-mode-IjlFOG4O.mjs +80 -0
- package/dist/template-mode-IjlFOG4O.mjs.map +1 -0
- package/dist/test-env.cjs +16 -0
- package/dist/test-env.cjs.map +1 -0
- package/dist/test-env.d.cts +1 -0
- package/dist/test-env.d.mts +1 -0
- package/dist/test-env.mjs +18 -0
- package/dist/test-env.mjs.map +1 -0
- package/dist/vite-plus.cjs +8 -33
- package/dist/vite-plus.cjs.map +1 -1
- package/dist/vite-plus.d.cts +4 -48
- package/dist/vite-plus.d.mts +4 -48
- package/dist/vite-plus.mjs +5 -30
- package/dist/vite-plus.mjs.map +1 -1
- package/dist/vitest-template.cjs +48 -0
- package/dist/vitest-template.cjs.map +1 -0
- package/dist/vitest-template.d.cts +31 -0
- package/dist/vitest-template.d.mts +31 -0
- package/dist/vitest-template.mjs +42 -0
- package/dist/vitest-template.mjs.map +1 -0
- package/dist/vitest.cjs +10 -10
- package/dist/vitest.cjs.map +1 -1
- package/dist/vitest.d.cts +7 -3
- package/dist/vitest.d.mts +7 -2
- package/dist/vitest.mjs +10 -5
- package/dist/vitest.mjs.map +1 -1
- package/package.json +37 -13
- package/scripts/autopg-version +1 -0
- package/scripts/ci-install-autopg.sh +73 -0
- package/scripts/postinstall.js +39 -13
- package/dist/constants-B7sCf4fg.cjs.map +0 -1
- package/dist/constants-YnHDwShD.mjs.map +0 -1
- package/dist/lifecycle-D10usEjM.cjs +0 -743
- package/dist/lifecycle-D10usEjM.cjs.map +0 -1
- package/dist/lifecycle-PbTXNC2Z.mjs +0 -577
- package/dist/lifecycle-PbTXNC2Z.mjs.map +0 -1
- package/dist/tasks-CW2D0n46.mjs +0 -16
- package/dist/tasks-CW2D0n46.mjs.map +0 -1
- package/dist/tasks-DZ7hMmGJ.cjs +0 -21
- package/dist/tasks-DZ7hMmGJ.cjs.map +0 -1
package/dist/cli.mjs
CHANGED
|
@@ -1,24 +1,32 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import { t as CLI_NAME } from "./constants-
|
|
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
|
-
process.stdout.write(`${CLI_NAME}
|
|
8
|
+
process.stdout.write(`${CLI_NAME}: worktree-isolated local Postgres (via autopg)
|
|
7
9
|
|
|
8
10
|
Usage:
|
|
9
|
-
${CLI_NAME}
|
|
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
|
|
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
|
|
21
|
-
CEDAR_PG=0
|
|
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
|
-
|
|
33
|
-
|
|
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(
|
|
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 =
|
|
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 === "
|
|
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
|
|
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({
|
|
@@ -96,7 +142,7 @@ async function main() {
|
|
|
96
142
|
process.stdout.write(`${CLI_NAME}: nothing to dispose for ${mode} (no lease)\n`);
|
|
97
143
|
return 0;
|
|
98
144
|
}
|
|
99
|
-
process.stderr.write(`${CLI_NAME}: could not dispose ${mode}
|
|
145
|
+
process.stderr.write(`${CLI_NAME}: could not dispose ${mode}: autopg host unavailable (lease kept for retry)\n`);
|
|
100
146
|
return 1;
|
|
101
147
|
}
|
|
102
148
|
if (args.cmd === "gc") {
|
|
@@ -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
|
|
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":";;;;AAOA,SAAS,YAAkB;CACzB,QAAQ,OAAO,MAAM,GAAG,SAAS;;;IAG/B,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;;;;;;;;;CASZ;AACD;AAEA,SAAS,UAAU,OAAmC;CACpD,IAAI,UAAU,SAAS,UAAU,QAAQ,OAAO;CAChD,MAAM,IAAI,MAAM,4BAA4B;AAC9C;AAEA,SAAS,UAAU,MAAgB;CACjC,MAAM,MAOF,CAAC;CACL,MAAM,OAAO,CAAC,GAAG,IAAI;CACrB,IAAI,MAAM,KAAK,MAAM;CACrB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,IAAI,KAAK;EACf,IAAI,MAAM,YAAY,MAAM,MAAM,IAAI,OAAO;OACxC,IAAI,MAAM,UAAU,IAAI,OAAO;OAC/B,IAAI,MAAM,eAAe,IAAI,WAAW;OACxC,IAAI,EAAE,WAAW,SAAS,GAAG,IAAI,OAAO,UAAU,EAAE,MAAM,CAAC,CAAC;OAC5D,IAAI,MAAM,UAAU,IAAI,OAAO,UAAU,KAAK,EAAE,EAAE;OAClD,IAAI,EAAE,WAAW,SAAS,GAAG,IAAI,OAAO,EAAE,MAAM,CAAC;OACjD,IAAI,MAAM,UAAU,IAAI,OAAO,KAAK,EAAE;OACtC,MAAM,IAAI,MAAM,qBAAqB,GAAG;CAC/C;CACA,OAAO;AACT;AAEA,eAAe,OAAwB;CACrC,MAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;CACjC,IAAI,KAAK,WAAW,KAAK,KAAK,OAAO,UAAU,KAAK,OAAO,YAAY,KAAK,OAAO,MAAM;EACvF,UAAU;EACV,OAAO;CACT;CACA,MAAM,OAAO,UAAU,IAAI;CAC3B,IAAI,KAAK,MAAM;EACb,UAAU;EACV,OAAO;CACT;CAEA,IAAI;EACF,IAAI,KAAK,QAAQ,UAAU;GACzB,MAAM,OAAO,KAAK,QAAQ;GAC1B,MAAM,SAAS,MAAM,OAAO;IAC1B,MAAM,KAAK;IACX;IACA,QAAQ;GACV,CAAC;GACD,IAAI,KAAK,UAAU;IACjB,QAAQ,OAAO,MAAM,gBAAgB,OAAO,YAAY,GAAG;IAC3D,IAAI,SAAS,QACX,QAAQ,OAAO,MAAM,qBAAqB,OAAO,YAAY,GAAG;GAEpE;GACA,IAAI,KAAK,MACP,QAAQ,OAAO,MACb,GAAG,KAAK,UACN;IACE,aAAa,OAAO;IACpB,cAAc,OAAO;IACrB,UAAU,OAAO;IACjB,UAAU,OAAO;IACjB,cAAc,OAAO;IACrB,UAAU,OAAO;IACjB,MAAM,OAAO;IACb,MAAM,OAAO;IACb,MAAM,OAAO;GACf,GACA,MACA,CACF,EAAE,GACJ;QACK,IAAI,CAAC,KAAK,UAAU;IACzB,QAAQ,OAAO,MACb,GAAG,SAAS,IAAI,OAAO,aAAa,IAAI,OAAO,SAAS,GAAG,OAAO,aAAa,GAAG,OAAO,KAAK,IAChG;IACA,QAAQ,OAAO,MAAM,GAAG,OAAO,YAAY,GAAG;GAChD;GACA,OAAO;EACT;EAEA,IAAI,KAAK,QAAQ,WAAW;GAC1B,MAAM,OAAO,KAAK,QAAQ;GAC1B,MAAM,SAAS,MAAM,QAAQ;IAAE,MAAM,KAAK;IAAM;GAAK,CAAC;GACtD,IAAI,OAAO,SAAS;IAClB,QAAQ,OAAO,MAAM,GAAG,SAAS,aAAa,KAAK,IAAI,OAAO,aAAa,IAAI;IAC/E,OAAO;GACT;GACA,IAAI,OAAO,WAAW,YAAY;IAChC,QAAQ,OAAO,MAAM,GAAG,SAAS,2BAA2B,KAAK,cAAc;IAC/E,OAAO;GACT;GACA,QAAQ,OAAO,MACb,GAAG,SAAS,sBAAsB,KAAK,oDACzC;GACA,OAAO;EACT;EAEA,IAAI,KAAK,QAAQ,MAAM;GACrB,MAAM,SAAS,MAAM,GAAG;GACxB,IAAI,KAAK,MACP,QAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,EAAE,GAAG;QAC7C;IACL,QAAQ,OAAO,MAAM,GAAG,SAAS,eAAe,OAAO,QAAQ,OAAO,eAAe;IACrF,KAAK,MAAM,QAAQ,OAAO,SAAS,QAAQ,OAAO,MAAM,KAAK,KAAK,GAAG;GACvE;GACA,OAAO;EACT;EAEA,IAAI,KAAK,QAAQ,aAAa;GAC5B,MAAM,OAAO,KAAK,QAAQ;GAE1B,MAAM,QAAQ,UADG,wBAAwB,KAAK,IACf,CAAC,CAAC,MAAM,IAAI;GAC3C,IAAI,CAAC,OAAO;IACV,QAAQ,OAAO,MACb,GAAG,SAAS,OAAO,KAAK,iBAAiB,SAAS,iBAAiB,KAAK,WAC1E;IACA,OAAO;GACT;GACA,QAAQ,OAAO,MAAM,GAAG,aAAa,KAAK,EAAE,GAAG;GAC/C,OAAO;EACT;EAEA,QAAQ,OAAO,MAAM,GAAG,SAAS,oBAAoB,KAAK,IAAI,GAAG;EACjE,UAAU;EACV,OAAO;CACT,SAAS,KAAK;EACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EAC/D,QAAQ,OAAO,MAAM,GAAG,SAAS,IAAI,QAAQ,GAAG;EAChD,OAAO;CACT;AACF;AAEA,KAAK,CAAC,CACH,MAAM,SAAS;CACd,QAAQ,KAAK,IAAI;AACnB,CAAC,CAAC,CACD,OAAO,QAAiB;CACvB,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;CAC/D,QAAQ,OAAO,MAAM,GAAG,SAAS,IAAI,QAAQ,GAAG;CAChD,QAAQ,KAAK,CAAC;AAChB,CAAC"}
|
|
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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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Product identity vs frozen crypto.
|
|
4
4
|
*
|
|
5
|
-
* State dirs follow the CLI name (`.cedarpg`)
|
|
5
|
+
* State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under
|
|
6
6
|
* autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).
|
|
7
7
|
* Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.
|
|
8
8
|
*/
|
|
@@ -14,8 +14,8 @@ const CLI_NAME = "cedarpg";
|
|
|
14
14
|
*/
|
|
15
15
|
const STATE_DIRNAME = ".cedarpg";
|
|
16
16
|
/**
|
|
17
|
-
* Password scheme
|
|
18
|
-
* Opaque
|
|
17
|
+
* Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + roleName).
|
|
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
|
|
@@ -38,4 +38,4 @@ Object.defineProperty(exports, "STATE_DIRNAME", {
|
|
|
38
38
|
}
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
//# sourceMappingURL=constants-
|
|
41
|
+
//# sourceMappingURL=constants-Ct8myrEn.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Product identity vs frozen crypto.
|
|
4
4
|
*
|
|
5
|
-
* State dirs follow the CLI name (`.cedarpg`)
|
|
5
|
+
* State dirs follow the CLI name (`.cedarpg`): product-owned, not nested under
|
|
6
6
|
* autopg's `~/.autopg/` (host owns that) and not a generic `.pg` (collision-prone).
|
|
7
7
|
* Password salt is an opaque crypto constant; bump ROLE_PASSWORD_SCHEME to change it.
|
|
8
8
|
*/
|
|
@@ -14,11 +14,11 @@ const CLI_NAME = "cedarpg";
|
|
|
14
14
|
*/
|
|
15
15
|
const STATE_DIRNAME = ".cedarpg";
|
|
16
16
|
/**
|
|
17
|
-
* Password scheme
|
|
18
|
-
* Opaque
|
|
17
|
+
* Password scheme v2 salt prefix: sha256(`${PASSWORD_SALT_PREFIX}\0` + roleName).
|
|
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-
|
|
24
|
+
//# sourceMappingURL=constants-NLR0U4NR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist/dev-env.cjs
ADDED
|
@@ -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 {}
|
package/dist/dev-env.mjs
ADDED
|
@@ -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-
|
|
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.
|
|
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 =
|
|
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 =
|
|
19
|
-
exports.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.
|
|
23
|
-
exports.
|
|
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"}
|