@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.
Files changed (112) hide show
  1. package/README.md +300 -230
  2. package/dist/cli.cjs +99 -43
  3. package/dist/cli.cjs.map +1 -1
  4. package/dist/cli.mjs +85 -29
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/dev-env.cjs +1 -1
  7. package/dist/dev-env.mjs +1 -1
  8. package/dist/index.cjs +9 -8
  9. package/dist/index.d.cts +80 -9
  10. package/dist/index.d.mts +80 -9
  11. package/dist/index.mjs +7 -7
  12. package/dist/jest-teardown.cjs +1 -1
  13. package/dist/jest-teardown.mjs +1 -1
  14. package/dist/jest-template.cjs +7 -2
  15. package/dist/jest-template.cjs.map +1 -1
  16. package/dist/jest-template.d.cts +7 -2
  17. package/dist/jest-template.d.mts +7 -2
  18. package/dist/jest-template.mjs +7 -2
  19. package/dist/jest-template.mjs.map +1 -1
  20. package/dist/jest.cjs +1 -1
  21. package/dist/jest.mjs +1 -1
  22. package/dist/{lease-BSBBpaR4.mjs → lease-DS1SX8U_.mjs} +23 -3
  23. package/dist/lease-DS1SX8U_.mjs.map +1 -0
  24. package/dist/{lease-Bq9wKwQa.cjs → lease-WlmOnNDi.cjs} +41 -3
  25. package/dist/lease-WlmOnNDi.cjs.map +1 -0
  26. package/dist/lifecycle-2BZgSVz2.mjs +1072 -0
  27. package/dist/lifecycle-2BZgSVz2.mjs.map +1 -0
  28. package/dist/{lifecycle-DEJ4GgWV.cjs → lifecycle-BCeM96tI.cjs} +517 -117
  29. package/dist/lifecycle-BCeM96tI.cjs.map +1 -0
  30. package/dist/{load-dev-env-7UjMHhw7.mjs → load-dev-env-BULkXyen.mjs} +2 -2
  31. package/dist/{load-dev-env-7UjMHhw7.mjs.map → load-dev-env-BULkXyen.mjs.map} +1 -1
  32. package/dist/{load-dev-env-cII6N4ZP.cjs → load-dev-env-Bl6Ddv1U.cjs} +2 -2
  33. package/dist/{load-dev-env-cII6N4ZP.cjs.map → load-dev-env-Bl6Ddv1U.cjs.map} +1 -1
  34. package/dist/{load-mode-env-B0qO9DZx.cjs → load-mode-env-CX9vd56X.cjs} +2 -2
  35. package/dist/{load-mode-env-B0qO9DZx.cjs.map → load-mode-env-CX9vd56X.cjs.map} +1 -1
  36. package/dist/{load-mode-env-C8gy4v9V.mjs → load-mode-env-Ce9ujisN.mjs} +2 -2
  37. package/dist/{load-mode-env-C8gy4v9V.mjs.map → load-mode-env-Ce9ujisN.mjs.map} +1 -1
  38. package/dist/{load-test-env-C34wpkIX.mjs → load-test-env-BqtA6V-d.mjs} +2 -2
  39. package/dist/{load-test-env-C34wpkIX.mjs.map → load-test-env-BqtA6V-d.mjs.map} +1 -1
  40. package/dist/{load-test-env-CkdUjTpV.cjs → load-test-env-Dcgh6YHV.cjs} +2 -2
  41. package/dist/{load-test-env-CkdUjTpV.cjs.map → load-test-env-Dcgh6YHV.cjs.map} +1 -1
  42. package/dist/{naming-C2nGVxPk.d.cts → naming-Df4fz_Fb.d.cts} +3 -2
  43. package/dist/{naming-C2nGVxPk.d.mts → naming-Df4fz_Fb.d.mts} +3 -2
  44. package/dist/status-B68SGSKx.mjs +26 -0
  45. package/dist/status-B68SGSKx.mjs.map +1 -0
  46. package/dist/status-Z_BYdxzI.cjs +31 -0
  47. package/dist/status-Z_BYdxzI.cjs.map +1 -0
  48. package/dist/studio-Bi6SU9jE.mjs +221 -0
  49. package/dist/studio-Bi6SU9jE.mjs.map +1 -0
  50. package/dist/studio-CdWIdnxr.cjs +280 -0
  51. package/dist/studio-CdWIdnxr.cjs.map +1 -0
  52. package/dist/{template-D0gJ_MS2.cjs → template-Cd77H7Cr.cjs} +21 -18
  53. package/dist/template-Cd77H7Cr.cjs.map +1 -0
  54. package/dist/{template-CGw3C1Ob.mjs → template-DlqHL8Go.mjs} +21 -18
  55. package/dist/template-DlqHL8Go.mjs.map +1 -0
  56. package/dist/template-mode-BqV3GjXI.d.cts +48 -0
  57. package/dist/template-mode-BqV3GjXI.d.mts +48 -0
  58. package/dist/template-mode-DK5cAlv9.mjs +81 -0
  59. package/dist/template-mode-DK5cAlv9.mjs.map +1 -0
  60. package/dist/template-mode-DMO5-z7O.cjs +92 -0
  61. package/dist/template-mode-DMO5-z7O.cjs.map +1 -0
  62. package/dist/test-env.cjs +1 -1
  63. package/dist/test-env.mjs +1 -1
  64. package/dist/vite-plus.cjs +113 -10
  65. package/dist/vite-plus.cjs.map +1 -1
  66. package/dist/vite-plus.d.cts +41 -2
  67. package/dist/vite-plus.d.mts +41 -2
  68. package/dist/vite-plus.mjs +110 -7
  69. package/dist/vite-plus.mjs.map +1 -1
  70. package/dist/vitest-template.cjs +6 -3
  71. package/dist/vitest-template.cjs.map +1 -1
  72. package/dist/vitest-template.d.cts +6 -3
  73. package/dist/vitest-template.d.mts +6 -3
  74. package/dist/vitest-template.mjs +6 -3
  75. package/dist/vitest-template.mjs.map +1 -1
  76. package/dist/vitest.cjs +1 -1
  77. package/dist/vitest.mjs +1 -1
  78. package/package.json +11 -7
  79. package/scripts/autopg-version +1 -1
  80. package/scripts/ci-install-autopg.sh +7 -2
  81. package/scripts/postinstall.js +41 -13
  82. package/dist/constants-Ct8myrEn.cjs +0 -41
  83. package/dist/constants-Ct8myrEn.cjs.map +0 -1
  84. package/dist/constants-NLR0U4NR.mjs +0 -24
  85. package/dist/constants-NLR0U4NR.mjs.map +0 -1
  86. package/dist/lease-B3TuX92y.d.mts +0 -24
  87. package/dist/lease-BSBBpaR4.mjs.map +0 -1
  88. package/dist/lease-Bq9wKwQa.cjs.map +0 -1
  89. package/dist/lease-t4I9JahV.d.cts +0 -24
  90. package/dist/lifecycle-BOo6xBjD.mjs +0 -684
  91. package/dist/lifecycle-BOo6xBjD.mjs.map +0 -1
  92. package/dist/lifecycle-DEJ4GgWV.cjs.map +0 -1
  93. package/dist/nx.cjs +0 -44
  94. package/dist/nx.cjs.map +0 -1
  95. package/dist/nx.d.cts +0 -15
  96. package/dist/nx.d.mts +0 -15
  97. package/dist/nx.mjs +0 -36
  98. package/dist/nx.mjs.map +0 -1
  99. package/dist/tasks-Caud9yHr.cjs +0 -67
  100. package/dist/tasks-Caud9yHr.cjs.map +0 -1
  101. package/dist/tasks-CjaZRi_G.d.mts +0 -19
  102. package/dist/tasks-DdQoP9We.d.cts +0 -19
  103. package/dist/tasks-KherHLac.mjs +0 -38
  104. package/dist/tasks-KherHLac.mjs.map +0 -1
  105. package/dist/template-CGw3C1Ob.mjs.map +0 -1
  106. package/dist/template-D0gJ_MS2.cjs.map +0 -1
  107. package/dist/template-mode-BkEs9LnY.cjs +0 -91
  108. package/dist/template-mode-BkEs9LnY.cjs.map +0 -1
  109. package/dist/template-mode-CcxV_Iju.d.cts +0 -28
  110. package/dist/template-mode-CcxV_Iju.d.mts +0 -28
  111. package/dist/template-mode-IjlFOG4O.mjs +0 -80
  112. package/dist/template-mode-IjlFOG4O.mjs.map +0 -1
