@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
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const require_constants = require("./constants-Ct8myrEn.cjs");
|
|
2
|
+
//#region src/adapters/tasks.ts
|
|
3
|
+
/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */
|
|
4
|
+
const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
|
|
5
|
+
const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
|
|
6
|
+
const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
7
|
+
function cedarPgCommands(bin = require_constants.CLI_NAME) {
|
|
8
|
+
return {
|
|
9
|
+
acquireDev: `${bin} acquire --mode=dev`,
|
|
10
|
+
acquireTest: `${bin} acquire --mode=test --print-env`,
|
|
11
|
+
disposeTest: `${bin} dispose --mode=test`
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function cedarPgLifecycleTargets(options = {}) {
|
|
15
|
+
const cmds = cedarPgCommands(options.bin ?? "cedarpg");
|
|
16
|
+
const targets = {
|
|
17
|
+
[CEDAR_PG_TASK_ACQUIRE_DEV]: {
|
|
18
|
+
command: cmds.acquireDev,
|
|
19
|
+
cache: false
|
|
20
|
+
},
|
|
21
|
+
[CEDAR_PG_TASK_ACQUIRE_TEST]: {
|
|
22
|
+
command: cmds.acquireTest,
|
|
23
|
+
cache: false
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
if (options.includeDisposeTest !== false) targets[CEDAR_PG_TASK_DISPOSE_TEST] = {
|
|
27
|
+
command: cmds.disposeTest,
|
|
28
|
+
cache: false
|
|
29
|
+
};
|
|
30
|
+
return targets;
|
|
31
|
+
}
|
|
32
|
+
function cedarPgRunCommand(mode, command, bin = require_constants.CLI_NAME) {
|
|
33
|
+
return `${bin} run --mode=${mode} -- ${command}`;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
Object.defineProperty(exports, "CEDAR_PG_TASK_ACQUIRE_DEV", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function() {
|
|
39
|
+
return CEDAR_PG_TASK_ACQUIRE_DEV;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(exports, "CEDAR_PG_TASK_ACQUIRE_TEST", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function() {
|
|
45
|
+
return CEDAR_PG_TASK_ACQUIRE_TEST;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "CEDAR_PG_TASK_DISPOSE_TEST", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function() {
|
|
51
|
+
return CEDAR_PG_TASK_DISPOSE_TEST;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
Object.defineProperty(exports, "cedarPgLifecycleTargets", {
|
|
55
|
+
enumerable: true,
|
|
56
|
+
get: function() {
|
|
57
|
+
return cedarPgLifecycleTargets;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
Object.defineProperty(exports, "cedarPgRunCommand", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function() {
|
|
63
|
+
return cedarPgRunCommand;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
//# sourceMappingURL=tasks-Caud9yHr.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-Caud9yHr.cjs","names":["CLI_NAME"],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\n\nexport const CEDAR_PG_TASK_ACQUIRE_DEV = \"db:acquire\";\nexport const CEDAR_PG_TASK_ACQUIRE_TEST = \"db:acquire-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgCommands = {\n acquireDev: string;\n acquireTest: string;\n disposeTest: string;\n};\n\nexport type CedarPgLifecycleTarget = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgLifecycleTargetsOptions = {\n bin?: string;\n /** Include dispose-test target (default: true). */\n includeDisposeTest?: boolean;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n acquireDev: `${bin} acquire --mode=dev`,\n acquireTest: `${bin} acquire --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n\nexport function cedarPgLifecycleTargets(\n options: CedarPgLifecycleTargetsOptions = {},\n): Record<string, CedarPgLifecycleTarget> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const targets: Record<string, CedarPgLifecycleTarget> = {\n [CEDAR_PG_TASK_ACQUIRE_DEV]: { command: cmds.acquireDev, cache: false },\n [CEDAR_PG_TASK_ACQUIRE_TEST]: { command: cmds.acquireTest, cache: false },\n };\n if (options.includeDisposeTest !== false) {\n targets[CEDAR_PG_TASK_DISPOSE_TEST] = { command: cmds.disposeTest, cache: false };\n }\n return targets;\n}\n\nexport function cedarPgRunCommand(mode: DbMode, command: string, bin = CLI_NAME): string {\n return `${bin} run --mode=${mode} -- ${command}`;\n}\n"],"mappings":";;;AAKA,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAmB1C,SAAgB,gBAAgB,MAAMA,kBAAAA,UAA2B;CAC/D,OAAO;EACL,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;EACpB,aAAa,GAAG,IAAI;CACtB;AACF;AAEA,SAAgB,wBACd,UAA0C,CAAC,GACH;CACxC,MAAM,OAAO,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,UAAkD;GACrD,4BAA4B;GAAE,SAAS,KAAK;GAAY,OAAO;EAAM;GACrE,6BAA6B;GAAE,SAAS,KAAK;GAAa,OAAO;EAAM;CAC1E;CACA,IAAI,QAAQ,uBAAuB,OACjC,QAAQ,8BAA8B;EAAE,SAAS,KAAK;EAAa,OAAO;CAAM;CAElF,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAc,SAAiB,MAAMA,kBAAAA,UAAkB;CACvF,OAAO,GAAG,IAAI,cAAc,KAAK,MAAM;AACzC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as DbMode } from "./naming-C2nGVxPk.mjs";
|
|
2
|
+
//#region src/adapters/tasks.d.ts
|
|
3
|
+
declare const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
|
|
4
|
+
declare const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
|
|
5
|
+
declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
6
|
+
type CedarPgLifecycleTarget = {
|
|
7
|
+
command: string;
|
|
8
|
+
cache?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type CedarPgLifecycleTargetsOptions = {
|
|
11
|
+
bin?: string;
|
|
12
|
+
/** Include dispose-test target (default: true). */
|
|
13
|
+
includeDisposeTest?: boolean;
|
|
14
|
+
};
|
|
15
|
+
declare function cedarPgLifecycleTargets(options?: CedarPgLifecycleTargetsOptions): Record<string, CedarPgLifecycleTarget>;
|
|
16
|
+
declare function cedarPgRunCommand(mode: DbMode, command: string, bin?: string): string;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { CedarPgLifecycleTargetsOptions as a, CedarPgLifecycleTarget as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, cedarPgLifecycleTargets as o, CEDAR_PG_TASK_DISPOSE_TEST as r, cedarPgRunCommand as s, CEDAR_PG_TASK_ACQUIRE_DEV as t };
|
|
19
|
+
//# sourceMappingURL=tasks-CjaZRi_G.d.mts.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { t as DbMode } from "./naming-C2nGVxPk.cjs";
|
|
2
|
+
//#region src/adapters/tasks.d.ts
|
|
3
|
+
declare const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
|
|
4
|
+
declare const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
|
|
5
|
+
declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
6
|
+
type CedarPgLifecycleTarget = {
|
|
7
|
+
command: string;
|
|
8
|
+
cache?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type CedarPgLifecycleTargetsOptions = {
|
|
11
|
+
bin?: string;
|
|
12
|
+
/** Include dispose-test target (default: true). */
|
|
13
|
+
includeDisposeTest?: boolean;
|
|
14
|
+
};
|
|
15
|
+
declare function cedarPgLifecycleTargets(options?: CedarPgLifecycleTargetsOptions): Record<string, CedarPgLifecycleTarget>;
|
|
16
|
+
declare function cedarPgRunCommand(mode: DbMode, command: string, bin?: string): string;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { CedarPgLifecycleTargetsOptions as a, CedarPgLifecycleTarget as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, cedarPgLifecycleTargets as o, CEDAR_PG_TASK_DISPOSE_TEST as r, cedarPgRunCommand as s, CEDAR_PG_TASK_ACQUIRE_DEV as t };
|
|
19
|
+
//# sourceMappingURL=tasks-DdQoP9We.d.cts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { t as CLI_NAME } from "./constants-NLR0U4NR.mjs";
|
|
2
|
+
//#region src/adapters/tasks.ts
|
|
3
|
+
/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */
|
|
4
|
+
const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
|
|
5
|
+
const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
|
|
6
|
+
const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
7
|
+
function cedarPgCommands(bin = CLI_NAME) {
|
|
8
|
+
return {
|
|
9
|
+
acquireDev: `${bin} acquire --mode=dev`,
|
|
10
|
+
acquireTest: `${bin} acquire --mode=test --print-env`,
|
|
11
|
+
disposeTest: `${bin} dispose --mode=test`
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function cedarPgLifecycleTargets(options = {}) {
|
|
15
|
+
const cmds = cedarPgCommands(options.bin ?? "cedarpg");
|
|
16
|
+
const targets = {
|
|
17
|
+
[CEDAR_PG_TASK_ACQUIRE_DEV]: {
|
|
18
|
+
command: cmds.acquireDev,
|
|
19
|
+
cache: false
|
|
20
|
+
},
|
|
21
|
+
[CEDAR_PG_TASK_ACQUIRE_TEST]: {
|
|
22
|
+
command: cmds.acquireTest,
|
|
23
|
+
cache: false
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
if (options.includeDisposeTest !== false) targets[CEDAR_PG_TASK_DISPOSE_TEST] = {
|
|
27
|
+
command: cmds.disposeTest,
|
|
28
|
+
cache: false
|
|
29
|
+
};
|
|
30
|
+
return targets;
|
|
31
|
+
}
|
|
32
|
+
function cedarPgRunCommand(mode, command, bin = CLI_NAME) {
|
|
33
|
+
return `${bin} run --mode=${mode} -- ${command}`;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { cedarPgRunCommand as a, cedarPgLifecycleTargets as i, CEDAR_PG_TASK_ACQUIRE_TEST as n, CEDAR_PG_TASK_DISPOSE_TEST as r, CEDAR_PG_TASK_ACQUIRE_DEV as t };
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=tasks-KherHLac.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-KherHLac.mjs","names":[],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/** Shared CLI command strings and lifecycle target defs for Vite+ / Nx. */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\n\nexport const CEDAR_PG_TASK_ACQUIRE_DEV = \"db:acquire\";\nexport const CEDAR_PG_TASK_ACQUIRE_TEST = \"db:acquire-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgCommands = {\n acquireDev: string;\n acquireTest: string;\n disposeTest: string;\n};\n\nexport type CedarPgLifecycleTarget = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgLifecycleTargetsOptions = {\n bin?: string;\n /** Include dispose-test target (default: true). */\n includeDisposeTest?: boolean;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n acquireDev: `${bin} acquire --mode=dev`,\n acquireTest: `${bin} acquire --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n\nexport function cedarPgLifecycleTargets(\n options: CedarPgLifecycleTargetsOptions = {},\n): Record<string, CedarPgLifecycleTarget> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const targets: Record<string, CedarPgLifecycleTarget> = {\n [CEDAR_PG_TASK_ACQUIRE_DEV]: { command: cmds.acquireDev, cache: false },\n [CEDAR_PG_TASK_ACQUIRE_TEST]: { command: cmds.acquireTest, cache: false },\n };\n if (options.includeDisposeTest !== false) {\n targets[CEDAR_PG_TASK_DISPOSE_TEST] = { command: cmds.disposeTest, cache: false };\n }\n return targets;\n}\n\nexport function cedarPgRunCommand(mode: DbMode, command: string, bin = CLI_NAME): string {\n return `${bin} run --mode=${mode} -- ${command}`;\n}\n"],"mappings":";;;AAKA,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;AAC1C,MAAa,6BAA6B;AAmB1C,SAAgB,gBAAgB,MAAM,UAA2B;CAC/D,OAAO;EACL,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;EACpB,aAAa,GAAG,IAAI;CACtB;AACF;AAEA,SAAgB,wBACd,UAA0C,CAAC,GACH;CACxC,MAAM,OAAO,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,UAAkD;GACrD,4BAA4B;GAAE,SAAS,KAAK;GAAY,OAAO;EAAM;GACrE,6BAA6B;GAAE,SAAS,KAAK;GAAa,OAAO;EAAM;CAC1E;CACA,IAAI,QAAQ,uBAAuB,OACjC,QAAQ,8BAA8B;EAAE,SAAS,KAAK;EAAa,OAAO;CAAM;CAElF,OAAO;AACT;AAEA,SAAgB,kBAAkB,MAAc,SAAiB,MAAM,UAAkB;CACvF,OAAO,GAAG,IAAI,cAAc,KAAK,MAAM;AACzC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { C as buildCloneDatabaseName, S as runIfNeeded, _ as setDatabaseIsTemplate, f as dropDatabase, l as buildDatabaseUrl, o as ensureHostRunning, u as cloneDatabaseFromTemplate, v as applyDatabaseUrlEnv } from "./lifecycle-BOo6xBjD.mjs";
|
|
2
|
+
import { f as resolveWorktreeIdentity, l as readLease } from "./lease-BSBBpaR4.mjs";
|
|
3
|
+
//#region src/core/template.ts
|
|
4
|
+
async function resolveAdminUrl(adminUrl) {
|
|
5
|
+
return adminUrl ?? (await ensureHostRunning()).adminUrl;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.
|
|
9
|
+
* Requires a lease from `acquire` (no datname override).
|
|
10
|
+
*/
|
|
11
|
+
async function markTemplate(options) {
|
|
12
|
+
const identity = resolveWorktreeIdentity(options.root);
|
|
13
|
+
const mode = options.mode;
|
|
14
|
+
const lease = readLease(identity.root, mode);
|
|
15
|
+
if (!lease) throw new Error(`no ${mode} lease; run acquire before markTemplate`);
|
|
16
|
+
const adminUrl = await resolveAdminUrl(options.adminUrl);
|
|
17
|
+
await setDatabaseIsTemplate({
|
|
18
|
+
adminUrl,
|
|
19
|
+
databaseName: lease.databaseName,
|
|
20
|
+
isTemplate: true
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
databaseName: lease.databaseName,
|
|
24
|
+
adminUrl
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).
|
|
29
|
+
* Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).
|
|
30
|
+
* Provider rejects when the leased DB is not marked TEMPLATE.
|
|
31
|
+
* Port comes from the lease; admin URL is passed through or rediscovered.
|
|
32
|
+
*/
|
|
33
|
+
async function cloneFromTemplate(options) {
|
|
34
|
+
const identity = resolveWorktreeIdentity(options.root);
|
|
35
|
+
const mode = options.mode;
|
|
36
|
+
const lease = readLease(identity.root, mode);
|
|
37
|
+
if (!lease) throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);
|
|
38
|
+
const adminUrl = await resolveAdminUrl(options.adminUrl);
|
|
39
|
+
const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;
|
|
40
|
+
const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);
|
|
41
|
+
await cloneDatabaseFromTemplate({
|
|
42
|
+
adminUrl,
|
|
43
|
+
templateName: lease.databaseName,
|
|
44
|
+
databaseName,
|
|
45
|
+
roleName: lease.roleName
|
|
46
|
+
});
|
|
47
|
+
const databaseUrl = buildDatabaseUrl({
|
|
48
|
+
port: lease.port,
|
|
49
|
+
databaseName,
|
|
50
|
+
roleName: lease.roleName
|
|
51
|
+
});
|
|
52
|
+
if (options.setEnv) applyDatabaseUrlEnv(databaseUrl, { mode });
|
|
53
|
+
const roleName = lease.roleName;
|
|
54
|
+
return {
|
|
55
|
+
databaseUrl,
|
|
56
|
+
adminUrl,
|
|
57
|
+
databaseName,
|
|
58
|
+
roleName,
|
|
59
|
+
templateName: lease.databaseName,
|
|
60
|
+
port: lease.port,
|
|
61
|
+
dropClone: async () => {
|
|
62
|
+
await dropDatabase({
|
|
63
|
+
adminUrl,
|
|
64
|
+
databaseName,
|
|
65
|
+
roleName
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve skip policy then clone. Host entry for worker adapters (same skip
|
|
72
|
+
* semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.
|
|
73
|
+
*/
|
|
74
|
+
async function cloneFromTemplateIfNeeded(options) {
|
|
75
|
+
const outcome = await runIfNeeded(options, () => cloneFromTemplate({
|
|
76
|
+
...options,
|
|
77
|
+
setEnv: options.setEnv !== false
|
|
78
|
+
}));
|
|
79
|
+
if (outcome.status === "skipped") return outcome;
|
|
80
|
+
return {
|
|
81
|
+
status: "cloned",
|
|
82
|
+
...outcome.value
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { cloneFromTemplateIfNeeded as n, markTemplate as r, cloneFromTemplate as t };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=template-CGw3C1Ob.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-CGw3C1Ob.mjs","names":[],"sources":["../src/core/template.ts"],"sourcesContent":["import { buildCloneDatabaseName, type DbMode } from \"./naming.ts\";\nimport { readLease } from \"./lease.ts\";\nimport { applyDatabaseUrlEnv, runIfNeeded, type ResolveAcquireSkipInput } from \"./policy.ts\";\nimport { resolveWorktreeIdentity } from \"./worktree.ts\";\nimport {\n buildDatabaseUrl,\n cloneDatabaseFromTemplate,\n dropDatabase,\n setDatabaseIsTemplate,\n} from \"../providers/autopg.ts\";\nimport { ensureHostRunning } from \"../providers/host.ts\";\n\nasync function resolveAdminUrl(adminUrl?: string): Promise<string> {\n return adminUrl ?? (await ensureHostRunning()).adminUrl;\n}\n\nexport type MarkTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n};\n\n/**\n * After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.\n * Requires a lease from `acquire` (no datname override).\n */\nexport async function markTemplate(\n options: MarkTemplateOptions,\n): Promise<{ databaseName: string; adminUrl: string }> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire before markTemplate`);\n }\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n await setDatabaseIsTemplate({\n adminUrl,\n databaseName: lease.databaseName,\n isTemplate: true,\n });\n return { databaseName: lease.databaseName, adminUrl };\n}\n\nexport type CloneFromTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n /**\n * Suffix for the clone datname (e.g. Jest worker id).\n * Defaults to `<pid>_<base36 time>`.\n */\n name?: string;\n /**\n * Inject DATABASE_URL / TEST_DATABASE_URL for this clone (default false).\n * Host `cloneFromTemplateIfNeeded` defaults true; worker adapters pass true explicitly.\n */\n setEnv?: boolean;\n};\n\nexport type CloneResult = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n templateName: string;\n port: number;\n /**\n * DROP this clone only (leaves TEMPLATE + role if still owned elsewhere).\n * Not suite teardown — use role-scoped `dispose` for that.\n */\n dropClone: () => Promise<void>;\n};\n\n/**\n * Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).\n * Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).\n * Provider rejects when the leased DB is not marked TEMPLATE.\n * Port comes from the lease; admin URL is passed through or rediscovered.\n */\nexport async function cloneFromTemplate(options: CloneFromTemplateOptions): Promise<CloneResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);\n }\n\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;\n const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);\n\n await cloneDatabaseFromTemplate({\n adminUrl,\n templateName: lease.databaseName,\n databaseName,\n roleName: lease.roleName,\n });\n\n const databaseUrl = buildDatabaseUrl({\n port: lease.port,\n databaseName,\n roleName: lease.roleName,\n });\n\n if (options.setEnv) {\n applyDatabaseUrlEnv(databaseUrl, { mode });\n }\n\n const roleName = lease.roleName;\n\n return {\n databaseUrl,\n adminUrl,\n databaseName,\n roleName,\n templateName: lease.databaseName,\n port: lease.port,\n dropClone: async () => {\n await dropDatabase({ adminUrl, databaseName, roleName });\n },\n };\n}\n\nexport type CloneFromTemplateIfNeededOptions = CloneFromTemplateOptions & ResolveAcquireSkipInput;\n\nexport type CloneFromTemplateIfNeededResult =\n | { status: \"skipped\"; reason: \"disabled\" }\n | { status: \"skipped\"; reason: \"external-url\"; databaseUrl: string }\n | ({ status: \"cloned\" } & CloneResult);\n\n/**\n * Resolve skip policy then clone. Host entry for worker adapters (same skip\n * semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.\n */\nexport async function cloneFromTemplateIfNeeded(\n options: CloneFromTemplateIfNeededOptions,\n): Promise<CloneFromTemplateIfNeededResult> {\n const outcome = await runIfNeeded(options, () =>\n cloneFromTemplate({\n ...options,\n setEnv: options.setEnv !== false,\n }),\n );\n if (outcome.status === \"skipped\") return outcome;\n return { status: \"cloned\", ...outcome.value };\n}\n"],"mappings":";;;AAYA,eAAe,gBAAgB,UAAoC;CACjE,OAAO,aAAa,MAAM,kBAAkB,EAAA,CAAG;AACjD;;;;;AAaA,eAAsB,aACpB,SACqD;CACrD,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,wCAAwC;CAErE,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,sBAAsB;EAC1B;EACA,cAAc,MAAM;EACpB,YAAY;CACd,CAAC;CACD,OAAO;EAAE,cAAc,MAAM;EAAc;CAAS;AACtD;;;;;;;AAuCA,eAAsB,kBAAkB,SAAyD;CAC/F,MAAM,WAAW,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQ,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,4DAA4D;CAGzF,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;CACvE,MAAM,eAAe,uBAAuB,MAAM,cAAc,MAAM;CAEtE,MAAM,0BAA0B;EAC9B;EACA,cAAc,MAAM;EACpB;EACA,UAAU,MAAM;CAClB,CAAC;CAED,MAAM,cAAc,iBAAiB;EACnC,MAAM,MAAM;EACZ;EACA,UAAU,MAAM;CAClB,CAAC;CAED,IAAI,QAAQ,QACV,oBAAoB,aAAa,EAAE,KAAK,CAAC;CAG3C,MAAM,WAAW,MAAM;CAEvB,OAAO;EACL;EACA;EACA;EACA;EACA,cAAc,MAAM;EACpB,MAAM,MAAM;EACZ,WAAW,YAAY;GACrB,MAAM,aAAa;IAAE;IAAU;IAAc;GAAS,CAAC;EACzD;CACF;AACF;;;;;AAaA,eAAsB,0BACpB,SAC0C;CAC1C,MAAM,UAAU,MAAM,YAAY,eAChC,kBAAkB;EAChB,GAAG;EACH,QAAQ,QAAQ,WAAW;CAC7B,CAAC,CACH;CACA,IAAI,QAAQ,WAAW,WAAW,OAAO;CACzC,OAAO;EAAE,QAAQ;EAAU,GAAG,QAAQ;CAAM;AAC9C"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const require_lifecycle = require("./lifecycle-DEJ4GgWV.cjs");
|
|
2
|
+
const require_lease = require("./lease-Bq9wKwQa.cjs");
|
|
3
|
+
//#region src/core/template.ts
|
|
4
|
+
async function resolveAdminUrl(adminUrl) {
|
|
5
|
+
return adminUrl ?? (await require_lifecycle.ensureHostRunning()).adminUrl;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.
|
|
9
|
+
* Requires a lease from `acquire` (no datname override).
|
|
10
|
+
*/
|
|
11
|
+
async function markTemplate(options) {
|
|
12
|
+
const identity = require_lease.resolveWorktreeIdentity(options.root);
|
|
13
|
+
const mode = options.mode;
|
|
14
|
+
const lease = require_lease.readLease(identity.root, mode);
|
|
15
|
+
if (!lease) throw new Error(`no ${mode} lease; run acquire before markTemplate`);
|
|
16
|
+
const adminUrl = await resolveAdminUrl(options.adminUrl);
|
|
17
|
+
await require_lifecycle.setDatabaseIsTemplate({
|
|
18
|
+
adminUrl,
|
|
19
|
+
databaseName: lease.databaseName,
|
|
20
|
+
isTemplate: true
|
|
21
|
+
});
|
|
22
|
+
return {
|
|
23
|
+
databaseName: lease.databaseName,
|
|
24
|
+
adminUrl
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).
|
|
29
|
+
* Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).
|
|
30
|
+
* Provider rejects when the leased DB is not marked TEMPLATE.
|
|
31
|
+
* Port comes from the lease; admin URL is passed through or rediscovered.
|
|
32
|
+
*/
|
|
33
|
+
async function cloneFromTemplate(options) {
|
|
34
|
+
const identity = require_lease.resolveWorktreeIdentity(options.root);
|
|
35
|
+
const mode = options.mode;
|
|
36
|
+
const lease = require_lease.readLease(identity.root, mode);
|
|
37
|
+
if (!lease) throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);
|
|
38
|
+
const adminUrl = await resolveAdminUrl(options.adminUrl);
|
|
39
|
+
const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;
|
|
40
|
+
const databaseName = require_lifecycle.buildCloneDatabaseName(lease.databaseName, suffix);
|
|
41
|
+
await require_lifecycle.cloneDatabaseFromTemplate({
|
|
42
|
+
adminUrl,
|
|
43
|
+
templateName: lease.databaseName,
|
|
44
|
+
databaseName,
|
|
45
|
+
roleName: lease.roleName
|
|
46
|
+
});
|
|
47
|
+
const databaseUrl = require_lifecycle.buildDatabaseUrl({
|
|
48
|
+
port: lease.port,
|
|
49
|
+
databaseName,
|
|
50
|
+
roleName: lease.roleName
|
|
51
|
+
});
|
|
52
|
+
if (options.setEnv) require_lifecycle.applyDatabaseUrlEnv(databaseUrl, { mode });
|
|
53
|
+
const roleName = lease.roleName;
|
|
54
|
+
return {
|
|
55
|
+
databaseUrl,
|
|
56
|
+
adminUrl,
|
|
57
|
+
databaseName,
|
|
58
|
+
roleName,
|
|
59
|
+
templateName: lease.databaseName,
|
|
60
|
+
port: lease.port,
|
|
61
|
+
dropClone: async () => {
|
|
62
|
+
await require_lifecycle.dropDatabase({
|
|
63
|
+
adminUrl,
|
|
64
|
+
databaseName,
|
|
65
|
+
roleName
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Resolve skip policy then clone. Host entry for worker adapters (same skip
|
|
72
|
+
* semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.
|
|
73
|
+
*/
|
|
74
|
+
async function cloneFromTemplateIfNeeded(options) {
|
|
75
|
+
const outcome = await require_lifecycle.runIfNeeded(options, () => cloneFromTemplate({
|
|
76
|
+
...options,
|
|
77
|
+
setEnv: options.setEnv !== false
|
|
78
|
+
}));
|
|
79
|
+
if (outcome.status === "skipped") return outcome;
|
|
80
|
+
return {
|
|
81
|
+
status: "cloned",
|
|
82
|
+
...outcome.value
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
Object.defineProperty(exports, "cloneFromTemplate", {
|
|
87
|
+
enumerable: true,
|
|
88
|
+
get: function() {
|
|
89
|
+
return cloneFromTemplate;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
Object.defineProperty(exports, "cloneFromTemplateIfNeeded", {
|
|
93
|
+
enumerable: true,
|
|
94
|
+
get: function() {
|
|
95
|
+
return cloneFromTemplateIfNeeded;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
Object.defineProperty(exports, "markTemplate", {
|
|
99
|
+
enumerable: true,
|
|
100
|
+
get: function() {
|
|
101
|
+
return markTemplate;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=template-D0gJ_MS2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-D0gJ_MS2.cjs","names":["ensureHostRunning","resolveWorktreeIdentity","readLease","setDatabaseIsTemplate","buildCloneDatabaseName","cloneDatabaseFromTemplate","buildDatabaseUrl","dropDatabase","runIfNeeded"],"sources":["../src/core/template.ts"],"sourcesContent":["import { buildCloneDatabaseName, type DbMode } from \"./naming.ts\";\nimport { readLease } from \"./lease.ts\";\nimport { applyDatabaseUrlEnv, runIfNeeded, type ResolveAcquireSkipInput } from \"./policy.ts\";\nimport { resolveWorktreeIdentity } from \"./worktree.ts\";\nimport {\n buildDatabaseUrl,\n cloneDatabaseFromTemplate,\n dropDatabase,\n setDatabaseIsTemplate,\n} from \"../providers/autopg.ts\";\nimport { ensureHostRunning } from \"../providers/host.ts\";\n\nasync function resolveAdminUrl(adminUrl?: string): Promise<string> {\n return adminUrl ?? (await ensureHostRunning()).adminUrl;\n}\n\nexport type MarkTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n};\n\n/**\n * After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.\n * Requires a lease from `acquire` (no datname override).\n */\nexport async function markTemplate(\n options: MarkTemplateOptions,\n): Promise<{ databaseName: string; adminUrl: string }> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire before markTemplate`);\n }\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n await setDatabaseIsTemplate({\n adminUrl,\n databaseName: lease.databaseName,\n isTemplate: true,\n });\n return { databaseName: lease.databaseName, adminUrl };\n}\n\nexport type CloneFromTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, discovers/starts the host. */\n adminUrl?: string;\n /**\n * Suffix for the clone datname (e.g. Jest worker id).\n * Defaults to `<pid>_<base36 time>`.\n */\n name?: string;\n /**\n * Inject DATABASE_URL / TEST_DATABASE_URL for this clone (default false).\n * Host `cloneFromTemplateIfNeeded` defaults true; worker adapters pass true explicitly.\n */\n setEnv?: boolean;\n};\n\nexport type CloneResult = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n templateName: string;\n port: number;\n /**\n * DROP this clone only (leaves TEMPLATE + role if still owned elsewhere).\n * Not suite teardown — use role-scoped `dispose` for that.\n */\n dropClone: () => Promise<void>;\n};\n\n/**\n * Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).\n * Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).\n * Provider rejects when the leased DB is not marked TEMPLATE.\n * Port comes from the lease; admin URL is passed through or rediscovered.\n */\nexport async function cloneFromTemplate(options: CloneFromTemplateOptions): Promise<CloneResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const lease = readLease(identity.root, mode);\n if (!lease) {\n throw new Error(`no ${mode} lease; run acquire + markTemplate before cloneFromTemplate`);\n }\n\n const adminUrl = await resolveAdminUrl(options.adminUrl);\n const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;\n const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);\n\n await cloneDatabaseFromTemplate({\n adminUrl,\n templateName: lease.databaseName,\n databaseName,\n roleName: lease.roleName,\n });\n\n const databaseUrl = buildDatabaseUrl({\n port: lease.port,\n databaseName,\n roleName: lease.roleName,\n });\n\n if (options.setEnv) {\n applyDatabaseUrlEnv(databaseUrl, { mode });\n }\n\n const roleName = lease.roleName;\n\n return {\n databaseUrl,\n adminUrl,\n databaseName,\n roleName,\n templateName: lease.databaseName,\n port: lease.port,\n dropClone: async () => {\n await dropDatabase({ adminUrl, databaseName, roleName });\n },\n };\n}\n\nexport type CloneFromTemplateIfNeededOptions = CloneFromTemplateOptions & ResolveAcquireSkipInput;\n\nexport type CloneFromTemplateIfNeededResult =\n | { status: \"skipped\"; reason: \"disabled\" }\n | { status: \"skipped\"; reason: \"external-url\"; databaseUrl: string }\n | ({ status: \"cloned\" } & CloneResult);\n\n/**\n * Resolve skip policy then clone. Host entry for worker adapters (same skip\n * semantics as `acquireIfNeeded`). Defaults `setEnv` on for skip and clone paths.\n */\nexport async function cloneFromTemplateIfNeeded(\n options: CloneFromTemplateIfNeededOptions,\n): Promise<CloneFromTemplateIfNeededResult> {\n const outcome = await runIfNeeded(options, () =>\n cloneFromTemplate({\n ...options,\n setEnv: options.setEnv !== false,\n }),\n );\n if (outcome.status === \"skipped\") return outcome;\n return { status: \"cloned\", ...outcome.value };\n}\n"],"mappings":";;;AAYA,eAAe,gBAAgB,UAAoC;CACjE,OAAO,aAAa,MAAMA,kBAAAA,kBAAkB,EAAA,CAAG;AACjD;;;;;AAaA,eAAsB,aACpB,SACqD;CACrD,MAAM,WAAWC,cAAAA,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQC,cAAAA,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,wCAAwC;CAErE,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAMC,kBAAAA,sBAAsB;EAC1B;EACA,cAAc,MAAM;EACpB,YAAY;CACd,CAAC;CACD,OAAO;EAAE,cAAc,MAAM;EAAc;CAAS;AACtD;;;;;;;AAuCA,eAAsB,kBAAkB,SAAyD;CAC/F,MAAM,WAAWF,cAAAA,wBAAwB,QAAQ,IAAI;CACrD,MAAM,OAAO,QAAQ;CACrB,MAAM,QAAQC,cAAAA,UAAU,SAAS,MAAM,IAAI;CAC3C,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,MAAM,KAAK,4DAA4D;CAGzF,MAAM,WAAW,MAAM,gBAAgB,QAAQ,QAAQ;CACvD,MAAM,SAAS,QAAQ,QAAQ,GAAG,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE;CACvE,MAAM,eAAeE,kBAAAA,uBAAuB,MAAM,cAAc,MAAM;CAEtE,MAAMC,kBAAAA,0BAA0B;EAC9B;EACA,cAAc,MAAM;EACpB;EACA,UAAU,MAAM;CAClB,CAAC;CAED,MAAM,cAAcC,kBAAAA,iBAAiB;EACnC,MAAM,MAAM;EACZ;EACA,UAAU,MAAM;CAClB,CAAC;CAED,IAAI,QAAQ,QACV,kBAAA,oBAAoB,aAAa,EAAE,KAAK,CAAC;CAG3C,MAAM,WAAW,MAAM;CAEvB,OAAO;EACL;EACA;EACA;EACA;EACA,cAAc,MAAM;EACpB,MAAM,MAAM;EACZ,WAAW,YAAY;GACrB,MAAMC,kBAAAA,aAAa;IAAE;IAAU;IAAc;GAAS,CAAC;EACzD;CACF;AACF;;;;;AAaA,eAAsB,0BACpB,SAC0C;CAC1C,MAAM,UAAU,MAAMC,kBAAAA,YAAY,eAChC,kBAAkB;EAChB,GAAG;EACH,QAAQ,QAAQ,WAAW;CAC7B,CAAC,CACH;CACA,IAAI,QAAQ,WAAW,WAAW,OAAO;CACzC,OAAO;EAAE,QAAQ;EAAU,GAAG,QAAQ;CAAM;AAC9C"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const require_lifecycle = require("./lifecycle-DEJ4GgWV.cjs");
|
|
2
|
+
const require_template = require("./template-D0gJ_MS2.cjs");
|
|
3
|
+
//#region src/adapters/template-mode.ts
|
|
4
|
+
/**
|
|
5
|
+
* Runner orchestration: acquire → migrate → markTemplate.
|
|
6
|
+
* After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure
|
|
7
|
+
* best-effort disposes the lease so Vitest (no separate teardown) does not leak.
|
|
8
|
+
* Programmatic apps that do not need a migrate hook should call core
|
|
9
|
+
* `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.
|
|
10
|
+
*/
|
|
11
|
+
async function setupTemplateMode(options) {
|
|
12
|
+
const result = await require_lifecycle.acquireIfNeeded({
|
|
13
|
+
root: options.root,
|
|
14
|
+
mode: "test",
|
|
15
|
+
setEnv: options.setEnv !== false
|
|
16
|
+
});
|
|
17
|
+
if (result.status !== "acquired") return result;
|
|
18
|
+
try {
|
|
19
|
+
await options.migrate({
|
|
20
|
+
databaseUrl: result.databaseUrl,
|
|
21
|
+
adminUrl: result.adminUrl,
|
|
22
|
+
databaseName: result.databaseName,
|
|
23
|
+
roleName: result.roleName
|
|
24
|
+
});
|
|
25
|
+
await require_template.markTemplate({
|
|
26
|
+
root: result.root,
|
|
27
|
+
mode: "test",
|
|
28
|
+
adminUrl: result.adminUrl
|
|
29
|
+
});
|
|
30
|
+
} catch (err) {
|
|
31
|
+
try {
|
|
32
|
+
await require_lifecycle.dispose({
|
|
33
|
+
root: result.root,
|
|
34
|
+
mode: "test"
|
|
35
|
+
});
|
|
36
|
+
} catch {}
|
|
37
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
38
|
+
throw new Error(`template setup failed after acquire; cleaned up lease DB (${result.databaseName}). Fix the error and re-run: ${detail}`, { cause: err });
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
let workerOnce;
|
|
43
|
+
let workerOnceKey;
|
|
44
|
+
function resolveWorkerName(options) {
|
|
45
|
+
return options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);
|
|
46
|
+
}
|
|
47
|
+
function workerOptionsKey(root, name) {
|
|
48
|
+
return `${root ?? ""}\0${name}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
52
|
+
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
53
|
+
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
54
|
+
*/
|
|
55
|
+
function cloneWorkerDatabase(options = {}) {
|
|
56
|
+
const name = resolveWorkerName(options);
|
|
57
|
+
const key = workerOptionsKey(options.root, name);
|
|
58
|
+
if (workerOnce) {
|
|
59
|
+
if (workerOnceKey !== key) throw new Error(`cloneWorkerDatabase already started with different root/name (first: ${JSON.stringify(workerOnceKey)}, now: ${JSON.stringify(key)})`);
|
|
60
|
+
return workerOnce;
|
|
61
|
+
}
|
|
62
|
+
workerOnceKey = key;
|
|
63
|
+
workerOnce = (async () => {
|
|
64
|
+
await require_template.cloneFromTemplateIfNeeded({
|
|
65
|
+
root: options.root,
|
|
66
|
+
mode: "test",
|
|
67
|
+
name,
|
|
68
|
+
setEnv: true
|
|
69
|
+
});
|
|
70
|
+
})().catch((err) => {
|
|
71
|
+
workerOnce = void 0;
|
|
72
|
+
workerOnceKey = void 0;
|
|
73
|
+
throw err;
|
|
74
|
+
});
|
|
75
|
+
return workerOnce;
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
Object.defineProperty(exports, "cloneWorkerDatabase", {
|
|
79
|
+
enumerable: true,
|
|
80
|
+
get: function() {
|
|
81
|
+
return cloneWorkerDatabase;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
Object.defineProperty(exports, "setupTemplateMode", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
get: function() {
|
|
87
|
+
return setupTemplateMode;
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=template-mode-BkEs9LnY.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-mode-BkEs9LnY.cjs","names":["acquireIfNeeded","markTemplate","dispose","cloneFromTemplateIfNeeded"],"sources":["../src/adapters/template-mode.ts"],"sourcesContent":["import { dispose, acquireIfNeeded, type AcquireIfNeededResult } from \"../core/lifecycle.ts\";\nimport { cloneFromTemplateIfNeeded, markTemplate } from \"../core/template.ts\";\n\nexport type TemplateMigrateContext = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n};\n\nexport type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;\n\nexport type SetupTemplateModeOptions = {\n root?: string;\n /** App-owned migrate; runs once, then `markTemplate`. Required. */\n migrate: TemplateMigrateFn;\n setEnv?: boolean;\n};\n\n/**\n * Runner orchestration: acquire → migrate → markTemplate.\n * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure\n * best-effort disposes the lease so Vitest (no separate teardown) does not leak.\n * Programmatic apps that do not need a migrate hook should call core\n * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.\n */\nexport async function setupTemplateMode(\n options: SetupTemplateModeOptions,\n): Promise<AcquireIfNeededResult> {\n const result = await acquireIfNeeded({\n root: options.root,\n mode: \"test\",\n setEnv: options.setEnv !== false,\n });\n if (result.status !== \"acquired\") return result;\n\n try {\n await options.migrate({\n databaseUrl: result.databaseUrl,\n adminUrl: result.adminUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n });\n await markTemplate({\n root: result.root,\n mode: \"test\",\n adminUrl: result.adminUrl,\n });\n } catch (err) {\n try {\n await dispose({ root: result.root, mode: \"test\" });\n } catch {\n // best-effort: leave lease for dispose/gc retry\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(\n `template setup failed after acquire; cleaned up lease DB (${result.databaseName}). ` +\n `Fix the error and re-run: ${detail}`,\n { cause: err },\n );\n }\n\n return result;\n}\n\nexport type CloneWorkerDatabaseOptions = {\n root?: string;\n /** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */\n name?: string;\n};\n\nlet workerOnce: Promise<void> | undefined;\nlet workerOnceKey: string | undefined;\n\nfunction resolveWorkerName(options: CloneWorkerDatabaseOptions): string {\n return (\n options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid)\n );\n}\n\nfunction workerOptionsKey(root: string | undefined, name: string): string {\n return `${root ?? \"\"}\\0${name}`;\n}\n\n/**\n * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).\n * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.\n * First call wins for `root`/`name`; conflicting later calls throw.\n */\nexport function cloneWorkerDatabase(options: CloneWorkerDatabaseOptions = {}): Promise<void> {\n const name = resolveWorkerName(options);\n const key = workerOptionsKey(options.root, name);\n if (workerOnce) {\n if (workerOnceKey !== key) {\n throw new Error(\n `cloneWorkerDatabase already started with different root/name ` +\n `(first: ${JSON.stringify(workerOnceKey)}, now: ${JSON.stringify(key)})`,\n );\n }\n return workerOnce;\n }\n workerOnceKey = key;\n workerOnce = (async () => {\n await cloneFromTemplateIfNeeded({\n root: options.root,\n mode: \"test\",\n name,\n setEnv: true,\n });\n })().catch((err) => {\n workerOnce = undefined;\n workerOnceKey = undefined;\n throw err;\n });\n return workerOnce;\n}\n"],"mappings":";;;;;;;;;;AA0BA,eAAsB,kBACpB,SACgC;CAChC,MAAM,SAAS,MAAMA,kBAAAA,gBAAgB;EACnC,MAAM,QAAQ;EACd,MAAM;EACN,QAAQ,QAAQ,WAAW;CAC7B,CAAC;CACD,IAAI,OAAO,WAAW,YAAY,OAAO;CAEzC,IAAI;EACF,MAAM,QAAQ,QAAQ;GACpB,aAAa,OAAO;GACpB,UAAU,OAAO;GACjB,cAAc,OAAO;GACrB,UAAU,OAAO;EACnB,CAAC;EACD,MAAMC,iBAAAA,aAAa;GACjB,MAAM,OAAO;GACb,MAAM;GACN,UAAU,OAAO;EACnB,CAAC;CACH,SAAS,KAAK;EACZ,IAAI;GACF,MAAMC,kBAAAA,QAAQ;IAAE,MAAM,OAAO;IAAM,MAAM;GAAO,CAAC;EACnD,QAAQ,CAER;EACA,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EAC9D,MAAM,IAAI,MACR,6DAA6D,OAAO,aAAa,+BAClD,UAC/B,EAAE,OAAO,IAAI,CACf;CACF;CAEA,OAAO;AACT;AAQA,IAAI;AACJ,IAAI;AAEJ,SAAS,kBAAkB,SAA6C;CACtE,OACE,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,GAAG;AAElG;AAEA,SAAS,iBAAiB,MAA0B,MAAsB;CACxE,OAAO,GAAG,QAAQ,GAAG,IAAI;AAC3B;;;;;;AAOA,SAAgB,oBAAoB,UAAsC,CAAC,GAAkB;CAC3F,MAAM,OAAO,kBAAkB,OAAO;CACtC,MAAM,MAAM,iBAAiB,QAAQ,MAAM,IAAI;CAC/C,IAAI,YAAY;EACd,IAAI,kBAAkB,KACpB,MAAM,IAAI,MACR,wEACa,KAAK,UAAU,aAAa,EAAE,SAAS,KAAK,UAAU,GAAG,EAAE,EAC1E;EAEF,OAAO;CACT;CACA,gBAAgB;CAChB,cAAc,YAAY;EACxB,MAAMC,iBAAAA,0BAA0B;GAC9B,MAAM,QAAQ;GACd,MAAM;GACN;GACA,QAAQ;EACV,CAAC;CACH,EAAA,CAAG,CAAC,CAAC,OAAO,QAAQ;EAClB,aAAa,KAAA;EACb,gBAAgB,KAAA;EAChB,MAAM;CACR,CAAC;CACD,OAAO;AACT"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/adapters/template-mode.d.ts
|
|
2
|
+
type TemplateMigrateContext = {
|
|
3
|
+
databaseUrl: string;
|
|
4
|
+
adminUrl: string;
|
|
5
|
+
databaseName: string;
|
|
6
|
+
roleName: string;
|
|
7
|
+
};
|
|
8
|
+
type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
|
|
9
|
+
type SetupTemplateModeOptions = {
|
|
10
|
+
root?: string;
|
|
11
|
+
/** App-owned migrate; runs once, then `markTemplate`. Required. */
|
|
12
|
+
migrate: TemplateMigrateFn;
|
|
13
|
+
setEnv?: boolean;
|
|
14
|
+
};
|
|
15
|
+
type CloneWorkerDatabaseOptions = {
|
|
16
|
+
root?: string;
|
|
17
|
+
/** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
|
|
18
|
+
name?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
22
|
+
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
23
|
+
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
24
|
+
*/
|
|
25
|
+
declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
|
|
28
|
+
//# sourceMappingURL=template-mode-CcxV_Iju.d.cts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/adapters/template-mode.d.ts
|
|
2
|
+
type TemplateMigrateContext = {
|
|
3
|
+
databaseUrl: string;
|
|
4
|
+
adminUrl: string;
|
|
5
|
+
databaseName: string;
|
|
6
|
+
roleName: string;
|
|
7
|
+
};
|
|
8
|
+
type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
|
|
9
|
+
type SetupTemplateModeOptions = {
|
|
10
|
+
root?: string;
|
|
11
|
+
/** App-owned migrate; runs once, then `markTemplate`. Required. */
|
|
12
|
+
migrate: TemplateMigrateFn;
|
|
13
|
+
setEnv?: boolean;
|
|
14
|
+
};
|
|
15
|
+
type CloneWorkerDatabaseOptions = {
|
|
16
|
+
root?: string;
|
|
17
|
+
/** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
|
|
18
|
+
name?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
22
|
+
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
23
|
+
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
24
|
+
*/
|
|
25
|
+
declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
|
|
26
|
+
//#endregion
|
|
27
|
+
export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
|
|
28
|
+
//# sourceMappingURL=template-mode-CcxV_Iju.d.mts.map
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { n as acquireIfNeeded, r as dispose } from "./lifecycle-BOo6xBjD.mjs";
|
|
2
|
+
import { n as cloneFromTemplateIfNeeded, r as markTemplate } from "./template-CGw3C1Ob.mjs";
|
|
3
|
+
//#region src/adapters/template-mode.ts
|
|
4
|
+
/**
|
|
5
|
+
* Runner orchestration: acquire → migrate → markTemplate.
|
|
6
|
+
* After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure
|
|
7
|
+
* best-effort disposes the lease so Vitest (no separate teardown) does not leak.
|
|
8
|
+
* Programmatic apps that do not need a migrate hook should call core
|
|
9
|
+
* `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.
|
|
10
|
+
*/
|
|
11
|
+
async function setupTemplateMode(options) {
|
|
12
|
+
const result = await acquireIfNeeded({
|
|
13
|
+
root: options.root,
|
|
14
|
+
mode: "test",
|
|
15
|
+
setEnv: options.setEnv !== false
|
|
16
|
+
});
|
|
17
|
+
if (result.status !== "acquired") return result;
|
|
18
|
+
try {
|
|
19
|
+
await options.migrate({
|
|
20
|
+
databaseUrl: result.databaseUrl,
|
|
21
|
+
adminUrl: result.adminUrl,
|
|
22
|
+
databaseName: result.databaseName,
|
|
23
|
+
roleName: result.roleName
|
|
24
|
+
});
|
|
25
|
+
await markTemplate({
|
|
26
|
+
root: result.root,
|
|
27
|
+
mode: "test",
|
|
28
|
+
adminUrl: result.adminUrl
|
|
29
|
+
});
|
|
30
|
+
} catch (err) {
|
|
31
|
+
try {
|
|
32
|
+
await dispose({
|
|
33
|
+
root: result.root,
|
|
34
|
+
mode: "test"
|
|
35
|
+
});
|
|
36
|
+
} catch {}
|
|
37
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
38
|
+
throw new Error(`template setup failed after acquire; cleaned up lease DB (${result.databaseName}). Fix the error and re-run: ${detail}`, { cause: err });
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
let workerOnce;
|
|
43
|
+
let workerOnceKey;
|
|
44
|
+
function resolveWorkerName(options) {
|
|
45
|
+
return options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);
|
|
46
|
+
}
|
|
47
|
+
function workerOptionsKey(root, name) {
|
|
48
|
+
return `${root ?? ""}\0${name}`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
52
|
+
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
53
|
+
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
54
|
+
*/
|
|
55
|
+
function cloneWorkerDatabase(options = {}) {
|
|
56
|
+
const name = resolveWorkerName(options);
|
|
57
|
+
const key = workerOptionsKey(options.root, name);
|
|
58
|
+
if (workerOnce) {
|
|
59
|
+
if (workerOnceKey !== key) throw new Error(`cloneWorkerDatabase already started with different root/name (first: ${JSON.stringify(workerOnceKey)}, now: ${JSON.stringify(key)})`);
|
|
60
|
+
return workerOnce;
|
|
61
|
+
}
|
|
62
|
+
workerOnceKey = key;
|
|
63
|
+
workerOnce = (async () => {
|
|
64
|
+
await cloneFromTemplateIfNeeded({
|
|
65
|
+
root: options.root,
|
|
66
|
+
mode: "test",
|
|
67
|
+
name,
|
|
68
|
+
setEnv: true
|
|
69
|
+
});
|
|
70
|
+
})().catch((err) => {
|
|
71
|
+
workerOnce = void 0;
|
|
72
|
+
workerOnceKey = void 0;
|
|
73
|
+
throw err;
|
|
74
|
+
});
|
|
75
|
+
return workerOnce;
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
78
|
+
export { setupTemplateMode as n, cloneWorkerDatabase as t };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=template-mode-IjlFOG4O.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-mode-IjlFOG4O.mjs","names":[],"sources":["../src/adapters/template-mode.ts"],"sourcesContent":["import { dispose, acquireIfNeeded, type AcquireIfNeededResult } from \"../core/lifecycle.ts\";\nimport { cloneFromTemplateIfNeeded, markTemplate } from \"../core/template.ts\";\n\nexport type TemplateMigrateContext = {\n databaseUrl: string;\n adminUrl: string;\n databaseName: string;\n roleName: string;\n};\n\nexport type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;\n\nexport type SetupTemplateModeOptions = {\n root?: string;\n /** App-owned migrate; runs once, then `markTemplate`. Required. */\n migrate: TemplateMigrateFn;\n setEnv?: boolean;\n};\n\n/**\n * Runner orchestration: acquire → migrate → markTemplate.\n * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure\n * best-effort disposes the lease so Vitest (no separate teardown) does not leak.\n * Programmatic apps that do not need a migrate hook should call core\n * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.\n */\nexport async function setupTemplateMode(\n options: SetupTemplateModeOptions,\n): Promise<AcquireIfNeededResult> {\n const result = await acquireIfNeeded({\n root: options.root,\n mode: \"test\",\n setEnv: options.setEnv !== false,\n });\n if (result.status !== \"acquired\") return result;\n\n try {\n await options.migrate({\n databaseUrl: result.databaseUrl,\n adminUrl: result.adminUrl,\n databaseName: result.databaseName,\n roleName: result.roleName,\n });\n await markTemplate({\n root: result.root,\n mode: \"test\",\n adminUrl: result.adminUrl,\n });\n } catch (err) {\n try {\n await dispose({ root: result.root, mode: \"test\" });\n } catch {\n // best-effort: leave lease for dispose/gc retry\n }\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(\n `template setup failed after acquire; cleaned up lease DB (${result.databaseName}). ` +\n `Fix the error and re-run: ${detail}`,\n { cause: err },\n );\n }\n\n return result;\n}\n\nexport type CloneWorkerDatabaseOptions = {\n root?: string;\n /** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */\n name?: string;\n};\n\nlet workerOnce: Promise<void> | undefined;\nlet workerOnceKey: string | undefined;\n\nfunction resolveWorkerName(options: CloneWorkerDatabaseOptions): string {\n return (\n options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid)\n );\n}\n\nfunction workerOptionsKey(root: string | undefined, name: string): string {\n return `${root ?? \"\"}\\0${name}`;\n}\n\n/**\n * Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).\n * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.\n * First call wins for `root`/`name`; conflicting later calls throw.\n */\nexport function cloneWorkerDatabase(options: CloneWorkerDatabaseOptions = {}): Promise<void> {\n const name = resolveWorkerName(options);\n const key = workerOptionsKey(options.root, name);\n if (workerOnce) {\n if (workerOnceKey !== key) {\n throw new Error(\n `cloneWorkerDatabase already started with different root/name ` +\n `(first: ${JSON.stringify(workerOnceKey)}, now: ${JSON.stringify(key)})`,\n );\n }\n return workerOnce;\n }\n workerOnceKey = key;\n workerOnce = (async () => {\n await cloneFromTemplateIfNeeded({\n root: options.root,\n mode: \"test\",\n name,\n setEnv: true,\n });\n })().catch((err) => {\n workerOnce = undefined;\n workerOnceKey = undefined;\n throw err;\n });\n return workerOnce;\n}\n"],"mappings":";;;;;;;;;;AA0BA,eAAsB,kBACpB,SACgC;CAChC,MAAM,SAAS,MAAM,gBAAgB;EACnC,MAAM,QAAQ;EACd,MAAM;EACN,QAAQ,QAAQ,WAAW;CAC7B,CAAC;CACD,IAAI,OAAO,WAAW,YAAY,OAAO;CAEzC,IAAI;EACF,MAAM,QAAQ,QAAQ;GACpB,aAAa,OAAO;GACpB,UAAU,OAAO;GACjB,cAAc,OAAO;GACrB,UAAU,OAAO;EACnB,CAAC;EACD,MAAM,aAAa;GACjB,MAAM,OAAO;GACb,MAAM;GACN,UAAU,OAAO;EACnB,CAAC;CACH,SAAS,KAAK;EACZ,IAAI;GACF,MAAM,QAAQ;IAAE,MAAM,OAAO;IAAM,MAAM;GAAO,CAAC;EACnD,QAAQ,CAER;EACA,MAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;EAC9D,MAAM,IAAI,MACR,6DAA6D,OAAO,aAAa,+BAClD,UAC/B,EAAE,OAAO,IAAI,CACf;CACF;CAEA,OAAO;AACT;AAQA,IAAI;AACJ,IAAI;AAEJ,SAAS,kBAAkB,SAA6C;CACtE,OACE,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,GAAG;AAElG;AAEA,SAAS,iBAAiB,MAA0B,MAAsB;CACxE,OAAO,GAAG,QAAQ,GAAG,IAAI;AAC3B;;;;;;AAOA,SAAgB,oBAAoB,UAAsC,CAAC,GAAkB;CAC3F,MAAM,OAAO,kBAAkB,OAAO;CACtC,MAAM,MAAM,iBAAiB,QAAQ,MAAM,IAAI;CAC/C,IAAI,YAAY;EACd,IAAI,kBAAkB,KACpB,MAAM,IAAI,MACR,wEACa,KAAK,UAAU,aAAa,EAAE,SAAS,KAAK,UAAU,GAAG,EAAE,EAC1E;EAEF,OAAO;CACT;CACA,gBAAgB;CAChB,cAAc,YAAY;EACxB,MAAM,0BAA0B;GAC9B,MAAM,QAAQ;GACd,MAAM;GACN;GACA,QAAQ;EACV,CAAC;CACH,EAAA,CAAG,CAAC,CAAC,OAAO,QAAQ;EAClB,aAAa,KAAA;EACb,gBAAgB,KAAA;EAChB,MAAM;CACR,CAAC;CACD,OAAO;AACT"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
//#region src/adapters/test-env.ts
|
|
2
|
+
/**
|
|
3
|
+
* Test-runner `setupFiles` entry: inject `DATABASE_URL` from `.cedarpg/test.env`.
|
|
4
|
+
*
|
|
5
|
+
* Required for Jest (globalSetup is a separate process). Optional for Vitest
|
|
6
|
+
* when the pool does not inherit env from the main process.
|
|
7
|
+
*
|
|
8
|
+
* ```js
|
|
9
|
+
* setupFiles: [require.resolve('@cedarjs/pg/test-env')]
|
|
10
|
+
* // or: setupFiles: ['@cedarjs/pg/test-env']
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
require("./load-test-env-CkdUjTpV.cjs").loadTestEnv();
|
|
14
|
+
//#endregion
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=test-env.cjs.map
|