@cedarjs/pg 0.1.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/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/cli.cjs +139 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/cli.d.cts +1 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +140 -0
- package/dist/cli.mjs.map +1 -0
- package/dist/constants-B7sCf4fg.cjs +41 -0
- package/dist/constants-B7sCf4fg.cjs.map +1 -0
- package/dist/constants-YnHDwShD.mjs +24 -0
- package/dist/constants-YnHDwShD.mjs.map +1 -0
- package/dist/index.cjs +26 -0
- package/dist/index.d.cts +201 -0
- package/dist/index.d.mts +201 -0
- package/dist/index.mjs +2 -0
- package/dist/jest.cjs +28 -0
- package/dist/jest.cjs.map +1 -0
- package/dist/jest.d.cts +14 -0
- package/dist/jest.d.mts +14 -0
- package/dist/jest.mjs +23 -0
- package/dist/jest.mjs.map +1 -0
- package/dist/lifecycle-D10usEjM.cjs +743 -0
- package/dist/lifecycle-D10usEjM.cjs.map +1 -0
- package/dist/lifecycle-PbTXNC2Z.mjs +577 -0
- package/dist/lifecycle-PbTXNC2Z.mjs.map +1 -0
- package/dist/nx.cjs +35 -0
- package/dist/nx.cjs.map +1 -0
- package/dist/nx.d.cts +26 -0
- package/dist/nx.d.mts +26 -0
- package/dist/nx.mjs +34 -0
- package/dist/nx.mjs.map +1 -0
- package/dist/tasks-CW2D0n46.mjs +16 -0
- package/dist/tasks-CW2D0n46.mjs.map +1 -0
- package/dist/tasks-DZ7hMmGJ.cjs +21 -0
- package/dist/tasks-DZ7hMmGJ.cjs.map +1 -0
- package/dist/vite-plus.cjs +65 -0
- package/dist/vite-plus.cjs.map +1 -0
- package/dist/vite-plus.d.cts +51 -0
- package/dist/vite-plus.d.mts +51 -0
- package/dist/vite-plus.mjs +61 -0
- package/dist/vite-plus.mjs.map +1 -0
- package/dist/vitest.cjs +33 -0
- package/dist/vitest.cjs.map +1 -0
- package/dist/vitest.d.cts +17 -0
- package/dist/vitest.d.mts +17 -0
- package/dist/vitest.mjs +28 -0
- package/dist/vitest.mjs.map +1 -0
- package/package.json +96 -0
- package/scripts/postinstall.js +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-PbTXNC2Z.mjs","names":[],"sources":["../src/core/naming.ts","../src/core/lease.ts","../src/core/policy.ts","../src/core/worktree.ts","../src/providers/autopg.ts","../src/core/lifecycle.ts"],"sourcesContent":["import type { WorktreeIdentity } from \"./worktree.ts\";\n\nexport type DbMode = \"dev\" | \"test\";\n\nconst PG_MAX = 63;\nconst PREFIX = \"cpg_\";\n\n/**\n * Build an observable Postgres database name:\n * cpg_<repoSlug>_<worktreeSlug>_<mode>_<pathHash8>\n *\n * Never drops `mode` or `pathHash`. Truncates slugs to fit ≤63 chars.\n */\nexport function buildDatabaseName(identity: WorktreeIdentity, mode: DbMode): string {\n const modePart = mode;\n const hashPart = identity.pathHash;\n // PREFIX + slug + '_' + slug + '_' + mode + '_' + hash\n // fixed: PREFIX(4) + 2 underscores around mode/hash segments + mode + hash\n // layout: cpg_<repo>_<wt>_<mode>_<hash>\n const fixed =\n PREFIX.length +\n 1 + // after repo\n 1 + // after worktree\n modePart.length +\n 1 +\n hashPart.length;\n\n let budget = PG_MAX - fixed;\n if (budget < 2) {\n // Extreme truncation: keep mode+hash, minimal slugs\n return `${PREFIX}${modePart}_${hashPart}`.slice(0, PG_MAX);\n }\n\n let repo = identity.repoSlug;\n let wt = identity.worktreeSlug;\n // Split budget roughly evenly, preferring to keep both readable\n while (repo.length + wt.length > budget) {\n if (repo.length >= wt.length && repo.length > 1) {\n repo = repo.slice(0, -1);\n } else if (wt.length > 1) {\n wt = wt.slice(0, -1);\n } else {\n break;\n }\n }\n\n const name = `${PREFIX}${repo}_${wt}_${modePart}_${hashPart}`;\n if (name.length > PG_MAX) {\n return name.slice(0, PG_MAX);\n }\n return name;\n}\n\nexport function buildRoleName(databaseName: string): string {\n const suffix = \"_role\";\n const maxBase = PG_MAX - suffix.length;\n const base = databaseName.slice(0, maxBase);\n return `${base}${suffix}`;\n}\n","import {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { STATE_DIRNAME } from \"./constants.ts\";\nimport type { DbMode } from \"./naming.ts\";\n\nexport type Lease = {\n schemaVersion: 1;\n mode: DbMode;\n root: string;\n repoSlug: string;\n worktreeSlug: string;\n pathHash: string;\n databaseName: string;\n roleName: string;\n port: number;\n pid: number;\n createdAt: string;\n};\n\nfunction isDbMode(value: unknown): value is DbMode {\n return value === \"dev\" || value === \"test\";\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/** Narrow-parse a lease; reject incomplete or wrong-version records. */\nexport function parseLease(raw: unknown): Lease | null {\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n if (o.schemaVersion !== 1) return null;\n if (!isDbMode(o.mode)) return null;\n if (!isNonEmptyString(o.root)) return null;\n if (!isNonEmptyString(o.repoSlug)) return null;\n if (!isNonEmptyString(o.worktreeSlug)) return null;\n if (!isNonEmptyString(o.pathHash)) return null;\n if (!isNonEmptyString(o.databaseName)) return null;\n if (!isNonEmptyString(o.roleName)) return null;\n if (typeof o.port !== \"number\") return null;\n if (typeof o.pid !== \"number\") return null;\n if (!isNonEmptyString(o.createdAt)) return null;\n return {\n schemaVersion: 1,\n mode: o.mode,\n root: o.root,\n repoSlug: o.repoSlug,\n worktreeSlug: o.worktreeSlug,\n pathHash: o.pathHash,\n databaseName: o.databaseName,\n roleName: o.roleName,\n port: o.port,\n pid: o.pid,\n createdAt: o.createdAt,\n };\n}\n\nexport function leaseDir(root: string): string {\n return join(root, STATE_DIRNAME);\n}\n\nexport function leasePath(root: string, mode: DbMode): string {\n return join(leaseDir(root), `${mode}.json`);\n}\n\n/** Durable registry outside worktrees so GC can find orphans after a checkout is deleted. */\nexport function registryDir(): string {\n return process.env.CEDAR_PG_REGISTRY_DIR || join(homedir(), STATE_DIRNAME, \"registry\");\n}\n\nfunction registryPath(databaseName: string): string {\n return join(registryDir(), `${databaseName}.json`);\n}\n\nfunction writeJsonAtomic(file: string, value: unknown): void {\n mkdirSync(dirname(file), { recursive: true, mode: 0o700 });\n const tmp = `${file}.tmp.${process.pid}`;\n writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600 });\n renameSync(tmp, file);\n}\n\nfunction registerLease(lease: Lease): void {\n writeJsonAtomic(registryPath(lease.databaseName), lease);\n}\n\nfunction unregisterLease(databaseName: string): void {\n try {\n unlinkSync(registryPath(databaseName));\n } catch {\n // missing is fine\n }\n}\n\nfunction peekDatabaseName(root: string, mode: DbMode): string | undefined {\n const file = leasePath(root, mode);\n if (!existsSync(file)) return undefined;\n try {\n const raw = JSON.parse(readFileSync(file, \"utf8\")) as { databaseName?: unknown };\n return typeof raw.databaseName === \"string\" && raw.databaseName ? raw.databaseName : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function readLease(root: string, mode: DbMode): Lease | null {\n const file = leasePath(root, mode);\n if (!existsSync(file)) return null;\n try {\n return parseLease(JSON.parse(readFileSync(file, \"utf8\")));\n } catch {\n return null;\n }\n}\n\n/**\n * Persist lease. Registry is written first (GC source of truth), then the worktree cache.\n */\nexport function writeLease(lease: Lease): void {\n registerLease(lease);\n const dir = leaseDir(lease.root);\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n writeJsonAtomic(leasePath(lease.root, lease.mode), lease);\n}\n\n/**\n * Remove registry entry by databaseName and best-effort delete the worktree lease file.\n * Call only after a successful DROP (or when intentionally abandoning tracking).\n */\nexport function forgetLease(lease: Pick<Lease, \"root\" | \"mode\" | \"databaseName\">): void {\n unregisterLease(lease.databaseName);\n try {\n unlinkSync(leasePath(lease.root, lease.mode));\n } catch {\n // root or file may already be gone\n }\n}\n\n/**\n * Clear worktree lease + registry. Unregisters by databaseName even when the local\n * file fails full parse (peeks databaseName from raw JSON).\n */\nexport function clearLease(root: string, mode: DbMode): void {\n const existing = readLease(root, mode);\n if (existing) {\n forgetLease(existing);\n return;\n }\n const databaseName = peekDatabaseName(root, mode);\n try {\n unlinkSync(leasePath(root, mode));\n } catch {\n // missing is fine\n }\n if (databaseName) {\n unregisterLease(databaseName);\n }\n}\n\n/** All registry entries (used by gc). */\nexport function listRegistryLeases(): Lease[] {\n const dir = registryDir();\n if (!existsSync(dir)) return [];\n const out: Lease[] = [];\n for (const name of readdirSync(dir)) {\n if (!name.endsWith(\".json\")) continue;\n try {\n const lease = parseLease(JSON.parse(readFileSync(join(dir, name), \"utf8\")));\n if (lease) out.push(lease);\n } catch {\n // skip corrupt\n }\n }\n return out;\n}\n\nexport function isOrphanLease(lease: Lease): boolean {\n return !existsSync(lease.root);\n}\n","/**\n * Shared ensure skip policy for test-runner adapters and Cedar CLI bridges.\n */\n\nexport type EnsureSkip =\n | { skip: false }\n | { skip: true; reason: \"disabled\" }\n | { skip: true; reason: \"external-url\"; databaseUrl: string };\n\nexport type ResolveEnsureSkipInput = {\n /** Candidate URL (TEST_DATABASE_URL for tests, DATABASE_URL for dev). */\n url?: string;\n /** When true, never skip (CEDAR_PG_FORCE=1). */\n force?: boolean;\n /**\n * When true, skip ensure entirely.\n * Defaults from CEDAR_PG=0|false (opt-out adapters). Pass `false` for Cedar opt-in flows.\n */\n disabled?: boolean;\n};\n\n/**\n * True when the URL looks like a cedarpg provisioned database (`cpg_*` name/role).\n * These must never be treated as an external escape hatch — always re-ensure so\n * disposed/stale shell env cannot skip provisioning.\n */\nexport function isCedarPgManagedUrl(url: string | undefined): boolean {\n if (!url || url.startsWith(\"file:\")) return false;\n try {\n const parsed = new URL(url);\n const databaseName = decodeURIComponent(\n (parsed.pathname.replace(/^\\//, \"\").split(\"?\")[0] ?? \"\").trim(),\n );\n const user = decodeURIComponent(parsed.username);\n return databaseName.startsWith(\"cpg_\") || user.startsWith(\"cpg_\");\n } catch {\n return false;\n }\n}\n\n/**\n * True when `url` is a real external database and ensure should be skipped.\n * Sqlite `file:` URLs and cedarpg `cpg_*` URLs are not external.\n */\nexport function isExternalDatabaseEscapeHatch(url: string | undefined): boolean {\n if (!url) return false;\n if (url.startsWith(\"file:\")) return false;\n if (isCedarPgManagedUrl(url)) return false;\n return true;\n}\n\n/**\n * Decide whether ensure should run.\n * Adapters may call with no args (env defaults). Cedar opt-in should pass `disabled: false`\n * and the relevant `url` (`DATABASE_URL` or `TEST_DATABASE_URL`).\n */\nexport function resolveEnsureSkip(input: ResolveEnsureSkipInput = {}): EnsureSkip {\n const disabled =\n input.disabled ?? (process.env.CEDAR_PG === \"0\" || process.env.CEDAR_PG === \"false\");\n if (disabled) {\n return { skip: true, reason: \"disabled\" };\n }\n\n const force = input.force ?? process.env.CEDAR_PG_FORCE === \"1\";\n if (force) {\n return { skip: false };\n }\n\n const url = input.url !== undefined ? input.url : process.env.TEST_DATABASE_URL;\n if (url && isExternalDatabaseEscapeHatch(url)) {\n return { skip: true, reason: \"external-url\", databaseUrl: url };\n }\n return { skip: false };\n}\n","import { createHash } from \"node:crypto\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { execFileSync } from \"node:child_process\";\n\nexport type WorktreeIdentity = {\n /** Absolute path to the worktree / project root. */\n root: string;\n /** Basename of the git common dir / main checkout (e.g. `cedar`). */\n repoSlug: string;\n /** Basename of this worktree directory (e.g. `feat-auth`). */\n worktreeSlug: string;\n /** First 8 hex chars of sha256(absolute root). */\n pathHash: string;\n};\n\nfunction git(args: string[], cwd: string): string | null {\n try {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n }).trim();\n } catch {\n return null;\n }\n}\n\nfunction sanitizeSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_|_$/g, \"\");\n}\n\n/**\n * Resolve the project / worktree root.\n * Explicit `root` wins (app project path). Otherwise prefer git toplevel, then cwd.\n */\nexport function resolveRoot(root?: string): string {\n if (root) return resolve(root);\n const start = resolve(process.cwd());\n const toplevel = git([\"rev-parse\", \"--show-toplevel\"], start);\n if (toplevel) return toplevel;\n return start;\n}\n\n/**\n * Identify repo + worktree for observable DB naming.\n */\nexport function resolveWorktreeIdentity(root?: string): WorktreeIdentity {\n const absRoot = resolveRoot(root);\n const pathHash = createHash(\"sha256\").update(absRoot).digest(\"hex\").slice(0, 8);\n\n const commonDir = git([\"rev-parse\", \"--git-common-dir\"], absRoot);\n let repoSlug = sanitizeSlug(basename(absRoot));\n if (commonDir) {\n // common-dir is often `<main>/.git` or an absolute path to the main .git\n const commonAbs = resolve(absRoot, commonDir);\n // If commonAbs ends with `.git`, parent is main worktree root\n const mainRoot = basename(commonAbs) === \".git\" ? dirname(commonAbs) : commonAbs;\n // For linked worktrees, common-dir may be `.../main/.git`\n const candidate = basename(mainRoot) === \".git\" ? dirname(mainRoot) : mainRoot;\n const fromGit = sanitizeSlug(basename(candidate));\n if (fromGit) repoSlug = fromGit;\n }\n\n // Prefer gitdir worktree name when present (`.git` file pointing at worktrees/<name>)\n let worktreeSlug = sanitizeSlug(basename(absRoot));\n const gitFile = resolve(absRoot, \".git\");\n if (existsSync(gitFile)) {\n try {\n const content = readFileSync(gitFile, \"utf8\").trim();\n const match = content.match(/gitdir:\\s*(.+)$/m);\n if (match?.[1]) {\n const gitdir = resolve(absRoot, match[1].trim());\n // .../.git/worktrees/<name>\n const parts = gitdir.split(/[/\\\\]/);\n const wtIdx = parts.lastIndexOf(\"worktrees\");\n if (wtIdx >= 0 && parts[wtIdx + 1]) {\n const fromWt = sanitizeSlug(parts[wtIdx + 1]!);\n if (fromWt) worktreeSlug = fromWt;\n }\n }\n } catch {\n // keep basename slug\n }\n }\n\n if (!repoSlug) repoSlug = \"repo\";\n if (!worktreeSlug) worktreeSlug = \"wt\";\n\n return { root: absRoot, repoSlug, worktreeSlug, pathHash };\n}\n","import { createHash } from \"node:crypto\";\nimport { execFileSync, spawnSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport pg from \"pg\";\nimport { PASSWORD_SALT_PREFIX } from \"../core/constants.ts\";\n\nexport type AutopgDiscovery = {\n port: number;\n adminUrl: string;\n bin: string;\n};\n\nexport const INSTALL_HINT =\n \"autopg is required. Install with:\\n\" +\n \" curl -fsSL https://raw.githubusercontent.com/automagik-dev/autopg/main/install.sh | bash\\n\" +\n \"Then ensure ~/.local/bin is on PATH, or set AUTOPG_BIN.\";\n\n/** Password scheme v1: sha256(PASSWORD_SALT_PREFIX + \"\\\\0\" + databaseName) hex[:32]. Frozen for URL rebuild. */\nexport const ROLE_PASSWORD_SCHEME = \"v1\" as const;\n\nfunction candidateBins(): string[] {\n const out: string[] = [];\n if (process.env.AUTOPG_BIN) out.push(process.env.AUTOPG_BIN);\n out.push(\"autopg\");\n out.push(join(homedir(), \".local\", \"bin\", \"autopg\"));\n return out;\n}\n\nexport function resolveAutopgBin(): string | null {\n for (const bin of candidateBins()) {\n if (bin === \"autopg\") {\n const which = spawnSync(\"which\", [\"autopg\"], { encoding: \"utf8\" });\n if (which.status === 0 && which.stdout.trim()) return which.stdout.trim();\n continue;\n }\n if (existsSync(bin)) return bin;\n }\n return null;\n}\n\nexport function requireAutopgBin(): string {\n const bin = resolveAutopgBin();\n if (!bin) {\n throw new Error(INSTALL_HINT);\n }\n return bin;\n}\n\n/**\n * Parse `autopg status --json` output. Requires a numeric port and running !== false.\n */\nexport function parseHostStatus(json: string): { port: number } {\n let parsed: { port?: unknown; running?: unknown };\n try {\n parsed = JSON.parse(json) as { port?: unknown; running?: unknown };\n } catch {\n throw new Error(`autopg status --json returned invalid JSON.\\n${INSTALL_HINT}`);\n }\n if (typeof parsed.port !== \"number\") {\n throw new Error(`autopg status --json missing numeric port.\\n${INSTALL_HINT}`);\n }\n if (parsed.running === false) {\n throw new Error(`autopg host is not running.\\n${INSTALL_HINT}`);\n }\n return { port: parsed.port };\n}\n\nfunction adminUrlFor(port: number): string {\n return `postgresql://postgres:postgres@127.0.0.1:${port}/postgres`;\n}\n\n/**\n * Discover a live autopg host via `autopg status --json`. Throws if the host is not proven live.\n */\nexport function discoverHost(bin = requireAutopgBin()): AutopgDiscovery {\n let status: string;\n try {\n status = execFileSync(bin, [\"status\", \"--json\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to query autopg status.\\n${detail}\\n${INSTALL_HINT}`);\n }\n const { port } = parseHostStatus(status);\n return { port, adminUrl: adminUrlFor(port), bin };\n}\n\n/**\n * Ensure the host postmaster is up. Runs `autopg install` only after status fails, then re-discovers.\n */\nexport function ensureHostRunning(bin = requireAutopgBin()): AutopgDiscovery {\n try {\n return discoverHost(bin);\n } catch {\n // status failed — attempt install, then require a successful rediscovery\n }\n\n const install = spawnSync(bin, [\"install\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n if (install.status !== 0) {\n throw new Error(\n `Failed to start autopg host (exit ${install.status}).\\n` +\n `${install.stderr || install.stdout || \"\"}\\n${INSTALL_HINT}`,\n );\n }\n return discoverHost(bin);\n}\n\nfunction quoteIdent(name: string): string {\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction quoteLiteral(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\n/**\n * Deterministic local-only password for an app role (Prisma/TCP need it;\n * autopg hba uses `password` for 127.0.0.1).\n */\nexport function rolePasswordFor(databaseName: string): string {\n return createHash(\"sha256\")\n .update(`${PASSWORD_SALT_PREFIX}\\0${databaseName}`)\n .digest(\"hex\")\n .slice(0, 32);\n}\n\n/**\n * Idempotently CREATE ROLE + CREATE DATABASE with cedar-pg owned names.\n */\nexport async function ensureDatabase(opts: {\n adminUrl: string;\n databaseName: string;\n roleName: string;\n password?: string;\n}): Promise<void> {\n const password = opts.password ?? rolePasswordFor(opts.databaseName);\n const client = new pg.Client({ connectionString: opts.adminUrl });\n await client.connect();\n try {\n const roleExists = await client.query(\"SELECT 1 FROM pg_roles WHERE rolname = $1\", [\n opts.roleName,\n ]);\n if (roleExists.rowCount === 0) {\n await client.query(\n `CREATE ROLE ${quoteIdent(opts.roleName)} WITH LOGIN PASSWORD ${quoteLiteral(password)}`,\n );\n } else {\n await client.query(\n `ALTER ROLE ${quoteIdent(opts.roleName)} WITH LOGIN PASSWORD ${quoteLiteral(password)}`,\n );\n }\n\n const dbExists = await client.query(\"SELECT 1 FROM pg_database WHERE datname = $1\", [\n opts.databaseName,\n ]);\n if (dbExists.rowCount === 0) {\n await client.query(\n `CREATE DATABASE ${quoteIdent(opts.databaseName)} OWNER ${quoteIdent(opts.roleName)}`,\n );\n } else {\n await client.query(\n `ALTER DATABASE ${quoteIdent(opts.databaseName)} OWNER TO ${quoteIdent(opts.roleName)}`,\n );\n }\n } finally {\n await client.end();\n }\n}\n\n/**\n * DROP DATABASE (force terminate backends) + DROP ROLE.\n */\nexport async function dropDatabase(opts: {\n adminUrl: string;\n databaseName: string;\n roleName: string;\n}): Promise<void> {\n const client = new pg.Client({ connectionString: opts.adminUrl });\n await client.connect();\n try {\n await client.query(\n `\n SELECT pg_terminate_backend(pid)\n FROM pg_stat_activity\n WHERE datname = $1 AND pid <> pg_backend_pid()\n `,\n [opts.databaseName],\n );\n await client.query(`DROP DATABASE IF EXISTS ${quoteIdent(opts.databaseName)}`);\n const owns = await client.query(\n `SELECT 1 FROM pg_database WHERE datdba = (SELECT oid FROM pg_roles WHERE rolname = $1) LIMIT 1`,\n [opts.roleName],\n );\n if (owns.rowCount === 0) {\n await client.query(`DROP ROLE IF EXISTS ${quoteIdent(opts.roleName)}`);\n }\n } finally {\n await client.end();\n }\n}\n\nexport function buildDatabaseUrl(opts: {\n port: number;\n databaseName: string;\n roleName: string;\n password?: string;\n}): string {\n const password = opts.password ?? rolePasswordFor(opts.databaseName);\n const user = encodeURIComponent(opts.roleName);\n const pass = encodeURIComponent(password);\n return `postgresql://${user}:${pass}@127.0.0.1:${opts.port}/${opts.databaseName}`;\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { buildDatabaseName, buildRoleName, type DbMode } from \"./naming.ts\";\nimport {\n forgetLease,\n isOrphanLease,\n leaseDir,\n listRegistryLeases,\n readLease,\n writeLease,\n type Lease,\n} from \"./lease.ts\";\nimport { resolveEnsureSkip, type ResolveEnsureSkipInput } from \"./policy.ts\";\nimport { resolveWorktreeIdentity } from \"./worktree.ts\";\nimport {\n buildDatabaseUrl,\n dropDatabase,\n ensureDatabase,\n ensureHostRunning,\n} from \"../providers/autopg.ts\";\n\nfunction writeEnvFile(root: string, mode: DbMode, databaseUrl: string): void {\n const dir = leaseDir(root);\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n let body = `DATABASE_URL=${databaseUrl}\\n`;\n if (mode === \"test\") body += `TEST_DATABASE_URL=${databaseUrl}\\n`;\n writeFileSync(join(dir, `${mode}.env`), body, { mode: 0o600 });\n}\n\nexport function urlFromLease(lease: Lease): string {\n return buildDatabaseUrl({\n port: lease.port,\n databaseName: lease.databaseName,\n roleName: lease.roleName,\n });\n}\n\n/**\n * DROP the database, then forget lease/registry. Never forget without a successful DROP.\n */\nasync function dropThenForget(lease: Lease, adminUrl: string): Promise<void> {\n await dropDatabase({\n adminUrl,\n databaseName: lease.databaseName,\n roleName: lease.roleName,\n });\n forgetLease(lease);\n}\n\nexport type EnsureOptions = {\n root?: string;\n mode: DbMode;\n /** Inject DATABASE_URL / TEST_DATABASE_URL into process.env (default true). */\n setEnv?: boolean;\n};\n\nexport type EnsureResult = {\n databaseUrl: string;\n databaseName: string;\n roleName: string;\n repoSlug: string;\n worktreeSlug: string;\n pathHash: string;\n root: string;\n mode: DbMode;\n port: number;\n dispose: () => Promise<void>;\n};\n\n/**\n * Ensure a worktree-scoped database exists and return connection info.\n *\n * - `dev`: keep DB across restarts.\n * - `test`: DROP when `dispose()` is awaited (callers / test runners own teardown).\n */\nexport async function ensure(options: EnsureOptions): Promise<EnsureResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode;\n const databaseName = buildDatabaseName(identity, mode);\n const roleName = buildRoleName(databaseName);\n\n const host = ensureHostRunning();\n await ensureDatabase({\n adminUrl: host.adminUrl,\n databaseName,\n roleName,\n });\n\n const databaseUrl = buildDatabaseUrl({\n port: host.port,\n databaseName,\n roleName,\n });\n\n const lease: Lease = {\n schemaVersion: 1,\n mode,\n root: identity.root,\n repoSlug: identity.repoSlug,\n worktreeSlug: identity.worktreeSlug,\n pathHash: identity.pathHash,\n databaseName,\n roleName,\n port: host.port,\n pid: process.pid,\n createdAt: new Date().toISOString(),\n };\n writeLease(lease);\n writeEnvFile(identity.root, mode, databaseUrl);\n\n if (options.setEnv !== false) {\n process.env.DATABASE_URL = databaseUrl;\n if (mode === \"test\") {\n process.env.TEST_DATABASE_URL = databaseUrl;\n }\n }\n\n const disposeFn = async () => {\n await dispose({ root: identity.root, mode });\n };\n\n return {\n databaseUrl,\n databaseName,\n roleName,\n repoSlug: identity.repoSlug,\n worktreeSlug: identity.worktreeSlug,\n pathHash: identity.pathHash,\n root: identity.root,\n mode,\n port: host.port,\n dispose: disposeFn,\n };\n}\n\nexport type EnsureIfNeededOptions = EnsureOptions & ResolveEnsureSkipInput;\n\nexport type EnsureIfNeededResult =\n | { status: \"skipped\"; reason: \"disabled\" }\n | { status: \"skipped\"; reason: \"external-url\"; databaseUrl: string }\n | ({ status: \"ensured\" } & EnsureResult);\n\n/**\n * Resolve skip policy then ensure. Single entry for hosts (Cedar CLI, Jest, Vitest).\n * On external-url skip, sets DATABASE_URL when `setEnv` is not false.\n */\nexport async function ensureIfNeeded(\n options: EnsureIfNeededOptions,\n): Promise<EnsureIfNeededResult> {\n const skip = resolveEnsureSkip({\n url: options.url,\n force: options.force,\n disabled: options.disabled,\n });\n if (skip.skip) {\n if (skip.reason === \"external-url\") {\n if (options.setEnv !== false) {\n process.env.DATABASE_URL = skip.databaseUrl;\n }\n return { status: \"skipped\", reason: \"external-url\", databaseUrl: skip.databaseUrl };\n }\n return { status: \"skipped\", reason: \"disabled\" };\n }\n\n const result = await ensure({\n root: options.root,\n mode: options.mode,\n setEnv: options.setEnv,\n });\n return { status: \"ensured\", ...result };\n}\n\nexport type DisposeOptions = {\n root?: string;\n mode?: DbMode;\n};\n\nexport type DisposeResult =\n | { dropped: true; databaseName: string }\n | { dropped: false; reason: \"no-lease\" | \"host-unavailable\" };\n\n/**\n * DROP the worktree database for the given mode (default: test).\n * No-ops without a valid lease (never invents a name to DROP).\n * If the host is unavailable, leaves the lease so dispose/gc can retry.\n */\nexport async function dispose(options: DisposeOptions = {}): Promise<DisposeResult> {\n const identity = resolveWorktreeIdentity(options.root);\n const mode = options.mode ?? \"test\";\n const lease = readLease(identity.root, mode);\n if (!lease) return { dropped: false, reason: \"no-lease\" };\n\n let host;\n try {\n host = ensureHostRunning();\n } catch {\n // Keep lease + registry so a later dispose/gc can still find the DB.\n return { dropped: false, reason: \"host-unavailable\" };\n }\n\n await dropThenForget(lease, host.adminUrl);\n return { dropped: true, databaseName: lease.databaseName };\n}\n\n/**\n * Drop databases whose registered worktree root no longer exists on disk.\n * Registry entries are removed only after a successful DROP.\n */\nexport async function gc(): Promise<{\n dropped: string[];\n}> {\n const dropped: string[] = [];\n const orphans = listRegistryLeases().filter(isOrphanLease);\n if (orphans.length === 0) return { dropped };\n\n let host;\n try {\n host = ensureHostRunning();\n } catch {\n return { dropped };\n }\n\n for (const lease of orphans) {\n try {\n await dropThenForget(lease, host.adminUrl);\n dropped.push(lease.databaseName);\n } catch {\n // Keep registry entry for retry\n }\n }\n return { dropped };\n}\n"],"mappings":"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"}
|
package/dist/nx.cjs
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_constants = require("./constants-B7sCf4fg.cjs");
|
|
3
|
+
const require_tasks = require("./tasks-DZ7hMmGJ.cjs");
|
|
4
|
+
//#region src/adapters/nx.ts
|
|
5
|
+
/**
|
|
6
|
+
* Nx target command hints. Wire into project.json / package.json:
|
|
7
|
+
*
|
|
8
|
+
* ```json
|
|
9
|
+
* {
|
|
10
|
+
* "targets": {
|
|
11
|
+
* "db:ensure": { "command": "cedarpg ensure --mode=dev" },
|
|
12
|
+
* "test": {
|
|
13
|
+
* "dependsOn": ["db:ensure-test"],
|
|
14
|
+
* "command": "vitest run"
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —
|
|
21
|
+
* there is no separate Nx runtime wrapper.
|
|
22
|
+
*/
|
|
23
|
+
/** Suggested target definitions for project.json / package.json nx targets. */
|
|
24
|
+
function nxTargetHints(bin = require_constants.CLI_NAME) {
|
|
25
|
+
const cmds = require_tasks.cedarPgCommands(bin);
|
|
26
|
+
return {
|
|
27
|
+
"db:ensure": { command: cmds.ensureDev },
|
|
28
|
+
"db:ensure-test": { command: cmds.ensureTest },
|
|
29
|
+
"db:dispose-test": { command: cmds.disposeTest }
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
exports.nxTargetHints = nxTargetHints;
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=nx.cjs.map
|
package/dist/nx.cjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx.cjs","names":["CLI_NAME","cedarPgCommands"],"sources":["../src/adapters/nx.ts"],"sourcesContent":["/**\n * Nx target command hints. Wire into project.json / package.json:\n *\n * ```json\n * {\n * \"targets\": {\n * \"db:ensure\": { \"command\": \"cedarpg ensure --mode=dev\" },\n * \"test\": {\n * \"dependsOn\": [\"db:ensure-test\"],\n * \"command\": \"vitest run\"\n * }\n * }\n * }\n * ```\n *\n * Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —\n * there is no separate Nx runtime wrapper.\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport { cedarPgCommands } from \"./tasks.ts\";\n\n/** Suggested target definitions for project.json / package.json nx targets. */\nexport function nxTargetHints(bin = CLI_NAME): Record<string, { command: string }> {\n const cmds = cedarPgCommands(bin);\n return {\n \"db:ensure\": { command: cmds.ensureDev },\n \"db:ensure-test\": { command: cmds.ensureTest },\n \"db:dispose-test\": { command: cmds.disposeTest },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,cAAc,MAAMA,kBAAAA,UAA+C;CACjF,MAAM,OAAOC,cAAAA,gBAAgB,GAAG;CAChC,OAAO;EACL,aAAa,EAAE,SAAS,KAAK,UAAU;EACvC,kBAAkB,EAAE,SAAS,KAAK,WAAW;EAC7C,mBAAmB,EAAE,SAAS,KAAK,YAAY;CACjD;AACF"}
|
package/dist/nx.d.cts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/adapters/nx.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Nx target command hints. Wire into project.json / package.json:
|
|
4
|
+
*
|
|
5
|
+
* ```json
|
|
6
|
+
* {
|
|
7
|
+
* "targets": {
|
|
8
|
+
* "db:ensure": { "command": "cedarpg ensure --mode=dev" },
|
|
9
|
+
* "test": {
|
|
10
|
+
* "dependsOn": ["db:ensure-test"],
|
|
11
|
+
* "command": "vitest run"
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —
|
|
18
|
+
* there is no separate Nx runtime wrapper.
|
|
19
|
+
*/
|
|
20
|
+
/** Suggested target definitions for project.json / package.json nx targets. */
|
|
21
|
+
declare function nxTargetHints(bin?: string): Record<string, {
|
|
22
|
+
command: string;
|
|
23
|
+
}>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { nxTargetHints };
|
|
26
|
+
//# sourceMappingURL=nx.d.cts.map
|
package/dist/nx.d.mts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
//#region src/adapters/nx.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Nx target command hints. Wire into project.json / package.json:
|
|
4
|
+
*
|
|
5
|
+
* ```json
|
|
6
|
+
* {
|
|
7
|
+
* "targets": {
|
|
8
|
+
* "db:ensure": { "command": "cedarpg ensure --mode=dev" },
|
|
9
|
+
* "test": {
|
|
10
|
+
* "dependsOn": ["db:ensure-test"],
|
|
11
|
+
* "command": "vitest run"
|
|
12
|
+
* }
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —
|
|
18
|
+
* there is no separate Nx runtime wrapper.
|
|
19
|
+
*/
|
|
20
|
+
/** Suggested target definitions for project.json / package.json nx targets. */
|
|
21
|
+
declare function nxTargetHints(bin?: string): Record<string, {
|
|
22
|
+
command: string;
|
|
23
|
+
}>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { nxTargetHints };
|
|
26
|
+
//# sourceMappingURL=nx.d.mts.map
|
package/dist/nx.mjs
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { t as CLI_NAME } from "./constants-YnHDwShD.mjs";
|
|
2
|
+
import { t as cedarPgCommands } from "./tasks-CW2D0n46.mjs";
|
|
3
|
+
//#region src/adapters/nx.ts
|
|
4
|
+
/**
|
|
5
|
+
* Nx target command hints. Wire into project.json / package.json:
|
|
6
|
+
*
|
|
7
|
+
* ```json
|
|
8
|
+
* {
|
|
9
|
+
* "targets": {
|
|
10
|
+
* "db:ensure": { "command": "cedarpg ensure --mode=dev" },
|
|
11
|
+
* "test": {
|
|
12
|
+
* "dependsOn": ["db:ensure-test"],
|
|
13
|
+
* "command": "vitest run"
|
|
14
|
+
* }
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —
|
|
20
|
+
* there is no separate Nx runtime wrapper.
|
|
21
|
+
*/
|
|
22
|
+
/** Suggested target definitions for project.json / package.json nx targets. */
|
|
23
|
+
function nxTargetHints(bin = CLI_NAME) {
|
|
24
|
+
const cmds = cedarPgCommands(bin);
|
|
25
|
+
return {
|
|
26
|
+
"db:ensure": { command: cmds.ensureDev },
|
|
27
|
+
"db:ensure-test": { command: cmds.ensureTest },
|
|
28
|
+
"db:dispose-test": { command: cmds.disposeTest }
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { nxTargetHints };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=nx.mjs.map
|
package/dist/nx.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nx.mjs","names":[],"sources":["../src/adapters/nx.ts"],"sourcesContent":["/**\n * Nx target command hints. Wire into project.json / package.json:\n *\n * ```json\n * {\n * \"targets\": {\n * \"db:ensure\": { \"command\": \"cedarpg ensure --mode=dev\" },\n * \"test\": {\n * \"dependsOn\": [\"db:ensure-test\"],\n * \"command\": \"vitest run\"\n * }\n * }\n * }\n * ```\n *\n * Prefer the CLI (`cedarpg` from `@cedarjs/pg`) for ensure/dispose —\n * there is no separate Nx runtime wrapper.\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport { cedarPgCommands } from \"./tasks.ts\";\n\n/** Suggested target definitions for project.json / package.json nx targets. */\nexport function nxTargetHints(bin = CLI_NAME): Record<string, { command: string }> {\n const cmds = cedarPgCommands(bin);\n return {\n \"db:ensure\": { command: cmds.ensureDev },\n \"db:ensure-test\": { command: cmds.ensureTest },\n \"db:dispose-test\": { command: cmds.disposeTest },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,cAAc,MAAM,UAA+C;CACjF,MAAM,OAAO,gBAAgB,GAAG;CAChC,OAAO;EACL,aAAa,EAAE,SAAS,KAAK,UAAU;EACvC,kBAAkB,EAAE,SAAS,KAAK,WAAW;EAC7C,mBAAmB,EAAE,SAAS,KAAK,YAAY;CACjD;AACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { t as CLI_NAME } from "./constants-YnHDwShD.mjs";
|
|
2
|
+
//#region src/adapters/tasks.ts
|
|
3
|
+
/**
|
|
4
|
+
* Shared CLI command strings for Vite+ / Nx task wiring.
|
|
5
|
+
*/
|
|
6
|
+
function cedarPgCommands(bin = CLI_NAME) {
|
|
7
|
+
return {
|
|
8
|
+
ensureDev: `${bin} ensure --mode=dev`,
|
|
9
|
+
ensureTest: `${bin} ensure --mode=test --print-env`,
|
|
10
|
+
disposeTest: `${bin} dispose --mode=test`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { cedarPgCommands as t };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=tasks-CW2D0n46.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-CW2D0n46.mjs","names":[],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/**\n * Shared CLI command strings for Vite+ / Nx task wiring.\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\n\nexport type CedarPgCommands = {\n ensureDev: string;\n ensureTest: string;\n disposeTest: string;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n ensureDev: `${bin} ensure --mode=dev`,\n ensureTest: `${bin} ensure --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n"],"mappings":";;;;;AAYA,SAAgB,gBAAgB,MAAM,UAA2B;CAC/D,OAAO;EACL,WAAW,GAAG,IAAI;EAClB,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;CACtB;AACF"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const require_constants = require("./constants-B7sCf4fg.cjs");
|
|
2
|
+
//#region src/adapters/tasks.ts
|
|
3
|
+
/**
|
|
4
|
+
* Shared CLI command strings for Vite+ / Nx task wiring.
|
|
5
|
+
*/
|
|
6
|
+
function cedarPgCommands(bin = require_constants.CLI_NAME) {
|
|
7
|
+
return {
|
|
8
|
+
ensureDev: `${bin} ensure --mode=dev`,
|
|
9
|
+
ensureTest: `${bin} ensure --mode=test --print-env`,
|
|
10
|
+
disposeTest: `${bin} dispose --mode=test`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
Object.defineProperty(exports, "cedarPgCommands", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function() {
|
|
17
|
+
return cedarPgCommands;
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=tasks-DZ7hMmGJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks-DZ7hMmGJ.cjs","names":["CLI_NAME"],"sources":["../src/adapters/tasks.ts"],"sourcesContent":["/**\n * Shared CLI command strings for Vite+ / Nx task wiring.\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\n\nexport type CedarPgCommands = {\n ensureDev: string;\n ensureTest: string;\n disposeTest: string;\n};\n\nexport function cedarPgCommands(bin = CLI_NAME): CedarPgCommands {\n return {\n ensureDev: `${bin} ensure --mode=dev`,\n ensureTest: `${bin} ensure --mode=test --print-env`,\n disposeTest: `${bin} dispose --mode=test`,\n };\n}\n"],"mappings":";;;;;AAYA,SAAgB,gBAAgB,MAAMA,kBAAAA,UAA2B;CAC/D,OAAO;EACL,WAAW,GAAG,IAAI;EAClB,YAAY,GAAG,IAAI;EACnB,aAAa,GAAG,IAAI;CACtB;AACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("./constants-B7sCf4fg.cjs");
|
|
3
|
+
const require_tasks = require("./tasks-DZ7hMmGJ.cjs");
|
|
4
|
+
//#region src/adapters/vite-plus.ts
|
|
5
|
+
/**
|
|
6
|
+
* Consumer adapter for external Vite+ projects.
|
|
7
|
+
*
|
|
8
|
+
* Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`
|
|
9
|
+
* depend on cedarpg ensure.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { defineConfig } from 'vite-plus'
|
|
14
|
+
* import { cedarPgTasks } from '@cedarjs/pg/vite-plus'
|
|
15
|
+
*
|
|
16
|
+
* export default defineConfig({
|
|
17
|
+
* run: {
|
|
18
|
+
* tasks: {
|
|
19
|
+
* ...cedarPgTasks(),
|
|
20
|
+
* test: {
|
|
21
|
+
* command: 'vp test',
|
|
22
|
+
* dependsOn: ['db:ensure-test'],
|
|
23
|
+
* env: ['DATABASE_URL', 'TEST_DATABASE_URL'],
|
|
24
|
+
* },
|
|
25
|
+
* dev: {
|
|
26
|
+
* command: 'vp dev',
|
|
27
|
+
* dependsOn: ['db:ensure'],
|
|
28
|
+
* env: ['DATABASE_URL'],
|
|
29
|
+
* },
|
|
30
|
+
* },
|
|
31
|
+
* },
|
|
32
|
+
* })
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
const CEDAR_PG_TASK_ENSURE_DEV = "db:ensure";
|
|
36
|
+
const CEDAR_PG_TASK_ENSURE_TEST = "db:ensure-test";
|
|
37
|
+
const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
38
|
+
/**
|
|
39
|
+
* Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.
|
|
40
|
+
*/
|
|
41
|
+
function cedarPgTasks(options = {}) {
|
|
42
|
+
const cmds = require_tasks.cedarPgCommands(options.bin ?? "cedarpg");
|
|
43
|
+
const tasks = {
|
|
44
|
+
[CEDAR_PG_TASK_ENSURE_DEV]: {
|
|
45
|
+
command: cmds.ensureDev,
|
|
46
|
+
cache: false
|
|
47
|
+
},
|
|
48
|
+
[CEDAR_PG_TASK_ENSURE_TEST]: {
|
|
49
|
+
command: cmds.ensureTest,
|
|
50
|
+
cache: false
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
if (options.includeDisposeTest !== false) tasks[CEDAR_PG_TASK_DISPOSE_TEST] = {
|
|
54
|
+
command: cmds.disposeTest,
|
|
55
|
+
cache: false
|
|
56
|
+
};
|
|
57
|
+
return tasks;
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
exports.CEDAR_PG_TASK_DISPOSE_TEST = CEDAR_PG_TASK_DISPOSE_TEST;
|
|
61
|
+
exports.CEDAR_PG_TASK_ENSURE_DEV = CEDAR_PG_TASK_ENSURE_DEV;
|
|
62
|
+
exports.CEDAR_PG_TASK_ENSURE_TEST = CEDAR_PG_TASK_ENSURE_TEST;
|
|
63
|
+
exports.cedarPgTasks = cedarPgTasks;
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=vite-plus.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plus.cjs","names":["cedarPgCommands"],"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 ensure.\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:ensure-test'],\n * env: ['DATABASE_URL', 'TEST_DATABASE_URL'],\n * },\n * dev: {\n * command: 'vp dev',\n * dependsOn: ['db:ensure'],\n * env: ['DATABASE_URL'],\n * },\n * },\n * },\n * })\n * ```\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport { cedarPgCommands } from \"./tasks.ts\";\n\nexport const CEDAR_PG_TASK_ENSURE_DEV = \"db:ensure\";\nexport const CEDAR_PG_TASK_ENSURE_TEST = \"db:ensure-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgTaskDef = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgTasksOptions = {\n /** Binary name / path (default: CLI_NAME / `cedarpg`). */\n bin?: string;\n /** Include dispose-test task (default: true). */\n includeDisposeTest?: boolean;\n};\n\n/**\n * Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.\n */\nexport function cedarPgTasks(options: CedarPgTasksOptions = {}): Record<string, CedarPgTaskDef> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const tasks: Record<string, CedarPgTaskDef> = {\n [CEDAR_PG_TASK_ENSURE_DEV]: {\n command: cmds.ensureDev,\n cache: false,\n },\n [CEDAR_PG_TASK_ENSURE_TEST]: {\n command: cmds.ensureTest,\n cache: false,\n },\n };\n if (options.includeDisposeTest !== false) {\n tasks[CEDAR_PG_TASK_DISPOSE_TEST] = {\n command: cmds.disposeTest,\n cache: false,\n };\n }\n return tasks;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,2BAA2B;AACxC,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;;;;AAiB1C,SAAgB,aAAa,UAA+B,CAAC,GAAmC;CAC9F,MAAM,OAAOA,cAAAA,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,QAAwC;GAC3C,2BAA2B;GAC1B,SAAS,KAAK;GACd,OAAO;EACT;GACC,4BAA4B;GAC3B,SAAS,KAAK;GACd,OAAO;EACT;CACF;CACA,IAAI,QAAQ,uBAAuB,OACjC,MAAM,8BAA8B;EAClC,SAAS,KAAK;EACd,OAAO;CACT;CAEF,OAAO;AACT"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/adapters/vite-plus.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Consumer adapter for external Vite+ projects.
|
|
4
|
+
*
|
|
5
|
+
* Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`
|
|
6
|
+
* depend on cedarpg ensure.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { defineConfig } from 'vite-plus'
|
|
11
|
+
* import { cedarPgTasks } from '@cedarjs/pg/vite-plus'
|
|
12
|
+
*
|
|
13
|
+
* export default defineConfig({
|
|
14
|
+
* run: {
|
|
15
|
+
* tasks: {
|
|
16
|
+
* ...cedarPgTasks(),
|
|
17
|
+
* test: {
|
|
18
|
+
* command: 'vp test',
|
|
19
|
+
* dependsOn: ['db:ensure-test'],
|
|
20
|
+
* env: ['DATABASE_URL', 'TEST_DATABASE_URL'],
|
|
21
|
+
* },
|
|
22
|
+
* dev: {
|
|
23
|
+
* command: 'vp dev',
|
|
24
|
+
* dependsOn: ['db:ensure'],
|
|
25
|
+
* env: ['DATABASE_URL'],
|
|
26
|
+
* },
|
|
27
|
+
* },
|
|
28
|
+
* },
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare const CEDAR_PG_TASK_ENSURE_DEV = "db:ensure";
|
|
33
|
+
declare const CEDAR_PG_TASK_ENSURE_TEST = "db:ensure-test";
|
|
34
|
+
declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
35
|
+
type CedarPgTaskDef = {
|
|
36
|
+
command: string;
|
|
37
|
+
cache?: boolean;
|
|
38
|
+
};
|
|
39
|
+
type CedarPgTasksOptions = {
|
|
40
|
+
/** Binary name / path (default: CLI_NAME / `cedarpg`). */
|
|
41
|
+
bin?: string;
|
|
42
|
+
/** Include dispose-test task (default: true). */
|
|
43
|
+
includeDisposeTest?: boolean;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.
|
|
47
|
+
*/
|
|
48
|
+
declare function cedarPgTasks(options?: CedarPgTasksOptions): Record<string, CedarPgTaskDef>;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { CEDAR_PG_TASK_DISPOSE_TEST, CEDAR_PG_TASK_ENSURE_DEV, CEDAR_PG_TASK_ENSURE_TEST, CedarPgTaskDef, CedarPgTasksOptions, cedarPgTasks };
|
|
51
|
+
//# sourceMappingURL=vite-plus.d.cts.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
//#region src/adapters/vite-plus.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Consumer adapter for external Vite+ projects.
|
|
4
|
+
*
|
|
5
|
+
* Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`
|
|
6
|
+
* depend on cedarpg ensure.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { defineConfig } from 'vite-plus'
|
|
11
|
+
* import { cedarPgTasks } from '@cedarjs/pg/vite-plus'
|
|
12
|
+
*
|
|
13
|
+
* export default defineConfig({
|
|
14
|
+
* run: {
|
|
15
|
+
* tasks: {
|
|
16
|
+
* ...cedarPgTasks(),
|
|
17
|
+
* test: {
|
|
18
|
+
* command: 'vp test',
|
|
19
|
+
* dependsOn: ['db:ensure-test'],
|
|
20
|
+
* env: ['DATABASE_URL', 'TEST_DATABASE_URL'],
|
|
21
|
+
* },
|
|
22
|
+
* dev: {
|
|
23
|
+
* command: 'vp dev',
|
|
24
|
+
* dependsOn: ['db:ensure'],
|
|
25
|
+
* env: ['DATABASE_URL'],
|
|
26
|
+
* },
|
|
27
|
+
* },
|
|
28
|
+
* },
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare const CEDAR_PG_TASK_ENSURE_DEV = "db:ensure";
|
|
33
|
+
declare const CEDAR_PG_TASK_ENSURE_TEST = "db:ensure-test";
|
|
34
|
+
declare const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
35
|
+
type CedarPgTaskDef = {
|
|
36
|
+
command: string;
|
|
37
|
+
cache?: boolean;
|
|
38
|
+
};
|
|
39
|
+
type CedarPgTasksOptions = {
|
|
40
|
+
/** Binary name / path (default: CLI_NAME / `cedarpg`). */
|
|
41
|
+
bin?: string;
|
|
42
|
+
/** Include dispose-test task (default: true). */
|
|
43
|
+
includeDisposeTest?: boolean;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.
|
|
47
|
+
*/
|
|
48
|
+
declare function cedarPgTasks(options?: CedarPgTasksOptions): Record<string, CedarPgTaskDef>;
|
|
49
|
+
//#endregion
|
|
50
|
+
export { CEDAR_PG_TASK_DISPOSE_TEST, CEDAR_PG_TASK_ENSURE_DEV, CEDAR_PG_TASK_ENSURE_TEST, CedarPgTaskDef, CedarPgTasksOptions, cedarPgTasks };
|
|
51
|
+
//# sourceMappingURL=vite-plus.d.mts.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import "./constants-YnHDwShD.mjs";
|
|
2
|
+
import { t as cedarPgCommands } from "./tasks-CW2D0n46.mjs";
|
|
3
|
+
//#region src/adapters/vite-plus.ts
|
|
4
|
+
/**
|
|
5
|
+
* Consumer adapter for external Vite+ projects.
|
|
6
|
+
*
|
|
7
|
+
* Merge into `vite.config.ts` `run.tasks` so `vp run test` / `vp run dev`
|
|
8
|
+
* depend on cedarpg ensure.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { defineConfig } from 'vite-plus'
|
|
13
|
+
* import { cedarPgTasks } from '@cedarjs/pg/vite-plus'
|
|
14
|
+
*
|
|
15
|
+
* export default defineConfig({
|
|
16
|
+
* run: {
|
|
17
|
+
* tasks: {
|
|
18
|
+
* ...cedarPgTasks(),
|
|
19
|
+
* test: {
|
|
20
|
+
* command: 'vp test',
|
|
21
|
+
* dependsOn: ['db:ensure-test'],
|
|
22
|
+
* env: ['DATABASE_URL', 'TEST_DATABASE_URL'],
|
|
23
|
+
* },
|
|
24
|
+
* dev: {
|
|
25
|
+
* command: 'vp dev',
|
|
26
|
+
* dependsOn: ['db:ensure'],
|
|
27
|
+
* env: ['DATABASE_URL'],
|
|
28
|
+
* },
|
|
29
|
+
* },
|
|
30
|
+
* },
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
const CEDAR_PG_TASK_ENSURE_DEV = "db:ensure";
|
|
35
|
+
const CEDAR_PG_TASK_ENSURE_TEST = "db:ensure-test";
|
|
36
|
+
const CEDAR_PG_TASK_DISPOSE_TEST = "db:dispose-test";
|
|
37
|
+
/**
|
|
38
|
+
* Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.
|
|
39
|
+
*/
|
|
40
|
+
function cedarPgTasks(options = {}) {
|
|
41
|
+
const cmds = cedarPgCommands(options.bin ?? "cedarpg");
|
|
42
|
+
const tasks = {
|
|
43
|
+
[CEDAR_PG_TASK_ENSURE_DEV]: {
|
|
44
|
+
command: cmds.ensureDev,
|
|
45
|
+
cache: false
|
|
46
|
+
},
|
|
47
|
+
[CEDAR_PG_TASK_ENSURE_TEST]: {
|
|
48
|
+
command: cmds.ensureTest,
|
|
49
|
+
cache: false
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
if (options.includeDisposeTest !== false) tasks[CEDAR_PG_TASK_DISPOSE_TEST] = {
|
|
53
|
+
command: cmds.disposeTest,
|
|
54
|
+
cache: false
|
|
55
|
+
};
|
|
56
|
+
return tasks;
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { CEDAR_PG_TASK_DISPOSE_TEST, CEDAR_PG_TASK_ENSURE_DEV, CEDAR_PG_TASK_ENSURE_TEST, cedarPgTasks };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=vite-plus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite-plus.mjs","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 ensure.\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:ensure-test'],\n * env: ['DATABASE_URL', 'TEST_DATABASE_URL'],\n * },\n * dev: {\n * command: 'vp dev',\n * dependsOn: ['db:ensure'],\n * env: ['DATABASE_URL'],\n * },\n * },\n * },\n * })\n * ```\n */\n\nimport { CLI_NAME } from \"../core/constants.ts\";\nimport { cedarPgCommands } from \"./tasks.ts\";\n\nexport const CEDAR_PG_TASK_ENSURE_DEV = \"db:ensure\";\nexport const CEDAR_PG_TASK_ENSURE_TEST = \"db:ensure-test\";\nexport const CEDAR_PG_TASK_DISPOSE_TEST = \"db:dispose-test\";\n\nexport type CedarPgTaskDef = {\n command: string;\n cache?: boolean;\n};\n\nexport type CedarPgTasksOptions = {\n /** Binary name / path (default: CLI_NAME / `cedarpg`). */\n bin?: string;\n /** Include dispose-test task (default: true). */\n includeDisposeTest?: boolean;\n};\n\n/**\n * Returns Vite+ `run.tasks` entries for cedar-pg lifecycle.\n */\nexport function cedarPgTasks(options: CedarPgTasksOptions = {}): Record<string, CedarPgTaskDef> {\n const cmds = cedarPgCommands(options.bin ?? CLI_NAME);\n const tasks: Record<string, CedarPgTaskDef> = {\n [CEDAR_PG_TASK_ENSURE_DEV]: {\n command: cmds.ensureDev,\n cache: false,\n },\n [CEDAR_PG_TASK_ENSURE_TEST]: {\n command: cmds.ensureTest,\n cache: false,\n },\n };\n if (options.includeDisposeTest !== false) {\n tasks[CEDAR_PG_TASK_DISPOSE_TEST] = {\n command: cmds.disposeTest,\n cache: false,\n };\n }\n return tasks;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,MAAa,2BAA2B;AACxC,MAAa,4BAA4B;AACzC,MAAa,6BAA6B;;;;AAiB1C,SAAgB,aAAa,UAA+B,CAAC,GAAmC;CAC9F,MAAM,OAAO,gBAAgB,QAAQ,OAAA,SAAe;CACpD,MAAM,QAAwC;GAC3C,2BAA2B;GAC1B,SAAS,KAAK;GACd,OAAO;EACT;GACC,4BAA4B;GAC3B,SAAS,KAAK;GACd,OAAO;EACT;CACF;CACA,IAAI,QAAQ,uBAAuB,OACjC,MAAM,8BAA8B;EAClC,SAAS,KAAK;EACd,OAAO;CACT;CAEF,OAAO;AACT"}
|
package/dist/vitest.cjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
const require_lifecycle = require("./lifecycle-D10usEjM.cjs");
|
|
6
|
+
//#region src/adapters/vitest.ts
|
|
7
|
+
/**
|
|
8
|
+
* Vitest globalSetup — ensure test DB, return teardown that disposes it.
|
|
9
|
+
*
|
|
10
|
+
* vitest.config.ts:
|
|
11
|
+
* ```ts
|
|
12
|
+
* export default defineConfig({
|
|
13
|
+
* test: {
|
|
14
|
+
* globalSetup: ['@cedarjs/pg/vitest'],
|
|
15
|
+
* },
|
|
16
|
+
* })
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
async function setup() {
|
|
20
|
+
const result = await require_lifecycle.ensureIfNeeded({
|
|
21
|
+
mode: "test",
|
|
22
|
+
setEnv: true
|
|
23
|
+
});
|
|
24
|
+
if (result.status !== "ensured") return async () => {};
|
|
25
|
+
return async () => {
|
|
26
|
+
await result.dispose();
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//#endregion
|
|
30
|
+
exports.default = setup;
|
|
31
|
+
exports.setup = setup;
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=vitest.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.cjs","names":["ensureIfNeeded"],"sources":["../src/adapters/vitest.ts"],"sourcesContent":["import { ensureIfNeeded } from \"../core/lifecycle.ts\";\n\n/**\n * Vitest globalSetup — ensure test DB, return teardown that disposes it.\n *\n * vitest.config.ts:\n * ```ts\n * export default defineConfig({\n * test: {\n * globalSetup: ['@cedarjs/pg/vitest'],\n * },\n * })\n * ```\n */\nexport async function setup(): Promise<() => Promise<void>> {\n const result = await ensureIfNeeded({\n mode: \"test\",\n setEnv: true,\n });\n if (result.status !== \"ensured\") {\n return async () => {};\n }\n return async () => {\n await result.dispose();\n };\n}\n\nexport default setup;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAcA,eAAsB,QAAsC;CAC1D,MAAM,SAAS,MAAMA,kBAAAA,eAAe;EAClC,MAAM;EACN,QAAQ;CACV,CAAC;CACD,IAAI,OAAO,WAAW,WACpB,OAAO,YAAY,CAAC;CAEtB,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ;CACvB;AACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/adapters/vitest.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Vitest globalSetup — ensure test DB, return teardown that disposes it.
|
|
4
|
+
*
|
|
5
|
+
* vitest.config.ts:
|
|
6
|
+
* ```ts
|
|
7
|
+
* export default defineConfig({
|
|
8
|
+
* test: {
|
|
9
|
+
* globalSetup: ['@cedarjs/pg/vitest'],
|
|
10
|
+
* },
|
|
11
|
+
* })
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare function setup(): Promise<() => Promise<void>>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { setup as default, setup };
|
|
17
|
+
//# sourceMappingURL=vitest.d.cts.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/adapters/vitest.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Vitest globalSetup — ensure test DB, return teardown that disposes it.
|
|
4
|
+
*
|
|
5
|
+
* vitest.config.ts:
|
|
6
|
+
* ```ts
|
|
7
|
+
* export default defineConfig({
|
|
8
|
+
* test: {
|
|
9
|
+
* globalSetup: ['@cedarjs/pg/vitest'],
|
|
10
|
+
* },
|
|
11
|
+
* })
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
declare function setup(): Promise<() => Promise<void>>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { setup as default, setup };
|
|
17
|
+
//# sourceMappingURL=vitest.d.mts.map
|
package/dist/vitest.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { r as ensureIfNeeded } from "./lifecycle-PbTXNC2Z.mjs";
|
|
2
|
+
//#region src/adapters/vitest.ts
|
|
3
|
+
/**
|
|
4
|
+
* Vitest globalSetup — ensure test DB, return teardown that disposes it.
|
|
5
|
+
*
|
|
6
|
+
* vitest.config.ts:
|
|
7
|
+
* ```ts
|
|
8
|
+
* export default defineConfig({
|
|
9
|
+
* test: {
|
|
10
|
+
* globalSetup: ['@cedarjs/pg/vitest'],
|
|
11
|
+
* },
|
|
12
|
+
* })
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
async function setup() {
|
|
16
|
+
const result = await ensureIfNeeded({
|
|
17
|
+
mode: "test",
|
|
18
|
+
setEnv: true
|
|
19
|
+
});
|
|
20
|
+
if (result.status !== "ensured") return async () => {};
|
|
21
|
+
return async () => {
|
|
22
|
+
await result.dispose();
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { setup as default, setup };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=vitest.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.mjs","names":[],"sources":["../src/adapters/vitest.ts"],"sourcesContent":["import { ensureIfNeeded } from \"../core/lifecycle.ts\";\n\n/**\n * Vitest globalSetup — ensure test DB, return teardown that disposes it.\n *\n * vitest.config.ts:\n * ```ts\n * export default defineConfig({\n * test: {\n * globalSetup: ['@cedarjs/pg/vitest'],\n * },\n * })\n * ```\n */\nexport async function setup(): Promise<() => Promise<void>> {\n const result = await ensureIfNeeded({\n mode: \"test\",\n setEnv: true,\n });\n if (result.status !== \"ensured\") {\n return async () => {};\n }\n return async () => {\n await result.dispose();\n };\n}\n\nexport default setup;\n"],"mappings":";;;;;;;;;;;;;;AAcA,eAAsB,QAAsC;CAC1D,MAAM,SAAS,MAAM,eAAe;EAClC,MAAM;EACN,QAAQ;CACV,CAAC;CACD,IAAI,OAAO,WAAW,WACpB,OAAO,YAAY,CAAC;CAEtB,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ;CACvB;AACF"}
|