@@ -1,19 +1,23 @@
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";
1
+ import { T as buildCloneDatabaseName, b as applyDatabaseUrlEnv, d as cloneDatabaseFromTemplate, l as adminUrlFor, p as dropDatabase, r as attach, u as buildDatabaseUrl, v as setDatabaseIsTemplate, w as runIfNeeded } from "./lifecycle-2BZgSVz2.mjs";
3
2
  //#region src/core/template.ts
4
- async function resolveAdminUrl(adminUrl) {
5
- return adminUrl ?? (await ensureHostRunning()).adminUrl;
3
+ /**
4
+ * Lease + admin URL the way `attach` connects: lease file, one TCP probe on the
5
+ * leased port, never host discovery / start / revive. Workers call this once per
6
+ * test file, so it must stay cheap (no git, no `autopg` processes).
7
+ */
8
+ async function attachAdmin(options) {
9
+ const { lease } = await attach(options);
10
+ return {
11
+ lease,
12
+ adminUrl: options.adminUrl ?? adminUrlFor(lease.port)
13
+ };
6
14
  }
7
15
  /**
8
16
  * After migrations, mark the leased DB as a PostgreSQL TEMPLATE so workers can clone it.
9
17
  * Requires a lease from `acquire` (no datname override).
10
18
  */
11
19
  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);
