@cedarjs/pg 0.2.0-alpha.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +300 -230
- package/dist/cli.cjs +99 -43
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +85 -29
- package/dist/cli.mjs.map +1 -1
- package/dist/dev-env.cjs +1 -1
- package/dist/dev-env.mjs +1 -1
- package/dist/index.cjs +9 -8
- package/dist/index.d.cts +80 -9
- package/dist/index.d.mts +80 -9
- package/dist/index.mjs +7 -7
- package/dist/jest-teardown.cjs +1 -1
- package/dist/jest-teardown.mjs +1 -1
- package/dist/jest-template.cjs +7 -2
- package/dist/jest-template.cjs.map +1 -1
- package/dist/jest-template.d.cts +7 -2
- package/dist/jest-template.d.mts +7 -2
- package/dist/jest-template.mjs +7 -2
- package/dist/jest-template.mjs.map +1 -1
- package/dist/jest.cjs +1 -1
- package/dist/jest.mjs +1 -1
- package/dist/{lease-BSBBpaR4.mjs → lease-DS1SX8U_.mjs} +23 -3
- package/dist/lease-DS1SX8U_.mjs.map +1 -0
- package/dist/{lease-Bq9wKwQa.cjs → lease-WlmOnNDi.cjs} +41 -3
- package/dist/lease-WlmOnNDi.cjs.map +1 -0
- package/dist/lifecycle-2BZgSVz2.mjs +1072 -0
- package/dist/lifecycle-2BZgSVz2.mjs.map +1 -0
- package/dist/{lifecycle-DEJ4GgWV.cjs → lifecycle-BCeM96tI.cjs} +517 -117
- package/dist/lifecycle-BCeM96tI.cjs.map +1 -0
- package/dist/{load-dev-env-7UjMHhw7.mjs → load-dev-env-BULkXyen.mjs} +2 -2
- package/dist/{load-dev-env-7UjMHhw7.mjs.map → load-dev-env-BULkXyen.mjs.map} +1 -1
- package/dist/{load-dev-env-cII6N4ZP.cjs → load-dev-env-Bl6Ddv1U.cjs} +2 -2
- package/dist/{load-dev-env-cII6N4ZP.cjs.map → load-dev-env-Bl6Ddv1U.cjs.map} +1 -1
- package/dist/{load-mode-env-B0qO9DZx.cjs → load-mode-env-CX9vd56X.cjs} +2 -2
- package/dist/{load-mode-env-B0qO9DZx.cjs.map → load-mode-env-CX9vd56X.cjs.map} +1 -1
- package/dist/{load-mode-env-C8gy4v9V.mjs → load-mode-env-Ce9ujisN.mjs} +2 -2
- package/dist/{load-mode-env-C8gy4v9V.mjs.map → load-mode-env-Ce9ujisN.mjs.map} +1 -1
- package/dist/{load-test-env-C34wpkIX.mjs → load-test-env-BqtA6V-d.mjs} +2 -2
- package/dist/{load-test-env-C34wpkIX.mjs.map → load-test-env-BqtA6V-d.mjs.map} +1 -1
- package/dist/{load-test-env-CkdUjTpV.cjs → load-test-env-Dcgh6YHV.cjs} +2 -2
- package/dist/{load-test-env-CkdUjTpV.cjs.map → load-test-env-Dcgh6YHV.cjs.map} +1 -1
- package/dist/{naming-C2nGVxPk.d.cts → naming-Df4fz_Fb.d.cts} +3 -2
- package/dist/{naming-C2nGVxPk.d.mts → naming-Df4fz_Fb.d.mts} +3 -2
- package/dist/status-B68SGSKx.mjs +26 -0
- package/dist/status-B68SGSKx.mjs.map +1 -0
- package/dist/status-Z_BYdxzI.cjs +31 -0
- package/dist/status-Z_BYdxzI.cjs.map +1 -0
- package/dist/studio-Bi6SU9jE.mjs +221 -0
- package/dist/studio-Bi6SU9jE.mjs.map +1 -0
- package/dist/studio-CdWIdnxr.cjs +280 -0
- package/dist/studio-CdWIdnxr.cjs.map +1 -0
- package/dist/{template-D0gJ_MS2.cjs → template-Cd77H7Cr.cjs} +21 -18
- package/dist/template-Cd77H7Cr.cjs.map +1 -0
- package/dist/{template-CGw3C1Ob.mjs → template-DlqHL8Go.mjs} +21 -18
- package/dist/template-DlqHL8Go.mjs.map +1 -0
- package/dist/template-mode-BqV3GjXI.d.cts +48 -0
- package/dist/template-mode-BqV3GjXI.d.mts +48 -0
- package/dist/template-mode-DK5cAlv9.mjs +81 -0
- package/dist/template-mode-DK5cAlv9.mjs.map +1 -0
- package/dist/template-mode-DMO5-z7O.cjs +92 -0
- package/dist/template-mode-DMO5-z7O.cjs.map +1 -0
- package/dist/test-env.cjs +1 -1
- package/dist/test-env.mjs +1 -1
- package/dist/vite-plus.cjs +113 -10
- package/dist/vite-plus.cjs.map +1 -1
- package/dist/vite-plus.d.cts +41 -2
- package/dist/vite-plus.d.mts +41 -2
- package/dist/vite-plus.mjs +110 -7
- package/dist/vite-plus.mjs.map +1 -1
- package/dist/vitest-template.cjs +6 -3
- package/dist/vitest-template.cjs.map +1 -1
- package/dist/vitest-template.d.cts +6 -3
- package/dist/vitest-template.d.mts +6 -3
- package/dist/vitest-template.mjs +6 -3
- package/dist/vitest-template.mjs.map +1 -1
- package/dist/vitest.cjs +1 -1
- package/dist/vitest.mjs +1 -1
- package/package.json +11 -7
- package/scripts/autopg-version +1 -1
- package/scripts/ci-install-autopg.sh +7 -2
- package/scripts/postinstall.js +41 -13
- package/dist/constants-Ct8myrEn.cjs +0 -41
- package/dist/constants-Ct8myrEn.cjs.map +0 -1
- package/dist/constants-NLR0U4NR.mjs +0 -24
- package/dist/constants-NLR0U4NR.mjs.map +0 -1
- package/dist/lease-B3TuX92y.d.mts +0 -24
- package/dist/lease-BSBBpaR4.mjs.map +0 -1
- package/dist/lease-Bq9wKwQa.cjs.map +0 -1
- package/dist/lease-t4I9JahV.d.cts +0 -24
- package/dist/lifecycle-BOo6xBjD.mjs +0 -684
- package/dist/lifecycle-BOo6xBjD.mjs.map +0 -1
- package/dist/lifecycle-DEJ4GgWV.cjs.map +0 -1
- package/dist/nx.cjs +0 -44
- package/dist/nx.cjs.map +0 -1
- package/dist/nx.d.cts +0 -15
- package/dist/nx.d.mts +0 -15
- package/dist/nx.mjs +0 -36
- package/dist/nx.mjs.map +0 -1
- package/dist/tasks-Caud9yHr.cjs +0 -67
- package/dist/tasks-Caud9yHr.cjs.map +0 -1
- package/dist/tasks-CjaZRi_G.d.mts +0 -19
- package/dist/tasks-DdQoP9We.d.cts +0 -19
- package/dist/tasks-KherHLac.mjs +0 -38
- package/dist/tasks-KherHLac.mjs.map +0 -1
- package/dist/template-CGw3C1Ob.mjs.map +0 -1
- package/dist/template-D0gJ_MS2.cjs.map +0 -1
- package/dist/template-mode-BkEs9LnY.cjs +0 -91
- package/dist/template-mode-BkEs9LnY.cjs.map +0 -1
- package/dist/template-mode-CcxV_Iju.d.cts +0 -28
- package/dist/template-mode-CcxV_Iju.d.mts +0 -28
- package/dist/template-mode-IjlFOG4O.mjs +0 -80
- package/dist/template-mode-IjlFOG4O.mjs.map +0 -1
|
@@ -1,91 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/template-mode.d.ts
|
|
2
|
-
type TemplateMigrateContext = {
|
|
3
|
-
databaseUrl: string;
|
|
4
|
-
adminUrl: string;
|
|
5
|
-
databaseName: string;
|
|
6
|
-
roleName: string;
|
|
7
|
-
};
|
|
8
|
-
type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
|
|
9
|
-
type SetupTemplateModeOptions = {
|
|
10
|
-
root?: string;
|
|
11
|
-
/** App-owned migrate; runs once, then `markTemplate`. Required. */
|
|
12
|
-
migrate: TemplateMigrateFn;
|
|
13
|
-
setEnv?: boolean;
|
|
14
|
-
};
|
|
15
|
-
type CloneWorkerDatabaseOptions = {
|
|
16
|
-
root?: string;
|
|
17
|
-
/** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
|
|
18
|
-
name?: string;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
22
|
-
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
23
|
-
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
24
|
-
*/
|
|
25
|
-
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
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/template-mode.d.ts
|
|
2
|
-
type TemplateMigrateContext = {
|
|
3
|
-
databaseUrl: string;
|
|
4
|
-
adminUrl: string;
|
|
5
|
-
databaseName: string;
|
|
6
|
-
roleName: string;
|
|
7
|
-
};
|
|
8
|
-
type TemplateMigrateFn = (ctx: TemplateMigrateContext) => void | Promise<void>;
|
|
9
|
-
type SetupTemplateModeOptions = {
|
|
10
|
-
root?: string;
|
|
11
|
-
/** App-owned migrate; runs once, then `markTemplate`. Required. */
|
|
12
|
-
migrate: TemplateMigrateFn;
|
|
13
|
-
setEnv?: boolean;
|
|
14
|
-
};
|
|
15
|
-
type CloneWorkerDatabaseOptions = {
|
|
16
|
-
root?: string;
|
|
17
|
-
/** Clone suffix; defaults to JEST_WORKER_ID / VITEST_POOL_ID / pid. */
|
|
18
|
-
name?: string;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Process-once per-worker clone (JEST_WORKER_ID / VITEST_POOL_ID / pid by default).
|
|
22
|
-
* Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
|
|
23
|
-
* First call wins for `root`/`name`; conflicting later calls throw.
|
|
24
|
-
*/
|
|
25
|
-
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
|
|
@@ -1,80 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|