20
+ const { lease, adminUrl } = await attachAdmin(options);
17
21
  await setDatabaseIsTemplate({
18
22
  adminUrl,
19
23
  databaseName: lease.databaseName,
@@ -28,28 +32,27 @@ async function markTemplate(options) {
28
32
  * Clone the leased TEMPLATE database via admin (`CREATE DATABASE … TEMPLATE`).
29
33
  * Reuses the template role so `databaseUrl` passwords stay valid (scheme v2).
30
34
  * Provider rejects when the leased DB is not marked TEMPLATE.
31
- * Port comes from the lease; admin URL is passed through or rediscovered.
35
+ * Port comes from the lease; admin URL is passed through or built from the lease
36
+ * port. Fails when nothing listens there (setup should have acquired).
37
+ * An existing clone datname fails unless `reuse` is set and the lease role owns it.
32
38
  */
33
39
  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);
40
+ const { lease, adminUrl } = await attachAdmin(options);
39
41
  const suffix = options.name ?? `${process.pid}_${Date.now().toString(36)}`;
40
42
  const databaseName = buildCloneDatabaseName(lease.databaseName, suffix);
41
43
  await cloneDatabaseFromTemplate({
42
44
  adminUrl,
43
45
  templateName: lease.databaseName,
44
46
  databaseName,
45
- roleName: lease.roleName
47
+ roleName: lease.roleName,
48
+ reuse: options.reuse
46
49
  });
47
50
  const databaseUrl = buildDatabaseUrl({
48
51
  port: lease.port,
49
52
  databaseName,
50
53
  roleName: lease.roleName
51
54
  });
52
- if (options.setEnv) applyDatabaseUrlEnv(databaseUrl, { mode });
55
+ if (options.setEnv) applyDatabaseUrlEnv(databaseUrl, { mode: options.mode });
53
56
  const roleName = lease.roleName;
54
57
  return {
55
58
  databaseUrl,
@@ -85,4 +88,4 @@ async function cloneFromTemplateIfNeeded(options) {
85
88
  //#endregion
86
89
  export { cloneFromTemplateIfNeeded as n, markTemplate as r, cloneFromTemplate as t };
87
90
 
88
- //# sourceMappingURL=template-CGw3C1Ob.mjs.map
91
+ //# sourceMappingURL=template-DlqHL8Go.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-DlqHL8Go.mjs","names":[],"sources":["../src/core/template.ts"],"sourcesContent":["import { buildCloneDatabaseName, type DbMode } from \"./naming.ts\";\nimport type { Lease } from \"./lease.ts\";\nimport { attach } from \"./lifecycle.ts\";\nimport { applyDatabaseUrlEnv, runIfNeeded, type ResolveAcquireSkipInput } from \"./policy.ts\";\nimport {\n adminUrlFor,\n buildDatabaseUrl,\n cloneDatabaseFromTemplate,\n dropDatabase,\n setDatabaseIsTemplate,\n} from \"../providers/autopg.ts\";\n\n/**\n * Lease + admin URL the way `attach` connects: lease file, one TCP probe on the\n * leased port, never host discovery / start / revive. Workers call this once per\n * test file, so it must stay cheap (no git, no `autopg` processes).\n */\nasync function attachAdmin(options: {\n root?: string;\n mode: DbMode;\n adminUrl?: string;\n}): Promise<{ lease: Lease; adminUrl: string }> {\n const { lease } = await attach(options);\n return { lease, adminUrl: options.adminUrl ?? adminUrlFor(lease.port) };\n}\n\nexport type MarkTemplateOptions = {\n root?: string;\n mode: DbMode;\n /** Superuser URL from `acquire`; when omitted, built from the lease port (never 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 { lease, adminUrl } = await attachAdmin(options);\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, built from the lease port (never 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 * Keep an existing `<template>_c_<name>` owned by the lease role instead of\n * failing with `database already exists` (default false). Worker adapters pass\n * true so every test file in one worker attaches to the same clone.\n */\n reuse?: boolean;\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 built from the lease\n * port. Fails when nothing listens there (setup should have acquired).\n * An existing clone datname fails unless `reuse` is set and the lease role owns it.\n */\nexport async function cloneFromTemplate(options: CloneFromTemplateOptions): Promise<CloneResult> {\n const { lease, adminUrl } = await attachAdmin(options);\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 reuse: options.reuse,\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: options.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":";;;;;;;AAiBA,eAAe,YAAY,SAIqB;CAC9C,MAAM,EAAE,UAAU,MAAM,OAAO,OAAO;CACtC,OAAO;EAAE;EAAO,UAAU,QAAQ,YAAY,YAAY,MAAM,IAAI;CAAE;AACxE;;;;;AAaA,eAAsB,aACpB,SACqD;CACrD,MAAM,EAAE,OAAO,aAAa,MAAM,YAAY,OAAO;CACrD,MAAM,sBAAsB;EAC1B;EACA,cAAc,MAAM;EACpB,YAAY;CACd,CAAC;CACD,OAAO;EAAE,cAAc,MAAM;EAAc;CAAS;AACtD;;;;;;;;;AA+CA,eAAsB,kBAAkB,SAAyD;CAC/F,MAAM,EAAE,OAAO,aAAa,MAAM,YAAY,OAAO;CACrD,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;EAChB,OAAO,QAAQ;CACjB,CAAC;CAED,MAAM,cAAc,iBAAiB;EACnC,MAAM,MAAM;EACZ;EACA,UAAU,MAAM;CAClB,CAAC;CAED,IAAI,QAAQ,QACV,oBAAoB,aAAa,EAAE,MAAM,QAAQ,KAAK,CAAC;CAGzD,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,48 @@
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
+ * How each file starts on the worker clone (default `"truncate"`):
21
+ * - `"truncate"`: `TRUNCATE … RESTART IDENTITY` on every user table, so rows
22
+ * from earlier files are gone and serial / identity IDs restart at 1.
23
+ * - `"none"`: keep whatever the previous file left (app-owned reset).
24
+ */
25
+ reset?: "truncate" | "none";
26
+ };
27
+ /**
28
+ * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),
29
+ * shared by every test file that worker runs. Call it once per test file
30
+ * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).
31
+ *
32
+ * The first file creates the clone. Later files reuse it (`reuse: true`): the
33
+ * database itself is the source of truth, so this holds even though Jest gives
34
+ * each file a fresh `globalThis` and module registry. Clones left over from a
35
+ * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.
36
+ *
37
+ * Every file then starts from empty tables with identities restarted (`reset`),
38
+ * the first file included, so file order never changes what a file sees. That
39
+ * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: "none"` to
40
+ * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)
41
+ * is never truncated.
42
+ *
43
+ * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
44
+ */
45
+ declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
46
+ //#endregion
47
+ export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
48
+ //# sourceMappingURL=template-mode-BqV3GjXI.d.cts.map
@@ -0,0 +1,48 @@
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
+ * How each file starts on the worker clone (default `"truncate"`):
21
+ * - `"truncate"`: `TRUNCATE … RESTART IDENTITY` on every user table, so rows
22
+ * from earlier files are gone and serial / identity IDs restart at 1.
23
+ * - `"none"`: keep whatever the previous file left (app-owned reset).
24
+ */
25
+ reset?: "truncate" | "none";
26
+ };
27
+ /**
28
+ * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),
29
+ * shared by every test file that worker runs. Call it once per test file
30
+ * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).
31
+ *
32
+ * The first file creates the clone. Later files reuse it (`reuse: true`): the
33
+ * database itself is the source of truth, so this holds even though Jest gives
34
+ * each file a fresh `globalThis` and module registry. Clones left over from a
35
+ * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.
36
+ *
37
+ * Every file then starts from empty tables with identities restarted (`reset`),
38
+ * the first file included, so file order never changes what a file sees. That
39
+ * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: "none"` to
40
+ * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)
41
+ * is never truncated.
42
+ *
43
+ * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
44
+ */
45
+ declare function cloneWorkerDatabase(options?: CloneWorkerDatabaseOptions): Promise<void>;
46
+ //#endregion
47
+ export { cloneWorkerDatabase as i, TemplateMigrateContext as n, TemplateMigrateFn as r, SetupTemplateModeOptions as t };
48
+ //# sourceMappingURL=template-mode-BqV3GjXI.d.mts.map
@@ -0,0 +1,81 @@
1
+ import { i as dispose, n as acquireIfNeeded, y as truncateUserTables } from "./lifecycle-2BZgSVz2.mjs";
2
+ import { n as cloneFromTemplateIfNeeded, r as markTemplate } from "./template-DlqHL8Go.mjs";
3
+ //#region src/adapters/template-mode.ts
4
+ /**
5
+ * Runner orchestration: fresh acquire → migrate → markTemplate.
6
+ * The acquire is `fresh`: leftovers a crashed earlier run left under this
7
+ * worktree's test role (TEMPLATE, worker clones) are dropped first, so migrate
8
+ * always starts from an empty database and no consumer pre-cleanup is needed.
9
+ * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure
10
+ * best-effort disposes the lease so Vitest (no separate teardown) does not leak.
11
+ * Programmatic apps that do not need a migrate hook should call core
12
+ * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.
13
+ */
14
+ async function setupTemplateMode(options) {
15
+ const result = await acquireIfNeeded({
16
+ root: options.root,
17
+ mode: "test",
18
+ fresh: true,
19
+ setEnv: options.setEnv !== false
20
+ });
21
+ if (result.status !== "acquired") return result;
22
+ try {
23
+ await options.migrate({
24
+ databaseUrl: result.databaseUrl,
25
+ adminUrl: result.adminUrl,
26
+ databaseName: result.databaseName,
27
+ roleName: result.roleName
28
+ });
29
+ await markTemplate({
30
+ root: result.root,
31
+ mode: "test",
32
+ adminUrl: result.adminUrl
33
+ });
34
+ } catch (err) {
35
+ try {
36
+ await dispose({
37
+ root: result.root,
38
+ mode: "test"
39
+ });
40
+ } catch {}
41
+ const detail = err instanceof Error ? err.message : String(err);
42
+ throw new Error(`template setup failed after acquire; cleaned up lease DB (${result.databaseName}). Fix the error and re-run: ${detail}`, { cause: err });
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),
48
+ * shared by every test file that worker runs. Call it once per test file
49
+ * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).
50
+ *
51
+ * The first file creates the clone. Later files reuse it (`reuse: true`): the
52
+ * database itself is the source of truth, so this holds even though Jest gives
53
+ * each file a fresh `globalThis` and module registry. Clones left over from a
54
+ * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.
55
+ *
56
+ * Every file then starts from empty tables with identities restarted (`reset`),
57
+ * the first file included, so file order never changes what a file sees. That
58
+ * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: "none"` to
59
+ * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)
60
+ * is never truncated.
61
+ *
62
+ * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
63
+ */
64
+ async function cloneWorkerDatabase(options = {}) {
65
+ const name = options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);
66
+ const clone = await cloneFromTemplateIfNeeded({
67
+ root: options.root,
68
+ mode: "test",
69
+ name,
70
+ reuse: true,
71
+ setEnv: true
72
+ });
73
+ if (clone.status === "cloned" && options.reset !== "none") await truncateUserTables({
74
+ adminUrl: clone.adminUrl,
75
+ databaseName: clone.databaseName
76
+ });
77
+ }
78
+ //#endregion
79
+ export { setupTemplateMode as n, cloneWorkerDatabase as t };
80
+
81
+ //# sourceMappingURL=template-mode-DK5cAlv9.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-mode-DK5cAlv9.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\";\nimport { truncateUserTables } from \"../providers/autopg.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: fresh acquire → migrate → markTemplate.\n * The acquire is `fresh`: leftovers a crashed earlier run left under this\n * worktree's test role (TEMPLATE, worker clones) are dropped first, so migrate\n * always starts from an empty database and no consumer pre-cleanup is needed.\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 fresh: true,\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 * How each file starts on the worker clone (default `\"truncate\"`):\n * - `\"truncate\"`: `TRUNCATE … RESTART IDENTITY` on every user table, so rows\n * from earlier files are gone and serial / identity IDs restart at 1.\n * - `\"none\"`: keep whatever the previous file left (app-owned reset).\n */\n reset?: \"truncate\" | \"none\";\n};\n\n/**\n * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),\n * shared by every test file that worker runs. Call it once per test file\n * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).\n *\n * The first file creates the clone. Later files reuse it (`reuse: true`): the\n * database itself is the source of truth, so this holds even though Jest gives\n * each file a fresh `globalThis` and module registry. Clones left over from a\n * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.\n *\n * Every file then starts from empty tables with identities restarted (`reset`),\n * the first file included, so file order never changes what a file sees. That\n * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: \"none\"` to\n * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)\n * is never truncated.\n *\n * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.\n */\nexport async function cloneWorkerDatabase(options: CloneWorkerDatabaseOptions = {}): Promise<void> {\n const name =\n options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);\n const clone = await cloneFromTemplateIfNeeded({\n root: options.root,\n mode: \"test\",\n name,\n reuse: true,\n setEnv: true,\n });\n if (clone.status === \"cloned\" && options.reset !== \"none\") {\n await truncateUserTables({ adminUrl: clone.adminUrl, databaseName: clone.databaseName });\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,eAAsB,kBACpB,SACgC;CAChC,MAAM,SAAS,MAAM,gBAAgB;EACnC,MAAM,QAAQ;EACd,MAAM;EACN,OAAO;EACP,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;;;;;;;;;;;;;;;;;;;AAiCA,eAAsB,oBAAoB,UAAsC,CAAC,GAAkB;CACjG,MAAM,OACJ,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,GAAG;CAChG,MAAM,QAAQ,MAAM,0BAA0B;EAC5C,MAAM,QAAQ;EACd,MAAM;EACN;EACA,OAAO;EACP,QAAQ;CACV,CAAC;CACD,IAAI,MAAM,WAAW,YAAY,QAAQ,UAAU,QACjD,MAAM,mBAAmB;EAAE,UAAU,MAAM;EAAU,cAAc,MAAM;CAAa,CAAC;AAE3F"}
@@ -0,0 +1,92 @@
1
+ const require_lifecycle = require("./lifecycle-BCeM96tI.cjs");
2
+ const require_template = require("./template-Cd77H7Cr.cjs");
3
+ //#region src/adapters/template-mode.ts
4
+ /**
5
+ * Runner orchestration: fresh acquire → migrate → markTemplate.
6
+ * The acquire is `fresh`: leftovers a crashed earlier run left under this
7
+ * worktree's test role (TEMPLATE, worker clones) are dropped first, so migrate
8
+ * always starts from an empty database and no consumer pre-cleanup is needed.
9
+ * After acquire succeeds, migrate + markTemplate are all-or-nothing: any failure
10
+ * best-effort disposes the lease so Vitest (no separate teardown) does not leak.
11
+ * Programmatic apps that do not need a migrate hook should call core
12
+ * `acquire` + `markTemplate` + `cloneFromTemplate` + `dispose` instead.
13
+ */
14
+ async function setupTemplateMode(options) {
15
+ const result = await require_lifecycle.acquireIfNeeded({
16
+ root: options.root,
17
+ mode: "test",
18
+ fresh: true,
19
+ setEnv: options.setEnv !== false
20
+ });
21
+ if (result.status !== "acquired") return result;
22
+ try {
23
+ await options.migrate({
24
+ databaseUrl: result.databaseUrl,
25
+ adminUrl: result.adminUrl,
26
+ databaseName: result.databaseName,
27
+ roleName: result.roleName
28
+ });
29
+ await require_template.markTemplate({
30
+ root: result.root,
31
+ mode: "test",
32
+ adminUrl: result.adminUrl
33
+ });
34
+ } catch (err) {
35
+ try {
36
+ await require_lifecycle.dispose({
37
+ root: result.root,
38
+ mode: "test"
39
+ });
40
+ } catch {}
41
+ const detail = err instanceof Error ? err.message : String(err);
42
+ throw new Error(`template setup failed after acquire; cleaned up lease DB (${result.databaseName}). Fix the error and re-run: ${detail}`, { cause: err });
43
+ }
44
+ return result;
45
+ }
46
+ /**
47
+ * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),
48
+ * shared by every test file that worker runs. Call it once per test file
49
+ * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).
50
+ *
51
+ * The first file creates the clone. Later files reuse it (`reuse: true`): the
52
+ * database itself is the source of truth, so this holds even though Jest gives
53
+ * each file a fresh `globalThis` and module registry. Clones left over from a
54
+ * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.
55
+ *
56
+ * Every file then starts from empty tables with identities restarted (`reset`),
57
+ * the first file included, so file order never changes what a file sees. That
58
+ * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: "none"` to
59
+ * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)
60
+ * is never truncated.
61
+ *
62
+ * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.
63
+ */
64
+ async function cloneWorkerDatabase(options = {}) {
65
+ const name = options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);
66
+ const clone = await require_template.cloneFromTemplateIfNeeded({
67
+ root: options.root,
68
+ mode: "test",
69
+ name,
70
+ reuse: true,
71
+ setEnv: true
72
+ });
73
+ if (clone.status === "cloned" && options.reset !== "none") await require_lifecycle.truncateUserTables({
74
+ adminUrl: clone.adminUrl,
75
+ databaseName: clone.databaseName
76
+ });
77
+ }
78
+ //#endregion
79
+ Object.defineProperty(exports, "cloneWorkerDatabase", {
80
+ enumerable: true,
81
+ get: function() {
82
+ return cloneWorkerDatabase;
83
+ }
84
+ });
85
+ Object.defineProperty(exports, "setupTemplateMode", {
86
+ enumerable: true,
87
+ get: function() {
88
+ return setupTemplateMode;
89
+ }
90
+ });
91
+
92
+ //# sourceMappingURL=template-mode-DMO5-z7O.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-mode-DMO5-z7O.cjs","names":["acquireIfNeeded","markTemplate","dispose","cloneFromTemplateIfNeeded","truncateUserTables"],"sources":["../src/adapters/template-mode.ts"],"sourcesContent":["import { dispose, acquireIfNeeded, type AcquireIfNeededResult } from \"../core/lifecycle.ts\";\nimport { cloneFromTemplateIfNeeded, markTemplate } from \"../core/template.ts\";\nimport { truncateUserTables } from \"../providers/autopg.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: fresh acquire → migrate → markTemplate.\n * The acquire is `fresh`: leftovers a crashed earlier run left under this\n * worktree's test role (TEMPLATE, worker clones) are dropped first, so migrate\n * always starts from an empty database and no consumer pre-cleanup is needed.\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 fresh: true,\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 * How each file starts on the worker clone (default `\"truncate\"`):\n * - `\"truncate\"`: `TRUNCATE … RESTART IDENTITY` on every user table, so rows\n * from earlier files are gone and serial / identity IDs restart at 1.\n * - `\"none\"`: keep whatever the previous file left (app-owned reset).\n */\n reset?: \"truncate\" | \"none\";\n};\n\n/**\n * One clone per worker (`<template>_c_<JEST_WORKER_ID | VITEST_POOL_ID | pid>`),\n * shared by every test file that worker runs. Call it once per test file\n * (`beforeAll` in `setupFilesAfterEnv`, or a Vitest `setupFiles` module).\n *\n * The first file creates the clone. Later files reuse it (`reuse: true`): the\n * database itself is the source of truth, so this holds even though Jest gives\n * each file a fresh `globalThis` and module registry. Clones left over from a\n * crashed earlier run cannot leak in — `setupTemplateMode` drops them first.\n *\n * Every file then starts from empty tables with identities restarted (`reset`),\n * the first file included, so file order never changes what a file sees. That\n * also clears rows `migrate` seeded into the TEMPLATE; pass `reset: \"none\"` to\n * keep them and reset on your own. A skipped clone (external URL, `CEDAR_PG=0`)\n * is never truncated.\n *\n * Uses `cloneFromTemplateIfNeeded` (same skip policy as `acquireIfNeeded`) with `setEnv: true`.\n */\nexport async function cloneWorkerDatabase(options: CloneWorkerDatabaseOptions = {}): Promise<void> {\n const name =\n options.name ?? process.env.JEST_WORKER_ID ?? process.env.VITEST_POOL_ID ?? String(process.pid);\n const clone = await cloneFromTemplateIfNeeded({\n root: options.root,\n mode: \"test\",\n name,\n reuse: true,\n setEnv: true,\n });\n if (clone.status === \"cloned\" && options.reset !== \"none\") {\n await truncateUserTables({ adminUrl: clone.adminUrl, databaseName: clone.databaseName });\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA8BA,eAAsB,kBACpB,SACgC;CAChC,MAAM,SAAS,MAAMA,kBAAAA,gBAAgB;EACnC,MAAM,QAAQ;EACd,MAAM;EACN,OAAO;EACP,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;;;;;;;;;;;;;;;;;;;AAiCA,eAAsB,oBAAoB,UAAsC,CAAC,GAAkB;CACjG,MAAM,OACJ,QAAQ,QAAQ,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,GAAG;CAChG,MAAM,QAAQ,MAAMC,iBAAAA,0BAA0B;EAC5C,MAAM,QAAQ;EACd,MAAM;EACN;EACA,OAAO;EACP,QAAQ;CACV,CAAC;CACD,IAAI,MAAM,WAAW,YAAY,QAAQ,UAAU,QACjD,MAAMC,kBAAAA,mBAAmB;EAAE,UAAU,MAAM;EAAU,cAAc,MAAM;CAAa,CAAC;AAE3F"}
package/dist/test-env.cjs CHANGED
@@ -10,7 +10,7 @@
10
10
  * // or: setupFiles: ['@cedarjs/pg/test-env']
11
11
  * ```
12
12
  */
13
- require("./load-test-env-CkdUjTpV.cjs").loadTestEnv();
13
+ require("./load-test-env-Dcgh6YHV.cjs").loadTestEnv();
14
14
  //#endregion
15
15
 
16
16
  //# sourceMappingURL=test-env.cjs.map
package/dist/test-env.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { t as loadTestEnv } from "./load-test-env-C34wpkIX.mjs";
1
+ import { t as loadTestEnv } from "./load-test-env-BqtA6V-d.mjs";
2
2
  //#region src/adapters/test-env.ts
3
3
  /**
4
4
  * Test-runner `setupFiles` entry: inject `DATABASE_URL` from `.cedarpg/test.env`.
@@ -1,18 +1,119 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_tasks = require("./tasks-Caud9yHr.cjs");
2
+ const require_lease = require("./lease-WlmOnNDi.cjs");
3
+ const require_status = require("./status-Z_BYdxzI.cjs");
4
+ const require_studio = require("./studio-CdWIdnxr.cjs");
5
+ //#region src/adapters/vite-dev-plugin.ts
6
+ const requireVite = (0, require("node:module").createRequire)(require("url").pathToFileURL(__filename).href);
7
+ function installedViteVersion() {
8
+ try {
9
+ return requireVite("vite/package.json").version;
10
+ } catch {
11
+ return;
12
+ }
13
+ }
14
+ function viteBindsPluginShortcuts(version) {
15
+ const resolved = version ?? installedViteVersion();
16
+ if (resolved === void 0) return false;
17
+ return Number.parseInt(resolved, 10) >= 8;
18
+ }
19
+ function shouldShowPanel() {
20
+ return Boolean(process.stdin.isTTY) && !process.env.CI;
21
+ }
22
+ function logStatus(server, options) {
23
+ const status = require_status.resolveDevStatus({
24
+ root: options.root,
25
+ mode: options.mode
26
+ });
27
+ for (const line of require_studio.formatDevStatus(status)) if (status.ok) server.config.logger.info(line);
28
+ else server.config.logger.warn(line);
29
+ return status;
30
+ }
31
+ function createStudioLauncher(options) {
32
+ let studioChild;
33
+ const prefer = options.studio === false ? void 0 : options.studio;
34
+ return (s) => {
35
+ const status = logStatus(s, options);
36
+ if (!status.ok) return;
37
+ const studio = require_studio.detectStudio({
38
+ root: status.root,
39
+ cwd: options.cwd ?? s.config.root,
40
+ prefer
41
+ });
42
+ if (!studio) {
43
+ s.config.logger.warn(`${require_lease.CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)`);
44
+ return;
45
+ }
46
+ if (require_studio.studioChildRunning(studioChild)) {
47
+ s.config.logger.info(`${require_lease.CLI_NAME}: studio already running`);
48
+ return;
49
+ }
50
+ const child = require_studio.openStudio({
51
+ databaseUrl: status.databaseUrl,
52
+ studio
53
+ });
54
+ child.once("error", (err) => {
55
+ studioChild = void 0;
56
+ s.config.logger.error(`${require_lease.CLI_NAME}: studio failed: ${err.message}`);
57
+ });
58
+ child.once("exit", (code, signal) => {
59
+ studioChild = void 0;
60
+ if (code && code !== 0) s.config.logger.warn(`${require_lease.CLI_NAME}: studio exited ${code}`);
61
+ else if (signal) s.config.logger.warn(`${require_lease.CLI_NAME}: studio killed (${signal})`);
62
+ });
63
+ studioChild = child;
64
+ s.config.logger.info(`${require_lease.CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(" ")})`);
65
+ };
66
+ }
67
+ /**
68
+ * Vite / Vite+ plugin: print a cedar-pg status panel on listen and register
69
+ * CLI shortcuts (`d` status, `s` studio) on Vite 8+. Does **not** acquire —
70
+ * pair with `cedarPgTasks()` / `dependsOn: ['db:acquire']`.
71
+ *
72
+ * @param viteVersion Test-only override for the shortcut gate. Omit in production.
73
+ */
74
+ function cedarPgDev(options = {}, viteVersion) {
75
+ return {
76
+ name: "cedar-pg-dev",
77
+ configureServer(server) {
78
+ if (shouldShowPanel() && server.httpServer) server.httpServer.once("listening", () => {
79
+ logStatus(server, options);
80
+ });
81
+ if (!viteBindsPluginShortcuts(viteVersion)) return;
82
+ const dShortcut = {
83
+ key: "d",
84
+ description: "show cedar-pg database status",
85
+ action(s) {
86
+ logStatus(s, options);
87
+ }
88
+ };
89
+ const shortcuts = options.studio === false ? [dShortcut] : [dShortcut, {
90
+ key: "s",
91
+ description: "open Prisma/Drizzle studio (cedar-pg DATABASE_URL)",
92
+ action: createStudioLauncher(options)
93
+ }];
94
+ server.bindCLIShortcuts({
95
+ print: false,
96
+ customShortcuts: shortcuts
97
+ });
98
+ }
99
+ };
100
+ }
101
+ //#endregion
3
102
  //#region src/adapters/vite-plus.ts
4
103
  /**
5
104
  * Consumer adapter for external Vite+ projects.
6
105
  *
7
- * Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`
8
- * depend on cedarpg acquire.
106
+ * - `cedarPgTasks()` — merge into `run.tasks` so `vp run test` / `vp run dev`
107
+ * depend on cedarpg acquire.
108
+ * - `cedarPgDev()` — Vite plugin: status panel + `d` / `s` shortcuts on Vite 8 (no acquire).
9
109
  *
10
110
  * @example
11
111
  * ```ts
12
112
  * import { defineConfig } from 'vite-plus'
13
- * import { cedarPgTasks } from '@cedarjs/pg/vite-plus'
113
+ * import { cedarPgTasks, cedarPgDev } from '@cedarjs/pg/vite-plus'
14
114
  *
15
115
  * export default defineConfig({
116
+ * plugins: [cedarPgDev()],
16
117
  * run: {
17
118
  * tasks: {
18
119
  * ...cedarPgTasks(),
@@ -21,10 +122,11 @@ const require_tasks = require("./tasks-Caud9yHr.cjs");
21
122
  * dependsOn: ['db:acquire-test'],
22
123
  * env: ['DATABASE_URL', 'TEST_DATABASE_URL'],
23
124
  * },
125
+ * // dependsOn does not forward env: attach hands vp dev the lease URL.
24
126
  * dev: {
25
- * command: 'vp dev',
127
+ * command: 'cedarpg run --attach --mode=dev -- vp dev',
26
128
  * dependsOn: ['db:acquire'],
27
- * env: ['DATABASE_URL'],
129
+ * cache: false,
28
130
  * },
29
131
  * },
30
132
  * },
@@ -32,9 +134,10 @@ const require_tasks = require("./tasks-Caud9yHr.cjs");
32
134
  * ```
33
135
  */
34
136
  //#endregion
35
- exports.CEDAR_PG_TASK_ACQUIRE_DEV = require_tasks.CEDAR_PG_TASK_ACQUIRE_DEV;
36
- exports.CEDAR_PG_TASK_ACQUIRE_TEST = require_tasks.CEDAR_PG_TASK_ACQUIRE_TEST;
37
- exports.CEDAR_PG_TASK_DISPOSE_TEST = require_tasks.CEDAR_PG_TASK_DISPOSE_TEST;
38
- exports.cedarPgTasks = require_tasks.cedarPgLifecycleTargets;
137
+ exports.CEDAR_PG_TASK_ACQUIRE_DEV = require_studio.CEDAR_PG_TASK_ACQUIRE_DEV;
138
+ exports.CEDAR_PG_TASK_ACQUIRE_TEST = require_studio.CEDAR_PG_TASK_ACQUIRE_TEST;
139
+ exports.CEDAR_PG_TASK_DISPOSE_TEST = require_studio.CEDAR_PG_TASK_DISPOSE_TEST;
140
+ exports.cedarPgDev = cedarPgDev;
141
+ exports.cedarPgTasks = require_studio.cedarPgLifecycleTargets;
39
142
 
40
143
  //# sourceMappingURL=vite-plus.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plus.cjs","names":[],"sources":["../src/adapters/vite-plus.ts"],"sourcesContent":["/**\n * Consumer adapter for external Vite+ projects.\n *\n * Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`\n * depend on cedarpg acquire.\n *\n * @example\n * ```ts\n * import { defineConfig } from 'vite-plus'\n * import { cedarPgTasks } from '@cedarjs/pg/vite-plus'\n *\n * export default defineConfig({\n * run: {\n * tasks: {\n * ...cedarPgTasks(),\n * test: {\n * command: 'vp test',\n * dependsOn: ['db:acquire-test'],\n * env: ['DATABASE_URL', 'TEST_DATABASE_URL'],\n * },\n * dev: {\n * command: 'vp dev',\n * dependsOn: ['db:acquire'],\n * env: ['DATABASE_URL'],\n * },\n * },\n * },\n * })\n * ```\n */\n\nimport {\n cedarPgLifecycleTargets,\n type CedarPgLifecycleTarget,\n type CedarPgLifecycleTargetsOptions,\n CEDAR_PG_TASK_DISPOSE_TEST,\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n} from \"./tasks.ts\";\n\nexport {\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n CEDAR_PG_TASK_DISPOSE_TEST,\n cedarPgLifecycleTargets as cedarPgTasks,\n};\n\nexport type CedarPgTaskDef = CedarPgLifecycleTarget;\nexport type CedarPgTasksOptions = CedarPgLifecycleTargetsOptions;\n"],"mappings":""}
1
+ {"version":3,"file":"vite-plus.cjs","names":["resolveDevStatus","formatDevStatus","detectStudio","CLI_NAME","studioChildRunning","openStudio"],"sources":["../src/adapters/vite-dev-plugin.ts","../src/adapters/vite-plus.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport type { ChildProcess } from \"node:child_process\";\nimport type { Plugin, ViteDevServer } from \"vite\";\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport { resolveDevStatus, type DevStatus } from \"../core/status.ts\";\nimport type { DbMode } from \"../core/naming.ts\";\nimport { formatDevStatus } from \"./status-format.ts\";\nimport { detectStudio, openStudio, studioChildRunning, type StudioKind } from \"./studio.ts\";\n\nconst requireVite = createRequire(import.meta.url);\n\nfunction installedViteVersion(): string | undefined {\n try {\n return (requireVite(\"vite/package.json\") as { version: string }).version;\n } catch {\n return undefined;\n }\n}\n\nexport function viteBindsPluginShortcuts(version?: string): boolean {\n const resolved = version ?? installedViteVersion();\n if (resolved === undefined) return false;\n return Number.parseInt(resolved, 10) >= 8;\n}\n\nexport type CedarPgDevOptions = {\n mode?: DbMode;\n /** Worktree / lease root. Omit to resolve from cwd (git toplevel). */\n root?: string;\n /** App package to search for Prisma/Drizzle. Defaults to Vite `config.root`. */\n cwd?: string;\n /** Force Prisma/Drizzle Studio; `false` disables the `s` shortcut. Omit to auto-detect. */\n studio?: StudioKind | false;\n};\n\nfunction shouldShowPanel(): boolean {\n return Boolean(process.stdin.isTTY) && !process.env.CI;\n}\n\nfunction logStatus(server: ViteDevServer, options: CedarPgDevOptions): DevStatus {\n const status = resolveDevStatus({ root: options.root, mode: options.mode });\n for (const line of formatDevStatus(status)) {\n if (status.ok) server.config.logger.info(line);\n else server.config.logger.warn(line);\n }\n return status;\n}\n\nfunction createStudioLauncher(options: CedarPgDevOptions): (s: ViteDevServer) => void {\n let studioChild: ChildProcess | undefined;\n const prefer = options.studio === false ? undefined : options.studio;\n return (s) => {\n const status = logStatus(s, options);\n if (!status.ok) return;\n\n const studio = detectStudio({\n root: status.root,\n cwd: options.cwd ?? s.config.root,\n prefer,\n });\n if (!studio) {\n s.config.logger.warn(\n `${CLI_NAME}: no Prisma or Drizzle Studio found (install prisma or drizzle-kit)`,\n );\n return;\n }\n\n if (studioChildRunning(studioChild)) {\n s.config.logger.info(`${CLI_NAME}: studio already running`);\n return;\n }\n\n const child = openStudio({ databaseUrl: status.databaseUrl, studio });\n child.once(\"error\", (err) => {\n studioChild = undefined;\n s.config.logger.error(`${CLI_NAME}: studio failed: ${err.message}`);\n });\n child.once(\"exit\", (code, signal) => {\n studioChild = undefined;\n if (code && code !== 0) {\n s.config.logger.warn(`${CLI_NAME}: studio exited ${code}`);\n } else if (signal) {\n s.config.logger.warn(`${CLI_NAME}: studio killed (${signal})`);\n }\n });\n studioChild = child;\n s.config.logger.info(\n `${CLI_NAME}: opening ${studio.kind} studio (${studio.command} ${studio.args.join(\" \")})`,\n );\n };\n}\n\n/**\n * Vite / Vite+ plugin: print a cedar-pg status panel on listen and register\n * CLI shortcuts (`d` status, `s` studio) on Vite 8+. Does **not** acquire —\n * pair with `cedarPgTasks()` / `dependsOn: ['db:acquire']`.\n *\n * @param viteVersion Test-only override for the shortcut gate. Omit in production.\n */\nexport function cedarPgDev(options: CedarPgDevOptions = {}, viteVersion?: string): Plugin {\n return {\n name: \"cedar-pg-dev\",\n configureServer(server) {\n if (shouldShowPanel() && server.httpServer) {\n server.httpServer.once(\"listening\", () => {\n logStatus(server, options);\n });\n }\n\n if (!viteBindsPluginShortcuts(viteVersion)) {\n return;\n }\n\n const dShortcut = {\n key: \"d\",\n description: \"show cedar-pg database status\",\n action(s: ViteDevServer) {\n logStatus(s, options);\n },\n };\n const shortcuts =\n options.studio === false\n ? [dShortcut]\n : [\n dShortcut,\n {\n key: \"s\",\n description: \"open Prisma/Drizzle studio (cedar-pg DATABASE_URL)\",\n action: createStudioLauncher(options),\n },\n ];\n\n server.bindCLIShortcuts({\n print: false,\n customShortcuts: shortcuts,\n });\n },\n };\n}\n","/**\n * Consumer adapter for external Vite+ projects.\n *\n * - `cedarPgTasks()` — merge into `run.tasks` so `vp run test` / `vp run dev`\n * depend on cedarpg acquire.\n * - `cedarPgDev()` — Vite plugin: status panel + `d` / `s` shortcuts on Vite 8 (no acquire).\n *\n * @example\n * ```ts\n * import { defineConfig } from 'vite-plus'\n * import { cedarPgTasks, cedarPgDev } from '@cedarjs/pg/vite-plus'\n *\n * export default defineConfig({\n * plugins: [cedarPgDev()],\n * run: {\n * tasks: {\n * ...cedarPgTasks(),\n * test: {\n * command: 'vp test',\n * dependsOn: ['db:acquire-test'],\n * env: ['DATABASE_URL', 'TEST_DATABASE_URL'],\n * },\n * // dependsOn does not forward env: attach hands vp dev the lease URL.\n * dev: {\n * command: 'cedarpg run --attach --mode=dev -- vp dev',\n * dependsOn: ['db:acquire'],\n * cache: false,\n * },\n * },\n * },\n * })\n * ```\n */\n\nimport {\n cedarPgLifecycleTargets,\n type CedarPgLifecycleTarget,\n type CedarPgLifecycleTargetsOptions,\n CEDAR_PG_TASK_DISPOSE_TEST,\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n} from \"./tasks.ts\";\n\nexport {\n CEDAR_PG_TASK_ACQUIRE_DEV,\n CEDAR_PG_TASK_ACQUIRE_TEST,\n CEDAR_PG_TASK_DISPOSE_TEST,\n cedarPgLifecycleTargets as cedarPgTasks,\n};\n\nexport type CedarPgTaskDef = CedarPgLifecycleTarget;\nexport type CedarPgTasksOptions = CedarPgLifecycleTargetsOptions;\n\nexport { cedarPgDev } from \"./vite-dev-plugin.ts\";\nexport type { CedarPgDevOptions } from \"./vite-dev-plugin.ts\";\n"],"mappings":";;;;;AASA,MAAM,eAAA,wBAAA,CAAA,CAAA,cAAA,CAAA,QAAA,KAAA,CAAA,CAAA,cAAA,UAAA,CAAA,CAAA,IAA2C;AAEjD,SAAS,uBAA2C;CAClD,IAAI;EACF,OAAQ,YAAY,mBAAmB,CAAC,CAAyB;CACnE,QAAQ;EACN;CACF;AACF;AAEA,SAAgB,yBAAyB,SAA2B;CAClE,MAAM,WAAW,WAAW,qBAAqB;CACjD,IAAI,aAAa,KAAA,GAAW,OAAO;CACnC,OAAO,OAAO,SAAS,UAAU,EAAE,KAAK;AAC1C;AAYA,SAAS,kBAA2B;CAClC,OAAO,QAAQ,QAAQ,MAAM,KAAK,KAAK,CAAC,QAAQ,IAAI;AACtD;AAEA,SAAS,UAAU,QAAuB,SAAuC;CAC/E,MAAM,SAASA,eAAAA,iBAAiB;EAAE,MAAM,QAAQ;EAAM,MAAM,QAAQ;CAAK,CAAC;CAC1E,KAAK,MAAM,QAAQC,eAAAA,gBAAgB,MAAM,GACvC,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,KAAK,IAAI;MACxC,OAAO,OAAO,OAAO,KAAK,IAAI;CAErC,OAAO;AACT;AAEA,SAAS,qBAAqB,SAAwD;CACpF,IAAI;CACJ,MAAM,SAAS,QAAQ,WAAW,QAAQ,KAAA,IAAY,QAAQ;CAC9D,QAAQ,MAAM;EACZ,MAAM,SAAS,UAAU,GAAG,OAAO;EACnC,IAAI,CAAC,OAAO,IAAI;EAEhB,MAAM,SAASC,eAAAA,aAAa;GAC1B,MAAM,OAAO;GACb,KAAK,QAAQ,OAAO,EAAE,OAAO;GAC7B;EACF,CAAC;EACD,IAAI,CAAC,QAAQ;GACX,EAAE,OAAO,OAAO,KACd,GAAGC,cAAAA,SAAS,oEACd;GACA;EACF;EAEA,IAAIC,eAAAA,mBAAmB,WAAW,GAAG;GACnC,EAAE,OAAO,OAAO,KAAK,GAAGD,cAAAA,SAAS,yBAAyB;GAC1D;EACF;EAEA,MAAM,QAAQE,eAAAA,WAAW;GAAE,aAAa,OAAO;GAAa;EAAO,CAAC;EACpE,MAAM,KAAK,UAAU,QAAQ;GAC3B,cAAc,KAAA;GACd,EAAE,OAAO,OAAO,MAAM,GAAGF,cAAAA,SAAS,mBAAmB,IAAI,SAAS;EACpE,CAAC;EACD,MAAM,KAAK,SAAS,MAAM,WAAW;GACnC,cAAc,KAAA;GACd,IAAI,QAAQ,SAAS,GACnB,EAAE,OAAO,OAAO,KAAK,GAAGA,cAAAA,SAAS,kBAAkB,MAAM;QACpD,IAAI,QACT,EAAE,OAAO,OAAO,KAAK,GAAGA,cAAAA,SAAS,mBAAmB,OAAO,EAAE;EAEjE,CAAC;EACD,cAAc;EACd,EAAE,OAAO,OAAO,KACd,GAAGA,cAAAA,SAAS,YAAY,OAAO,KAAK,WAAW,OAAO,QAAQ,GAAG,OAAO,KAAK,KAAK,GAAG,EAAE,EACzF;CACF;AACF;;;;;;;;AASA,SAAgB,WAAW,UAA6B,CAAC,GAAG,aAA8B;CACxF,OAAO;EACL,MAAM;EACN,gBAAgB,QAAQ;GACtB,IAAI,gBAAgB,KAAK,OAAO,YAC9B,OAAO,WAAW,KAAK,mBAAmB;IACxC,UAAU,QAAQ,OAAO;GAC3B,CAAC;GAGH,IAAI,CAAC,yBAAyB,WAAW,GACvC;GAGF,MAAM,YAAY;IAChB,KAAK;IACL,aAAa;IACb,OAAO,GAAkB;KACvB,UAAU,GAAG,OAAO;IACtB;GACF;GACA,MAAM,YACJ,QAAQ,WAAW,QACf,CAAC,SAAS,IACV,CACE,WACA;IACE,KAAK;IACL,aAAa;IACb,QAAQ,qBAAqB,OAAO;GACtC,CACF;GAEN,OAAO,iBAAiB;IACtB,OAAO;IACP,iBAAiB;GACnB,CAAC;EACH;CACF;AACF"}
@@ -1,7 +1,46 @@
1
- import { a as CedarPgLifecycleTargetsOptions, i as CedarPgLifecycleTarget, n as CEDAR_PG_TASK_ACQUIRE_TEST, o as cedarPgLifecycleTargets, r as CEDAR_PG_TASK_DISPOSE_TEST, t as CEDAR_PG_TASK_ACQUIRE_DEV } from "./tasks-DdQoP9We.cjs";
1
+ import { t as DbMode } from "./naming-Df4fz_Fb.cjs";
2
+ import { Plugin } from "vite";
3
+ //#region src/adapters/tasks.d.ts
4
+ /** Vite+ lifecycle task names and command strings (also used by the status hint). */
5
+ declare const CEDAR_PG_TASK_ACQUIRE_DEV = "db:acquire";
6
+ declare const CEDAR_PG_TASK_ACQUIRE_TEST = "db:acquire-test";
7
+ declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
8
+ type CedarPgLifecycleTarget = {
9
+ command: string;
10
+ cache?: boolean;
11
+ };
12
+ type CedarPgLifecycleTargetsOptions = {
13
+ bin?: string;
14
+ /** Include dispose-test target (default: true). */
15
+ includeDisposeTest?: boolean;
16
+ };
17
+ declare function cedarPgLifecycleTargets(options?: CedarPgLifecycleTargetsOptions): Record<string, CedarPgLifecycleTarget>;
18
+ //#endregion
19
+ //#region src/adapters/studio.d.ts
20
+ type StudioKind = "prisma" | "drizzle";
21
+ //#endregion
22
+ //#region src/adapters/vite-dev-plugin.d.ts
23
+ type CedarPgDevOptions = {
24
+ mode?: DbMode;
25
+ /** Worktree / lease root. Omit to resolve from cwd (git toplevel). */
26
+ root?: string;
27
+ /** App package to search for Prisma/Drizzle. Defaults to Vite `config.root`. */
28
+ cwd?: string;
29
+ /** Force Prisma/Drizzle Studio; `false` disables the `s` shortcut. Omit to auto-detect. */
30
+ studio?: StudioKind | false;
31
+ };
32
+ /**
33
+ * Vite / Vite+ plugin: print a cedar-pg status panel on listen and register
34
+ * CLI shortcuts (`d` status, `s` studio) on Vite 8+. Does **not** acquire —
35
+ * pair with `cedarPgTasks()` / `dependsOn: ['db:acquire']`.
36
+ *
37
+ * @param viteVersion Test-only override for the shortcut gate. Omit in production.
38
+ */
39
+ declare function cedarPgDev(options?: CedarPgDevOptions, viteVersion?: string): Plugin;
40
+ //#endregion
2
41
  //#region src/adapters/vite-plus.d.ts
3
42
  type CedarPgTaskDef = CedarPgLifecycleTarget;
4
43
  type CedarPgTasksOptions = CedarPgLifecycleTargetsOptions;
5
44
  //#endregion
6
- export { CEDAR_PG_TASK_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST, CEDAR_PG_TASK_DISPOSE_TEST, CedarPgTaskDef, CedarPgTasksOptions, cedarPgLifecycleTargets as cedarPgTasks };
45
+ export { CEDAR_PG_TASK_ACQUIRE_DEV, CEDAR_PG_TASK_ACQUIRE_TEST, CEDAR_PG_TASK_DISPOSE_TEST, type CedarPgDevOptions, CedarPgTaskDef, CedarPgTasksOptions, cedarPgDev, cedarPgLifecycleTargets as cedarPgTasks };
7
46
  //# sourceMappingURL=vite-plus.d.cts.map