@hogsend/cli 0.10.0 → 0.11.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/dist/bin.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/bin.ts","../src/commands/campaigns.ts","../src/lib/http.ts","../src/lib/output.ts","../src/commands/contacts.ts","../src/commands/doctor.ts","../src/lib/skills.ts","../src/commands/eject.ts","../src/eject.ts","../src/commands/emails.ts","../src/commands/events.ts","../src/commands/journeys.ts","../src/commands/patch.ts","../src/commands/setup.ts","../src/lib/prompt.ts","../src/commands/skills.ts","../src/commands/stats.ts","../src/commands/studio.ts","../src/commands/upgrade.ts","../src/commands/webhooks.ts","../src/commands/index.ts","../src/lib/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\nimport { commands } from \"./commands/index.js\";\nimport type { Command } from \"./commands/types.js\";\nimport { parseGlobalFlags, resolveConfig } from \"./lib/config.js\";\nimport { createAdminClient, createDataPlaneClient } from \"./lib/http.js\";\nimport { color, createOutput } from \"./lib/output.js\";\n\nfunction version(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction rootUsage(): string {\n const longest = commands.reduce((n, c) => Math.max(n, c.name.length), 0);\n const list = commands\n .map((c) => ` ${color.cyan(c.name.padEnd(longest))} ${c.summary}`)\n .join(\"\\n\");\n return `${color.bold(\"hogsend\")} — the agent-native Hogsend CLI\n\n${color.dim(\"Usage:\")} hogsend <command> [options]\n\n${color.dim(\"Commands:\")}\n${list}\n\n${color.dim(\"Global options:\")}\n --url <baseUrl> Target instance (default HOGSEND_API_URL or http://localhost:3002)\n --admin-key <key> Admin bearer token (default HOGSEND_ADMIN_KEY / ADMIN_API_KEY)\n --data-key <key> Ingest bearer token for writes (default HOGSEND_DATA_KEY / HOGSEND_API_KEY)\n --json Emit machine-readable JSON only (for agents)\n -h, --help Show help (use after a command for command help)\n -v, --version Show version\n\nRun ${color.cyan(\"hogsend <command> --help\")} for command-specific options.`;\n}\n\nfunction findCommand(name: string): Command | undefined {\n return commands.find((c) => c.name === name);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const [token, ...afterToken] = argv;\n\n // Version is a top-level concern (before flag parsing).\n if (token === \"-v\" || token === \"--version\") {\n process.stdout.write(`${version()}\\n`);\n return;\n }\n\n // No command, or a root-level help request.\n if (!token || token === \"-h\" || token === \"--help\") {\n process.stdout.write(`${rootUsage()}\\n`);\n return;\n }\n\n const command = findCommand(token);\n if (!command) {\n // Unknown command: report on stderr and show usage. Not json-gated since\n // there's no resolved Output yet.\n process.stderr.write(\n `${color.red(\"error\")} unknown command \"${token}\"\\n\\n${rootUsage()}\\n`,\n );\n process.exit(1);\n }\n\n // Parse global flags off the post-token argv; the rest is the command's argv.\n const flags = parseGlobalFlags(afterToken);\n const out = createOutput({ json: flags.json });\n\n // `hogsend <cmd> --help` short-circuits to the command's usage block.\n if (flags.help) {\n out.log(command.usage);\n return;\n }\n\n const cfg = resolveConfig(flags);\n const http = createAdminClient(cfg);\n const dataHttp = createDataPlaneClient(cfg);\n\n await command.run({\n argv: flags.rest,\n cfg,\n http,\n dataHttp,\n out,\n json: flags.json,\n });\n}\n\nmain().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n // Best-effort json detection for top-level failures (Output may not exist).\n if (process.argv.includes(\"--json\")) {\n process.stdout.write(`${JSON.stringify({ error: msg })}\\n`);\n } else {\n process.stderr.write(`${color.red(\"error\")} ${msg}\\n`);\n }\n process.exit(1);\n});\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend campaigns <subcommand> [options]\n\nQueue and inspect broadcasts: durably send one email template to every\nsubscribed member of a list (or every active member of a bucket). Wraps the\ndata-plane campaigns routes (POST /v1/campaigns, GET /v1/campaigns/{id}).\n\nSubcommands:\n send Queue a campaign. Sends run async in the worker.\n status <id> Show a campaign's status + send counts.\n\nsend options (exactly one of --list / --bucket, plus --template, required):\n --list <id> Target every subscribed member of this list.\n --bucket <id> Target every active member of this bucket.\n --template <key> Email template to send.\n --prop <key=value> Template prop; repeatable. Value parsed as JSON, falling\n back to a string.\n --props <json> Template props as one JSON object (merged with --prop).\n --name <text> Human label for the campaign.\n --from <addr> Override the default From address.\n --subject <text> Override the rendered subject.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend campaigns send --list newsletter --template june-update --name \"June\"\n hogsend campaigns send --bucket power-users --template feature-launch --json\n hogsend campaigns status cmp_123 --json`;\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} campaigns`;\n\n/** Shape returned by POST /v1/campaigns (202 enqueue ack). */\ninterface SendResponse {\n campaignId: string;\n status: \"queued\" | \"sending\" | \"sent\" | \"failed\";\n}\n\n/** Shape returned by GET /v1/campaigns/{id}. */\ninterface StatusResponse {\n id: string;\n name: string;\n status: \"queued\" | \"sending\" | \"sent\" | \"failed\";\n audienceKind: \"list\" | \"bucket\";\n audienceId: string;\n templateKey: string;\n totalRecipients: number;\n sentCount: number;\n skippedCount: number;\n failedCount: number;\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n}\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single props record. Each `--prop` value is JSON-parsed when valid\n * JSON, else kept as a string. The `--props` object is applied first, so later\n * `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction statusColor(status: SendResponse[\"status\"]): string {\n switch (status) {\n case \"sent\":\n return color.green(status);\n case \"queued\":\n case \"sending\":\n return color.cyan(status);\n default:\n // failed\n return color.red(status);\n }\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n list: { type: \"string\" },\n bucket: { type: \"string\" },\n template: { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n name: { type: \"string\" },\n from: { type: \"string\" },\n subject: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const list = values.list;\n const bucket = values.bucket;\n if ((list && bucket) || (!list && !bucket)) {\n ctx.out.fail(\"campaigns send requires exactly one of --list or --bucket\");\n }\n\n const template = values.template;\n if (!template) {\n ctx.out.fail(\n \"campaigns send requires --template, e.g. hogsend campaigns send --list newsletter --template welcome\",\n );\n }\n\n const props = parseProps(ctx, values.props, values.prop);\n\n const body: {\n template: string;\n list?: string;\n bucket?: string;\n props?: Record<string, unknown>;\n name?: string;\n from?: string;\n subject?: string;\n } = { template };\n if (list) body.list = list;\n if (bucket) body.bucket = bucket;\n if (props) body.props = props;\n if (values.name) body.name = values.name;\n if (values.from) body.from = values.from;\n if (values.subject) body.subject = values.subject;\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Queuing campaign ${template}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/campaigns\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} send`);\n ctx.out.kv(\n {\n campaignId: res.campaignId,\n template,\n audience: list ? `list:${list}` : `bucket:${bucket}`,\n status: statusColor(res.status),\n },\n \"Campaign queued\",\n );\n ctx.out.outro(\n `${color.green(\"Queued\")} — poll ${color.cyan(`hogsend campaigns status ${res.campaignId}`)} for progress.`,\n );\n}\n\nasync function runStatus(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"campaigns status requires a campaign id, e.g. hogsend campaigns status cmp_123\",\n );\n }\n\n let res: StatusResponse;\n try {\n res = await ctx.out.step(`Fetching campaign ${id}`, () =>\n ctx.dataHttp.get<StatusResponse>(\n `/v1/campaigns/${encodeURIComponent(id)}`,\n ),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} status`);\n ctx.out.kv(\n {\n id: res.id,\n name: res.name,\n status: statusColor(res.status),\n audience: `${res.audienceKind}:${res.audienceId}`,\n template: res.templateKey,\n recipients: res.totalRecipients,\n sent: color.green(String(res.sentCount)),\n skipped: color.yellow(String(res.skippedCount)),\n failed:\n res.failedCount > 0\n ? color.red(String(res.failedCount))\n : String(res.failedCount),\n startedAt: res.startedAt ?? \"\",\n completedAt: res.completedAt ?? \"\",\n },\n \"Campaign\",\n );\n ctx.out.outro(\n `${res.name} → ${statusColor(res.status)} ` +\n color.dim(\n `(${res.sentCount}/${res.totalRecipients} sent, ${res.skippedCount} skipped, ${res.failedCount} failed)`,\n ),\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"send\":\n // Strip the leading \"send\" token; the rest is send's own args.\n return runSend(ctx, ctx.argv.slice(1));\n case \"status\":\n return runStatus(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"campaigns requires a subcommand: send | status (see hogsend campaigns --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown campaigns subcommand \"${sub}\" — expected send or status`,\n );\n }\n}\n\nexport const campaignsCommand: Command = {\n name: \"campaigns\",\n summary: \"Queue a broadcast to a list/bucket, or check its status\",\n usage,\n run,\n};\n","import type { ResolvedConfig } from \"./config.js\";\n\n/** A non-2xx response (or transport failure) from the admin API. */\nexport interface HttpError extends Error {\n /** HTTP status code, or 0 for a transport-level failure (DNS/connect). */\n status: number;\n /** Parsed JSON body when available, else the raw text, else undefined. */\n body: unknown;\n}\n\n/** Query params accepted by `get` — undefined values are dropped. */\nexport type Query = Record<string, string | number | undefined>;\n\n/**\n * Thin admin HTTP client over native fetch (Node 22). Hits `<base>/v1/...`,\n * sends `Authorization: Bearer <adminKey>` on admin paths, parses JSON, and\n * throws an {@link HttpError} on any non-2xx response.\n *\n * Path convention: pass the path AFTER the base URL, e.g. `/v1/admin/journeys`\n * or `/v1/health`. The unauthenticated health route is reached via the same\n * `get` — pass `{ auth: false }` so a missing admin key doesn't error.\n */\nexport interface AdminClient {\n get<T = unknown>(\n path: string,\n query?: Query,\n opts?: RequestExtras,\n ): Promise<T>;\n patch<T = unknown>(path: string, body: unknown): Promise<T>;\n post<T = unknown>(path: string, body: unknown): Promise<T>;\n del<T = unknown>(path: string, body?: unknown): Promise<T>;\n /** The resolved config this client is bound to (for messages/JSON output). */\n readonly cfg: ResolvedConfig;\n}\n\n/** Per-request overrides. */\nexport interface RequestExtras {\n /** Set false for unauthenticated routes (e.g. /v1/health). Default true. */\n auth?: boolean;\n}\n\nfunction isHttpError(value: unknown): value is HttpError {\n return value instanceof Error && \"status\" in value;\n}\n\nfunction makeHttpError(\n message: string,\n status: number,\n body: unknown,\n): HttpError {\n const err = new Error(message) as HttpError;\n err.name = \"HttpError\";\n err.status = status;\n err.body = body;\n return err;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: Query): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, `${baseUrl}/`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n}\n\nfunction bodyMessage(status: number, body: unknown): string {\n if (\n body &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return `${status}: ${(body as { error: string }).error}`;\n }\n return `request failed with status ${status}`;\n}\n\n/** Internal options accepted by the shared {@link request} core. */\ninterface RequestOpts {\n query?: Query;\n body?: unknown;\n /** When false, no Authorization header is sent (e.g. /v1/health). */\n auth: boolean;\n}\n\n/**\n * The single HTTP core, shared by the admin client and the data-plane client.\n * Bound to a `baseUrl` + a bearer `key`; the only difference between the two\n * clients is which key (and which \"missing key\" message) they carry. Sends\n * `Authorization: Bearer <key>` when `auth` is set, parses JSON, and throws an\n * {@link HttpError} on any non-2xx response (or transport failure).\n */\nasync function request<T>(\n baseUrl: string,\n key: string | undefined,\n missingKeyMessage: string,\n method: string,\n path: string,\n opts: RequestOpts,\n): Promise<T> {\n if (opts.auth && !key) {\n throw makeHttpError(missingKeyMessage, 0, undefined);\n }\n\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (opts.auth && key) {\n headers.Authorization = `Bearer ${key}`;\n }\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const url = buildUrl(baseUrl, path, opts.query);\n\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n throw makeHttpError(`cannot reach ${baseUrl} (${msg})`, 0, undefined);\n }\n\n const text = await res.text();\n let parsed: unknown;\n if (text.length > 0) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n\n if (!res.ok) {\n throw makeHttpError(bodyMessage(res.status, parsed), res.status, parsed);\n }\n\n return parsed as T;\n}\n\n/** Build an {@link AdminClient} bound to the given resolved config. */\nexport function createAdminClient(cfg: ResolvedConfig): AdminClient {\n const missing =\n \"no admin key configured — pass --admin-key, or set HOGSEND_ADMIN_KEY / ADMIN_API_KEY\";\n return {\n cfg,\n get: <T>(path: string, query?: Query, extras?: RequestExtras) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"GET\", path, {\n query,\n auth: extras?.auth ?? true,\n }),\n patch: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"PATCH\", path, {\n body,\n auth: true,\n }),\n post: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"POST\", path, {\n body,\n auth: true,\n }),\n del: <T>(path: string, body?: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"DELETE\", path, {\n body,\n auth: true,\n }),\n };\n}\n\n/**\n * Thin data-plane HTTP client over the same core as {@link createAdminClient},\n * but bound to `cfg.dataKey` (an `ingest`-scoped key). Used by the write\n * commands (`contacts upsert`, `events send`, `emails send`) which hit the\n * authed `/v1/contacts`, `/v1/events`, and `/v1/emails` data-plane routes.\n *\n * Exposes the full read/write verb set the data plane needs: `get`/`post`/\n * `put`/`del`. Every call is authenticated (there is no unauthenticated\n * data-plane route), so there is no `{ auth: false }` escape hatch here.\n */\nexport interface DataPlaneClient {\n get<T = unknown>(path: string, query?: Query): Promise<T>;\n post<T = unknown>(path: string, body: unknown): Promise<T>;\n put<T = unknown>(path: string, body: unknown): Promise<T>;\n del<T = unknown>(path: string, body?: unknown): Promise<T>;\n /** The resolved config this client is bound to (for messages/JSON output). */\n readonly cfg: ResolvedConfig;\n}\n\n/** Build a {@link DataPlaneClient} bound to `cfg.dataKey`. */\nexport function createDataPlaneClient(cfg: ResolvedConfig): DataPlaneClient {\n const missing =\n \"no data key configured — pass --data-key, or set HOGSEND_DATA_KEY / HOGSEND_API_KEY\";\n return {\n cfg,\n get: <T>(path: string, query?: Query) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"GET\", path, {\n query,\n auth: true,\n }),\n post: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"POST\", path, {\n body,\n auth: true,\n }),\n put: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"PUT\", path, {\n body,\n auth: true,\n }),\n del: <T>(path: string, body?: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"DELETE\", path, {\n body,\n auth: true,\n }),\n };\n}\n\nexport { isHttpError };\n","import {\n cancel,\n intro as clackIntro,\n note as clackNote,\n outro as clackOutro,\n spinner,\n} from \"@clack/prompts\";\nimport color from \"picocolors\";\n\n/**\n * Unified output sink. Two modes:\n *\n * - human: TTY clack chrome (intro badge, spinners, notes, outro) + tables.\n * Falls back to plain console.log lines when stdout is not a TTY.\n * - json (`--json`): ALL chrome is a no-op; the command emits exactly one\n * JSON document via `out.json(payload)`. Nothing else touches stdout, so a\n * --json run is always a single valid JSON document — safe for agents.\n *\n * `interactive` is true only when human mode AND stdout is a TTY; commands key\n * spinner/prompt behaviour off it. `isJson` flips command control flow to the\n * non-interactive branch.\n */\nexport interface Output {\n /** True when human-mode AND stdout is a TTY (clack chrome is live). */\n readonly interactive: boolean;\n /** True when `--json` was passed. */\n readonly isJson: boolean;\n /** Session intro badge. No-op in json / non-TTY. */\n intro(title: string): void;\n /**\n * Run an async step with a spinner in interactive mode; a plain awaited call\n * otherwise. The label is logged (not spun) when non-interactive & not json.\n */\n step<T>(label: string, fn: () => Promise<T>): Promise<T>;\n /** Boxed note. No-op in json / non-TTY (prints plain lines in non-TTY human). */\n note(body: string, title?: string): void;\n /** Render an array of records as a table (human only; no-op in json). */\n table(rows: Record<string, unknown>[], columns?: string[]): void;\n /** Render a key/value object (human only; no-op in json). */\n kv(obj: Record<string, unknown>, title?: string): void;\n /** Plain human/plain-text line. No-op in json. */\n log(msg: string): void;\n /** Emit the single JSON document. Only meaningful in json mode. */\n json(payload: unknown): void;\n /** Session outro. No-op in json / non-TTY. */\n outro(msg: string): void;\n /**\n * Fail terminally. json: prints `{ \"error\": message }` to stdout, exit 1.\n * human (TTY): clack cancel(message), exit 1. human (non-TTY): stderr, exit 1.\n */\n fail(message: string): never;\n}\n\nfunction renderTable(\n rows: Record<string, unknown>[],\n columns?: string[],\n): string {\n if (rows.length === 0) return color.dim(\"(no rows)\");\n const cols =\n columns ??\n Array.from(\n rows.reduce<Set<string>>((set, row) => {\n for (const key of Object.keys(row)) set.add(key);\n return set;\n }, new Set<string>()),\n );\n const cell = (value: unknown): string => {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n };\n const widths = cols.map((c) =>\n Math.max(c.length, ...rows.map((r) => cell(r[c]).length)),\n );\n const pad = (text: string, width: number) =>\n text + \" \".repeat(width - text.length);\n const header = cols\n .map((c, i) => color.bold(pad(c, widths[i] ?? 0)))\n .join(\" \");\n const sep = cols.map((_, i) => \"-\".repeat(widths[i] ?? 0)).join(\" \");\n const body = rows\n .map((r) => cols.map((c, i) => pad(cell(r[c]), widths[i] ?? 0)).join(\" \"))\n .join(\"\\n\");\n return `${header}\\n${color.dim(sep)}\\n${body}`;\n}\n\nfunction renderKv(obj: Record<string, unknown>): string {\n const keys = Object.keys(obj);\n if (keys.length === 0) return color.dim(\"(empty)\");\n const width = Math.max(...keys.map((k) => k.length));\n return keys\n .map((k) => {\n const v = obj[k];\n const str =\n v === null || v === undefined\n ? \"\"\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v);\n return `${color.dim(`${k}:`.padEnd(width + 1))} ${str}`;\n })\n .join(\"\\n\");\n}\n\n/** Build an {@link Output} for the given mode. */\nexport function createOutput(opts: { json: boolean }): Output {\n const isJson = opts.json;\n const interactive = !isJson && Boolean(process.stdout.isTTY);\n\n return {\n interactive,\n isJson,\n\n intro(title) {\n if (!interactive) return;\n clackIntro(title);\n },\n\n async step<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (interactive) {\n const s = spinner();\n s.start(label);\n try {\n const result = await fn();\n s.stop(`${color.green(\"✓\")} ${label}`);\n return result;\n } catch (err) {\n s.stop(`${color.red(\"✗\")} ${label}`);\n throw err;\n }\n }\n if (!isJson) console.log(` ${label} ...`);\n return fn();\n },\n\n note(body, title) {\n if (isJson) return;\n if (interactive) {\n clackNote(body, title);\n return;\n }\n if (title) console.log(`\\n${title}`);\n console.log(body);\n },\n\n table(rows, columns) {\n if (isJson) return;\n console.log(renderTable(rows, columns));\n },\n\n kv(obj, title) {\n if (isJson) return;\n if (title) console.log(color.bold(title));\n console.log(renderKv(obj));\n },\n\n log(msg) {\n if (isJson) return;\n console.log(msg);\n },\n\n json(payload) {\n // Only stdout write in json mode; pretty-printed, single document.\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n },\n\n outro(msg) {\n if (!interactive) return;\n clackOutro(msg);\n },\n\n fail(message): never {\n if (isJson) {\n process.stdout.write(`${JSON.stringify({ error: message })}\\n`);\n } else if (interactive) {\n cancel(message);\n } else {\n process.stderr.write(`${color.red(\"error\")} ${message}\\n`);\n }\n process.exit(1);\n },\n };\n}\n\nexport { color };\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend contacts <subcommand> [options]\n\nInspect contacts via the admin API (/v1/admin/contacts) and upsert them via the\ndata plane (PUT /v1/contacts).\n\nSubcommands:\n list List contacts (newest activity first).\n get <id> Get one contact (by id or externalId) + preferences.\n timeline <id> Merged event/email/journey activity for a contact.\n upsert Create or update a contact (PUT /v1/contacts).\n\nlist options:\n --search <q> Filter by email/externalId substring.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n\ntimeline options:\n --type <t> Restrict to one of: event | journey | email.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n\nupsert options (at least one of --email / --user-id required):\n --email <addr> Contact email (a resolvable identity key).\n --user-id <id> External (distinct) id.\n --prop <key=value> Contact property; repeatable. Value parsed as JSON,\n falling back to a string. Uses the data plane (ingest key).\n --props <json> Contact properties as one JSON object (merged with --prop).\n --list <id> Subscribe to a list; repeatable.\n --unlist <id> Unsubscribe from a list; repeatable.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend contacts list --search acme@ --json\n hogsend contacts get user_123\n hogsend contacts timeline user_123 --type email --json\n hogsend contacts upsert --email a@b.com --user-id user_123 --prop plan=pro\n hogsend contacts upsert --user-id user_123 --props '{\"plan\":\"pro\",\"seats\":5}'`;\n\ntype ContactRecord = {\n id: string;\n externalId: string;\n email: string | null;\n properties: Record<string, unknown>;\n firstSeenAt: string;\n lastSeenAt: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype Preferences = {\n id: string;\n userId: string;\n email: string;\n unsubscribedAll: boolean;\n suppressed: boolean;\n bounceCount: number;\n categories: Record<string, boolean>;\n} | null;\n\ntype ListResponse = {\n contacts: ContactRecord[];\n total: number;\n limit: number;\n offset: number;\n};\n\ntype GetResponse = {\n contact: ContactRecord;\n preferences: Preferences;\n};\n\ntype TimelineEntry = {\n type: \"event\" | \"journey\" | \"email\";\n timestamp: string;\n data: Record<string, unknown>;\n};\n\ntype TimelineResponse = {\n timeline: TimelineEntry[];\n total: number;\n limit: number;\n offset: number;\n};\n\n/** Shape returned by PUT /v1/contacts. */\ntype UpsertResponse = {\n id: string;\n created: boolean;\n linked: boolean;\n};\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} contacts`;\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single properties record. Each `--prop` value is JSON-parsed when it\n * is valid JSON (numbers/booleans/null/objects), else kept as a string. The\n * explicit `--props` object is applied first, so later `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n const raw = pair.slice(eq + 1);\n out[key] = coerceValue(raw);\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Build a `lists` map from repeatable `--list <id>` (true) / `--unlist <id>`\n * (false) flags. Returns undefined when neither was passed.\n */\nfunction parseLists(\n subscribe: string[] | undefined,\n unsubscribe: string[] | undefined,\n): Record<string, boolean> | undefined {\n const out: Record<string, boolean> = {};\n let any = false;\n for (const id of subscribe ?? []) {\n out[id] = true;\n any = true;\n }\n for (const id of unsubscribe ?? []) {\n out[id] = false;\n any = true;\n }\n return any ? out : undefined;\n}\n\n/** Run an HTTP call, mapping HttpError into a clean ctx.out.fail message. */\nasync function fetchOrFail<T>(\n ctx: CommandContext,\n label: string,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await ctx.out.step(label, fn);\n } catch (err) {\n if (isHttpError(err)) {\n if (err.status === 404) {\n ctx.out.fail(err.message || \"contact not found\");\n }\n ctx.out.fail(err.message);\n }\n throw err;\n }\n}\n\nasync function runList(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n search: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const query = {\n search: values.search,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} list`);\n\n const res = await fetchOrFail<ListResponse>(ctx, \"Fetching contacts\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/contacts\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.contacts.map((cnt) => ({\n id: cnt.id,\n externalId: cnt.externalId,\n email: cnt.email ?? color.dim(\"(none)\"),\n lastSeenAt: cnt.lastSeenAt,\n })),\n [\"id\", \"externalId\", \"email\", \"lastSeenAt\"],\n );\n ctx.out.outro(\n `${res.contacts.length} of ${res.total} contact(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\nasync function runGet(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the \"get\" subcommand token; the id follows it.\n const id = positionals[1];\n if (!id) {\n ctx.out.fail(\n \"contacts get requires an id, e.g. hogsend contacts get user_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} get`);\n\n const res = await fetchOrFail<GetResponse>(ctx, \"Fetching contact\", () =>\n ctx.http.get<GetResponse>(`/v1/admin/contacts/${encodeURIComponent(id)}`),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n const { contact, preferences } = res;\n ctx.out.kv(\n {\n id: contact.id,\n externalId: contact.externalId,\n email: contact.email ?? color.dim(\"(none)\"),\n firstSeenAt: contact.firstSeenAt,\n lastSeenAt: contact.lastSeenAt,\n properties: contact.properties,\n },\n \"Contact\",\n );\n\n if (preferences) {\n ctx.out.kv(\n {\n unsubscribedAll: preferences.unsubscribedAll,\n suppressed: preferences.suppressed,\n bounceCount: preferences.bounceCount,\n categories: preferences.categories,\n },\n \"Preferences\",\n );\n } else {\n ctx.out.log(color.dim(\"No email preferences on record.\"));\n }\n\n ctx.out.outro(`Contact ${color.cyan(contact.externalId)}`);\n}\n\nasync function runTimeline(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n type: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the \"timeline\" subcommand token; the id follows it.\n const id = positionals[1];\n if (!id) {\n ctx.out.fail(\n \"contacts timeline requires an id, e.g. hogsend contacts timeline user_123\",\n );\n }\n\n if (values.type && ![\"event\", \"journey\", \"email\"].includes(values.type)) {\n ctx.out.fail(\"--type must be one of: event, journey, email\");\n }\n\n const query = {\n type: values.type,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} timeline`);\n\n const res = await fetchOrFail<TimelineResponse>(\n ctx,\n \"Fetching timeline\",\n () =>\n ctx.http.get<TimelineResponse>(\n `/v1/admin/contacts/${encodeURIComponent(id)}/timeline`,\n query,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.timeline.map((entry) => ({\n timestamp: entry.timestamp,\n type: entry.type,\n summary: summarizeTimelineEntry(entry),\n })),\n [\"timestamp\", \"type\", \"summary\"],\n );\n ctx.out.outro(\n `${res.timeline.length} of ${res.total} entry(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\n/** One-line human description of a timeline entry, by type. */\nfunction summarizeTimelineEntry(entry: TimelineEntry): string {\n const d = entry.data;\n if (entry.type === \"event\") {\n return String(d.event ?? \"\");\n }\n if (entry.type === \"journey\") {\n return `${String(d.journeyId ?? \"\")} (${String(d.status ?? \"\")})`;\n }\n // email\n const subject = d.subject ? String(d.subject) : String(d.templateKey ?? \"\");\n return `${subject} [${String(d.status ?? \"\")}]`;\n}\n\nasync function runUpsert(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n email: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n list: { type: \"string\", multiple: true },\n unlist: { type: \"string\", multiple: true },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const email = values.email;\n const userId = values[\"user-id\"];\n if (!email && !userId) {\n ctx.out.fail(\n \"contacts upsert requires at least one of --email or --user-id\",\n );\n }\n\n const properties = parseProps(ctx, values.props, values.prop);\n const lists = parseLists(values.list, values.unlist);\n\n const body: {\n email?: string;\n userId?: string;\n properties?: Record<string, unknown>;\n lists?: Record<string, boolean>;\n } = {};\n if (email) body.email = email;\n if (userId) body.userId = userId;\n if (properties) body.properties = properties;\n if (lists) body.lists = lists;\n\n if (!ctx.json) ctx.out.intro(`${badge} upsert`);\n\n const res = await fetchOrFail<UpsertResponse>(ctx, \"Upserting contact\", () =>\n ctx.dataHttp.put<UpsertResponse>(\"/v1/contacts\", body),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.kv(\n {\n id: res.id,\n created: res.created,\n linked: res.linked,\n email: email ?? color.dim(\"(none)\"),\n userId: userId ?? color.dim(\"(none)\"),\n },\n \"Contact\",\n );\n const verb = res.created ? \"created\" : \"updated\";\n ctx.out.outro(`Contact ${color.cyan(res.id)} ${verb}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n return runList(ctx, ctx.argv);\n case \"get\":\n return runGet(ctx, ctx.argv);\n case \"timeline\":\n return runTimeline(ctx, ctx.argv);\n case \"upsert\":\n // Strip the leading \"upsert\" token; the rest is upsert's own flags.\n return runUpsert(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"contacts requires a subcommand: list, get, timeline, or upsert (see hogsend contacts --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown contacts subcommand \"${sub}\" — expected list, get, timeline, or upsert`,\n );\n }\n}\n\nexport const contactsCommand: Command = {\n name: \"contacts\",\n summary: \"List, inspect, trace, and upsert contacts\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport { skillsStaleness } from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\n/**\n * Best-effort nudge: if the cwd is a Hogsend app whose vendored skills were\n * installed by an OLDER CLI than the one running now, point the user at the\n * refresh. Silent when there's no stamp (not an app dir / never tracked).\n */\nfunction skillsNudge(ctx: CommandContext): void {\n const verdict = skillsStaleness(process.cwd());\n if (!verdict?.stale || ctx.json) return;\n ctx.out.note(\n [\n `Vendored Claude skills are from v${verdict.installed}; this CLI is v${verdict.current}.`,\n \"\",\n `Refresh: ${color.cyan(\"hogsend upgrade\")} ${color.dim(\"(deps + skills)\")} or ${color.cyan(\"hogsend skills add --all --force\")}.`,\n ].join(\"\\n\"),\n \"Skills out of date\",\n );\n}\n\nconst usage = `hogsend doctor [--url <baseUrl>] [--admin-key <key>] [--json]\n\nProbe a running Hogsend instance via GET /v1/health and report its health:\ncomponent status (database, redis), two-track schema state (engine + client),\nand an overall verdict.\n\nThe health route is unauthenticated, so doctor works without an admin key.\n\nVerdict:\n ok service healthy, all components up, schema in sync\n degraded reachable but a component (database/redis) is down\n migration_pending reachable but a schema track is behind (pending migrations)\n unreachable the instance could not be reached at all\n\nExit code: 0 when ok, 1 when unreachable / degraded / migration_pending.\n\nOptions:\n --url <baseUrl> Target instance (default HOGSEND_API_URL / .env / :3002).\n --admin-key <key> Unused by doctor (health is unauthenticated).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.`;\n\n/** Subset of the engine /v1/health response we render. */\ninterface HealthComponent {\n status: \"up\" | \"down\";\n latencyMs?: number;\n}\ninterface HealthTrack {\n applied: string | null;\n required: string | null;\n inSync: boolean;\n pending: string[];\n}\ninterface HealthResponse {\n status: \"healthy\" | \"degraded\" | \"migration_pending\";\n uptime: number;\n timestamp: string;\n version: string;\n components: {\n database: HealthComponent;\n redis: HealthComponent;\n };\n schema: {\n engine: HealthTrack;\n client: HealthTrack;\n };\n}\n\ntype Verdict = \"ok\" | \"degraded\" | \"migration_pending\" | \"unreachable\";\n\n/** Map the server's status onto the CLI verdict vocabulary. */\nfunction toVerdict(status: HealthResponse[\"status\"]): Verdict {\n switch (status) {\n case \"healthy\":\n return \"ok\";\n case \"degraded\":\n return \"degraded\";\n case \"migration_pending\":\n return \"migration_pending\";\n }\n}\n\nfunction componentSymbol(status: \"up\" | \"down\"): string {\n return status === \"up\" ? color.green(\"up\") : color.red(\"down\");\n}\n\nfunction trackLine(name: string, track: HealthTrack): string {\n const sync = track.inSync\n ? color.green(\"in sync\")\n : color.yellow(\n `behind (${track.pending.length} pending: ${\n track.pending.length > 0 ? track.pending.join(\", \") : \"n/a\"\n })`,\n );\n const applied = track.applied ?? color.dim(\"none\");\n const required = track.required ?? color.dim(\"none\");\n return `${color.bold(name.padEnd(7))} applied ${applied} -> required ${required} ${sync}`;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n // doctor takes no extra flags of its own; tolerate stray tokens.\n strict: false,\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const { baseUrl } = ctx.http.cfg;\n\n // Fetch health. A transport failure (status 0) means unreachable — we surface\n // that as a first-class verdict rather than a hard error so agents get a\n // structured answer. Any other HttpError (non-2xx) is genuinely exceptional.\n let health: HealthResponse | null = null;\n let reachError: string | null = null;\n try {\n health = await ctx.out.step(`GET ${baseUrl}/v1/health`, () =>\n ctx.http.get<HealthResponse>(\"/v1/health\", undefined, { auth: false }),\n );\n } catch (error) {\n if (isHttpError(error) && error.status === 0) {\n reachError = error.message;\n } else if (isHttpError(error)) {\n // A 4xx/5xx from /v1/health: the instance is up but answering badly.\n // Treat as unreachable-for-health so the verdict stays meaningful.\n reachError = error.message;\n } else {\n throw error;\n }\n }\n\n if (!health) {\n const verdict: Verdict = \"unreachable\";\n if (ctx.json) {\n ctx.out.json({\n ok: false,\n verdict,\n baseUrl,\n error: reachError ?? \"unreachable\",\n });\n process.exit(1);\n }\n ctx.out.note(\n [\n `${color.red(\"●\")} ${color.bold(\"unreachable\")}`,\n \"\",\n reachError ?? `could not reach ${baseUrl}`,\n \"\",\n color.dim(\"Is the instance running? Check --url / HOGSEND_API_URL.\"),\n ].join(\"\\n\"),\n \"Doctor\",\n );\n ctx.out.outro(color.red(\"doctor: unreachable\"));\n process.exit(1);\n }\n\n const verdict = toVerdict(health.status);\n const ok = verdict === \"ok\";\n\n if (ctx.json) {\n ctx.out.json({\n ok,\n verdict,\n baseUrl,\n version: health.version,\n uptime: health.uptime,\n timestamp: health.timestamp,\n components: health.components,\n schema: health.schema,\n skills: skillsStaleness(process.cwd()) ?? undefined,\n });\n if (!ok) process.exit(1);\n return;\n }\n\n // Human render.\n const badge = `${color.bgMagenta(color.black(\" hogsend \"))} doctor`;\n ctx.out.intro(badge);\n\n const verdictColor =\n verdict === \"ok\"\n ? color.green\n : verdict === \"degraded\"\n ? color.red\n : color.yellow;\n\n const lines = [\n `${verdictColor(\"●\")} ${color.bold(verdict)}`,\n color.dim(\n `${baseUrl} v${health.version} up ${Math.round(health.uptime)}s`,\n ),\n \"\",\n color.bold(\"Components\"),\n ` database ${componentSymbol(health.components.database.status)}${\n health.components.database.latencyMs !== undefined\n ? color.dim(` ${health.components.database.latencyMs}ms`)\n : \"\"\n }`,\n ` redis ${componentSymbol(health.components.redis.status)}${\n health.components.redis.latencyMs !== undefined\n ? color.dim(` ${health.components.redis.latencyMs}ms`)\n : \"\"\n }`,\n \"\",\n color.bold(\"Schema\"),\n ` ${trackLine(\"engine\", health.schema.engine)}`,\n ` ${trackLine(\"client\", health.schema.client)}`,\n ];\n\n ctx.out.note(lines.join(\"\\n\"), \"Doctor\");\n\n skillsNudge(ctx);\n\n if (ok) {\n ctx.out.outro(color.green(\"doctor: ok\"));\n return;\n }\n\n ctx.out.outro(verdictColor(`doctor: ${verdict}`));\n process.exit(1);\n}\n\nexport const doctorCommand: Command = {\n name: \"doctor\",\n summary: \"Probe a running instance's health (GET /v1/health)\",\n usage,\n run,\n};\n","import {\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Shared skill-install machinery, used by `hogsend skills`, `hogsend upgrade`,\n * and the `hogsend doctor` staleness nudge. The CLI ships a `skills/` dir in its\n * published tarball (package.json files[]); these helpers copy it into a\n * consumer project's ./.claude/skills/ and track which CLI version produced it.\n */\n\nexport interface BundledSkill {\n name: string;\n description: string;\n installed: boolean;\n}\n\nexport interface CopyResult {\n name: string;\n installed: boolean;\n skipped: boolean;\n path: string;\n}\n\n/** Persisted record of the last skill install — drives the staleness nudge. */\nexport interface SkillsStamp {\n /** The @hogsend/cli version that produced the installed skills. */\n cliVersion: string;\n /** Installed skill names. */\n skills: string[];\n /** ISO timestamp of the install/refresh (omitted by build-time stamps). */\n updatedAt?: string;\n}\n\n/**\n * Resolve the directory holding the bundled skills shipped in the tarball.\n * At runtime the CLI is bundled into <pkg>/dist/bin.js, so the skills dir\n * (shipped via package.json files[]) is one level up at <pkg>/skills.\n */\nexport function bundledSkillsDir(): string {\n return fileURLToPath(new URL(\"../skills\", import.meta.url));\n}\n\n/** Target directory for installed skills in the consumer project. */\nexport function installDir(cwd: string): string {\n return join(cwd, \".claude\", \"skills\");\n}\n\n/** Path to the install stamp (sibling of skills/, NOT inside it). */\nexport function stampPath(cwd: string): string {\n return join(cwd, \".claude\", \".hogsend-skills.json\");\n}\n\n/** This CLI's own version (read from its package.json at <pkg>/package.json). */\nexport function cliVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\n/** Read a file as utf8, returning \"\" on any error (never throws). */\nfunction readFileSyncSafe(path: string): string {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/** A single-line `key: value` reader for SKILL.md YAML frontmatter. */\nfunction readFrontmatterField(skillDir: string, field: string): string {\n const skillFile = join(skillDir, \"SKILL.md\");\n if (!existsSync(skillFile)) return \"\";\n // Tiny frontmatter scan — avoids a YAML dep. Reads only the top block.\n const raw = readFileSyncSafe(skillFile);\n const fmMatch = raw.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return \"\";\n const block = fmMatch[1] ?? \"\";\n for (const line of block.split(\"\\n\")) {\n const m = line.match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (m && m[1] === field) {\n return (m[2] ?? \"\").replace(/^[\"']|[\"']$/g, \"\").trim();\n }\n }\n return \"\";\n}\n\n/** Enumerate bundled skills (each is a subdir with a SKILL.md). */\nexport function listBundledSkills(cwd: string): BundledSkill[] {\n const dir = bundledSkillsDir();\n if (!existsSync(dir)) return [];\n const target = installDir(cwd);\n const entries = readdirSync(dir).filter((name) => {\n const full = join(dir, name);\n return statSync(full).isDirectory() && existsSync(join(full, \"SKILL.md\"));\n });\n return entries.sort().map((name) => ({\n name,\n description: readFrontmatterField(join(dir, name), \"description\"),\n installed: existsSync(join(target, name)),\n }));\n}\n\n/** Copy one bundled skill into the project, honouring --force. */\nexport function copySkill(\n name: string,\n cwd: string,\n force: boolean,\n): CopyResult {\n const src = join(bundledSkillsDir(), name);\n const dest = join(installDir(cwd), name);\n const exists = existsSync(dest);\n if (exists && !force) {\n return { name, installed: false, skipped: true, path: dest };\n }\n mkdirSync(installDir(cwd), { recursive: true });\n cpSync(src, dest, { recursive: true, force: true });\n return { name, installed: true, skipped: false, path: dest };\n}\n\n/** Record which CLI version produced the currently-installed skills. */\nexport function writeSkillsStamp(cwd: string, skills: string[]): void {\n const stamp: SkillsStamp = {\n cliVersion: cliVersion(),\n skills: [...skills].sort(),\n updatedAt: new Date().toISOString(),\n };\n mkdirSync(join(cwd, \".claude\"), { recursive: true });\n writeFileSync(stampPath(cwd), `${JSON.stringify(stamp, null, 2)}\\n`);\n}\n\n/** Read the install stamp, or null when absent/unreadable. */\nexport function readSkillsStamp(cwd: string): SkillsStamp | null {\n try {\n const parsed = JSON.parse(readFileSync(stampPath(cwd), \"utf8\")) as\n | SkillsStamp\n | undefined;\n return parsed && typeof parsed.cliVersion === \"string\" ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** Numeric semver compare on the release line (prerelease tags ignored). */\nexport function compareVersions(a: string, b: string): number {\n const parse = (v: string) =>\n (v.split(\"-\")[0] ?? \"\").split(\".\").map((n) => Number.parseInt(n, 10) || 0);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return 0;\n}\n\n/**\n * Staleness verdict for the skills installed in `cwd`. Returns null when no\n * stamp exists (not a tracked app), else whether the installed skills came from\n * an OLDER CLI than the one running now.\n */\nexport function skillsStaleness(\n cwd: string,\n): { stale: boolean; installed: string; current: string } | null {\n const stamp = readSkillsStamp(cwd);\n if (!stamp) return null;\n const current = cliVersion();\n return {\n stale: compareVersions(stamp.cliVersion, current) < 0,\n installed: stamp.cliVersion,\n current,\n };\n}\n","import { existsSync, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, sep } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { EjectError, eject } from \"../eject.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend eject <package> [--force] [--cwd <dir>]\n\nCopy a @hogsend/* package's source into vendor/<name> and rewrite the consumer\ndependency to file:./vendor/<name>. Every other dependency keeps upgrading.\n\nOptions:\n --force Overwrite an existing vendor/<name>.\n --cwd <dir> Consumer repo root (defaults to the current directory).\n -h, --help Show this help.\n\nAfter ejecting, run: pnpm install`;\n\n/**\n * Resolve the on-disk source directory for an installed package. Strategy 1:\n * probe node_modules/<pkg>/package.json (following pnpm/workspace symlinks).\n * Strategy 2: resolve the package entry via createRequire and walk up.\n */\nfunction resolveSourceDir(pkg: string, consumerRoot: string): string | null {\n const direct = join(consumerRoot, \"node_modules\", pkg, \"package.json\");\n if (existsSync(direct)) {\n return dirname(realpathSync(direct));\n }\n const require = createRequire(`${consumerRoot}${sep}`);\n try {\n const entry = require.resolve(pkg);\n let dir = dirname(entry);\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n } catch {\n // fall through\n }\n return null;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n force: { type: \"boolean\", default: false },\n cwd: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const pkg = positionals[0];\n if (!pkg) {\n ctx.out.fail(\n \"eject requires a package name, e.g. hogsend eject @hogsend/engine\",\n );\n }\n\n const consumerRoot = values.cwd ?? process.cwd();\n const sourceDir = resolveSourceDir(pkg, consumerRoot);\n if (!sourceDir) {\n ctx.out.fail(\n `cannot resolve ${pkg} from ${consumerRoot}. Is it installed? Run pnpm install first.`,\n );\n }\n\n try {\n const result = await ctx.out.step(`Ejecting ${pkg}`, () =>\n eject({ pkg, consumerRoot, sourceDir, force: values.force }),\n );\n if (ctx.json) {\n ctx.out.json(result);\n return;\n }\n ctx.out.note(\n [\n `copied ${result.copiedFiles} files -> ${result.vendorPath}`,\n `dependency ${result.depSpecBefore} -> ${color.cyan(result.depSpecAfter)}`,\n \"\",\n `Now run: ${color.cyan(result.followUp)}`,\n ].join(\"\\n\"),\n `Ejected ${result.pkg}`,\n );\n } catch (error) {\n if (error instanceof EjectError) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n}\n\nexport const ejectCommand: Command = {\n name: \"eject\",\n summary: \"Vendor a @hogsend/* package into vendor/<name>\",\n usage,\n run,\n};\n","import { existsSync } from \"node:fs\";\nimport { cp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join, relative, sep } from \"node:path\";\n\n/** Options for {@link eject}. */\nexport interface EjectOptions {\n /** Scoped package name to eject, e.g. \"@hogsend/engine\". */\n pkg: string;\n /** Consumer repo root (the dir containing the consumer package.json). */\n consumerRoot: string;\n /**\n * Where the package source currently lives (the workspace/registry copy).\n * In-monorepo: <repoRoot>/packages/<name>. In a scaffolded app it is the\n * resolved node_modules path. The caller resolves this; eject() never\n * guesses it.\n */\n sourceDir: string;\n /** Overwrite an existing vendor/<name>. */\n force?: boolean;\n}\n\n/** Result of a successful {@link eject}. */\nexport interface EjectResult {\n pkg: string;\n /** Absolute path to vendor/<name>. */\n vendorPath: string;\n /** The dep spec before the rewrite, e.g. \"workspace:^\". */\n depSpecBefore: string;\n /** The dep spec after the rewrite, \"file:./vendor/<name>\". */\n depSpecAfter: string;\n /** Number of files copied into vendor/<name>. */\n copiedFiles: number;\n /** The install command the operator must run next. */\n followUp: string;\n}\n\n/** Typed failure thrown by {@link eject} for expected, user-facing errors. */\nexport class EjectError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EjectError\";\n }\n}\n\n/** Directory/file names excluded from the vendor copy. */\nconst EXCLUDED_NAMES = new Set([\n \"node_modules\",\n \"dist\",\n \".turbo\",\n \".changeset\",\n \"CHANGELOG.md\",\n]);\n\ninterface PackageJson {\n private?: boolean;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepMap = \"dependencies\" | \"devDependencies\";\n\nasync function readPackageJson(file: string): Promise<PackageJson> {\n const raw = await readFile(file, \"utf8\");\n return JSON.parse(raw) as PackageJson;\n}\n\nasync function writePackageJson(\n file: string,\n value: PackageJson,\n): Promise<void> {\n await writeFile(file, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Pure eject: copies a single package's source into the consumer's\n * `vendor/<name>` and rewrites only that consumer dependency to a\n * `file:./vendor/<name>` link. Every other dependency is left untouched, so\n * the rest of the `@hogsend/*` set keeps upgrading via `pnpm up`.\n *\n * This function performs filesystem operations only — it never runs an install\n * and never resolves `sourceDir` itself, which keeps it hermetically testable.\n */\nexport async function eject(opts: EjectOptions): Promise<EjectResult> {\n const { pkg, consumerRoot, sourceDir, force = false } = opts;\n\n // 1. Resolve names.\n const vendorName = basename(pkg);\n const vendorPath = join(consumerRoot, \"vendor\", vendorName);\n\n // 2. Validate the consumer dependency exists (before any side effects).\n const consumerPkgPath = join(consumerRoot, \"package.json\");\n const consumerPkg = await readPackageJson(consumerPkgPath);\n let depMap: DepMap | undefined;\n let depSpecBefore: string | undefined;\n if (consumerPkg.dependencies?.[pkg] !== undefined) {\n depMap = \"dependencies\";\n depSpecBefore = consumerPkg.dependencies[pkg];\n } else if (consumerPkg.devDependencies?.[pkg] !== undefined) {\n depMap = \"devDependencies\";\n depSpecBefore = consumerPkg.devDependencies[pkg];\n }\n if (!depMap || depSpecBefore === undefined) {\n throw new EjectError(\n `${pkg} is not a dependency of the consumer package.json`,\n );\n }\n\n // 3. Guard the vendor dir.\n if (existsSync(vendorPath)) {\n if (!force) {\n throw new EjectError(\n `vendor/${vendorName} already exists; pass --force to overwrite`,\n );\n }\n await rm(vendorPath, { recursive: true, force: true });\n }\n\n // 4. Copy source with an exclude filter. Returning false for a directory\n // prunes the whole subtree (Node 22 fs.cp filter semantics).\n let copiedFiles = 0;\n await cp(sourceDir, vendorPath, {\n recursive: true,\n filter: (source) => {\n const rel = relative(sourceDir, source);\n if (rel === \"\") {\n return true;\n }\n const segments = rel.split(sep);\n const name = basename(rel);\n // Exclude any path segment that is an excluded name (prunes subtrees).\n if (segments.some((segment) => EXCLUDED_NAMES.has(segment))) {\n return false;\n }\n if (name.endsWith(\".test.ts\")) {\n return false;\n }\n return true;\n },\n });\n\n // Count copied files (directories excluded) for the result summary.\n copiedFiles = await countFiles(vendorPath);\n\n // 5. Sanitize the vendored package.json.\n const vendoredPkgPath = join(vendorPath, \"package.json\");\n const vendoredPkg = await readPackageJson(vendoredPkgPath);\n if (vendoredPkg.private === true) {\n delete vendoredPkg.private;\n }\n await writePackageJson(vendoredPkgPath, vendoredPkg);\n\n // 6. Rewrite the consumer dep in place (preserving key order).\n const depSpecAfter = `file:./vendor/${vendorName}`;\n // biome-ignore lint/style/noNonNullAssertion: depMap validated above.\n consumerPkg[depMap]![pkg] = depSpecAfter;\n await writePackageJson(consumerPkgPath, consumerPkg);\n\n // 7. Return the result.\n return {\n pkg,\n vendorPath,\n depSpecBefore,\n depSpecAfter,\n copiedFiles,\n followUp: \"pnpm install\",\n };\n}\n\n/** Recursively counts regular files under a directory. */\nasync function countFiles(dir: string): Promise<number> {\n const { readdir } = await import(\"node:fs/promises\");\n let count = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n count += await countFiles(full);\n } else if (entry.isFile()) {\n count += 1;\n } else {\n const info = await stat(full);\n if (info.isFile()) {\n count += 1;\n }\n }\n }\n return count;\n}\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend emails <subcommand> [options]\n\nSend a transactional email through the data plane (POST /v1/emails). The send\nruns through the full preferences + tracking pipeline (link-click + open).\n\nSubcommands:\n send <template> Send the named template to a recipient.\n\nsend options (at least one of --to / --user-id required):\n --to <addr> Recipient email address.\n --user-id <id> External (distinct) id; the recipient email is resolved\n from the contact (404 if it has no resolvable email).\n --prop <key=value> Template prop; repeatable. Value parsed as JSON, falling\n back to a string.\n --props <json> Template props as one JSON object (merged with --prop).\n --from <addr> Override the default From address.\n --subject <text> Override the rendered subject.\n --reply-to <addr> Set the Reply-To address.\n --category <key> Preference category / list id to gate the send on.\n --skip-preference-check Bypass unsubscribe/suppression (requires full-admin).\n --idempotency-key <k> Dedup key.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend emails send welcome --to a@b.com --prop name=Ada\n hogsend emails send welcome --user-id user_123 --props '{\"name\":\"Ada\"}' --json`;\n\n/** Shape returned by POST /v1/emails. */\ninterface SendResponse {\n emailSendId: string;\n status: \"queued\" | \"sent\" | \"suppressed\" | \"unsubscribed\" | \"skipped\";\n reason?: string;\n}\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} emails`;\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single props record. Each `--prop` value is JSON-parsed when valid\n * JSON, else kept as a string. The `--props` object is applied first, so later\n * `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction statusColor(status: SendResponse[\"status\"]): string {\n switch (status) {\n case \"queued\":\n case \"sent\":\n return color.green(status);\n case \"skipped\":\n return color.dim(status);\n default:\n // suppressed | unsubscribed\n return color.yellow(status);\n }\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n to: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n from: { type: \"string\" },\n subject: { type: \"string\" },\n \"reply-to\": { type: \"string\" },\n category: { type: \"string\" },\n \"skip-preference-check\": { type: \"boolean\", default: false },\n \"idempotency-key\": { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the template name (the \"send\" token was already stripped).\n const template = positionals[0];\n if (!template) {\n ctx.out.fail(\n \"emails send requires a template, e.g. hogsend emails send welcome --to a@b.com\",\n );\n }\n\n const to = values.to;\n const userId = values[\"user-id\"];\n if (!to && !userId) {\n ctx.out.fail(\"emails send requires at least one of --to or --user-id\");\n }\n\n const props = parseProps(ctx, values.props, values.prop);\n\n const body: {\n template: string;\n to?: string;\n userId?: string;\n props?: Record<string, unknown>;\n from?: string;\n subject?: string;\n replyTo?: string;\n category?: string;\n skipPreferenceCheck?: boolean;\n idempotencyKey?: string;\n } = { template };\n if (to) body.to = to;\n if (userId) body.userId = userId;\n if (props) body.props = props;\n if (values.from) body.from = values.from;\n if (values.subject) body.subject = values.subject;\n if (values[\"reply-to\"]) body.replyTo = values[\"reply-to\"];\n if (values.category) body.category = values.category;\n if (values[\"skip-preference-check\"]) body.skipPreferenceCheck = true;\n if (values[\"idempotency-key\"]) {\n body.idempotencyKey = values[\"idempotency-key\"];\n }\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Sending ${template}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/emails\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} send`);\n ctx.out.kv(\n {\n emailSendId: res.emailSendId,\n template,\n recipient: to ?? userId ?? \"\",\n status: statusColor(res.status),\n reason: res.reason ?? \"\",\n },\n \"Email send\",\n );\n ctx.out.outro(`${template} → ${statusColor(res.status)}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"send\":\n // Strip the leading \"send\" token; the rest is send's own args.\n return runSend(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"emails requires a subcommand: send (see hogsend emails --help)\",\n );\n break;\n default:\n ctx.out.fail(`unknown emails subcommand \"${sub}\" — expected send`);\n }\n}\n\nexport const emailsCommand: Command = {\n name: \"emails\",\n summary: \"Send a transactional email through the data plane\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend events <userId> [options]\nhogsend events send <name> [options]\n\nRead a single user's event history (admin API), or send an event into the data\nplane to drive journeys/buckets.\n\nRead mode — hogsend events <userId>:\n Stream the event history for a single user, newest first. Wraps\n GET /v1/admin/events?userId=<userId>.\n\n Arguments:\n <userId> The user (distinct) id to fetch events for. Required.\n\n Options:\n --event <name> Filter to a single event name.\n --from <iso> Only events at/after this ISO-8601 timestamp.\n --to <iso> Only events at/before this ISO-8601 timestamp.\n --limit <n> Max events to return (1-100, default 50).\n --offset <n> Pagination offset (default 0).\n\nSend mode — hogsend events send <name>:\n Push an event into POST /v1/events (data plane, ingest key). At least one of\n --email / --user-id is required.\n\n Options:\n --email <addr> Recipient/identity email.\n --user-id <id> External (distinct) id.\n --prop <key=value> Event property; repeatable. Value parsed as JSON,\n falling back to a string.\n --props <json> Event properties as one JSON object.\n --contact-prop <k=v> Contact property to merge onto the contact; repeatable.\n --contact-props <json> Contact properties as one JSON object.\n --list <id> Subscribe to a list; repeatable.\n --unlist <id> Unsubscribe from a list; repeatable.\n --idempotency-key <k> Dedup key (sent as the Idempotency-Key header).\n --timestamp <iso> Override the event timestamp.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend events user_123\n hogsend events user_123 --event signup --limit 10\n hogsend events user_123 --from 2026-01-01T00:00:00Z --json\n hogsend events send signup --user-id user_123 --prop plan=pro\n hogsend events send purchase --email a@b.com --props '{\"amount\":49}' --json`;\n\ninterface UserEvent {\n id: string;\n userId: string;\n event: string;\n properties: Record<string, unknown> | null;\n occurredAt: string;\n}\n\ninterface EventsResponse {\n events: UserEvent[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Shape returned by POST /v1/events. */\ninterface ExitResult {\n journeyId: string;\n stateId: string;\n exited: boolean;\n}\n\ninterface SendResponse {\n stored: boolean;\n exits: ExitResult[];\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n // `events send <name>` is the write path; everything else is the read path\n // (bare `events <userId>`). Dispatch on the first positional WITHOUT a global\n // --help short-circuit here, so `events send --help` still shows usage.\n if (ctx.argv[0] === \"send\") {\n return runSend(ctx, ctx.argv.slice(1));\n }\n return runRead(ctx, ctx.argv);\n}\n\nasync function runRead(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n event: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const userId = positionals[0];\n if (!userId) {\n ctx.out.fail(\"events requires a userId, e.g. hogsend events user_123\");\n }\n\n const limit = parseNumber(values.limit, \"limit\", ctx);\n const offset = parseNumber(values.offset, \"offset\", ctx);\n\n const query = {\n userId,\n event: values.event,\n from: values.from,\n to: values.to,\n limit,\n offset,\n };\n\n let data: EventsResponse;\n try {\n data = await ctx.out.step(`Fetching events for ${userId}`, () =>\n ctx.http.get<EventsResponse>(\"/v1/admin/events\", query),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} events`);\n\n if (data.events.length === 0) {\n ctx.out.note(\n `No events found for ${color.cyan(userId)}.`,\n \"Empty event stream\",\n );\n ctx.out.outro(color.dim(\"Nothing to show.\"));\n return;\n }\n\n const rows = data.events.map((e) => ({\n occurredAt: e.occurredAt,\n event: e.event,\n properties: summarizeProps(e.properties),\n id: e.id,\n }));\n ctx.out.table(rows, [\"occurredAt\", \"event\", \"properties\", \"id\"]);\n\n const shown = data.events.length;\n const through = data.offset + shown;\n ctx.out.outro(\n `${color.green(String(shown))} event${shown === 1 ? \"\" : \"s\"} ` +\n color.dim(`(${data.offset + 1}-${through} of ${data.total})`),\n );\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n email: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n \"contact-prop\": { type: \"string\", multiple: true },\n \"contact-props\": { type: \"string\" },\n list: { type: \"string\", multiple: true },\n unlist: { type: \"string\", multiple: true },\n \"idempotency-key\": { type: \"string\" },\n timestamp: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the event name (the \"send\" token was already stripped).\n const name = positionals[0];\n if (!name) {\n ctx.out.fail(\n \"events send requires an event name, e.g. hogsend events send signup --user-id user_123\",\n );\n }\n\n const email = values.email;\n const userId = values[\"user-id\"];\n if (!email && !userId) {\n ctx.out.fail(\"events send requires at least one of --email or --user-id\");\n }\n\n const eventProperties = parseProps(ctx, values.props, values.prop, \"prop\");\n const contactProperties = parseProps(\n ctx,\n values[\"contact-props\"],\n values[\"contact-prop\"],\n \"contact-prop\",\n );\n const lists = parseLists(values.list, values.unlist);\n\n const body: {\n name: string;\n email?: string;\n userId?: string;\n eventProperties?: Record<string, unknown>;\n contactProperties?: Record<string, unknown>;\n lists?: Record<string, boolean>;\n idempotencyKey?: string;\n timestamp?: string;\n } = { name };\n if (email) body.email = email;\n if (userId) body.userId = userId;\n if (eventProperties) body.eventProperties = eventProperties;\n if (contactProperties) body.contactProperties = contactProperties;\n if (lists) body.lists = lists;\n if (values[\"idempotency-key\"]) {\n body.idempotencyKey = values[\"idempotency-key\"];\n }\n if (values.timestamp) body.timestamp = values.timestamp;\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Sending event ${name}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/events\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} events send`);\n\n const exited = res.exits.filter((e) => e.exited);\n ctx.out.kv(\n {\n event: name,\n stored: res.stored,\n identity: email ?? userId ?? \"\",\n exits: res.exits.length,\n \"journeys exited\": exited.length,\n },\n \"Event sent\",\n );\n\n if (exited.length > 0) {\n ctx.out.table(\n exited.map((e) => ({ journeyId: e.journeyId, stateId: e.stateId })),\n [\"journeyId\", \"stateId\"],\n );\n }\n\n ctx.out.outro(\n res.stored\n ? `${color.green(\"Stored\")} ${name}.`\n : color.dim(`${name} was deduped (not stored).`),\n );\n}\n\n/**\n * Parse `--<flag> key=value` (repeatable) + an optional `--<flag>s <json>`\n * object into a single properties record. Each value is JSON-parsed when valid\n * JSON, else kept as a string. The JSON object is applied first so later\n * key=value flags win. `flagName` is used only for error messages.\n */\nfunction parseProps(\n ctx: CommandContext,\n json: string | undefined,\n pairs: string[] | undefined,\n flagName: string,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (json !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n ctx.out.fail(`--${flagName}s must be valid JSON, got: ${json}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(`--${flagName}s must be a JSON object`);\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of pairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--${flagName} must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--${flagName} key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Build a `lists` map from repeatable `--list <id>` (true) / `--unlist <id>`\n * (false) flags. Returns undefined when neither was passed.\n */\nfunction parseLists(\n subscribe: string[] | undefined,\n unsubscribe: string[] | undefined,\n): Record<string, boolean> | undefined {\n const out: Record<string, boolean> = {};\n let any = false;\n for (const id of subscribe ?? []) {\n out[id] = true;\n any = true;\n }\n for (const id of unsubscribe ?? []) {\n out[id] = false;\n any = true;\n }\n return any ? out : undefined;\n}\n\n/**\n * Parse an optional numeric flag. Returns undefined when absent (lets the\n * server apply its default); fails on a non-numeric value.\n */\nfunction parseNumber(\n raw: string | undefined,\n name: string,\n ctx: CommandContext,\n): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n)) {\n ctx.out.fail(`--${name} must be a number, got \"${raw}\"`);\n }\n return n;\n}\n\n/** Compact a properties object into a single-line preview for the table. */\nfunction summarizeProps(props: Record<string, unknown> | null): string {\n if (!props) return \"\";\n const keys = Object.keys(props);\n if (keys.length === 0) return \"\";\n const preview = JSON.stringify(props);\n return preview.length > 60 ? `${preview.slice(0, 57)}...` : preview;\n}\n\nexport const eventsCommand: Command = {\n name: \"events\",\n summary: \"Stream a user's event history, or send an event\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend journeys <subcommand> [options]\n\nInspect and toggle journeys via the admin API (/v1/admin/journeys).\n\nSubcommands:\n list List journeys with status, trigger, and state counts.\n get <id> Show one journey: trigger, exitOn, counts, recent states.\n enable <id> Enable a journey (PATCH { enabled: true }).\n disable <id> Disable a journey (PATCH { enabled: false }).\n\nOptions:\n list:\n --enabled <true|false> Filter by enabled state.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.\n\nExamples:\n hogsend journeys list --enabled true\n hogsend journeys get activation-welcome --json\n hogsend journeys disable churn-prevention`;\n\n/** Shape returned by GET /v1/admin/journeys. */\ninterface JourneyCounts {\n active: number;\n waiting: number;\n completed: number;\n failed: number;\n exited: number;\n}\n\ninterface JourneyListItem {\n id: string;\n name: string;\n description?: string;\n enabled: boolean;\n trigger: { event: string };\n entryLimit: string;\n counts: JourneyCounts;\n}\n\ninterface ListResponse {\n journeys: JourneyListItem[];\n total: number;\n limit: number;\n offset: number;\n}\n\ninterface JourneyState {\n id: string;\n userId: string;\n userEmail: string;\n journeyId: string;\n currentNodeId: string;\n status: string;\n errorMessage: string | null;\n entryCount: number;\n completedAt: string | null;\n exitedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface JourneyDetail extends Omit<JourneyListItem, \"trigger\"> {\n trigger: { event: string; where?: Record<string, unknown>[] };\n exitOn?: { event: string; where?: Record<string, unknown>[] }[];\n suppress: Record<string, number>;\n recentStates: JourneyState[];\n}\n\ninterface GetResponse {\n journey: JourneyDetail;\n}\n\ninterface PatchResponse {\n journey: { id: string; name: string; enabled: boolean; updatedAt: string };\n}\n\nfunction badge(): string {\n return `${color.bgMagenta(color.black(\" hogsend \"))} journeys`;\n}\n\nfunction statusColor(enabled: boolean): string {\n return enabled ? color.green(\"enabled\") : color.yellow(\"disabled\");\n}\n\nasync function runList(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n enabled: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n if (\n values.enabled !== undefined &&\n ![\"true\", \"false\"].includes(values.enabled)\n ) {\n ctx.out.fail(\"--enabled must be 'true' or 'false'\");\n }\n\n const query = {\n enabled: values.enabled,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(\"Fetching journeys\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/journeys\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n if (data.journeys.length === 0) {\n ctx.out.note(\"No journeys matched.\", \"Journeys\");\n } else {\n ctx.out.table(\n data.journeys.map((j) => ({\n id: j.id,\n name: j.name,\n status: statusColor(j.enabled),\n trigger: j.trigger.event,\n active: j.counts.active,\n waiting: j.counts.waiting,\n completed: j.counts.completed,\n failed: j.counts.failed,\n })),\n [\n \"id\",\n \"name\",\n \"status\",\n \"trigger\",\n \"active\",\n \"waiting\",\n \"completed\",\n \"failed\",\n ],\n );\n }\n\n ctx.out.outro(\n `${data.journeys.length} of ${data.total} journey(s) — offset ${data.offset}, limit ${data.limit}`,\n );\n}\n\nasync function runGet(\n ctx: CommandContext,\n id: string | undefined,\n): Promise<void> {\n if (!id) {\n ctx.out.fail(\n \"journeys get requires a journey id, e.g. hogsend journeys get activation-welcome\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(`Fetching journey ${id}`, () =>\n ctx.http.get<GetResponse>(\n `/v1/admin/journeys/${encodeURIComponent(id as string)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n const j = data.journey;\n ctx.out.kv(\n {\n id: j.id,\n name: j.name,\n description: j.description ?? \"\",\n status: statusColor(j.enabled),\n trigger: j.trigger.event,\n entryLimit: j.entryLimit,\n exitOn: j.exitOn?.map((e) => e.event).join(\", \") ?? \"(none)\",\n },\n \"Journey\",\n );\n\n ctx.out.kv(\n {\n active: j.counts.active,\n waiting: j.counts.waiting,\n completed: j.counts.completed,\n failed: j.counts.failed,\n exited: j.counts.exited,\n },\n \"Counts\",\n );\n\n if (j.recentStates.length === 0) {\n ctx.out.note(\"No recent journey instances.\", \"Recent states\");\n } else {\n ctx.out.table(\n j.recentStates.map((s) => ({\n userId: s.userId,\n email: s.userEmail,\n status: s.status,\n node: s.currentNodeId,\n updatedAt: s.updatedAt,\n })),\n [\"userId\", \"email\", \"status\", \"node\", \"updatedAt\"],\n );\n }\n\n ctx.out.outro(`Journey ${j.id} is ${j.enabled ? \"enabled\" : \"disabled\"}.`);\n}\n\nasync function runToggle(\n ctx: CommandContext,\n id: string | undefined,\n enabled: boolean,\n): Promise<void> {\n const verb = enabled ? \"enable\" : \"disable\";\n if (!id) {\n ctx.out.fail(\n `journeys ${verb} requires a journey id, e.g. hogsend journeys ${verb} activation-welcome`,\n );\n }\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(\n `${enabled ? \"Enabling\" : \"Disabling\"} ${id}`,\n () =>\n ctx.http.patch<PatchResponse>(\n `/v1/admin/journeys/${encodeURIComponent(id as string)}`,\n { enabled },\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n const j = data.journey;\n ctx.out.note(\n [\n `${color.bold(j.name)} (${j.id})`,\n `status: ${statusColor(j.enabled)}`,\n `updated: ${j.updatedAt}`,\n ].join(\"\\n\"),\n `Journey ${enabled ? \"enabled\" : \"disabled\"}`,\n );\n ctx.out.outro(`${j.id} is now ${statusColor(j.enabled)}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n // argv after the subcommand token — positionals/flags for the subcommand.\n const rest = ctx.argv.slice(1);\n const subCtx: CommandContext = { ...ctx, argv: rest };\n\n try {\n switch (sub) {\n case \"list\":\n await runList(subCtx);\n return;\n case \"get\": {\n const id = rest.find((a) => !a.startsWith(\"-\"));\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runGet(subCtx, id);\n return;\n }\n case \"enable\": {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runToggle(\n subCtx,\n rest.find((a) => !a.startsWith(\"-\")),\n true,\n );\n return;\n }\n case \"disable\": {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runToggle(\n subCtx,\n rest.find((a) => !a.startsWith(\"-\")),\n false,\n );\n return;\n }\n case undefined:\n ctx.out.fail(\n `journeys requires a subcommand (list|get|enable|disable). Run: hogsend journeys --help`,\n );\n return;\n default:\n ctx.out.fail(\n `unknown journeys subcommand '${sub}'. Expected list|get|enable|disable.`,\n );\n return;\n }\n } catch (error) {\n if (isHttpError(error)) {\n if (error.status === 404) {\n ctx.out.fail(\"journey not found\");\n }\n ctx.out.fail(error.message);\n }\n throw error;\n }\n}\n\nexport const journeysCommand: Command = {\n name: \"journeys\",\n summary: \"List, inspect, enable, and disable journeys\",\n usage,\n run,\n};\n","import { spawnSync } from \"node:child_process\";\nimport { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend patch <package> [--cwd <dir>]\n\nThin wrapper over pnpm's native patch flow. Runs \\`pnpm patch <package>\\`, which\nextracts the package into a temp dir and prints the path to edit. After editing,\ncommit the patch with the command pnpm prints (\\`pnpm patch-commit <dir>\\`).\n\nThis does NOT replace scripts/patch-check.sh (the patch re-apply contract).\n\nOptions:\n --cwd <dir> Project root to run pnpm in (defaults to current directory).\n -h, --help Show this help.`;\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const pkg = positionals[0];\n if (!pkg) {\n ctx.out.fail(\n \"patch requires a package name, e.g. hogsend patch @hogsend/engine\",\n );\n }\n\n const cwd = values.cwd ?? process.cwd();\n\n // pnpm patch is interactive-ish (prints an editable dir). Stream it through\n // unless --json, where we suppress chrome and report the spawn result only.\n const result = spawnSync(\"pnpm\", [\"patch\", pkg], {\n cwd,\n stdio: ctx.json ? \"ignore\" : \"inherit\",\n });\n\n if (ctx.json) {\n ctx.out.json({\n package: pkg,\n command: `pnpm patch ${pkg}`,\n status: result.status,\n ok: result.status === 0,\n });\n if (result.status !== 0) process.exit(1);\n return;\n }\n\n if (result.status !== 0) {\n ctx.out.fail(`pnpm patch ${pkg} exited with code ${result.status ?? \"?\"}`);\n }\n\n ctx.out.note(\n [\n \"pnpm extracted the package to a temp dir (printed above).\",\n \"Edit the files, then commit the patch:\",\n \"\",\n color.cyan(\"pnpm patch-commit <dir>\"),\n ].join(\"\\n\"),\n \"Next steps\",\n );\n}\n\nexport const patchCommand: Command = {\n name: \"patch\",\n summary: \"Patch a package via pnpm's native patch flow\",\n usage,\n run,\n};\n","import { spawnSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { copyFileSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { confirm } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend setup [--cwd <dir>] [--yes] [--json]\n\nInteractive local onboarding for a scaffolded Hogsend app. Mirrors the\ncreate-hogsend \"next steps\":\n\n 1. docker compose up -d # Postgres + Redis + Hatchet-Lite\n 2. cp .env.example .env (if missing)\n 3. generate a BETTER_AUTH_SECRET (if still the placeholder)\n 4. pnpm db:migrate # engine track then client track\n\nOptions:\n --cwd <dir> Project root to run in (defaults to the current directory).\n --yes, -y Skip confirmation prompts (assume yes). Implied by --json.\n --json Run non-interactively and emit a single JSON result document.\n -h, --help Show this help.\n\nRun ${color.cyan(\"hogsend doctor\")} afterwards to verify the instance is healthy.`;\n\n/** Generate a 64-char hex secret (32 bytes) for BETTER_AUTH_SECRET. */\nfunction generateSecret(): string {\n return randomBytes(32).toString(\"hex\");\n}\n\nconst SECRET_KEY = \"BETTER_AUTH_SECRET\";\nconst PLACEHOLDER_PREFIX = \"change-me\";\n\ninterface StepResult {\n step: string;\n status: \"ok\" | \"skipped\" | \"failed\";\n detail: string;\n}\n\n/**\n * Ensure a `.env` exists (copying `.env.example` when absent) and that\n * BETTER_AUTH_SECRET holds a real generated value rather than the placeholder.\n * Pure-ish: only touches the filesystem, returns a structured result.\n */\nfunction ensureEnv(cwd: string): { copied: StepResult; secret: StepResult } {\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n let copied: StepResult;\n if (existsSync(envPath)) {\n copied = {\n step: \"env\",\n status: \"skipped\",\n detail: \".env already exists\",\n };\n } else if (existsSync(examplePath)) {\n copyFileSync(examplePath, envPath);\n copied = {\n step: \"env\",\n status: \"ok\",\n detail: \"copied .env.example -> .env\",\n };\n } else {\n copied = {\n step: \"env\",\n status: \"failed\",\n detail: \"no .env and no .env.example to copy from\",\n };\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"skipped\",\n detail: \"skipped — no .env\",\n },\n };\n }\n\n // (Re)read the file we just ensured exists and refresh the secret if it is\n // missing or still the scaffold placeholder. Never overwrite a real secret.\n let raw: string;\n try {\n raw = readFileSync(envPath, \"utf8\");\n } catch (err) {\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"failed\",\n detail: `could not read .env: ${err instanceof Error ? err.message : String(err)}`,\n },\n };\n }\n\n const lines = raw.split(/\\r?\\n/);\n const idx = lines.findIndex((l) =>\n l\n .replace(/^export\\s+/, \"\")\n .trimStart()\n .startsWith(`${SECRET_KEY}=`),\n );\n const existingLine = idx === -1 ? undefined : lines[idx];\n const current =\n existingLine === undefined\n ? undefined\n : existingLine.slice(existingLine.indexOf(\"=\") + 1).trim();\n const isPlaceholder =\n current === undefined ||\n current === \"\" ||\n current.startsWith(PLACEHOLDER_PREFIX);\n\n if (!isPlaceholder) {\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"skipped\",\n detail: `${SECRET_KEY} already set`,\n },\n };\n }\n\n const secret = generateSecret();\n const newLine = `${SECRET_KEY}=${secret}`;\n if (idx === -1) {\n if (raw.length > 0 && !raw.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(newLine);\n } else {\n lines[idx] = newLine;\n }\n writeFileSync(envPath, lines.join(\"\\n\"));\n\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"ok\",\n detail: `generated ${SECRET_KEY} (64-char hex)`,\n },\n };\n}\n\n/** Run a shell command, capturing exit status. */\nfunction runCmd(\n cmd: string,\n args: string[],\n cwd: string,\n json: boolean,\n): { status: number | null; ok: boolean } {\n const result = spawnSync(cmd, args, {\n cwd,\n // In json mode stay silent (we report structured status); otherwise stream\n // so the user sees docker / migration output inline.\n stdio: json ? \"ignore\" : \"inherit\",\n });\n return { status: result.status, ok: result.status === 0 };\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n yes: { type: \"boolean\", short: \"y\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const cwd = values.cwd ?? process.cwd();\n\n if (!existsSync(join(cwd, \"package.json\"))) {\n ctx.out.fail(\n `no package.json in ${cwd} — run setup from a scaffolded Hogsend app (or pass --cwd).`,\n );\n }\n\n const hasCompose =\n existsSync(join(cwd, \"docker-compose.yml\")) ||\n existsSync(join(cwd, \"docker-compose.yaml\")) ||\n existsSync(join(cwd, \"compose.yml\")) ||\n existsSync(join(cwd, \"compose.yaml\"));\n\n // --json implies non-interactive; in TTY human mode we confirm first.\n const skipConfirm = ctx.json || values.yes;\n\n if (!ctx.json) {\n ctx.out.intro(\n `${color.bgMagenta(color.black(\" hogsend \"))} ${color.dim(\"local onboarding\")}`,\n );\n }\n\n if (ctx.out.interactive && !skipConfirm) {\n const proceed = bail(\n await confirm({\n message: `Set up local infra in ${color.cyan(cwd)}? (docker compose up, .env, db:migrate)`,\n }),\n );\n if (!proceed) {\n ctx.out.outro(color.dim(\"Nothing changed.\"));\n return;\n }\n }\n\n const results: StepResult[] = [];\n\n // 1. docker compose up -d\n if (hasCompose) {\n const docker = await ctx.out.step(\n \"Starting infra (docker compose up -d)\",\n async () => runCmd(\"docker\", [\"compose\", \"up\", \"-d\"], cwd, ctx.json),\n );\n results.push({\n step: \"docker\",\n status: docker.ok ? \"ok\" : \"failed\",\n detail: docker.ok\n ? \"Postgres + Redis + Hatchet-Lite up\"\n : `docker compose exited with code ${docker.status ?? \"?\"}`,\n });\n } else {\n results.push({\n step: \"docker\",\n status: \"skipped\",\n detail: \"no docker-compose file found\",\n });\n }\n\n // 2 + 3. .env + secret (synchronous fs work, wrapped in a step for the spinner)\n const env = await ctx.out.step(\"Preparing .env + auth secret\", async () =>\n ensureEnv(cwd),\n );\n results.push(env.copied, env.secret);\n\n // 4. db:migrate (only attempt if docker didn't hard-fail; still try if skipped)\n const dockerFailed = results.some(\n (r) => r.step === \"docker\" && r.status === \"failed\",\n );\n if (dockerFailed) {\n results.push({\n step: \"migrate\",\n status: \"skipped\",\n detail:\n \"skipped — docker compose failed; bring infra up then run pnpm db:migrate\",\n });\n } else {\n const migrate = await ctx.out.step(\n \"Running migrations (pnpm db:migrate)\",\n async () => runCmd(\"pnpm\", [\"db:migrate\"], cwd, ctx.json),\n );\n results.push({\n step: \"migrate\",\n status: migrate.ok ? \"ok\" : \"failed\",\n detail: migrate.ok\n ? \"engine + client migrations applied\"\n : `pnpm db:migrate exited with code ${migrate.status ?? \"?\"}`,\n });\n }\n\n const failed = results.filter((r) => r.status === \"failed\");\n const ok = failed.length === 0;\n\n if (ctx.json) {\n ctx.out.json({\n ok,\n cwd,\n steps: results,\n });\n if (!ok) process.exit(1);\n return;\n }\n\n // Human summary.\n ctx.out.table(\n results.map((r) => ({\n step: r.step,\n status:\n r.status === \"ok\"\n ? color.green(\"ok\")\n : r.status === \"skipped\"\n ? color.dim(\"skipped\")\n : color.red(\"failed\"),\n detail: r.detail,\n })),\n [\"step\", \"status\", \"detail\"],\n );\n\n ctx.out.note(\n [\n `${color.cyan(\"pnpm dev\")} ${color.dim(\"# HTTP API on :3002\")}`,\n `${color.cyan(\"pnpm worker:dev\")} ${color.dim(\"# Hatchet worker, 2nd terminal\")}`,\n \"\",\n `${color.dim(\"Verify with\")} ${color.cyan(\"hogsend doctor\")}${color.dim(\".\")}`,\n `${color.dim(\"Grab HATCHET_CLIENT_TOKEN at\")} ${color.cyan(\"http://localhost:8888\")} ${color.dim(\"and set it in .env.\")}`,\n ].join(\"\\n\"),\n \"Next steps\",\n );\n\n if (!ok) {\n ctx.out.fail(\n `${failed.length} step(s) failed — see the table above. Fix and re-run hogsend setup.`,\n );\n }\n\n ctx.out.outro(\n `${color.green(\"Done.\")} ${color.dim(\"Local infra is up — go write a journey.\")}`,\n );\n}\n\nexport const setupCommand: Command = {\n name: \"setup\",\n summary: \"Local onboarding: docker compose up, gen secret, db:migrate\",\n usage,\n run,\n};\n","import { cancel, isCancel } from \"@clack/prompts\";\n\n/**\n * Guard a clack prompt result. clack returns a cancellation symbol when the\n * user hits Ctrl-C / Esc; this unwraps the value or aborts the whole CLI\n * cleanly (exit 0 — a deliberate cancel, not an error).\n *\n * Re-export clack's `text`/`select`/`confirm`/`multiselect` from\n * `@clack/prompts` directly in command files; wrap each call in `bail()`.\n */\nexport function bail<T>(value: T | symbol): T {\n if (isCancel(value)) {\n cancel(\"Cancelled.\");\n process.exit(0);\n }\n return value as T;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { multiselect } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport {\n bundledSkillsDir,\n type CopyResult,\n copySkill,\n installDir,\n listBundledSkills,\n writeSkillsStamp,\n} from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend skills <subcommand> [options]\n\nManage the Claude Code skills bundled with @hogsend/cli. Bundled skills teach\nagents how to drive the hogsend CLI; \\`add\\` copies them into your project's\n./.claude/skills/<name>/ so Claude Code can discover them.\n\nSubcommands:\n list List bundled skills + whether each is installed.\n add [name] [--force] Copy a bundled skill into ./.claude/skills/<name>/.\n Omit name for an interactive multiselect (human),\n or copy all bundled skills (--all / --json /\n non-interactive).\n\nOptions:\n --all Install every bundled skill (skips the interactive picker).\n --force Overwrite an already-installed skill. Use after upgrading the\n engine to refresh vendored skills to the latest guidance.\n --json Emit machine-readable JSON only (implies non-interactive).\n -h, --help Show this help.\n\nExamples:\n hogsend skills list\n hogsend skills list --json\n hogsend skills add\n hogsend skills add --all\n hogsend skills add hogsend-cli --force\n hogsend skills add --all --force # refresh everything after an upgrade\n\nTip: \\`hogsend upgrade\\` bumps the engine AND refreshes these skills in one step.`;\n\nfunction runList(ctx: CommandContext): void {\n const skills = listBundledSkills(process.cwd());\n\n if (ctx.json) {\n ctx.out.json({\n bundledSkillsDir: bundledSkillsDir(),\n installDir: installDir(process.cwd()),\n skills,\n });\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} skills`);\n if (skills.length === 0) {\n ctx.out.note(\n \"No bundled skills found in this package build.\",\n \"skills list\",\n );\n ctx.out.outro(\"Nothing to install.\");\n return;\n }\n ctx.out.table(\n skills.map((s) => ({\n name: s.name,\n installed: s.installed ? color.green(\"yes\") : color.dim(\"no\"),\n description:\n s.description.length > 60\n ? `${s.description.slice(0, 57)}...`\n : s.description,\n })),\n [\"name\", \"installed\", \"description\"],\n );\n ctx.out.outro(\n `Install with ${color.cyan(\"hogsend skills add <name>\")} (or ${color.cyan(\"hogsend skills add --all\")}). ` +\n `Refresh after an engine upgrade with ${color.cyan(\"--force\")}.`,\n );\n}\n\nasync function runAdd(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n all: { type: \"boolean\", default: false },\n force: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const cwd = process.cwd();\n const bundled = listBundledSkills(cwd);\n if (bundled.length === 0) {\n ctx.out.fail(\"no bundled skills found in this package build\");\n }\n\n const requested = positionals[0];\n const force = Boolean(values.force);\n\n // Resolve which skills to install.\n let names: string[];\n if (requested) {\n const match = bundled.find((s) => s.name === requested);\n if (!match) {\n ctx.out.fail(\n `unknown skill \"${requested}\". Available: ${bundled.map((s) => s.name).join(\", \")}`,\n );\n }\n names = [requested];\n } else if (values.all) {\n // Explicit install-all — skip the picker even in a TTY.\n names = bundled.map((s) => s.name);\n } else if (ctx.out.interactive) {\n const picked = bail(\n await multiselect({\n message: \"Which skills do you want to install?\",\n options: bundled.map((s) => ({\n value: s.name,\n label: s.name,\n hint: s.installed ? \"installed\" : undefined,\n })),\n required: true,\n }),\n ) as string[];\n names = picked;\n } else {\n // Non-interactive (json or non-TTY) with no name => install all.\n names = bundled.map((s) => s.name);\n }\n\n const results: CopyResult[] = names.map((name) =>\n copySkill(name, cwd, force),\n );\n\n // Stamp the now-installed set with this CLI's version, so `hogsend doctor`\n // can later tell whether the vendored skills have fallen behind the engine.\n if (results.some((r) => r.installed)) {\n const installedNames = listBundledSkills(cwd)\n .filter((s) => existsSync(join(installDir(cwd), s.name)))\n .map((s) => s.name);\n writeSkillsStamp(cwd, installedNames);\n }\n\n if (ctx.json) {\n ctx.out.json({\n installDir: installDir(cwd),\n force,\n results,\n });\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} skills add`);\n for (const r of results) {\n if (r.skipped) {\n ctx.out.log(\n `${color.yellow(\"skip\")} ${r.name} ${color.dim(\"(already installed; use --force to overwrite)\")}`,\n );\n } else {\n ctx.out.log(`${color.green(\"✓\")} ${r.name} ${color.dim(`-> ${r.path}`)}`);\n }\n }\n const installedCount = results.filter((r) => r.installed).length;\n const skippedCount = results.filter((r) => r.skipped).length;\n ctx.out.outro(\n `Installed ${installedCount} skill${installedCount === 1 ? \"\" : \"s\"}` +\n (skippedCount > 0 ? `, skipped ${skippedCount}.` : \".\"),\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n runList(ctx);\n return;\n case \"add\":\n await runAdd(ctx, ctx.argv.slice(1));\n return;\n case undefined:\n case \"-h\":\n case \"--help\":\n ctx.out.log(usage);\n return;\n default:\n ctx.out.fail(\n `unknown skills subcommand \"${sub}\". Use: list | add. See hogsend skills --help.`,\n );\n }\n}\n\nexport const skillsCommand: Command = {\n name: \"skills\",\n summary: \"List + install bundled Claude Code skills into .claude/skills\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend stats [--json]\n\nShow system-wide overview metrics from a running Hogsend instance.\nWraps GET /v1/admin/metrics/overview.\n\nFields:\n totalContacts Live (non-deleted) contacts.\n activeJourneys Journey states currently active or waiting.\n emailsSent24h Emails sent in the last 24 hours.\n emailsSent7d Emails sent in the last 7 days.\n emailsSent30d Emails sent in the last 30 days.\n bounceRate30d Bounced / sent over the last 30 days (0..1).\n unsubscribeRate Unsubscribed / total preferences (0..1).\n\nOptions:\n --url <baseUrl> API base URL (default HOGSEND_API_URL or http://localhost:3002).\n --admin-key <key> Admin bearer key (default HOGSEND_ADMIN_KEY / ADMIN_API_KEY).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.`;\n\n/** Shape returned by GET /v1/admin/metrics/overview. */\ninterface OverviewMetrics {\n totalContacts: number;\n activeJourneys: number;\n emailsSent24h: number;\n emailsSent7d: number;\n emailsSent30d: number;\n bounceRate30d: number;\n unsubscribeRate: number;\n}\n\n/** Render a 0..1 rate as a percentage with two decimals, e.g. 0.0123 -> \"1.23%\". */\nfunction pct(rate: number): string {\n return `${(rate * 100).toFixed(2)}%`;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const metrics = await ctx.out.step(\"Fetching overview metrics\", () =>\n ctx.http.get<OverviewMetrics>(\"/v1/admin/metrics/overview\"),\n );\n\n if (ctx.json) {\n ctx.out.json(metrics);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} stats`);\n\n ctx.out.kv(\n {\n \"Total contacts\": metrics.totalContacts,\n \"Active journeys\": metrics.activeJourneys,\n \"Emails sent (24h)\": metrics.emailsSent24h,\n \"Emails sent (7d)\": metrics.emailsSent7d,\n \"Emails sent (30d)\": metrics.emailsSent30d,\n \"Bounce rate (30d)\": pct(metrics.bounceRate30d),\n \"Unsubscribe rate\": pct(metrics.unsubscribeRate),\n },\n \"Overview\",\n );\n\n ctx.out.outro(color.dim(ctx.http.cfg.baseUrl));\n}\n\nexport const statsCommand: Command = {\n name: \"stats\",\n summary: \"Show system-wide overview metrics\",\n usage,\n run,\n};\n","import { spawn } from \"node:child_process\";\nimport { createReadStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { extname, join, normalize, resolve, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend studio [options]\n\nServe the bundled Hogsend Studio (the admin SPA) locally and open it in a\nbrowser. The Studio is a static single-page app; this command starts a tiny\nlocal web server for it on a port of your choosing.\n\nBy default the Studio talks to the API at the same origin it is served from,\nwhich won't be a running API here — so point it at your instance with\n--base-url (the SPA uses cookie auth, so the instance must allow CORS from the\nStudio origin, or you can simply open the Studio that the engine mounts at\n\\`<instance>/studio\\` instead).\n\nOptions:\n --port <n> Local port to serve on (default 3333).\n --base-url <url> API instance the Studio should call (injected at runtime).\n Omit to use same-origin (the local server, for static\n preview only).\n --open Open the Studio in your default browser after starting.\n --dist <path> Override the Studio dist directory (advanced).\n -h, --help Show this help.\n\nExamples:\n hogsend studio --open\n hogsend studio --base-url https://api.example.com --open\n hogsend studio --port 4000`;\n\n/**\n * Resolve the built Studio `dist/` directory.\n *\n * Resolution order:\n * 1. Explicit --dist override (positional path; absolute or cwd-relative).\n * 2. The dist bundled inside this CLI package (shipped via package.json files[];\n * at runtime bin.js is <pkg>/dist/bin.js, so the bundled studio is one level\n * up at <pkg>/studio).\n * 3. Monorepo source layout: packages/studio/dist relative to this file.\n * 4. cwd-relative packages/studio/dist (running from repo root).\n */\nfunction resolveStudioDist(distFlag: string | undefined): string | null {\n const candidates: string[] = [];\n\n if (distFlag && distFlag.length > 0) {\n candidates.push(resolve(process.cwd(), distFlag));\n }\n\n // Bundled in the published CLI tarball at <pkg>/studio.\n candidates.push(fileURLToPath(new URL(\"../studio\", import.meta.url)));\n\n // Monorepo: this file is packages/cli/src/commands/studio.ts (or built into\n // dist/), so the studio dist sits at ../../studio/dist relative to dist/.\n candidates.push(\n fileURLToPath(new URL(\"../../studio/dist\", import.meta.url)),\n fileURLToPath(new URL(\"../../../studio/dist\", import.meta.url)),\n );\n\n candidates.push(resolve(process.cwd(), \"packages/studio/dist\"));\n\n for (const dir of candidates) {\n if (existsSync(join(dir, \"index.html\"))) {\n return dir;\n }\n }\n return null;\n}\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json; charset=utf-8\",\n};\n\nfunction mimeFor(path: string): string {\n return MIME[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\n\n/**\n * Read index.html and, when a base URL is provided, inject a runtime global the\n * Studio reads (`window.__HOGSEND_STUDIO__ = { baseUrl }`) so the static bundle\n * can be pointed at a remote instance without a rebuild.\n */\nfunction indexHtml(distPath: string, baseUrl: string | undefined): string {\n const raw = readFileSync(join(distPath, \"index.html\"), \"utf8\");\n if (!baseUrl) return raw;\n const inject = `<script>window.__HOGSEND_STUDIO__=${JSON.stringify({\n baseUrl,\n })};</script>`;\n if (raw.includes(\"</head>\")) {\n return raw.replace(\"</head>\", `${inject}</head>`);\n }\n return `${inject}${raw}`;\n}\n\n/** Open a URL in the OS default browser (best-effort, never throws). */\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true });\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // best-effort\n }\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n strict: false,\n options: {\n port: { type: \"string\" },\n \"base-url\": { type: \"string\" },\n open: { type: \"boolean\", default: false },\n dist: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const port = Number(values.port ?? \"3333\");\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n ctx.out.fail(`invalid --port \"${values.port}\" (expected 1-65535)`);\n }\n\n // --base-url flag, else the resolved CLI config base URL (so it \"just works\"\n // against the same instance the other commands target), unless that's the\n // local default placeholder. Keep undefined for pure static preview.\n const baseUrl =\n typeof values[\"base-url\"] === \"string\" ? values[\"base-url\"] : undefined;\n\n const distPath = resolveStudioDist(\n typeof values.dist === \"string\" ? values.dist : positionals[0],\n );\n\n if (!distPath) {\n ctx.out.fail(\n \"could not find a built Studio (dist/). Build it with \" +\n \"`pnpm --filter @hogsend/studio build`, or pass --dist <path>.\",\n );\n }\n\n const cleanBase = baseUrl ? baseUrl.replace(/\\/+$/, \"\") : undefined;\n const index = indexHtml(distPath, cleanBase);\n\n const server = createServer((req, res) => {\n const urlPath = decodeURIComponent((req.url ?? \"/\").split(\"?\")[0] ?? \"/\");\n\n // The Studio bundle is built under base \"/studio/\", so all asset URLs are\n // prefixed with /studio. Strip that prefix to map onto the dist root.\n const rel = urlPath.replace(/^\\/studio/, \"\");\n if (rel === \"\" || rel === \"/\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(index);\n return;\n }\n\n // Resolve safely inside distPath (defend against path traversal).\n const target = normalize(join(distPath, rel));\n if (target !== distPath && !target.startsWith(distPath + sep)) {\n res.writeHead(403);\n res.end(\"Forbidden\");\n return;\n }\n\n if (existsSync(target) && statSync(target).isFile()) {\n res.writeHead(200, { \"content-type\": mimeFor(target) });\n createReadStream(target).pipe(res);\n return;\n }\n\n // SPA fallback: unknown paths serve index.html so client-side routes work.\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(index);\n });\n\n await new Promise<void>((resolveListen, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => resolveListen());\n }).catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.out.fail(`could not start server on port ${port}: ${msg}`);\n });\n\n const localUrl = `http://localhost:${port}/studio/`;\n\n if (ctx.json) {\n ctx.out.json({\n url: localUrl,\n port,\n baseUrl: cleanBase ?? null,\n dist: distPath,\n });\n // In json mode we still keep the server running (foreground). Agents that\n // don't want a long-running process should not pass --json to `studio`.\n } else {\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} studio`);\n ctx.out.note(\n [\n `${color.green(\"●\")} Studio serving at ${color.cyan(localUrl)}`,\n cleanBase\n ? color.dim(`API instance: ${cleanBase}`)\n : color.dim(\n \"No --base-url set (same-origin / static preview). The API \" +\n \"calls will hit this local server and fail — pass --base-url \" +\n \"<instance>, or open <instance>/studio directly.\",\n ),\n \"\",\n color.dim(\"First load shows a create-admin screen if no admin exists.\"),\n color.dim(\"Press Ctrl+C to stop.\"),\n ].join(\"\\n\"),\n \"Studio\",\n );\n }\n\n if (values.open) {\n openBrowser(localUrl);\n }\n\n // Keep the process alive until interrupted.\n await new Promise<void>((resolveForever) => {\n const stop = () => {\n server.close(() => resolveForever());\n };\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n });\n}\n\nexport const studioCommand: Command = {\n name: \"studio\",\n summary: \"Serve the bundled Hogsend Studio admin SPA locally\",\n usage,\n run,\n};\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { confirm } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport {\n copySkill,\n installDir,\n listBundledSkills,\n writeSkillsStamp,\n} from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend upgrade [--cwd <dir>] [--pm <pnpm|npm|yarn|bun>] [options]\n\nUpgrade a scaffolded Hogsend app in one step:\n 1. bump every @hogsend/* dependency to latest (or --to <version>), then\n 2. refresh the vendored Claude Code skills in ./.claude/skills to match.\n\nRun this after a new engine release so your app AND the agent guidance move\ntogether. Skills are version-stamped so \\`hogsend doctor\\` can warn when they\nfall behind.\n\nOptions:\n --cwd <dir> Project root to upgrade (defaults to the current directory).\n --pm <manager> Package manager (default: detected from the lockfile, else pnpm).\n --to <version> Target version for @hogsend/* deps (default: latest).\n --deps-only Bump dependencies only; don't touch skills.\n --skills-only Refresh skills only; don't touch dependencies.\n --yes, -y Skip the confirmation prompt. Implied by --json.\n --json Run non-interactively and emit a single JSON result.\n -h, --help Show this help.`;\n\ntype Pm = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\nconst VALID_PMS: Pm[] = [\"pnpm\", \"npm\", \"yarn\", \"bun\"];\n\n/** Detect the package manager from a lockfile, defaulting to pnpm. */\nfunction detectPm(cwd: string): Pm {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")))\n return \"bun\";\n if (existsSync(join(cwd, \"package-lock.json\"))) return \"npm\";\n return \"pnpm\";\n}\n\n/** The @hogsend/* deps declared in the app's package.json. */\nfunction hogsendDeps(cwd: string): string[] {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const all = { ...pkg.dependencies, ...pkg.devDependencies };\n return Object.keys(all)\n .filter((n) => n.startsWith(\"@hogsend/\"))\n .sort();\n}\n\n/** Build the install verb + args for the given pm (all but npm use `add`). */\nfunction addArgs(pm: Pm, specs: string[]): string[] {\n return [pm === \"npm\" ? \"install\" : \"add\", ...specs];\n}\n\ninterface StepResult {\n step: string;\n status: \"ok\" | \"skipped\" | \"failed\";\n detail: string;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n pm: { type: \"string\" },\n to: { type: \"string\" },\n \"deps-only\": { type: \"boolean\", default: false },\n \"skills-only\": { type: \"boolean\", default: false },\n yes: { type: \"boolean\", short: \"y\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n if (values[\"deps-only\"] && values[\"skills-only\"]) {\n ctx.out.fail(\"--deps-only and --skills-only are mutually exclusive.\");\n }\n\n const cwd = values.cwd ?? process.cwd();\n if (!existsSync(join(cwd, \"package.json\"))) {\n ctx.out.fail(\n `no package.json in ${cwd} — run upgrade from a scaffolded Hogsend app (or pass --cwd).`,\n );\n }\n\n let pm: Pm;\n if (values.pm !== undefined) {\n if (!(VALID_PMS as string[]).includes(values.pm)) {\n ctx.out.fail(\n `invalid --pm \"${values.pm}\". Expected one of: ${VALID_PMS.join(\", \")}.`,\n );\n }\n pm = values.pm as Pm;\n } else {\n pm = detectPm(cwd);\n }\n\n const target = values.to ?? \"latest\";\n const doDeps = !values[\"skills-only\"];\n const doSkills = !values[\"deps-only\"];\n const deps = doDeps ? hogsendDeps(cwd) : [];\n\n if (doDeps && deps.length === 0) {\n ctx.out.fail(\n `no @hogsend/* dependencies found in ${join(cwd, \"package.json\")}.`,\n );\n }\n\n const skipConfirm = ctx.json || values.yes;\n if (!ctx.json) {\n ctx.out.intro(\n `${color.bgMagenta(color.black(\" hogsend \"))} ${color.dim(\"upgrade\")}`,\n );\n }\n if (ctx.out.interactive && !skipConfirm) {\n const plan = [\n doDeps\n ? `bump ${deps.length} @hogsend/* dep(s) to ${target} (${pm})`\n : null,\n doSkills ? \"refresh .claude/skills\" : null,\n ]\n .filter(Boolean)\n .join(\" + \");\n const proceed = bail(\n await confirm({ message: `Upgrade ${color.cyan(cwd)}: ${plan}?` }),\n );\n if (!proceed) {\n ctx.out.outro(color.dim(\"Nothing changed.\"));\n return;\n }\n }\n\n const results: StepResult[] = [];\n\n // 1. bump @hogsend/* deps via the package manager.\n if (doDeps) {\n const specs = deps.map((n) => `${n}@${target}`);\n const dep = await ctx.out.step(\n `Bumping @hogsend/* -> ${target} (${pm})`,\n async () =>\n spawnSync(pm, addArgs(pm, specs), {\n cwd,\n stdio: ctx.json ? \"ignore\" : \"inherit\",\n shell: process.platform === \"win32\",\n }),\n );\n results.push({\n step: \"deps\",\n status: dep.status === 0 ? \"ok\" : \"failed\",\n detail:\n dep.status === 0\n ? `${deps.join(\", \")} -> ${target}`\n : `${pm} exited with code ${dep.status ?? \"?\"}`,\n });\n } else {\n results.push({ step: \"deps\", status: \"skipped\", detail: \"--skills-only\" });\n }\n\n // 2. refresh vendored skills + re-stamp (only if deps didn't hard-fail).\n const depsFailed = results.some(\n (r) => r.step === \"deps\" && r.status === \"failed\",\n );\n if (!doSkills) {\n results.push({\n step: \"skills\",\n status: \"skipped\",\n detail: \"--deps-only\",\n });\n } else if (depsFailed) {\n results.push({\n step: \"skills\",\n status: \"skipped\",\n detail: \"skipped — dependency bump failed; fix it then re-run\",\n });\n } else {\n const bundled = listBundledSkills(cwd);\n const copied = bundled.map((s) => copySkill(s.name, cwd, true));\n writeSkillsStamp(\n cwd,\n bundled.map((s) => s.name),\n );\n results.push({\n step: \"skills\",\n status: \"ok\",\n detail: `refreshed ${copied.length} skill(s) -> ${installDir(cwd)}`,\n });\n }\n\n const failed = results.filter((r) => r.status === \"failed\");\n const ok = failed.length === 0;\n\n if (ctx.json) {\n ctx.out.json({ ok, cwd, pm, target, steps: results });\n if (!ok) process.exit(1);\n return;\n }\n\n ctx.out.table(\n results.map((r) => ({\n step: r.step,\n status:\n r.status === \"ok\"\n ? color.green(\"ok\")\n : r.status === \"skipped\"\n ? color.dim(\"skipped\")\n : color.red(\"failed\"),\n detail: r.detail,\n })),\n [\"step\", \"status\", \"detail\"],\n );\n\n if (!ok) {\n ctx.out.fail(\n `${failed.length} step(s) failed — see the table above. Fix and re-run hogsend upgrade.`,\n );\n }\n\n ctx.out.outro(\n `${color.green(\"Upgraded.\")} ${color.dim(\"Engine + agent skills are on the latest line.\")}`,\n );\n}\n\nexport const upgradeCommand: Command = {\n name: \"upgrade\",\n summary: \"Bump @hogsend/* deps to latest + refresh vendored skills\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\n/**\n * The 13-event outbound catalog, VENDORED from the engine's\n * `WEBHOOK_EVENT_TYPES` (lib/webhook-signing.ts). The CLI cannot import the\n * engine, so the tuple is re-declared here and MUST be kept in sync BY HAND when\n * the engine catalog changes. The `webhook.test` sentinel is NOT a member.\n */\nconst WEBHOOK_EVENT_TYPES = [\n \"contact.created\",\n \"contact.updated\",\n \"contact.deleted\",\n \"contact.unsubscribed\",\n \"email.sent\",\n \"email.delivered\",\n \"email.opened\",\n \"email.clicked\",\n \"email.bounced\",\n \"email.complained\",\n \"journey.completed\",\n \"bucket.entered\",\n \"bucket.left\",\n] as const;\n\ntype OutboundEventType = (typeof WEBHOOK_EVENT_TYPES)[number];\n\nconst usage = `hogsend webhooks <subcommand> [options]\n\nManage outbound webhook endpoints — the Svix-style signed event stream Hogsend\nemits to your URLs. Wraps the admin routes (/v1/admin/webhooks), so this command\nREQUIRES an admin key (--admin-key / HOGSEND_ADMIN_KEY), not the data key.\n\nSubcommands:\n list List endpoints.\n get <id> Show one endpoint.\n create Register an endpoint (prints the secret ONCE).\n update <id> Patch an endpoint.\n delete <id> Hard-delete an endpoint (drops its deliveries).\n rotate-secret <id> Issue a new signing secret (prints it ONCE).\n test <id> Enqueue an out-of-band webhook.test delivery.\n\nlist options:\n --include-disabled Include disabled endpoints.\n --limit <n> Page size.\n --offset <n> Page offset.\n\ncreate options (--url required, plus at least one event):\n --url <url> Destination URL (required).\n --event <type> Subscribe to an event; repeatable.\n --all-events Subscribe to all 13 event types.\n --description <text> Human label.\n --disabled Create the endpoint disabled.\n\nupdate options (only the provided fields change):\n --url <url> New destination URL.\n --event <type> Replace the subscribed events (repeatable).\n --all-events Subscribe to all 13 event types.\n --description <text> New description.\n --disabled / --enabled Disable or enable the endpoint.\n\nEvent types:\n ${WEBHOOK_EVENT_TYPES.join(\", \")}\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend webhooks create --url https://x.com/hook --event contact.created --event email.sent\n hogsend webhooks create --url https://x.com/hook --all-events --json\n hogsend webhooks list --include-disabled\n hogsend webhooks rotate-secret we_123\n hogsend webhooks test we_123`;\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} webhooks`;\n\ninterface WebhookEndpoint {\n id: string;\n url: string;\n description: string | null;\n eventTypes: OutboundEventType[];\n // null for keyed destinations (kind !== \"webhook\"), which carry no signing\n // secret — their credentials live in the endpoint config, not a whsec_.\n secretPrefix: string | null;\n status: \"enabled\" | \"disabled\";\n organizationId: string | null;\n lastDeliveryAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ntype CreatedWebhookEndpoint = WebhookEndpoint & { secret: string };\n\ninterface ListResponse {\n endpoints: WebhookEndpoint[];\n total: number;\n limit: number;\n offset: number;\n}\n\ninterface RotateResponse {\n id: string;\n secret: string;\n secretPrefix: string;\n}\n\n/** Run an admin HTTP call, mapping HttpError to a clean ctx.out.fail message. */\nasync function fetchOrFail<T>(\n ctx: CommandContext,\n label: string,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await ctx.out.step(label, fn);\n } catch (err) {\n if (isHttpError(err)) {\n if (err.status === 404) {\n ctx.out.fail(err.message || \"webhook endpoint not found\");\n }\n ctx.out.fail(err.message);\n }\n throw err;\n }\n}\n\n/**\n * Resolve the subscribed event set from `--all-events` and/or repeatable\n * `--event <type>` flags, validating each against the vendored catalog. Returns\n * undefined when neither was passed (so `update` can leave events unchanged).\n */\nfunction resolveEvents(\n ctx: CommandContext,\n allEvents: boolean | undefined,\n events: string[] | undefined,\n): OutboundEventType[] | undefined {\n if (allEvents) {\n return [...WEBHOOK_EVENT_TYPES];\n }\n if (!events || events.length === 0) {\n return undefined;\n }\n const valid = new Set<string>(WEBHOOK_EVENT_TYPES);\n const out: OutboundEventType[] = [];\n for (const ev of events) {\n if (!valid.has(ev)) {\n ctx.out.fail(\n `unknown event type \"${ev}\" — expected one of: ${WEBHOOK_EVENT_TYPES.join(\", \")}`,\n );\n }\n if (!out.includes(ev as OutboundEventType)) {\n out.push(ev as OutboundEventType);\n }\n }\n return out;\n}\n\n/** Print a created/rotated secret once, with a loud yellow warning. */\nfunction printSecretOnce(ctx: CommandContext, secret: string): void {\n ctx.out.note(\n `${color.yellow(\"Store this signing secret now — it is shown only once and cannot be recovered.\")}\\n\\n${color.bold(secret)}`,\n color.yellow(\"Signing secret\"),\n );\n}\n\nasync function runList(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n \"include-disabled\": { type: \"boolean\", default: false },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const query = {\n includeDisabled: values[\"include-disabled\"] ? \"true\" : undefined,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} list`);\n\n const res = await fetchOrFail<ListResponse>(ctx, \"Fetching webhooks\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/webhooks\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.endpoints.map((ep) => ({\n id: ep.id,\n url: ep.url,\n status:\n ep.status === \"enabled\"\n ? color.green(ep.status)\n : color.yellow(ep.status),\n events: ep.eventTypes.length,\n lastDeliveryAt: ep.lastDeliveryAt ?? color.dim(\"(never)\"),\n })),\n [\"id\", \"url\", \"status\", \"events\", \"lastDeliveryAt\"],\n );\n ctx.out.outro(\n `${res.endpoints.length} of ${res.total} endpoint(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\nfunction renderEndpoint(\n ctx: CommandContext,\n ep: WebhookEndpoint,\n title: string,\n): void {\n ctx.out.kv(\n {\n id: ep.id,\n url: ep.url,\n description: ep.description ?? color.dim(\"(none)\"),\n status:\n ep.status === \"enabled\"\n ? color.green(ep.status)\n : color.yellow(ep.status),\n eventTypes: ep.eventTypes,\n secretPrefix: ep.secretPrefix ?? color.dim(\"(none — keyed destination)\"),\n lastDeliveryAt: ep.lastDeliveryAt ?? color.dim(\"(never)\"),\n createdAt: ep.createdAt,\n updatedAt: ep.updatedAt,\n },\n title,\n );\n}\n\nasync function runGet(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks get requires an endpoint id, e.g. hogsend webhooks get we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} get`);\n\n const res = await fetchOrFail<WebhookEndpoint>(ctx, \"Fetching webhook\", () =>\n ctx.http.get<WebhookEndpoint>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n renderEndpoint(ctx, res, \"Endpoint\");\n ctx.out.outro(`${res.url} → ${res.status}`);\n}\n\nasync function runCreate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n url: { type: \"string\" },\n event: { type: \"string\", multiple: true },\n \"all-events\": { type: \"boolean\", default: false },\n description: { type: \"string\" },\n disabled: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const url = values.url;\n if (!url) {\n ctx.out.fail(\n \"webhooks create requires --url, e.g. hogsend webhooks create --url https://x.com/hook --all-events\",\n );\n }\n\n const eventTypes = resolveEvents(ctx, values[\"all-events\"], values.event);\n if (!eventTypes || eventTypes.length === 0) {\n ctx.out.fail(\n \"webhooks create requires at least one --event <type> (or --all-events)\",\n );\n }\n\n const body: {\n url: string;\n eventTypes: OutboundEventType[];\n description?: string;\n disabled?: boolean;\n } = { url, eventTypes };\n if (values.description !== undefined) body.description = values.description;\n if (values.disabled) body.disabled = true;\n\n if (!ctx.json) ctx.out.intro(`${badge} create`);\n\n const res = await fetchOrFail<CreatedWebhookEndpoint>(\n ctx,\n \"Creating webhook\",\n () => ctx.http.post<CreatedWebhookEndpoint>(\"/v1/admin/webhooks\", body),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n const { secret, ...endpoint } = res;\n renderEndpoint(ctx, endpoint, \"Endpoint created\");\n printSecretOnce(ctx, secret);\n ctx.out.outro(`${color.green(\"Created\")} ${res.id} → ${res.url}`);\n}\n\nasync function runUpdate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n url: { type: \"string\" },\n event: { type: \"string\", multiple: true },\n \"all-events\": { type: \"boolean\", default: false },\n description: { type: \"string\" },\n disabled: { type: \"boolean\", default: false },\n enabled: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks update requires an endpoint id, e.g. hogsend webhooks update we_123 --enabled\",\n );\n }\n\n if (values.disabled && values.enabled) {\n ctx.out.fail(\"webhooks update: pass at most one of --disabled / --enabled\");\n }\n\n const eventTypes = resolveEvents(ctx, values[\"all-events\"], values.event);\n\n const body: {\n url?: string;\n eventTypes?: OutboundEventType[];\n description?: string;\n disabled?: boolean;\n } = {};\n if (values.url !== undefined) body.url = values.url;\n if (eventTypes !== undefined) body.eventTypes = eventTypes;\n if (values.description !== undefined) body.description = values.description;\n if (values.disabled) body.disabled = true;\n if (values.enabled) body.disabled = false;\n\n if (Object.keys(body).length === 0) {\n ctx.out.fail(\n \"webhooks update: nothing to change — pass --url / --event / --description / --disabled / --enabled\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} update`);\n\n const res = await fetchOrFail<WebhookEndpoint>(ctx, \"Updating webhook\", () =>\n ctx.http.patch<WebhookEndpoint>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n body,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n renderEndpoint(ctx, res, \"Endpoint updated\");\n ctx.out.outro(`${color.green(\"Updated\")} ${res.id} → ${res.status}`);\n}\n\nasync function runDelete(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks delete requires an endpoint id, e.g. hogsend webhooks delete we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} delete`);\n\n const res = await fetchOrFail<{ deleted: boolean }>(\n ctx,\n \"Deleting webhook\",\n () =>\n ctx.http.del<{ deleted: boolean }>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.outro(`${color.green(\"Deleted\")} ${id}`);\n}\n\nasync function runRotate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks rotate-secret requires an endpoint id, e.g. hogsend webhooks rotate-secret we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} rotate-secret`);\n\n const res = await fetchOrFail<RotateResponse>(\n ctx,\n \"Rotating signing secret\",\n () =>\n ctx.http.post<RotateResponse>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}/rotate-secret`,\n {},\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.kv({ id: res.id, secretPrefix: res.secretPrefix }, \"Secret rotated\");\n printSecretOnce(ctx, res.secret);\n ctx.out.outro(\n `${color.green(\"Rotated\")} — the old secret is now invalid. Update every subscriber.`,\n );\n}\n\nasync function runTest(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks test requires an endpoint id, e.g. hogsend webhooks test we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} test`);\n\n const res = await fetchOrFail<{\n enqueued: boolean;\n eventType: \"webhook.test\";\n }>(ctx, \"Enqueuing test delivery\", () =>\n ctx.http.post<{ enqueued: boolean; eventType: \"webhook.test\" }>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}/test`,\n {},\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.outro(\n `${color.green(\"Enqueued\")} a ${color.cyan(res.eventType)} delivery to ${id}.`,\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n return runList(ctx, ctx.argv.slice(1));\n case \"get\":\n return runGet(ctx, ctx.argv.slice(1));\n case \"create\":\n return runCreate(ctx, ctx.argv.slice(1));\n case \"update\":\n return runUpdate(ctx, ctx.argv.slice(1));\n case \"delete\":\n return runDelete(ctx, ctx.argv.slice(1));\n case \"rotate-secret\":\n return runRotate(ctx, ctx.argv.slice(1));\n case \"test\":\n return runTest(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"webhooks requires a subcommand: list | get | create | update | delete | rotate-secret | test (see hogsend webhooks --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown webhooks subcommand \"${sub}\" — expected one of list | get | create | update | delete | rotate-secret | test`,\n );\n }\n}\n\nexport const webhooksCommand: Command = {\n name: \"webhooks\",\n summary: \"Manage outbound webhook endpoints (create, rotate, test)\",\n usage,\n run,\n};\n","import { campaignsCommand } from \"./campaigns.js\";\nimport { contactsCommand } from \"./contacts.js\";\nimport { doctorCommand } from \"./doctor.js\";\nimport { ejectCommand } from \"./eject.js\";\nimport { emailsCommand } from \"./emails.js\";\nimport { eventsCommand } from \"./events.js\";\nimport { journeysCommand } from \"./journeys.js\";\nimport { patchCommand } from \"./patch.js\";\nimport { setupCommand } from \"./setup.js\";\nimport { skillsCommand } from \"./skills.js\";\nimport { statsCommand } from \"./stats.js\";\nimport { studioCommand } from \"./studio.js\";\nimport type { Command } from \"./types.js\";\nimport { upgradeCommand } from \"./upgrade.js\";\nimport { webhooksCommand } from \"./webhooks.js\";\n\n/**\n * The command registry. The router (src/bin.ts) matches the leading argv token\n * against each `command.name` and dispatches to `run()`.\n *\n * Order here is the order shown in root help. Data commands (agent-native,\n * wrapping the engine's /v1/admin/* routes) come first, then the local\n * scaffolding/maintenance commands (setup, skills, eject, patch).\n */\nexport const commands: Command[] = [\n doctorCommand,\n journeysCommand,\n contactsCommand,\n statsCommand,\n eventsCommand,\n emailsCommand,\n campaignsCommand,\n webhooksCommand,\n studioCommand,\n setupCommand,\n skillsCommand,\n upgradeCommand,\n ejectCommand,\n patchCommand,\n];\n\nexport type { Command, CommandContext } from \"./types.js\";\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\n/** Resolved target for the admin HTTP client. */\nexport interface ResolvedConfig {\n /** Base URL of the target instance, no trailing slash. */\n baseUrl: string;\n /** Admin bearer token, if resolvable. `doctor`/health works without it. */\n adminKey: string | undefined;\n /**\n * Data-plane bearer token (an `ingest`-scoped key), if resolvable. Used by the\n * write commands (`contacts upsert`, `events send`, `emails send`). Falls back\n * to the admin key since `full-admin` implies `ingest`.\n */\n dataKey: string | undefined;\n}\n\n/** Global flags parsed off the front of any command's argv. */\nexport interface GlobalFlags {\n url?: string;\n adminKey?: string;\n dataKey?: string;\n json: boolean;\n help: boolean;\n /** The remaining args after global flags are stripped. */\n rest: string[];\n}\n\nconst DEFAULT_BASE_URL = \"http://localhost:3002\";\n\n/**\n * Parse the global flags that every command honours (`--url`, `--admin-key`,\n * `--json`, `-h`/`--help`) off an argv slice, returning the parsed values plus\n * the leftover `rest` (positionals + unknown flags) for the command to handle.\n *\n * `strict: false` so command-specific flags (e.g. `--enabled`, `--limit`) pass\n * through untouched in `rest` rather than throwing here.\n */\nexport function parseGlobalFlags(argv: string[]): GlobalFlags {\n const { values, tokens } = parseArgs({\n args: argv,\n allowPositionals: true,\n strict: false,\n tokens: true,\n options: {\n url: { type: \"string\" },\n \"admin-key\": { type: \"string\" },\n \"data-key\": { type: \"string\" },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n // Rebuild `rest` from the token stream, dropping only the global flags we\n // own (and their values). Everything else — positionals and unknown option\n // tokens — is preserved verbatim for the command's own parser.\n const owned = new Set([\"url\", \"admin-key\", \"data-key\", \"json\", \"help\", \"h\"]);\n const rest: string[] = [];\n for (const token of tokens) {\n if (token.kind === \"positional\") {\n rest.push(token.value);\n } else if (token.kind === \"option\") {\n if (owned.has(token.name)) continue;\n rest.push(token.rawName);\n if (token.value !== undefined && !token.inlineValue) {\n rest.push(token.value);\n } else if (token.inlineValue && token.value !== undefined) {\n // already captured in rawName? no — rebuild as --name=value\n rest[rest.length - 1] = `${token.rawName}=${token.value}`;\n }\n }\n }\n\n return {\n url: typeof values.url === \"string\" ? values.url : undefined,\n adminKey:\n typeof values[\"admin-key\"] === \"string\" ? values[\"admin-key\"] : undefined,\n dataKey:\n typeof values[\"data-key\"] === \"string\" ? values[\"data-key\"] : undefined,\n json: values.json === true,\n help: values.help === true,\n rest,\n };\n}\n\n/**\n * Manually parse a `.env` file into a flat record. No dotenv dependency: a\n * small, forgiving parser (KEY=VALUE per line, `#` comments, optional quotes,\n * `export ` prefix tolerated). Never throws — a missing/unreadable file yields\n * an empty record so config resolution stays robust in any cwd.\n */\nexport function loadDotEnv(\n cwd: string = process.cwd(),\n): Record<string, string> {\n const out: Record<string, string> = {};\n const file = join(cwd, \".env\");\n if (!existsSync(file)) return out;\n let raw: string;\n try {\n raw = readFileSync(file, \"utf8\");\n } catch {\n return out;\n }\n for (const rawLine of raw.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\")) continue;\n const withoutExport = line.startsWith(\"export \")\n ? line.slice(\"export \".length)\n : line;\n const eq = withoutExport.indexOf(\"=\");\n if (eq === -1) continue;\n const key = withoutExport.slice(0, eq).trim();\n if (key === \"\") continue;\n let value = withoutExport.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n out[key] = value;\n }\n return out;\n}\n\n/**\n * Resolve the target config with precedence flags > process.env > .env, falling\n * back to the local-dev default base URL.\n *\n * baseUrl: --url > HOGSEND_API_URL (env) > HOGSEND_API_URL (.env) > localhost:3002\n * adminKey: --admin-key > HOGSEND_ADMIN_KEY|ADMIN_API_KEY (env) > (.env equiv)\n * dataKey: --data-key > HOGSEND_DATA_KEY > HOGSEND_API_KEY (env then .env)\n */\nexport function resolveConfig(\n flags: GlobalFlags,\n cwd: string = process.cwd(),\n): ResolvedConfig {\n const dotenv = loadDotEnv(cwd);\n\n const baseUrlRaw =\n flags.url ??\n process.env.HOGSEND_API_URL ??\n dotenv.HOGSEND_API_URL ??\n DEFAULT_BASE_URL;\n\n const adminKey =\n flags.adminKey ??\n process.env.HOGSEND_ADMIN_KEY ??\n process.env.ADMIN_API_KEY ??\n dotenv.HOGSEND_ADMIN_KEY ??\n dotenv.ADMIN_API_KEY;\n\n // Data-plane (ingest-scoped) key. Precedence is independent of adminKey:\n // explicit data key first, then a dedicated env/.env var, then the generic\n // HOGSEND_API_KEY (which a fresh scaffold mints as an ingest key).\n const dataKey =\n flags.dataKey ??\n process.env.HOGSEND_DATA_KEY ??\n process.env.HOGSEND_API_KEY ??\n dotenv.HOGSEND_DATA_KEY ??\n dotenv.HOGSEND_API_KEY;\n\n return {\n baseUrl: baseUrlRaw.replace(/\\/+$/, \"\"),\n adminKey: adminKey && adminKey.length > 0 ? adminKey : undefined,\n dataKey: dataKey && dataKey.length > 0 ? dataKey : undefined,\n };\n}\n"],"mappings":"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","names":["createRequire","sep","parseArgs","usage","badge","parseProps","coerceValue","parseArgs","run","parseArgs","require","usage","run","parseArgs","verdict","badge","existsSync","createRequire","join","sep","parseArgs","existsSync","join","usage","join","existsSync","require","createRequire","sep","run","parseArgs","parseArgs","usage","badge","parseProps","coerceValue","statusColor","runSend","parseArgs","run","parseArgs","usage","run","runSend","parseArgs","parseProps","parseLists","coerceValue","parseArgs","usage","badge","statusColor","runList","parseArgs","runGet","run","parseArgs","usage","run","parseArgs","spawnSync","existsSync","readFileSync","writeFileSync","join","parseArgs","cancel","usage","join","existsSync","readFileSync","writeFileSync","spawnSync","run","parseArgs","existsSync","join","parseArgs","usage","runList","parseArgs","existsSync","join","run","parseArgs","usage","run","parseArgs","existsSync","readFileSync","statSync","join","sep","fileURLToPath","parseArgs","usage","fileURLToPath","existsSync","join","readFileSync","run","parseArgs","sep","statSync","spawnSync","existsSync","readFileSync","join","parseArgs","confirm","usage","existsSync","join","readFileSync","run","parseArgs","confirm","spawnSync","parseArgs","usage","badge","fetchOrFail","runList","parseArgs","runGet","run","existsSync","readFileSync","join","parseArgs","require","createRequire"]}
1
+ {"version":3,"sources":["../src/bin.ts","../src/commands/campaigns.ts","../src/lib/http.ts","../src/lib/output.ts","../src/commands/contacts.ts","../src/commands/doctor.ts","../src/lib/skills.ts","../src/commands/eject.ts","../src/eject.ts","../src/commands/emails.ts","../src/commands/events.ts","../src/commands/journeys.ts","../src/commands/patch.ts","../src/commands/setup.ts","../src/lib/prompt.ts","../src/commands/skills.ts","../src/commands/stats.ts","../src/commands/studio.ts","../src/commands/studio-admin.ts","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/index.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/query.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/errors.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/types.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/connection.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/result.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/queue.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/bytes.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/subscribe.js","../../../node_modules/.pnpm/postgres@3.4.9/node_modules/postgres/src/large.js","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/entity.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/logger.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/query-promise.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/column.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/column-builder.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/table.utils.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/foreign-keys.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/tracing-utils.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/unique-constraint.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/utils/array.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/common.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/enum.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/subquery.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/drizzle-orm/version.js","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/tracing.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/view-common.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/table.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/sql/sql.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/alias.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/selection-proxy.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/utils.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/int.common.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/bigint.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/bigserial.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/boolean.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/char.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/cidr.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/custom.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/date.common.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/date.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/double-precision.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/inet.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/integer.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/interval.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/json.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/jsonb.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/line.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/macaddr.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/macaddr8.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/numeric.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/point.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/postgis_extension/utils.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/postgis_extension/geometry.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/real.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/serial.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/smallint.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/smallserial.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/text.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/time.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/timestamp.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/uuid.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/varchar.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/vector_extension/bit.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/vector_extension/halfvec.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/vector_extension/sparsevec.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/vector_extension/vector.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/columns/all.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/table.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/indexes.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/primary-keys.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/casing.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/errors.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/sql/expressions/conditions.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/sql/expressions/select.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/relations.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/view-base.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/dialect.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/query-builders/query-builder.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/select.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/query-builder.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/utils.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/delete.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/insert.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/refresh-materialized-view.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/update.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/count.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/query.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/query-builders/raw.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/db.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/cache/core/cache.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/pg-core/session.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/postgres-js/session.ts","../../../node_modules/.pnpm/drizzle-orm@0.45.2_kysely@0.28.17_postgres@3.4.9/node_modules/src/postgres-js/driver.ts","../../db/src/schema/index.ts","../../db/src/schema/_shared.ts","../../db/src/schema/enums.ts","../../db/src/schema/alert-rules.ts","../../db/src/schema/alert-history.ts","../../db/src/schema/api-keys.ts","../../db/src/schema/audit-logs.ts","../../db/src/schema/auth.ts","../../db/src/schema/bucket-configs.ts","../../db/src/schema/bucket-memberships.ts","../../db/src/schema/campaigns.ts","../../db/src/schema/contacts.ts","../../db/src/schema/contact-aliases.ts","../../db/src/schema/dead-letter-queue.ts","../../db/src/schema/email-preferences.ts","../../db/src/schema/journey-states.ts","../../db/src/schema/email-sends.ts","../../db/src/schema/import-jobs.ts","../../db/src/schema/journey-configs.ts","../../db/src/schema/journey-logs.ts","../../db/src/schema/tracked-links.ts","../../db/src/schema/link-clicks.ts","../../db/src/schema/user-events.ts","../../db/src/schema/webhook-endpoints.ts","../../db/src/schema/webhook-deliveries.ts","../../db/src/schema/relations.ts","../../db/src/index.ts","../../engine/src/lib/auth.ts","../../engine/src/lib/create-admin.ts","../src/lib/admin-recovery.ts","../src/commands/upgrade.ts","../src/commands/webhooks.ts","../src/commands/index.ts","../src/lib/config.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\nimport { commands } from \"./commands/index.js\";\nimport type { Command } from \"./commands/types.js\";\nimport { parseGlobalFlags, resolveConfig } from \"./lib/config.js\";\nimport { createAdminClient, createDataPlaneClient } from \"./lib/http.js\";\nimport { color, createOutput } from \"./lib/output.js\";\n\nfunction version(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nfunction rootUsage(): string {\n const longest = commands.reduce((n, c) => Math.max(n, c.name.length), 0);\n const list = commands\n .map((c) => ` ${color.cyan(c.name.padEnd(longest))} ${c.summary}`)\n .join(\"\\n\");\n return `${color.bold(\"hogsend\")} — the agent-native Hogsend CLI\n\n${color.dim(\"Usage:\")} hogsend <command> [options]\n\n${color.dim(\"Commands:\")}\n${list}\n\n${color.dim(\"Global options:\")}\n --url <baseUrl> Target instance (default HOGSEND_API_URL or http://localhost:3002)\n --admin-key <key> Admin bearer token (default HOGSEND_ADMIN_KEY / ADMIN_API_KEY)\n --data-key <key> Ingest bearer token for writes (default HOGSEND_DATA_KEY / HOGSEND_API_KEY)\n --json Emit machine-readable JSON only (for agents)\n -h, --help Show help (use after a command for command help)\n -v, --version Show version\n\nRun ${color.cyan(\"hogsend <command> --help\")} for command-specific options.`;\n}\n\nfunction findCommand(name: string): Command | undefined {\n return commands.find((c) => c.name === name);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const [token, ...afterToken] = argv;\n\n // Version is a top-level concern (before flag parsing).\n if (token === \"-v\" || token === \"--version\") {\n process.stdout.write(`${version()}\\n`);\n return;\n }\n\n // No command, or a root-level help request.\n if (!token || token === \"-h\" || token === \"--help\") {\n process.stdout.write(`${rootUsage()}\\n`);\n return;\n }\n\n const command = findCommand(token);\n if (!command) {\n // Unknown command: report on stderr and show usage. Not json-gated since\n // there's no resolved Output yet.\n process.stderr.write(\n `${color.red(\"error\")} unknown command \"${token}\"\\n\\n${rootUsage()}\\n`,\n );\n process.exit(1);\n }\n\n // Parse global flags off the post-token argv; the rest is the command's argv.\n const flags = parseGlobalFlags(afterToken);\n const out = createOutput({ json: flags.json });\n\n // `hogsend <cmd> --help` short-circuits to the command's usage block — but\n // only when there's no subcommand positional. With a subcommand present\n // (e.g. `hogsend studio admin --help`) we defer to the command so it can\n // render subcommand-specific help, re-injecting `--help` into its argv (bin\n // owns/strips the global flag) so the command re-detects it. Commands\n // without subcommand help just print their top-level usage on seeing it,\n // matching the prior behavior.\n const hasSubcommand = flags.rest.some((token) => !token.startsWith(\"-\"));\n if (flags.help && !hasSubcommand) {\n out.log(command.usage);\n return;\n }\n\n const cfg = resolveConfig(flags);\n const http = createAdminClient(cfg);\n const dataHttp = createDataPlaneClient(cfg);\n\n const commandArgv =\n flags.help && hasSubcommand ? [...flags.rest, \"--help\"] : flags.rest;\n\n await command.run({\n argv: commandArgv,\n cfg,\n http,\n dataHttp,\n out,\n json: flags.json,\n });\n}\n\nmain().catch((error: unknown) => {\n const msg = error instanceof Error ? error.message : String(error);\n // Best-effort json detection for top-level failures (Output may not exist).\n if (process.argv.includes(\"--json\")) {\n process.stdout.write(`${JSON.stringify({ error: msg })}\\n`);\n } else {\n process.stderr.write(`${color.red(\"error\")} ${msg}\\n`);\n }\n process.exit(1);\n});\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend campaigns <subcommand> [options]\n\nQueue and inspect broadcasts: durably send one email template to every\nsubscribed member of a list (or every active member of a bucket). Wraps the\ndata-plane campaigns routes (POST /v1/campaigns, GET /v1/campaigns/{id}).\n\nSubcommands:\n send Queue a campaign. Sends run async in the worker.\n status <id> Show a campaign's status + send counts.\n\nsend options (exactly one of --list / --bucket, plus --template, required):\n --list <id> Target every subscribed member of this list.\n --bucket <id> Target every active member of this bucket.\n --template <key> Email template to send.\n --prop <key=value> Template prop; repeatable. Value parsed as JSON, falling\n back to a string.\n --props <json> Template props as one JSON object (merged with --prop).\n --name <text> Human label for the campaign.\n --from <addr> Override the default From address.\n --subject <text> Override the rendered subject.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend campaigns send --list newsletter --template june-update --name \"June\"\n hogsend campaigns send --bucket power-users --template feature-launch --json\n hogsend campaigns status cmp_123 --json`;\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} campaigns`;\n\n/** Shape returned by POST /v1/campaigns (202 enqueue ack). */\ninterface SendResponse {\n campaignId: string;\n status: \"queued\" | \"sending\" | \"sent\" | \"failed\";\n}\n\n/** Shape returned by GET /v1/campaigns/{id}. */\ninterface StatusResponse {\n id: string;\n name: string;\n status: \"queued\" | \"sending\" | \"sent\" | \"failed\";\n audienceKind: \"list\" | \"bucket\";\n audienceId: string;\n templateKey: string;\n totalRecipients: number;\n sentCount: number;\n skippedCount: number;\n failedCount: number;\n startedAt: string | null;\n completedAt: string | null;\n createdAt: string;\n}\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single props record. Each `--prop` value is JSON-parsed when valid\n * JSON, else kept as a string. The `--props` object is applied first, so later\n * `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction statusColor(status: SendResponse[\"status\"]): string {\n switch (status) {\n case \"sent\":\n return color.green(status);\n case \"queued\":\n case \"sending\":\n return color.cyan(status);\n default:\n // failed\n return color.red(status);\n }\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n list: { type: \"string\" },\n bucket: { type: \"string\" },\n template: { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n name: { type: \"string\" },\n from: { type: \"string\" },\n subject: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const list = values.list;\n const bucket = values.bucket;\n if ((list && bucket) || (!list && !bucket)) {\n ctx.out.fail(\"campaigns send requires exactly one of --list or --bucket\");\n }\n\n const template = values.template;\n if (!template) {\n ctx.out.fail(\n \"campaigns send requires --template, e.g. hogsend campaigns send --list newsletter --template welcome\",\n );\n }\n\n const props = parseProps(ctx, values.props, values.prop);\n\n const body: {\n template: string;\n list?: string;\n bucket?: string;\n props?: Record<string, unknown>;\n name?: string;\n from?: string;\n subject?: string;\n } = { template };\n if (list) body.list = list;\n if (bucket) body.bucket = bucket;\n if (props) body.props = props;\n if (values.name) body.name = values.name;\n if (values.from) body.from = values.from;\n if (values.subject) body.subject = values.subject;\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Queuing campaign ${template}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/campaigns\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} send`);\n ctx.out.kv(\n {\n campaignId: res.campaignId,\n template,\n audience: list ? `list:${list}` : `bucket:${bucket}`,\n status: statusColor(res.status),\n },\n \"Campaign queued\",\n );\n ctx.out.outro(\n `${color.green(\"Queued\")} — poll ${color.cyan(`hogsend campaigns status ${res.campaignId}`)} for progress.`,\n );\n}\n\nasync function runStatus(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"campaigns status requires a campaign id, e.g. hogsend campaigns status cmp_123\",\n );\n }\n\n let res: StatusResponse;\n try {\n res = await ctx.out.step(`Fetching campaign ${id}`, () =>\n ctx.dataHttp.get<StatusResponse>(\n `/v1/campaigns/${encodeURIComponent(id)}`,\n ),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} status`);\n ctx.out.kv(\n {\n id: res.id,\n name: res.name,\n status: statusColor(res.status),\n audience: `${res.audienceKind}:${res.audienceId}`,\n template: res.templateKey,\n recipients: res.totalRecipients,\n sent: color.green(String(res.sentCount)),\n skipped: color.yellow(String(res.skippedCount)),\n failed:\n res.failedCount > 0\n ? color.red(String(res.failedCount))\n : String(res.failedCount),\n startedAt: res.startedAt ?? \"\",\n completedAt: res.completedAt ?? \"\",\n },\n \"Campaign\",\n );\n ctx.out.outro(\n `${res.name} → ${statusColor(res.status)} ` +\n color.dim(\n `(${res.sentCount}/${res.totalRecipients} sent, ${res.skippedCount} skipped, ${res.failedCount} failed)`,\n ),\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"send\":\n // Strip the leading \"send\" token; the rest is send's own args.\n return runSend(ctx, ctx.argv.slice(1));\n case \"status\":\n return runStatus(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"campaigns requires a subcommand: send | status (see hogsend campaigns --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown campaigns subcommand \"${sub}\" — expected send or status`,\n );\n }\n}\n\nexport const campaignsCommand: Command = {\n name: \"campaigns\",\n summary: \"Queue a broadcast to a list/bucket, or check its status\",\n usage,\n run,\n};\n","import type { ResolvedConfig } from \"./config.js\";\n\n/** A non-2xx response (or transport failure) from the admin API. */\nexport interface HttpError extends Error {\n /** HTTP status code, or 0 for a transport-level failure (DNS/connect). */\n status: number;\n /** Parsed JSON body when available, else the raw text, else undefined. */\n body: unknown;\n}\n\n/** Query params accepted by `get` — undefined values are dropped. */\nexport type Query = Record<string, string | number | undefined>;\n\n/**\n * Thin admin HTTP client over native fetch (Node 22). Hits `<base>/v1/...`,\n * sends `Authorization: Bearer <adminKey>` on admin paths, parses JSON, and\n * throws an {@link HttpError} on any non-2xx response.\n *\n * Path convention: pass the path AFTER the base URL, e.g. `/v1/admin/journeys`\n * or `/v1/health`. The unauthenticated health route is reached via the same\n * `get` — pass `{ auth: false }` so a missing admin key doesn't error.\n */\nexport interface AdminClient {\n get<T = unknown>(\n path: string,\n query?: Query,\n opts?: RequestExtras,\n ): Promise<T>;\n patch<T = unknown>(path: string, body: unknown): Promise<T>;\n post<T = unknown>(path: string, body: unknown): Promise<T>;\n del<T = unknown>(path: string, body?: unknown): Promise<T>;\n /** The resolved config this client is bound to (for messages/JSON output). */\n readonly cfg: ResolvedConfig;\n}\n\n/** Per-request overrides. */\nexport interface RequestExtras {\n /** Set false for unauthenticated routes (e.g. /v1/health). Default true. */\n auth?: boolean;\n}\n\nfunction isHttpError(value: unknown): value is HttpError {\n return value instanceof Error && \"status\" in value;\n}\n\nfunction makeHttpError(\n message: string,\n status: number,\n body: unknown,\n): HttpError {\n const err = new Error(message) as HttpError;\n err.name = \"HttpError\";\n err.status = status;\n err.body = body;\n return err;\n}\n\nfunction buildUrl(baseUrl: string, path: string, query?: Query): string {\n const url = new URL(path.startsWith(\"/\") ? path : `/${path}`, `${baseUrl}/`);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue;\n url.searchParams.set(key, String(value));\n }\n }\n return url.toString();\n}\n\nfunction bodyMessage(status: number, body: unknown): string {\n if (\n body &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof (body as { error: unknown }).error === \"string\"\n ) {\n return `${status}: ${(body as { error: string }).error}`;\n }\n return `request failed with status ${status}`;\n}\n\n/** Internal options accepted by the shared {@link request} core. */\ninterface RequestOpts {\n query?: Query;\n body?: unknown;\n /** When false, no Authorization header is sent (e.g. /v1/health). */\n auth: boolean;\n}\n\n/**\n * The single HTTP core, shared by the admin client and the data-plane client.\n * Bound to a `baseUrl` + a bearer `key`; the only difference between the two\n * clients is which key (and which \"missing key\" message) they carry. Sends\n * `Authorization: Bearer <key>` when `auth` is set, parses JSON, and throws an\n * {@link HttpError} on any non-2xx response (or transport failure).\n */\nasync function request<T>(\n baseUrl: string,\n key: string | undefined,\n missingKeyMessage: string,\n method: string,\n path: string,\n opts: RequestOpts,\n): Promise<T> {\n if (opts.auth && !key) {\n throw makeHttpError(missingKeyMessage, 0, undefined);\n }\n\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (opts.auth && key) {\n headers.Authorization = `Bearer ${key}`;\n }\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const url = buildUrl(baseUrl, path, opts.query);\n\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n throw makeHttpError(`cannot reach ${baseUrl} (${msg})`, 0, undefined);\n }\n\n const text = await res.text();\n let parsed: unknown;\n if (text.length > 0) {\n try {\n parsed = JSON.parse(text);\n } catch {\n parsed = text;\n }\n }\n\n if (!res.ok) {\n throw makeHttpError(bodyMessage(res.status, parsed), res.status, parsed);\n }\n\n return parsed as T;\n}\n\n/** Build an {@link AdminClient} bound to the given resolved config. */\nexport function createAdminClient(cfg: ResolvedConfig): AdminClient {\n const missing =\n \"no admin key configured — pass --admin-key, or set HOGSEND_ADMIN_KEY / ADMIN_API_KEY\";\n return {\n cfg,\n get: <T>(path: string, query?: Query, extras?: RequestExtras) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"GET\", path, {\n query,\n auth: extras?.auth ?? true,\n }),\n patch: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"PATCH\", path, {\n body,\n auth: true,\n }),\n post: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"POST\", path, {\n body,\n auth: true,\n }),\n del: <T>(path: string, body?: unknown) =>\n request<T>(cfg.baseUrl, cfg.adminKey, missing, \"DELETE\", path, {\n body,\n auth: true,\n }),\n };\n}\n\n/**\n * Thin data-plane HTTP client over the same core as {@link createAdminClient},\n * but bound to `cfg.dataKey` (an `ingest`-scoped key). Used by the write\n * commands (`contacts upsert`, `events send`, `emails send`) which hit the\n * authed `/v1/contacts`, `/v1/events`, and `/v1/emails` data-plane routes.\n *\n * Exposes the full read/write verb set the data plane needs: `get`/`post`/\n * `put`/`del`. Every call is authenticated (there is no unauthenticated\n * data-plane route), so there is no `{ auth: false }` escape hatch here.\n */\nexport interface DataPlaneClient {\n get<T = unknown>(path: string, query?: Query): Promise<T>;\n post<T = unknown>(path: string, body: unknown): Promise<T>;\n put<T = unknown>(path: string, body: unknown): Promise<T>;\n del<T = unknown>(path: string, body?: unknown): Promise<T>;\n /** The resolved config this client is bound to (for messages/JSON output). */\n readonly cfg: ResolvedConfig;\n}\n\n/** Build a {@link DataPlaneClient} bound to `cfg.dataKey`. */\nexport function createDataPlaneClient(cfg: ResolvedConfig): DataPlaneClient {\n const missing =\n \"no data key configured — pass --data-key, or set HOGSEND_DATA_KEY / HOGSEND_API_KEY\";\n return {\n cfg,\n get: <T>(path: string, query?: Query) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"GET\", path, {\n query,\n auth: true,\n }),\n post: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"POST\", path, {\n body,\n auth: true,\n }),\n put: <T>(path: string, body: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"PUT\", path, {\n body,\n auth: true,\n }),\n del: <T>(path: string, body?: unknown) =>\n request<T>(cfg.baseUrl, cfg.dataKey, missing, \"DELETE\", path, {\n body,\n auth: true,\n }),\n };\n}\n\nexport { isHttpError };\n","import {\n cancel,\n intro as clackIntro,\n note as clackNote,\n outro as clackOutro,\n spinner,\n} from \"@clack/prompts\";\nimport color from \"picocolors\";\n\n/**\n * Unified output sink. Two modes:\n *\n * - human: TTY clack chrome (intro badge, spinners, notes, outro) + tables.\n * Falls back to plain console.log lines when stdout is not a TTY.\n * - json (`--json`): ALL chrome is a no-op; the command emits exactly one\n * JSON document via `out.json(payload)`. Nothing else touches stdout, so a\n * --json run is always a single valid JSON document — safe for agents.\n *\n * `interactive` is true only when human mode AND stdout is a TTY; commands key\n * spinner/prompt behaviour off it. `isJson` flips command control flow to the\n * non-interactive branch.\n */\nexport interface Output {\n /** True when human-mode AND stdout is a TTY (clack chrome is live). */\n readonly interactive: boolean;\n /** True when `--json` was passed. */\n readonly isJson: boolean;\n /** Session intro badge. No-op in json / non-TTY. */\n intro(title: string): void;\n /**\n * Run an async step with a spinner in interactive mode; a plain awaited call\n * otherwise. The label is logged (not spun) when non-interactive & not json.\n */\n step<T>(label: string, fn: () => Promise<T>): Promise<T>;\n /** Boxed note. No-op in json / non-TTY (prints plain lines in non-TTY human). */\n note(body: string, title?: string): void;\n /** Render an array of records as a table (human only; no-op in json). */\n table(rows: Record<string, unknown>[], columns?: string[]): void;\n /** Render a key/value object (human only; no-op in json). */\n kv(obj: Record<string, unknown>, title?: string): void;\n /** Plain human/plain-text line. No-op in json. */\n log(msg: string): void;\n /** Emit the single JSON document. Only meaningful in json mode. */\n json(payload: unknown): void;\n /** Session outro. No-op in json / non-TTY. */\n outro(msg: string): void;\n /**\n * Fail terminally. json: prints `{ \"error\": message }` to stdout, exit 1.\n * human (TTY): clack cancel(message), exit 1. human (non-TTY): stderr, exit 1.\n */\n fail(message: string): never;\n}\n\nfunction renderTable(\n rows: Record<string, unknown>[],\n columns?: string[],\n): string {\n if (rows.length === 0) return color.dim(\"(no rows)\");\n const cols =\n columns ??\n Array.from(\n rows.reduce<Set<string>>((set, row) => {\n for (const key of Object.keys(row)) set.add(key);\n return set;\n }, new Set<string>()),\n );\n const cell = (value: unknown): string => {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n };\n const widths = cols.map((c) =>\n Math.max(c.length, ...rows.map((r) => cell(r[c]).length)),\n );\n const pad = (text: string, width: number) =>\n text + \" \".repeat(width - text.length);\n const header = cols\n .map((c, i) => color.bold(pad(c, widths[i] ?? 0)))\n .join(\" \");\n const sep = cols.map((_, i) => \"-\".repeat(widths[i] ?? 0)).join(\" \");\n const body = rows\n .map((r) => cols.map((c, i) => pad(cell(r[c]), widths[i] ?? 0)).join(\" \"))\n .join(\"\\n\");\n return `${header}\\n${color.dim(sep)}\\n${body}`;\n}\n\nfunction renderKv(obj: Record<string, unknown>): string {\n const keys = Object.keys(obj);\n if (keys.length === 0) return color.dim(\"(empty)\");\n const width = Math.max(...keys.map((k) => k.length));\n return keys\n .map((k) => {\n const v = obj[k];\n const str =\n v === null || v === undefined\n ? \"\"\n : typeof v === \"object\"\n ? JSON.stringify(v)\n : String(v);\n return `${color.dim(`${k}:`.padEnd(width + 1))} ${str}`;\n })\n .join(\"\\n\");\n}\n\n/** Build an {@link Output} for the given mode. */\nexport function createOutput(opts: { json: boolean }): Output {\n const isJson = opts.json;\n const interactive = !isJson && Boolean(process.stdout.isTTY);\n\n return {\n interactive,\n isJson,\n\n intro(title) {\n if (!interactive) return;\n clackIntro(title);\n },\n\n async step<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (interactive) {\n const s = spinner();\n s.start(label);\n try {\n const result = await fn();\n s.stop(`${color.green(\"✓\")} ${label}`);\n return result;\n } catch (err) {\n s.stop(`${color.red(\"✗\")} ${label}`);\n throw err;\n }\n }\n if (!isJson) console.log(` ${label} ...`);\n return fn();\n },\n\n note(body, title) {\n if (isJson) return;\n if (interactive) {\n clackNote(body, title);\n return;\n }\n if (title) console.log(`\\n${title}`);\n console.log(body);\n },\n\n table(rows, columns) {\n if (isJson) return;\n console.log(renderTable(rows, columns));\n },\n\n kv(obj, title) {\n if (isJson) return;\n if (title) console.log(color.bold(title));\n console.log(renderKv(obj));\n },\n\n log(msg) {\n if (isJson) return;\n console.log(msg);\n },\n\n json(payload) {\n // Only stdout write in json mode; pretty-printed, single document.\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n },\n\n outro(msg) {\n if (!interactive) return;\n clackOutro(msg);\n },\n\n fail(message): never {\n if (isJson) {\n process.stdout.write(`${JSON.stringify({ error: message })}\\n`);\n } else if (interactive) {\n cancel(message);\n } else {\n process.stderr.write(`${color.red(\"error\")} ${message}\\n`);\n }\n process.exit(1);\n },\n };\n}\n\nexport { color };\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend contacts <subcommand> [options]\n\nInspect contacts via the admin API (/v1/admin/contacts) and upsert them via the\ndata plane (PUT /v1/contacts).\n\nSubcommands:\n list List contacts (newest activity first).\n get <id> Get one contact (by id or externalId) + preferences.\n timeline <id> Merged event/email/journey activity for a contact.\n upsert Create or update a contact (PUT /v1/contacts).\n\nlist options:\n --search <q> Filter by email/externalId substring.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n\ntimeline options:\n --type <t> Restrict to one of: event | journey | email.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n\nupsert options (at least one of --email / --user-id required):\n --email <addr> Contact email (a resolvable identity key).\n --user-id <id> External (distinct) id.\n --prop <key=value> Contact property; repeatable. Value parsed as JSON,\n falling back to a string. Uses the data plane (ingest key).\n --props <json> Contact properties as one JSON object (merged with --prop).\n --list <id> Subscribe to a list; repeatable.\n --unlist <id> Unsubscribe from a list; repeatable.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend contacts list --search acme@ --json\n hogsend contacts get user_123\n hogsend contacts timeline user_123 --type email --json\n hogsend contacts upsert --email a@b.com --user-id user_123 --prop plan=pro\n hogsend contacts upsert --user-id user_123 --props '{\"plan\":\"pro\",\"seats\":5}'`;\n\ntype ContactRecord = {\n id: string;\n externalId: string;\n email: string | null;\n properties: Record<string, unknown>;\n firstSeenAt: string;\n lastSeenAt: string;\n createdAt: string;\n updatedAt: string;\n};\n\ntype Preferences = {\n id: string;\n userId: string;\n email: string;\n unsubscribedAll: boolean;\n suppressed: boolean;\n bounceCount: number;\n categories: Record<string, boolean>;\n} | null;\n\ntype ListResponse = {\n contacts: ContactRecord[];\n total: number;\n limit: number;\n offset: number;\n};\n\ntype GetResponse = {\n contact: ContactRecord;\n preferences: Preferences;\n};\n\ntype TimelineEntry = {\n type: \"event\" | \"journey\" | \"email\";\n timestamp: string;\n data: Record<string, unknown>;\n};\n\ntype TimelineResponse = {\n timeline: TimelineEntry[];\n total: number;\n limit: number;\n offset: number;\n};\n\n/** Shape returned by PUT /v1/contacts. */\ntype UpsertResponse = {\n id: string;\n created: boolean;\n linked: boolean;\n};\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} contacts`;\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single properties record. Each `--prop` value is JSON-parsed when it\n * is valid JSON (numbers/booleans/null/objects), else kept as a string. The\n * explicit `--props` object is applied first, so later `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n const raw = pair.slice(eq + 1);\n out[key] = coerceValue(raw);\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Build a `lists` map from repeatable `--list <id>` (true) / `--unlist <id>`\n * (false) flags. Returns undefined when neither was passed.\n */\nfunction parseLists(\n subscribe: string[] | undefined,\n unsubscribe: string[] | undefined,\n): Record<string, boolean> | undefined {\n const out: Record<string, boolean> = {};\n let any = false;\n for (const id of subscribe ?? []) {\n out[id] = true;\n any = true;\n }\n for (const id of unsubscribe ?? []) {\n out[id] = false;\n any = true;\n }\n return any ? out : undefined;\n}\n\n/** Run an HTTP call, mapping HttpError into a clean ctx.out.fail message. */\nasync function fetchOrFail<T>(\n ctx: CommandContext,\n label: string,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await ctx.out.step(label, fn);\n } catch (err) {\n if (isHttpError(err)) {\n if (err.status === 404) {\n ctx.out.fail(err.message || \"contact not found\");\n }\n ctx.out.fail(err.message);\n }\n throw err;\n }\n}\n\nasync function runList(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n search: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const query = {\n search: values.search,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} list`);\n\n const res = await fetchOrFail<ListResponse>(ctx, \"Fetching contacts\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/contacts\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.contacts.map((cnt) => ({\n id: cnt.id,\n externalId: cnt.externalId,\n email: cnt.email ?? color.dim(\"(none)\"),\n lastSeenAt: cnt.lastSeenAt,\n })),\n [\"id\", \"externalId\", \"email\", \"lastSeenAt\"],\n );\n ctx.out.outro(\n `${res.contacts.length} of ${res.total} contact(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\nasync function runGet(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the \"get\" subcommand token; the id follows it.\n const id = positionals[1];\n if (!id) {\n ctx.out.fail(\n \"contacts get requires an id, e.g. hogsend contacts get user_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} get`);\n\n const res = await fetchOrFail<GetResponse>(ctx, \"Fetching contact\", () =>\n ctx.http.get<GetResponse>(`/v1/admin/contacts/${encodeURIComponent(id)}`),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n const { contact, preferences } = res;\n ctx.out.kv(\n {\n id: contact.id,\n externalId: contact.externalId,\n email: contact.email ?? color.dim(\"(none)\"),\n firstSeenAt: contact.firstSeenAt,\n lastSeenAt: contact.lastSeenAt,\n properties: contact.properties,\n },\n \"Contact\",\n );\n\n if (preferences) {\n ctx.out.kv(\n {\n unsubscribedAll: preferences.unsubscribedAll,\n suppressed: preferences.suppressed,\n bounceCount: preferences.bounceCount,\n categories: preferences.categories,\n },\n \"Preferences\",\n );\n } else {\n ctx.out.log(color.dim(\"No email preferences on record.\"));\n }\n\n ctx.out.outro(`Contact ${color.cyan(contact.externalId)}`);\n}\n\nasync function runTimeline(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n type: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the \"timeline\" subcommand token; the id follows it.\n const id = positionals[1];\n if (!id) {\n ctx.out.fail(\n \"contacts timeline requires an id, e.g. hogsend contacts timeline user_123\",\n );\n }\n\n if (values.type && ![\"event\", \"journey\", \"email\"].includes(values.type)) {\n ctx.out.fail(\"--type must be one of: event, journey, email\");\n }\n\n const query = {\n type: values.type,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} timeline`);\n\n const res = await fetchOrFail<TimelineResponse>(\n ctx,\n \"Fetching timeline\",\n () =>\n ctx.http.get<TimelineResponse>(\n `/v1/admin/contacts/${encodeURIComponent(id)}/timeline`,\n query,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.timeline.map((entry) => ({\n timestamp: entry.timestamp,\n type: entry.type,\n summary: summarizeTimelineEntry(entry),\n })),\n [\"timestamp\", \"type\", \"summary\"],\n );\n ctx.out.outro(\n `${res.timeline.length} of ${res.total} entry(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\n/** One-line human description of a timeline entry, by type. */\nfunction summarizeTimelineEntry(entry: TimelineEntry): string {\n const d = entry.data;\n if (entry.type === \"event\") {\n return String(d.event ?? \"\");\n }\n if (entry.type === \"journey\") {\n return `${String(d.journeyId ?? \"\")} (${String(d.status ?? \"\")})`;\n }\n // email\n const subject = d.subject ? String(d.subject) : String(d.templateKey ?? \"\");\n return `${subject} [${String(d.status ?? \"\")}]`;\n}\n\nasync function runUpsert(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n email: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n list: { type: \"string\", multiple: true },\n unlist: { type: \"string\", multiple: true },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const email = values.email;\n const userId = values[\"user-id\"];\n if (!email && !userId) {\n ctx.out.fail(\n \"contacts upsert requires at least one of --email or --user-id\",\n );\n }\n\n const properties = parseProps(ctx, values.props, values.prop);\n const lists = parseLists(values.list, values.unlist);\n\n const body: {\n email?: string;\n userId?: string;\n properties?: Record<string, unknown>;\n lists?: Record<string, boolean>;\n } = {};\n if (email) body.email = email;\n if (userId) body.userId = userId;\n if (properties) body.properties = properties;\n if (lists) body.lists = lists;\n\n if (!ctx.json) ctx.out.intro(`${badge} upsert`);\n\n const res = await fetchOrFail<UpsertResponse>(ctx, \"Upserting contact\", () =>\n ctx.dataHttp.put<UpsertResponse>(\"/v1/contacts\", body),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.kv(\n {\n id: res.id,\n created: res.created,\n linked: res.linked,\n email: email ?? color.dim(\"(none)\"),\n userId: userId ?? color.dim(\"(none)\"),\n },\n \"Contact\",\n );\n const verb = res.created ? \"created\" : \"updated\";\n ctx.out.outro(`Contact ${color.cyan(res.id)} ${verb}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n return runList(ctx, ctx.argv);\n case \"get\":\n return runGet(ctx, ctx.argv);\n case \"timeline\":\n return runTimeline(ctx, ctx.argv);\n case \"upsert\":\n // Strip the leading \"upsert\" token; the rest is upsert's own flags.\n return runUpsert(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"contacts requires a subcommand: list, get, timeline, or upsert (see hogsend contacts --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown contacts subcommand \"${sub}\" — expected list, get, timeline, or upsert`,\n );\n }\n}\n\nexport const contactsCommand: Command = {\n name: \"contacts\",\n summary: \"List, inspect, trace, and upsert contacts\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport { skillsStaleness } from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\n/**\n * Best-effort nudge: if the cwd is a Hogsend app whose vendored skills were\n * installed by an OLDER CLI than the one running now, point the user at the\n * refresh. Silent when there's no stamp (not an app dir / never tracked).\n */\nfunction skillsNudge(ctx: CommandContext): void {\n const verdict = skillsStaleness(process.cwd());\n if (!verdict?.stale || ctx.json) return;\n ctx.out.note(\n [\n `Vendored Claude skills are from v${verdict.installed}; this CLI is v${verdict.current}.`,\n \"\",\n `Refresh: ${color.cyan(\"hogsend upgrade\")} ${color.dim(\"(deps + skills)\")} or ${color.cyan(\"hogsend skills add --all --force\")}.`,\n ].join(\"\\n\"),\n \"Skills out of date\",\n );\n}\n\nconst usage = `hogsend doctor [--url <baseUrl>] [--admin-key <key>] [--json]\n\nProbe a running Hogsend instance via GET /v1/health and report its health:\ncomponent status (database, redis), two-track schema state (engine + client),\nand an overall verdict.\n\nThe health route is unauthenticated, so doctor works without an admin key.\n\nVerdict:\n ok service healthy, all components up, schema in sync\n degraded reachable but a component (database/redis) is down\n migration_pending reachable but a schema track is behind (pending migrations)\n unreachable the instance could not be reached at all\n\nExit code: 0 when ok, 1 when unreachable / degraded / migration_pending.\n\nOptions:\n --url <baseUrl> Target instance (default HOGSEND_API_URL / .env / :3002).\n --admin-key <key> Unused by doctor (health is unauthenticated).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.`;\n\n/** Subset of the engine /v1/health response we render. */\ninterface HealthComponent {\n status: \"up\" | \"down\";\n latencyMs?: number;\n}\ninterface HealthTrack {\n applied: string | null;\n required: string | null;\n inSync: boolean;\n pending: string[];\n}\ninterface HealthResponse {\n status: \"healthy\" | \"degraded\" | \"migration_pending\";\n uptime: number;\n timestamp: string;\n version: string;\n components: {\n database: HealthComponent;\n redis: HealthComponent;\n };\n schema: {\n engine: HealthTrack;\n client: HealthTrack;\n };\n}\n\ntype Verdict = \"ok\" | \"degraded\" | \"migration_pending\" | \"unreachable\";\n\n/** Map the server's status onto the CLI verdict vocabulary. */\nfunction toVerdict(status: HealthResponse[\"status\"]): Verdict {\n switch (status) {\n case \"healthy\":\n return \"ok\";\n case \"degraded\":\n return \"degraded\";\n case \"migration_pending\":\n return \"migration_pending\";\n }\n}\n\nfunction componentSymbol(status: \"up\" | \"down\"): string {\n return status === \"up\" ? color.green(\"up\") : color.red(\"down\");\n}\n\nfunction trackLine(name: string, track: HealthTrack): string {\n const sync = track.inSync\n ? color.green(\"in sync\")\n : color.yellow(\n `behind (${track.pending.length} pending: ${\n track.pending.length > 0 ? track.pending.join(\", \") : \"n/a\"\n })`,\n );\n const applied = track.applied ?? color.dim(\"none\");\n const required = track.required ?? color.dim(\"none\");\n return `${color.bold(name.padEnd(7))} applied ${applied} -> required ${required} ${sync}`;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n // doctor takes no extra flags of its own; tolerate stray tokens.\n strict: false,\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const { baseUrl } = ctx.http.cfg;\n\n // Fetch health. A transport failure (status 0) means unreachable — we surface\n // that as a first-class verdict rather than a hard error so agents get a\n // structured answer. Any other HttpError (non-2xx) is genuinely exceptional.\n let health: HealthResponse | null = null;\n let reachError: string | null = null;\n try {\n health = await ctx.out.step(`GET ${baseUrl}/v1/health`, () =>\n ctx.http.get<HealthResponse>(\"/v1/health\", undefined, { auth: false }),\n );\n } catch (error) {\n if (isHttpError(error) && error.status === 0) {\n reachError = error.message;\n } else if (isHttpError(error)) {\n // A 4xx/5xx from /v1/health: the instance is up but answering badly.\n // Treat as unreachable-for-health so the verdict stays meaningful.\n reachError = error.message;\n } else {\n throw error;\n }\n }\n\n if (!health) {\n const verdict: Verdict = \"unreachable\";\n if (ctx.json) {\n ctx.out.json({\n ok: false,\n verdict,\n baseUrl,\n error: reachError ?? \"unreachable\",\n });\n process.exit(1);\n }\n ctx.out.note(\n [\n `${color.red(\"●\")} ${color.bold(\"unreachable\")}`,\n \"\",\n reachError ?? `could not reach ${baseUrl}`,\n \"\",\n color.dim(\"Is the instance running? Check --url / HOGSEND_API_URL.\"),\n ].join(\"\\n\"),\n \"Doctor\",\n );\n ctx.out.outro(color.red(\"doctor: unreachable\"));\n process.exit(1);\n }\n\n const verdict = toVerdict(health.status);\n const ok = verdict === \"ok\";\n\n if (ctx.json) {\n ctx.out.json({\n ok,\n verdict,\n baseUrl,\n version: health.version,\n uptime: health.uptime,\n timestamp: health.timestamp,\n components: health.components,\n schema: health.schema,\n skills: skillsStaleness(process.cwd()) ?? undefined,\n });\n if (!ok) process.exit(1);\n return;\n }\n\n // Human render.\n const badge = `${color.bgMagenta(color.black(\" hogsend \"))} doctor`;\n ctx.out.intro(badge);\n\n const verdictColor =\n verdict === \"ok\"\n ? color.green\n : verdict === \"degraded\"\n ? color.red\n : color.yellow;\n\n const lines = [\n `${verdictColor(\"●\")} ${color.bold(verdict)}`,\n color.dim(\n `${baseUrl} v${health.version} up ${Math.round(health.uptime)}s`,\n ),\n \"\",\n color.bold(\"Components\"),\n ` database ${componentSymbol(health.components.database.status)}${\n health.components.database.latencyMs !== undefined\n ? color.dim(` ${health.components.database.latencyMs}ms`)\n : \"\"\n }`,\n ` redis ${componentSymbol(health.components.redis.status)}${\n health.components.redis.latencyMs !== undefined\n ? color.dim(` ${health.components.redis.latencyMs}ms`)\n : \"\"\n }`,\n \"\",\n color.bold(\"Schema\"),\n ` ${trackLine(\"engine\", health.schema.engine)}`,\n ` ${trackLine(\"client\", health.schema.client)}`,\n ];\n\n ctx.out.note(lines.join(\"\\n\"), \"Doctor\");\n\n skillsNudge(ctx);\n\n if (ok) {\n ctx.out.outro(color.green(\"doctor: ok\"));\n return;\n }\n\n ctx.out.outro(verdictColor(`doctor: ${verdict}`));\n process.exit(1);\n}\n\nexport const doctorCommand: Command = {\n name: \"doctor\",\n summary: \"Probe a running instance's health (GET /v1/health)\",\n usage,\n run,\n};\n","import {\n cpSync,\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Shared skill-install machinery, used by `hogsend skills`, `hogsend upgrade`,\n * and the `hogsend doctor` staleness nudge. The CLI ships a `skills/` dir in its\n * published tarball (package.json files[]); these helpers copy it into a\n * consumer project's ./.claude/skills/ and track which CLI version produced it.\n */\n\nexport interface BundledSkill {\n name: string;\n description: string;\n installed: boolean;\n}\n\nexport interface CopyResult {\n name: string;\n installed: boolean;\n skipped: boolean;\n path: string;\n}\n\n/** Persisted record of the last skill install — drives the staleness nudge. */\nexport interface SkillsStamp {\n /** The @hogsend/cli version that produced the installed skills. */\n cliVersion: string;\n /** Installed skill names. */\n skills: string[];\n /** ISO timestamp of the install/refresh (omitted by build-time stamps). */\n updatedAt?: string;\n}\n\n/**\n * Resolve the directory holding the bundled skills shipped in the tarball.\n * At runtime the CLI is bundled into <pkg>/dist/bin.js, so the skills dir\n * (shipped via package.json files[]) is one level up at <pkg>/skills.\n */\nexport function bundledSkillsDir(): string {\n return fileURLToPath(new URL(\"../skills\", import.meta.url));\n}\n\n/** Target directory for installed skills in the consumer project. */\nexport function installDir(cwd: string): string {\n return join(cwd, \".claude\", \"skills\");\n}\n\n/** Path to the install stamp (sibling of skills/, NOT inside it). */\nexport function stampPath(cwd: string): string {\n return join(cwd, \".claude\", \".hogsend-skills.json\");\n}\n\n/** This CLI's own version (read from its package.json at <pkg>/package.json). */\nexport function cliVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n const pkg = require(\"../package.json\") as { version?: string };\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\n/** Read a file as utf8, returning \"\" on any error (never throws). */\nfunction readFileSyncSafe(path: string): string {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return \"\";\n }\n}\n\n/** A single-line `key: value` reader for SKILL.md YAML frontmatter. */\nfunction readFrontmatterField(skillDir: string, field: string): string {\n const skillFile = join(skillDir, \"SKILL.md\");\n if (!existsSync(skillFile)) return \"\";\n // Tiny frontmatter scan — avoids a YAML dep. Reads only the top block.\n const raw = readFileSyncSafe(skillFile);\n const fmMatch = raw.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!fmMatch) return \"\";\n const block = fmMatch[1] ?? \"\";\n for (const line of block.split(\"\\n\")) {\n const m = line.match(/^([A-Za-z0-9_-]+):\\s*(.*)$/);\n if (m && m[1] === field) {\n return (m[2] ?? \"\").replace(/^[\"']|[\"']$/g, \"\").trim();\n }\n }\n return \"\";\n}\n\n/** Enumerate bundled skills (each is a subdir with a SKILL.md). */\nexport function listBundledSkills(cwd: string): BundledSkill[] {\n const dir = bundledSkillsDir();\n if (!existsSync(dir)) return [];\n const target = installDir(cwd);\n const entries = readdirSync(dir).filter((name) => {\n const full = join(dir, name);\n return statSync(full).isDirectory() && existsSync(join(full, \"SKILL.md\"));\n });\n return entries.sort().map((name) => ({\n name,\n description: readFrontmatterField(join(dir, name), \"description\"),\n installed: existsSync(join(target, name)),\n }));\n}\n\n/** Copy one bundled skill into the project, honouring --force. */\nexport function copySkill(\n name: string,\n cwd: string,\n force: boolean,\n): CopyResult {\n const src = join(bundledSkillsDir(), name);\n const dest = join(installDir(cwd), name);\n const exists = existsSync(dest);\n if (exists && !force) {\n return { name, installed: false, skipped: true, path: dest };\n }\n mkdirSync(installDir(cwd), { recursive: true });\n cpSync(src, dest, { recursive: true, force: true });\n return { name, installed: true, skipped: false, path: dest };\n}\n\n/** Record which CLI version produced the currently-installed skills. */\nexport function writeSkillsStamp(cwd: string, skills: string[]): void {\n const stamp: SkillsStamp = {\n cliVersion: cliVersion(),\n skills: [...skills].sort(),\n updatedAt: new Date().toISOString(),\n };\n mkdirSync(join(cwd, \".claude\"), { recursive: true });\n writeFileSync(stampPath(cwd), `${JSON.stringify(stamp, null, 2)}\\n`);\n}\n\n/** Read the install stamp, or null when absent/unreadable. */\nexport function readSkillsStamp(cwd: string): SkillsStamp | null {\n try {\n const parsed = JSON.parse(readFileSync(stampPath(cwd), \"utf8\")) as\n | SkillsStamp\n | undefined;\n return parsed && typeof parsed.cliVersion === \"string\" ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** Numeric semver compare on the release line (prerelease tags ignored). */\nexport function compareVersions(a: string, b: string): number {\n const parse = (v: string) =>\n (v.split(\"-\")[0] ?? \"\").split(\".\").map((n) => Number.parseInt(n, 10) || 0);\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return 0;\n}\n\n/**\n * Staleness verdict for the skills installed in `cwd`. Returns null when no\n * stamp exists (not a tracked app), else whether the installed skills came from\n * an OLDER CLI than the one running now.\n */\nexport function skillsStaleness(\n cwd: string,\n): { stale: boolean; installed: string; current: string } | null {\n const stamp = readSkillsStamp(cwd);\n if (!stamp) return null;\n const current = cliVersion();\n return {\n stale: compareVersions(stamp.cliVersion, current) < 0,\n installed: stamp.cliVersion,\n current,\n };\n}\n","import { existsSync, realpathSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, sep } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { EjectError, eject } from \"../eject.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend eject <package> [--force] [--cwd <dir>]\n\nCopy a @hogsend/* package's source into vendor/<name> and rewrite the consumer\ndependency to file:./vendor/<name>. Every other dependency keeps upgrading.\n\nOptions:\n --force Overwrite an existing vendor/<name>.\n --cwd <dir> Consumer repo root (defaults to the current directory).\n -h, --help Show this help.\n\nAfter ejecting, run: pnpm install`;\n\n/**\n * Resolve the on-disk source directory for an installed package. Strategy 1:\n * probe node_modules/<pkg>/package.json (following pnpm/workspace symlinks).\n * Strategy 2: resolve the package entry via createRequire and walk up.\n */\nfunction resolveSourceDir(pkg: string, consumerRoot: string): string | null {\n const direct = join(consumerRoot, \"node_modules\", pkg, \"package.json\");\n if (existsSync(direct)) {\n return dirname(realpathSync(direct));\n }\n const require = createRequire(`${consumerRoot}${sep}`);\n try {\n const entry = require.resolve(pkg);\n let dir = dirname(entry);\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n } catch {\n // fall through\n }\n return null;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n force: { type: \"boolean\", default: false },\n cwd: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const pkg = positionals[0];\n if (!pkg) {\n ctx.out.fail(\n \"eject requires a package name, e.g. hogsend eject @hogsend/engine\",\n );\n }\n\n const consumerRoot = values.cwd ?? process.cwd();\n const sourceDir = resolveSourceDir(pkg, consumerRoot);\n if (!sourceDir) {\n ctx.out.fail(\n `cannot resolve ${pkg} from ${consumerRoot}. Is it installed? Run pnpm install first.`,\n );\n }\n\n try {\n const result = await ctx.out.step(`Ejecting ${pkg}`, () =>\n eject({ pkg, consumerRoot, sourceDir, force: values.force }),\n );\n if (ctx.json) {\n ctx.out.json(result);\n return;\n }\n ctx.out.note(\n [\n `copied ${result.copiedFiles} files -> ${result.vendorPath}`,\n `dependency ${result.depSpecBefore} -> ${color.cyan(result.depSpecAfter)}`,\n \"\",\n `Now run: ${color.cyan(result.followUp)}`,\n ].join(\"\\n\"),\n `Ejected ${result.pkg}`,\n );\n } catch (error) {\n if (error instanceof EjectError) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n}\n\nexport const ejectCommand: Command = {\n name: \"eject\",\n summary: \"Vendor a @hogsend/* package into vendor/<name>\",\n usage,\n run,\n};\n","import { existsSync } from \"node:fs\";\nimport { cp, readFile, rm, stat, writeFile } from \"node:fs/promises\";\nimport { basename, join, relative, sep } from \"node:path\";\n\n/** Options for {@link eject}. */\nexport interface EjectOptions {\n /** Scoped package name to eject, e.g. \"@hogsend/engine\". */\n pkg: string;\n /** Consumer repo root (the dir containing the consumer package.json). */\n consumerRoot: string;\n /**\n * Where the package source currently lives (the workspace/registry copy).\n * In-monorepo: <repoRoot>/packages/<name>. In a scaffolded app it is the\n * resolved node_modules path. The caller resolves this; eject() never\n * guesses it.\n */\n sourceDir: string;\n /** Overwrite an existing vendor/<name>. */\n force?: boolean;\n}\n\n/** Result of a successful {@link eject}. */\nexport interface EjectResult {\n pkg: string;\n /** Absolute path to vendor/<name>. */\n vendorPath: string;\n /** The dep spec before the rewrite, e.g. \"workspace:^\". */\n depSpecBefore: string;\n /** The dep spec after the rewrite, \"file:./vendor/<name>\". */\n depSpecAfter: string;\n /** Number of files copied into vendor/<name>. */\n copiedFiles: number;\n /** The install command the operator must run next. */\n followUp: string;\n}\n\n/** Typed failure thrown by {@link eject} for expected, user-facing errors. */\nexport class EjectError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EjectError\";\n }\n}\n\n/** Directory/file names excluded from the vendor copy. */\nconst EXCLUDED_NAMES = new Set([\n \"node_modules\",\n \"dist\",\n \".turbo\",\n \".changeset\",\n \"CHANGELOG.md\",\n]);\n\ninterface PackageJson {\n private?: boolean;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\ntype DepMap = \"dependencies\" | \"devDependencies\";\n\nasync function readPackageJson(file: string): Promise<PackageJson> {\n const raw = await readFile(file, \"utf8\");\n return JSON.parse(raw) as PackageJson;\n}\n\nasync function writePackageJson(\n file: string,\n value: PackageJson,\n): Promise<void> {\n await writeFile(file, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n\n/**\n * Pure eject: copies a single package's source into the consumer's\n * `vendor/<name>` and rewrites only that consumer dependency to a\n * `file:./vendor/<name>` link. Every other dependency is left untouched, so\n * the rest of the `@hogsend/*` set keeps upgrading via `pnpm up`.\n *\n * This function performs filesystem operations only — it never runs an install\n * and never resolves `sourceDir` itself, which keeps it hermetically testable.\n */\nexport async function eject(opts: EjectOptions): Promise<EjectResult> {\n const { pkg, consumerRoot, sourceDir, force = false } = opts;\n\n // 1. Resolve names.\n const vendorName = basename(pkg);\n const vendorPath = join(consumerRoot, \"vendor\", vendorName);\n\n // 2. Validate the consumer dependency exists (before any side effects).\n const consumerPkgPath = join(consumerRoot, \"package.json\");\n const consumerPkg = await readPackageJson(consumerPkgPath);\n let depMap: DepMap | undefined;\n let depSpecBefore: string | undefined;\n if (consumerPkg.dependencies?.[pkg] !== undefined) {\n depMap = \"dependencies\";\n depSpecBefore = consumerPkg.dependencies[pkg];\n } else if (consumerPkg.devDependencies?.[pkg] !== undefined) {\n depMap = \"devDependencies\";\n depSpecBefore = consumerPkg.devDependencies[pkg];\n }\n if (!depMap || depSpecBefore === undefined) {\n throw new EjectError(\n `${pkg} is not a dependency of the consumer package.json`,\n );\n }\n\n // 3. Guard the vendor dir.\n if (existsSync(vendorPath)) {\n if (!force) {\n throw new EjectError(\n `vendor/${vendorName} already exists; pass --force to overwrite`,\n );\n }\n await rm(vendorPath, { recursive: true, force: true });\n }\n\n // 4. Copy source with an exclude filter. Returning false for a directory\n // prunes the whole subtree (Node 22 fs.cp filter semantics).\n let copiedFiles = 0;\n await cp(sourceDir, vendorPath, {\n recursive: true,\n filter: (source) => {\n const rel = relative(sourceDir, source);\n if (rel === \"\") {\n return true;\n }\n const segments = rel.split(sep);\n const name = basename(rel);\n // Exclude any path segment that is an excluded name (prunes subtrees).\n if (segments.some((segment) => EXCLUDED_NAMES.has(segment))) {\n return false;\n }\n if (name.endsWith(\".test.ts\")) {\n return false;\n }\n return true;\n },\n });\n\n // Count copied files (directories excluded) for the result summary.\n copiedFiles = await countFiles(vendorPath);\n\n // 5. Sanitize the vendored package.json.\n const vendoredPkgPath = join(vendorPath, \"package.json\");\n const vendoredPkg = await readPackageJson(vendoredPkgPath);\n if (vendoredPkg.private === true) {\n delete vendoredPkg.private;\n }\n await writePackageJson(vendoredPkgPath, vendoredPkg);\n\n // 6. Rewrite the consumer dep in place (preserving key order).\n const depSpecAfter = `file:./vendor/${vendorName}`;\n // biome-ignore lint/style/noNonNullAssertion: depMap validated above.\n consumerPkg[depMap]![pkg] = depSpecAfter;\n await writePackageJson(consumerPkgPath, consumerPkg);\n\n // 7. Return the result.\n return {\n pkg,\n vendorPath,\n depSpecBefore,\n depSpecAfter,\n copiedFiles,\n followUp: \"pnpm install\",\n };\n}\n\n/** Recursively counts regular files under a directory. */\nasync function countFiles(dir: string): Promise<number> {\n const { readdir } = await import(\"node:fs/promises\");\n let count = 0;\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n count += await countFiles(full);\n } else if (entry.isFile()) {\n count += 1;\n } else {\n const info = await stat(full);\n if (info.isFile()) {\n count += 1;\n }\n }\n }\n return count;\n}\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend emails <subcommand> [options]\n\nSend a transactional email through the data plane (POST /v1/emails). The send\nruns through the full preferences + tracking pipeline (link-click + open).\n\nSubcommands:\n send <template> Send the named template to a recipient.\n\nsend options (at least one of --to / --user-id required):\n --to <addr> Recipient email address.\n --user-id <id> External (distinct) id; the recipient email is resolved\n from the contact (404 if it has no resolvable email).\n --prop <key=value> Template prop; repeatable. Value parsed as JSON, falling\n back to a string.\n --props <json> Template props as one JSON object (merged with --prop).\n --from <addr> Override the default From address.\n --subject <text> Override the rendered subject.\n --reply-to <addr> Set the Reply-To address.\n --category <key> Preference category / list id to gate the send on.\n --skip-preference-check Bypass unsubscribe/suppression (requires full-admin).\n --idempotency-key <k> Dedup key.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend emails send welcome --to a@b.com --prop name=Ada\n hogsend emails send welcome --user-id user_123 --props '{\"name\":\"Ada\"}' --json`;\n\n/** Shape returned by POST /v1/emails. */\ninterface SendResponse {\n emailSendId: string;\n status: \"queued\" | \"sent\" | \"suppressed\" | \"unsubscribed\" | \"skipped\";\n reason?: string;\n}\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} emails`;\n\n/**\n * Parse `--prop key=value` (repeatable) + an optional `--props <json>` object\n * into a single props record. Each `--prop` value is JSON-parsed when valid\n * JSON, else kept as a string. The `--props` object is applied first, so later\n * `--prop` flags win.\n */\nfunction parseProps(\n ctx: CommandContext,\n propsJson: string | undefined,\n propPairs: string[] | undefined,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (propsJson !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(propsJson);\n } catch {\n ctx.out.fail(`--props must be valid JSON, got: ${propsJson}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(\"--props must be a JSON object\");\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of propPairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--prop must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--prop key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\nfunction statusColor(status: SendResponse[\"status\"]): string {\n switch (status) {\n case \"queued\":\n case \"sent\":\n return color.green(status);\n case \"skipped\":\n return color.dim(status);\n default:\n // suppressed | unsubscribed\n return color.yellow(status);\n }\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n to: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n from: { type: \"string\" },\n subject: { type: \"string\" },\n \"reply-to\": { type: \"string\" },\n category: { type: \"string\" },\n \"skip-preference-check\": { type: \"boolean\", default: false },\n \"idempotency-key\": { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the template name (the \"send\" token was already stripped).\n const template = positionals[0];\n if (!template) {\n ctx.out.fail(\n \"emails send requires a template, e.g. hogsend emails send welcome --to a@b.com\",\n );\n }\n\n const to = values.to;\n const userId = values[\"user-id\"];\n if (!to && !userId) {\n ctx.out.fail(\"emails send requires at least one of --to or --user-id\");\n }\n\n const props = parseProps(ctx, values.props, values.prop);\n\n const body: {\n template: string;\n to?: string;\n userId?: string;\n props?: Record<string, unknown>;\n from?: string;\n subject?: string;\n replyTo?: string;\n category?: string;\n skipPreferenceCheck?: boolean;\n idempotencyKey?: string;\n } = { template };\n if (to) body.to = to;\n if (userId) body.userId = userId;\n if (props) body.props = props;\n if (values.from) body.from = values.from;\n if (values.subject) body.subject = values.subject;\n if (values[\"reply-to\"]) body.replyTo = values[\"reply-to\"];\n if (values.category) body.category = values.category;\n if (values[\"skip-preference-check\"]) body.skipPreferenceCheck = true;\n if (values[\"idempotency-key\"]) {\n body.idempotencyKey = values[\"idempotency-key\"];\n }\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Sending ${template}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/emails\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${badge} send`);\n ctx.out.kv(\n {\n emailSendId: res.emailSendId,\n template,\n recipient: to ?? userId ?? \"\",\n status: statusColor(res.status),\n reason: res.reason ?? \"\",\n },\n \"Email send\",\n );\n ctx.out.outro(`${template} → ${statusColor(res.status)}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"send\":\n // Strip the leading \"send\" token; the rest is send's own args.\n return runSend(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"emails requires a subcommand: send (see hogsend emails --help)\",\n );\n break;\n default:\n ctx.out.fail(`unknown emails subcommand \"${sub}\" — expected send`);\n }\n}\n\nexport const emailsCommand: Command = {\n name: \"emails\",\n summary: \"Send a transactional email through the data plane\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend events <userId> [options]\nhogsend events send <name> [options]\n\nRead a single user's event history (admin API), or send an event into the data\nplane to drive journeys/buckets.\n\nRead mode — hogsend events <userId>:\n Stream the event history for a single user, newest first. Wraps\n GET /v1/admin/events?userId=<userId>.\n\n Arguments:\n <userId> The user (distinct) id to fetch events for. Required.\n\n Options:\n --event <name> Filter to a single event name.\n --from <iso> Only events at/after this ISO-8601 timestamp.\n --to <iso> Only events at/before this ISO-8601 timestamp.\n --limit <n> Max events to return (1-100, default 50).\n --offset <n> Pagination offset (default 0).\n\nSend mode — hogsend events send <name>:\n Push an event into POST /v1/events (data plane, ingest key). At least one of\n --email / --user-id is required.\n\n Options:\n --email <addr> Recipient/identity email.\n --user-id <id> External (distinct) id.\n --prop <key=value> Event property; repeatable. Value parsed as JSON,\n falling back to a string.\n --props <json> Event properties as one JSON object.\n --contact-prop <k=v> Contact property to merge onto the contact; repeatable.\n --contact-props <json> Contact properties as one JSON object.\n --list <id> Subscribe to a list; repeatable.\n --unlist <id> Unsubscribe from a list; repeatable.\n --idempotency-key <k> Dedup key (sent as the Idempotency-Key header).\n --timestamp <iso> Override the event timestamp.\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend events user_123\n hogsend events user_123 --event signup --limit 10\n hogsend events user_123 --from 2026-01-01T00:00:00Z --json\n hogsend events send signup --user-id user_123 --prop plan=pro\n hogsend events send purchase --email a@b.com --props '{\"amount\":49}' --json`;\n\ninterface UserEvent {\n id: string;\n userId: string;\n event: string;\n properties: Record<string, unknown> | null;\n occurredAt: string;\n}\n\ninterface EventsResponse {\n events: UserEvent[];\n total: number;\n limit: number;\n offset: number;\n}\n\n/** Shape returned by POST /v1/events. */\ninterface ExitResult {\n journeyId: string;\n stateId: string;\n exited: boolean;\n}\n\ninterface SendResponse {\n stored: boolean;\n exits: ExitResult[];\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n // `events send <name>` is the write path; everything else is the read path\n // (bare `events <userId>`). Dispatch on the first positional WITHOUT a global\n // --help short-circuit here, so `events send --help` still shows usage.\n if (ctx.argv[0] === \"send\") {\n return runSend(ctx, ctx.argv.slice(1));\n }\n return runRead(ctx, ctx.argv);\n}\n\nasync function runRead(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n event: { type: \"string\" },\n from: { type: \"string\" },\n to: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const userId = positionals[0];\n if (!userId) {\n ctx.out.fail(\"events requires a userId, e.g. hogsend events user_123\");\n }\n\n const limit = parseNumber(values.limit, \"limit\", ctx);\n const offset = parseNumber(values.offset, \"offset\", ctx);\n\n const query = {\n userId,\n event: values.event,\n from: values.from,\n to: values.to,\n limit,\n offset,\n };\n\n let data: EventsResponse;\n try {\n data = await ctx.out.step(`Fetching events for ${userId}`, () =>\n ctx.http.get<EventsResponse>(\"/v1/admin/events\", query),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} events`);\n\n if (data.events.length === 0) {\n ctx.out.note(\n `No events found for ${color.cyan(userId)}.`,\n \"Empty event stream\",\n );\n ctx.out.outro(color.dim(\"Nothing to show.\"));\n return;\n }\n\n const rows = data.events.map((e) => ({\n occurredAt: e.occurredAt,\n event: e.event,\n properties: summarizeProps(e.properties),\n id: e.id,\n }));\n ctx.out.table(rows, [\"occurredAt\", \"event\", \"properties\", \"id\"]);\n\n const shown = data.events.length;\n const through = data.offset + shown;\n ctx.out.outro(\n `${color.green(String(shown))} event${shown === 1 ? \"\" : \"s\"} ` +\n color.dim(`(${data.offset + 1}-${through} of ${data.total})`),\n );\n}\n\nasync function runSend(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n email: { type: \"string\" },\n \"user-id\": { type: \"string\" },\n prop: { type: \"string\", multiple: true },\n props: { type: \"string\" },\n \"contact-prop\": { type: \"string\", multiple: true },\n \"contact-props\": { type: \"string\" },\n list: { type: \"string\", multiple: true },\n unlist: { type: \"string\", multiple: true },\n \"idempotency-key\": { type: \"string\" },\n timestamp: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n // positionals[0] is the event name (the \"send\" token was already stripped).\n const name = positionals[0];\n if (!name) {\n ctx.out.fail(\n \"events send requires an event name, e.g. hogsend events send signup --user-id user_123\",\n );\n }\n\n const email = values.email;\n const userId = values[\"user-id\"];\n if (!email && !userId) {\n ctx.out.fail(\"events send requires at least one of --email or --user-id\");\n }\n\n const eventProperties = parseProps(ctx, values.props, values.prop, \"prop\");\n const contactProperties = parseProps(\n ctx,\n values[\"contact-props\"],\n values[\"contact-prop\"],\n \"contact-prop\",\n );\n const lists = parseLists(values.list, values.unlist);\n\n const body: {\n name: string;\n email?: string;\n userId?: string;\n eventProperties?: Record<string, unknown>;\n contactProperties?: Record<string, unknown>;\n lists?: Record<string, boolean>;\n idempotencyKey?: string;\n timestamp?: string;\n } = { name };\n if (email) body.email = email;\n if (userId) body.userId = userId;\n if (eventProperties) body.eventProperties = eventProperties;\n if (contactProperties) body.contactProperties = contactProperties;\n if (lists) body.lists = lists;\n if (values[\"idempotency-key\"]) {\n body.idempotencyKey = values[\"idempotency-key\"];\n }\n if (values.timestamp) body.timestamp = values.timestamp;\n\n let res: SendResponse;\n try {\n res = await ctx.out.step(`Sending event ${name}`, () =>\n ctx.dataHttp.post<SendResponse>(\"/v1/events\", body),\n );\n } catch (error) {\n if (isHttpError(error)) {\n ctx.out.fail(error.message);\n }\n throw error;\n }\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} events send`);\n\n const exited = res.exits.filter((e) => e.exited);\n ctx.out.kv(\n {\n event: name,\n stored: res.stored,\n identity: email ?? userId ?? \"\",\n exits: res.exits.length,\n \"journeys exited\": exited.length,\n },\n \"Event sent\",\n );\n\n if (exited.length > 0) {\n ctx.out.table(\n exited.map((e) => ({ journeyId: e.journeyId, stateId: e.stateId })),\n [\"journeyId\", \"stateId\"],\n );\n }\n\n ctx.out.outro(\n res.stored\n ? `${color.green(\"Stored\")} ${name}.`\n : color.dim(`${name} was deduped (not stored).`),\n );\n}\n\n/**\n * Parse `--<flag> key=value` (repeatable) + an optional `--<flag>s <json>`\n * object into a single properties record. Each value is JSON-parsed when valid\n * JSON, else kept as a string. The JSON object is applied first so later\n * key=value flags win. `flagName` is used only for error messages.\n */\nfunction parseProps(\n ctx: CommandContext,\n json: string | undefined,\n pairs: string[] | undefined,\n flagName: string,\n): Record<string, unknown> | undefined {\n const out: Record<string, unknown> = {};\n let any = false;\n\n if (json !== undefined) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(json);\n } catch {\n ctx.out.fail(`--${flagName}s must be valid JSON, got: ${json}`);\n }\n if (\n parsed === null ||\n typeof parsed !== \"object\" ||\n Array.isArray(parsed)\n ) {\n ctx.out.fail(`--${flagName}s must be a JSON object`);\n }\n Object.assign(out, parsed as Record<string, unknown>);\n any = true;\n }\n\n for (const pair of pairs ?? []) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) {\n ctx.out.fail(`--${flagName} must be key=value, got: ${pair}`);\n }\n const key = pair.slice(0, eq).trim();\n if (key === \"\") {\n ctx.out.fail(`--${flagName} key cannot be empty, got: ${pair}`);\n }\n out[key] = coerceValue(pair.slice(eq + 1));\n any = true;\n }\n\n return any ? out : undefined;\n}\n\n/** JSON-parse a flag value, falling back to the raw string. */\nfunction coerceValue(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n}\n\n/**\n * Build a `lists` map from repeatable `--list <id>` (true) / `--unlist <id>`\n * (false) flags. Returns undefined when neither was passed.\n */\nfunction parseLists(\n subscribe: string[] | undefined,\n unsubscribe: string[] | undefined,\n): Record<string, boolean> | undefined {\n const out: Record<string, boolean> = {};\n let any = false;\n for (const id of subscribe ?? []) {\n out[id] = true;\n any = true;\n }\n for (const id of unsubscribe ?? []) {\n out[id] = false;\n any = true;\n }\n return any ? out : undefined;\n}\n\n/**\n * Parse an optional numeric flag. Returns undefined when absent (lets the\n * server apply its default); fails on a non-numeric value.\n */\nfunction parseNumber(\n raw: string | undefined,\n name: string,\n ctx: CommandContext,\n): number | undefined {\n if (raw === undefined) return undefined;\n const n = Number(raw);\n if (!Number.isFinite(n)) {\n ctx.out.fail(`--${name} must be a number, got \"${raw}\"`);\n }\n return n;\n}\n\n/** Compact a properties object into a single-line preview for the table. */\nfunction summarizeProps(props: Record<string, unknown> | null): string {\n if (!props) return \"\";\n const keys = Object.keys(props);\n if (keys.length === 0) return \"\";\n const preview = JSON.stringify(props);\n return preview.length > 60 ? `${preview.slice(0, 57)}...` : preview;\n}\n\nexport const eventsCommand: Command = {\n name: \"events\",\n summary: \"Stream a user's event history, or send an event\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend journeys <subcommand> [options]\n\nInspect and toggle journeys via the admin API (/v1/admin/journeys).\n\nSubcommands:\n list List journeys with status, trigger, and state counts.\n get <id> Show one journey: trigger, exitOn, counts, recent states.\n enable <id> Enable a journey (PATCH { enabled: true }).\n disable <id> Disable a journey (PATCH { enabled: false }).\n\nOptions:\n list:\n --enabled <true|false> Filter by enabled state.\n --limit <n> Page size (1-100, default 50).\n --offset <n> Page offset (default 0).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.\n\nExamples:\n hogsend journeys list --enabled true\n hogsend journeys get activation-welcome --json\n hogsend journeys disable churn-prevention`;\n\n/** Shape returned by GET /v1/admin/journeys. */\ninterface JourneyCounts {\n active: number;\n waiting: number;\n completed: number;\n failed: number;\n exited: number;\n}\n\ninterface JourneyListItem {\n id: string;\n name: string;\n description?: string;\n enabled: boolean;\n trigger: { event: string };\n entryLimit: string;\n counts: JourneyCounts;\n}\n\ninterface ListResponse {\n journeys: JourneyListItem[];\n total: number;\n limit: number;\n offset: number;\n}\n\ninterface JourneyState {\n id: string;\n userId: string;\n userEmail: string;\n journeyId: string;\n currentNodeId: string;\n status: string;\n errorMessage: string | null;\n entryCount: number;\n completedAt: string | null;\n exitedAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface JourneyDetail extends Omit<JourneyListItem, \"trigger\"> {\n trigger: { event: string; where?: Record<string, unknown>[] };\n exitOn?: { event: string; where?: Record<string, unknown>[] }[];\n suppress: Record<string, number>;\n recentStates: JourneyState[];\n}\n\ninterface GetResponse {\n journey: JourneyDetail;\n}\n\ninterface PatchResponse {\n journey: { id: string; name: string; enabled: boolean; updatedAt: string };\n}\n\nfunction badge(): string {\n return `${color.bgMagenta(color.black(\" hogsend \"))} journeys`;\n}\n\nfunction statusColor(enabled: boolean): string {\n return enabled ? color.green(\"enabled\") : color.yellow(\"disabled\");\n}\n\nasync function runList(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n enabled: { type: \"string\" },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n if (\n values.enabled !== undefined &&\n ![\"true\", \"false\"].includes(values.enabled)\n ) {\n ctx.out.fail(\"--enabled must be 'true' or 'false'\");\n }\n\n const query = {\n enabled: values.enabled,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(\"Fetching journeys\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/journeys\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n if (data.journeys.length === 0) {\n ctx.out.note(\"No journeys matched.\", \"Journeys\");\n } else {\n ctx.out.table(\n data.journeys.map((j) => ({\n id: j.id,\n name: j.name,\n status: statusColor(j.enabled),\n trigger: j.trigger.event,\n active: j.counts.active,\n waiting: j.counts.waiting,\n completed: j.counts.completed,\n failed: j.counts.failed,\n })),\n [\n \"id\",\n \"name\",\n \"status\",\n \"trigger\",\n \"active\",\n \"waiting\",\n \"completed\",\n \"failed\",\n ],\n );\n }\n\n ctx.out.outro(\n `${data.journeys.length} of ${data.total} journey(s) — offset ${data.offset}, limit ${data.limit}`,\n );\n}\n\nasync function runGet(\n ctx: CommandContext,\n id: string | undefined,\n): Promise<void> {\n if (!id) {\n ctx.out.fail(\n \"journeys get requires a journey id, e.g. hogsend journeys get activation-welcome\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(`Fetching journey ${id}`, () =>\n ctx.http.get<GetResponse>(\n `/v1/admin/journeys/${encodeURIComponent(id as string)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n const j = data.journey;\n ctx.out.kv(\n {\n id: j.id,\n name: j.name,\n description: j.description ?? \"\",\n status: statusColor(j.enabled),\n trigger: j.trigger.event,\n entryLimit: j.entryLimit,\n exitOn: j.exitOn?.map((e) => e.event).join(\", \") ?? \"(none)\",\n },\n \"Journey\",\n );\n\n ctx.out.kv(\n {\n active: j.counts.active,\n waiting: j.counts.waiting,\n completed: j.counts.completed,\n failed: j.counts.failed,\n exited: j.counts.exited,\n },\n \"Counts\",\n );\n\n if (j.recentStates.length === 0) {\n ctx.out.note(\"No recent journey instances.\", \"Recent states\");\n } else {\n ctx.out.table(\n j.recentStates.map((s) => ({\n userId: s.userId,\n email: s.userEmail,\n status: s.status,\n node: s.currentNodeId,\n updatedAt: s.updatedAt,\n })),\n [\"userId\", \"email\", \"status\", \"node\", \"updatedAt\"],\n );\n }\n\n ctx.out.outro(`Journey ${j.id} is ${j.enabled ? \"enabled\" : \"disabled\"}.`);\n}\n\nasync function runToggle(\n ctx: CommandContext,\n id: string | undefined,\n enabled: boolean,\n): Promise<void> {\n const verb = enabled ? \"enable\" : \"disable\";\n if (!id) {\n ctx.out.fail(\n `journeys ${verb} requires a journey id, e.g. hogsend journeys ${verb} activation-welcome`,\n );\n }\n\n if (!ctx.json) ctx.out.intro(badge());\n\n const data = await ctx.out.step(\n `${enabled ? \"Enabling\" : \"Disabling\"} ${id}`,\n () =>\n ctx.http.patch<PatchResponse>(\n `/v1/admin/journeys/${encodeURIComponent(id as string)}`,\n { enabled },\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(data);\n return;\n }\n\n const j = data.journey;\n ctx.out.note(\n [\n `${color.bold(j.name)} (${j.id})`,\n `status: ${statusColor(j.enabled)}`,\n `updated: ${j.updatedAt}`,\n ].join(\"\\n\"),\n `Journey ${enabled ? \"enabled\" : \"disabled\"}`,\n );\n ctx.out.outro(`${j.id} is now ${statusColor(j.enabled)}.`);\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n // argv after the subcommand token — positionals/flags for the subcommand.\n const rest = ctx.argv.slice(1);\n const subCtx: CommandContext = { ...ctx, argv: rest };\n\n try {\n switch (sub) {\n case \"list\":\n await runList(subCtx);\n return;\n case \"get\": {\n const id = rest.find((a) => !a.startsWith(\"-\"));\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runGet(subCtx, id);\n return;\n }\n case \"enable\": {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runToggle(\n subCtx,\n rest.find((a) => !a.startsWith(\"-\")),\n true,\n );\n return;\n }\n case \"disable\": {\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n ctx.out.log(usage);\n return;\n }\n await runToggle(\n subCtx,\n rest.find((a) => !a.startsWith(\"-\")),\n false,\n );\n return;\n }\n case undefined:\n ctx.out.fail(\n `journeys requires a subcommand (list|get|enable|disable). Run: hogsend journeys --help`,\n );\n return;\n default:\n ctx.out.fail(\n `unknown journeys subcommand '${sub}'. Expected list|get|enable|disable.`,\n );\n return;\n }\n } catch (error) {\n if (isHttpError(error)) {\n if (error.status === 404) {\n ctx.out.fail(\"journey not found\");\n }\n ctx.out.fail(error.message);\n }\n throw error;\n }\n}\n\nexport const journeysCommand: Command = {\n name: \"journeys\",\n summary: \"List, inspect, enable, and disable journeys\",\n usage,\n run,\n};\n","import { spawnSync } from \"node:child_process\";\nimport { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend patch <package> [--cwd <dir>]\n\nThin wrapper over pnpm's native patch flow. Runs \\`pnpm patch <package>\\`, which\nextracts the package into a temp dir and prints the path to edit. After editing,\ncommit the patch with the command pnpm prints (\\`pnpm patch-commit <dir>\\`).\n\nThis does NOT replace scripts/patch-check.sh (the patch re-apply contract).\n\nOptions:\n --cwd <dir> Project root to run pnpm in (defaults to current directory).\n -h, --help Show this help.`;\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const pkg = positionals[0];\n if (!pkg) {\n ctx.out.fail(\n \"patch requires a package name, e.g. hogsend patch @hogsend/engine\",\n );\n }\n\n const cwd = values.cwd ?? process.cwd();\n\n // pnpm patch is interactive-ish (prints an editable dir). Stream it through\n // unless --json, where we suppress chrome and report the spawn result only.\n const result = spawnSync(\"pnpm\", [\"patch\", pkg], {\n cwd,\n stdio: ctx.json ? \"ignore\" : \"inherit\",\n });\n\n if (ctx.json) {\n ctx.out.json({\n package: pkg,\n command: `pnpm patch ${pkg}`,\n status: result.status,\n ok: result.status === 0,\n });\n if (result.status !== 0) process.exit(1);\n return;\n }\n\n if (result.status !== 0) {\n ctx.out.fail(`pnpm patch ${pkg} exited with code ${result.status ?? \"?\"}`);\n }\n\n ctx.out.note(\n [\n \"pnpm extracted the package to a temp dir (printed above).\",\n \"Edit the files, then commit the patch:\",\n \"\",\n color.cyan(\"pnpm patch-commit <dir>\"),\n ].join(\"\\n\"),\n \"Next steps\",\n );\n}\n\nexport const patchCommand: Command = {\n name: \"patch\",\n summary: \"Patch a package via pnpm's native patch flow\",\n usage,\n run,\n};\n","import { spawnSync } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { copyFileSync, existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { confirm } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend setup [--cwd <dir>] [--yes] [--json]\n\nInteractive local onboarding for a scaffolded Hogsend app. Mirrors the\ncreate-hogsend \"next steps\":\n\n 1. docker compose up -d # Postgres + Redis + Hatchet-Lite\n 2. cp .env.example .env (if missing)\n 3. generate a BETTER_AUTH_SECRET (if still the placeholder)\n 4. pnpm db:migrate # engine track then client track\n\nOptions:\n --cwd <dir> Project root to run in (defaults to the current directory).\n --yes, -y Skip confirmation prompts (assume yes). Implied by --json.\n --json Run non-interactively and emit a single JSON result document.\n -h, --help Show this help.\n\nRun ${color.cyan(\"hogsend doctor\")} afterwards to verify the instance is healthy.`;\n\n/** Generate a 64-char hex secret (32 bytes) for BETTER_AUTH_SECRET. */\nfunction generateSecret(): string {\n return randomBytes(32).toString(\"hex\");\n}\n\nconst SECRET_KEY = \"BETTER_AUTH_SECRET\";\nconst PLACEHOLDER_PREFIX = \"change-me\";\n\ninterface StepResult {\n step: string;\n status: \"ok\" | \"skipped\" | \"failed\";\n detail: string;\n}\n\n/**\n * Ensure a `.env` exists (copying `.env.example` when absent) and that\n * BETTER_AUTH_SECRET holds a real generated value rather than the placeholder.\n * Pure-ish: only touches the filesystem, returns a structured result.\n */\nfunction ensureEnv(cwd: string): { copied: StepResult; secret: StepResult } {\n const envPath = join(cwd, \".env\");\n const examplePath = join(cwd, \".env.example\");\n\n let copied: StepResult;\n if (existsSync(envPath)) {\n copied = {\n step: \"env\",\n status: \"skipped\",\n detail: \".env already exists\",\n };\n } else if (existsSync(examplePath)) {\n copyFileSync(examplePath, envPath);\n copied = {\n step: \"env\",\n status: \"ok\",\n detail: \"copied .env.example -> .env\",\n };\n } else {\n copied = {\n step: \"env\",\n status: \"failed\",\n detail: \"no .env and no .env.example to copy from\",\n };\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"skipped\",\n detail: \"skipped — no .env\",\n },\n };\n }\n\n // (Re)read the file we just ensured exists and refresh the secret if it is\n // missing or still the scaffold placeholder. Never overwrite a real secret.\n let raw: string;\n try {\n raw = readFileSync(envPath, \"utf8\");\n } catch (err) {\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"failed\",\n detail: `could not read .env: ${err instanceof Error ? err.message : String(err)}`,\n },\n };\n }\n\n const lines = raw.split(/\\r?\\n/);\n const idx = lines.findIndex((l) =>\n l\n .replace(/^export\\s+/, \"\")\n .trimStart()\n .startsWith(`${SECRET_KEY}=`),\n );\n const existingLine = idx === -1 ? undefined : lines[idx];\n const current =\n existingLine === undefined\n ? undefined\n : existingLine.slice(existingLine.indexOf(\"=\") + 1).trim();\n const isPlaceholder =\n current === undefined ||\n current === \"\" ||\n current.startsWith(PLACEHOLDER_PREFIX);\n\n if (!isPlaceholder) {\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"skipped\",\n detail: `${SECRET_KEY} already set`,\n },\n };\n }\n\n const secret = generateSecret();\n const newLine = `${SECRET_KEY}=${secret}`;\n if (idx === -1) {\n if (raw.length > 0 && !raw.endsWith(\"\\n\")) lines.push(\"\");\n lines.push(newLine);\n } else {\n lines[idx] = newLine;\n }\n writeFileSync(envPath, lines.join(\"\\n\"));\n\n return {\n copied,\n secret: {\n step: \"secret\",\n status: \"ok\",\n detail: `generated ${SECRET_KEY} (64-char hex)`,\n },\n };\n}\n\n/** Run a shell command, capturing exit status. */\nfunction runCmd(\n cmd: string,\n args: string[],\n cwd: string,\n json: boolean,\n): { status: number | null; ok: boolean } {\n const result = spawnSync(cmd, args, {\n cwd,\n // In json mode stay silent (we report structured status); otherwise stream\n // so the user sees docker / migration output inline.\n stdio: json ? \"ignore\" : \"inherit\",\n });\n return { status: result.status, ok: result.status === 0 };\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n yes: { type: \"boolean\", short: \"y\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const cwd = values.cwd ?? process.cwd();\n\n if (!existsSync(join(cwd, \"package.json\"))) {\n ctx.out.fail(\n `no package.json in ${cwd} — run setup from a scaffolded Hogsend app (or pass --cwd).`,\n );\n }\n\n const hasCompose =\n existsSync(join(cwd, \"docker-compose.yml\")) ||\n existsSync(join(cwd, \"docker-compose.yaml\")) ||\n existsSync(join(cwd, \"compose.yml\")) ||\n existsSync(join(cwd, \"compose.yaml\"));\n\n // --json implies non-interactive; in TTY human mode we confirm first.\n const skipConfirm = ctx.json || values.yes;\n\n if (!ctx.json) {\n ctx.out.intro(\n `${color.bgMagenta(color.black(\" hogsend \"))} ${color.dim(\"local onboarding\")}`,\n );\n }\n\n if (ctx.out.interactive && !skipConfirm) {\n const proceed = bail(\n await confirm({\n message: `Set up local infra in ${color.cyan(cwd)}? (docker compose up, .env, db:migrate)`,\n }),\n );\n if (!proceed) {\n ctx.out.outro(color.dim(\"Nothing changed.\"));\n return;\n }\n }\n\n const results: StepResult[] = [];\n\n // 1. docker compose up -d\n if (hasCompose) {\n const docker = await ctx.out.step(\n \"Starting infra (docker compose up -d)\",\n async () => runCmd(\"docker\", [\"compose\", \"up\", \"-d\"], cwd, ctx.json),\n );\n results.push({\n step: \"docker\",\n status: docker.ok ? \"ok\" : \"failed\",\n detail: docker.ok\n ? \"Postgres + Redis + Hatchet-Lite up\"\n : `docker compose exited with code ${docker.status ?? \"?\"}`,\n });\n } else {\n results.push({\n step: \"docker\",\n status: \"skipped\",\n detail: \"no docker-compose file found\",\n });\n }\n\n // 2 + 3. .env + secret (synchronous fs work, wrapped in a step for the spinner)\n const env = await ctx.out.step(\"Preparing .env + auth secret\", async () =>\n ensureEnv(cwd),\n );\n results.push(env.copied, env.secret);\n\n // 4. db:migrate (only attempt if docker didn't hard-fail; still try if skipped)\n const dockerFailed = results.some(\n (r) => r.step === \"docker\" && r.status === \"failed\",\n );\n if (dockerFailed) {\n results.push({\n step: \"migrate\",\n status: \"skipped\",\n detail:\n \"skipped — docker compose failed; bring infra up then run pnpm db:migrate\",\n });\n } else {\n const migrate = await ctx.out.step(\n \"Running migrations (pnpm db:migrate)\",\n async () => runCmd(\"pnpm\", [\"db:migrate\"], cwd, ctx.json),\n );\n results.push({\n step: \"migrate\",\n status: migrate.ok ? \"ok\" : \"failed\",\n detail: migrate.ok\n ? \"engine + client migrations applied\"\n : `pnpm db:migrate exited with code ${migrate.status ?? \"?\"}`,\n });\n }\n\n const failed = results.filter((r) => r.status === \"failed\");\n const ok = failed.length === 0;\n\n if (ctx.json) {\n ctx.out.json({\n ok,\n cwd,\n steps: results,\n });\n if (!ok) process.exit(1);\n return;\n }\n\n // Human summary.\n ctx.out.table(\n results.map((r) => ({\n step: r.step,\n status:\n r.status === \"ok\"\n ? color.green(\"ok\")\n : r.status === \"skipped\"\n ? color.dim(\"skipped\")\n : color.red(\"failed\"),\n detail: r.detail,\n })),\n [\"step\", \"status\", \"detail\"],\n );\n\n ctx.out.note(\n [\n `${color.cyan(\"pnpm dev\")} ${color.dim(\"# HTTP API on :3002\")}`,\n `${color.cyan(\"pnpm worker:dev\")} ${color.dim(\"# Hatchet worker, 2nd terminal\")}`,\n \"\",\n `${color.dim(\"Verify with\")} ${color.cyan(\"hogsend doctor\")}${color.dim(\".\")}`,\n `${color.dim(\"Grab HATCHET_CLIENT_TOKEN at\")} ${color.cyan(\"http://localhost:8888\")} ${color.dim(\"and set it in .env.\")}`,\n ].join(\"\\n\"),\n \"Next steps\",\n );\n\n if (!ok) {\n ctx.out.fail(\n `${failed.length} step(s) failed — see the table above. Fix and re-run hogsend setup.`,\n );\n }\n\n ctx.out.outro(\n `${color.green(\"Done.\")} ${color.dim(\"Local infra is up — go write a journey.\")}`,\n );\n}\n\nexport const setupCommand: Command = {\n name: \"setup\",\n summary: \"Local onboarding: docker compose up, gen secret, db:migrate\",\n usage,\n run,\n};\n","import { cancel, isCancel } from \"@clack/prompts\";\n\n/**\n * Guard a clack prompt result. clack returns a cancellation symbol when the\n * user hits Ctrl-C / Esc; this unwraps the value or aborts the whole CLI\n * cleanly (exit 0 — a deliberate cancel, not an error).\n *\n * Re-export clack's `text`/`select`/`confirm`/`multiselect` from\n * `@clack/prompts` directly in command files; wrap each call in `bail()`.\n */\nexport function bail<T>(value: T | symbol): T {\n if (isCancel(value)) {\n cancel(\"Cancelled.\");\n process.exit(0);\n }\n return value as T;\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { multiselect } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport {\n bundledSkillsDir,\n type CopyResult,\n copySkill,\n installDir,\n listBundledSkills,\n writeSkillsStamp,\n} from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend skills <subcommand> [options]\n\nManage the Claude Code skills bundled with @hogsend/cli. Bundled skills teach\nagents how to drive the hogsend CLI; \\`add\\` copies them into your project's\n./.claude/skills/<name>/ so Claude Code can discover them.\n\nSubcommands:\n list List bundled skills + whether each is installed.\n add [name] [--force] Copy a bundled skill into ./.claude/skills/<name>/.\n Omit name for an interactive multiselect (human),\n or copy all bundled skills (--all / --json /\n non-interactive).\n\nOptions:\n --all Install every bundled skill (skips the interactive picker).\n --force Overwrite an already-installed skill. Use after upgrading the\n engine to refresh vendored skills to the latest guidance.\n --json Emit machine-readable JSON only (implies non-interactive).\n -h, --help Show this help.\n\nExamples:\n hogsend skills list\n hogsend skills list --json\n hogsend skills add\n hogsend skills add --all\n hogsend skills add hogsend-cli --force\n hogsend skills add --all --force # refresh everything after an upgrade\n\nTip: \\`hogsend upgrade\\` bumps the engine AND refreshes these skills in one step.`;\n\nfunction runList(ctx: CommandContext): void {\n const skills = listBundledSkills(process.cwd());\n\n if (ctx.json) {\n ctx.out.json({\n bundledSkillsDir: bundledSkillsDir(),\n installDir: installDir(process.cwd()),\n skills,\n });\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} skills`);\n if (skills.length === 0) {\n ctx.out.note(\n \"No bundled skills found in this package build.\",\n \"skills list\",\n );\n ctx.out.outro(\"Nothing to install.\");\n return;\n }\n ctx.out.table(\n skills.map((s) => ({\n name: s.name,\n installed: s.installed ? color.green(\"yes\") : color.dim(\"no\"),\n description:\n s.description.length > 60\n ? `${s.description.slice(0, 57)}...`\n : s.description,\n })),\n [\"name\", \"installed\", \"description\"],\n );\n ctx.out.outro(\n `Install with ${color.cyan(\"hogsend skills add <name>\")} (or ${color.cyan(\"hogsend skills add --all\")}). ` +\n `Refresh after an engine upgrade with ${color.cyan(\"--force\")}.`,\n );\n}\n\nasync function runAdd(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n all: { type: \"boolean\", default: false },\n force: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const cwd = process.cwd();\n const bundled = listBundledSkills(cwd);\n if (bundled.length === 0) {\n ctx.out.fail(\"no bundled skills found in this package build\");\n }\n\n const requested = positionals[0];\n const force = Boolean(values.force);\n\n // Resolve which skills to install.\n let names: string[];\n if (requested) {\n const match = bundled.find((s) => s.name === requested);\n if (!match) {\n ctx.out.fail(\n `unknown skill \"${requested}\". Available: ${bundled.map((s) => s.name).join(\", \")}`,\n );\n }\n names = [requested];\n } else if (values.all) {\n // Explicit install-all — skip the picker even in a TTY.\n names = bundled.map((s) => s.name);\n } else if (ctx.out.interactive) {\n const picked = bail(\n await multiselect({\n message: \"Which skills do you want to install?\",\n options: bundled.map((s) => ({\n value: s.name,\n label: s.name,\n hint: s.installed ? \"installed\" : undefined,\n })),\n required: true,\n }),\n ) as string[];\n names = picked;\n } else {\n // Non-interactive (json or non-TTY) with no name => install all.\n names = bundled.map((s) => s.name);\n }\n\n const results: CopyResult[] = names.map((name) =>\n copySkill(name, cwd, force),\n );\n\n // Stamp the now-installed set with this CLI's version, so `hogsend doctor`\n // can later tell whether the vendored skills have fallen behind the engine.\n if (results.some((r) => r.installed)) {\n const installedNames = listBundledSkills(cwd)\n .filter((s) => existsSync(join(installDir(cwd), s.name)))\n .map((s) => s.name);\n writeSkillsStamp(cwd, installedNames);\n }\n\n if (ctx.json) {\n ctx.out.json({\n installDir: installDir(cwd),\n force,\n results,\n });\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} skills add`);\n for (const r of results) {\n if (r.skipped) {\n ctx.out.log(\n `${color.yellow(\"skip\")} ${r.name} ${color.dim(\"(already installed; use --force to overwrite)\")}`,\n );\n } else {\n ctx.out.log(`${color.green(\"✓\")} ${r.name} ${color.dim(`-> ${r.path}`)}`);\n }\n }\n const installedCount = results.filter((r) => r.installed).length;\n const skippedCount = results.filter((r) => r.skipped).length;\n ctx.out.outro(\n `Installed ${installedCount} skill${installedCount === 1 ? \"\" : \"s\"}` +\n (skippedCount > 0 ? `, skipped ${skippedCount}.` : \".\"),\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n runList(ctx);\n return;\n case \"add\":\n await runAdd(ctx, ctx.argv.slice(1));\n return;\n case undefined:\n case \"-h\":\n case \"--help\":\n ctx.out.log(usage);\n return;\n default:\n ctx.out.fail(\n `unknown skills subcommand \"${sub}\". Use: list | add. See hogsend skills --help.`,\n );\n }\n}\n\nexport const skillsCommand: Command = {\n name: \"skills\",\n summary: \"List + install bundled Claude Code skills into .claude/skills\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend stats [--json]\n\nShow system-wide overview metrics from a running Hogsend instance.\nWraps GET /v1/admin/metrics/overview.\n\nFields:\n totalContacts Live (non-deleted) contacts.\n activeJourneys Journey states currently active or waiting.\n emailsSent24h Emails sent in the last 24 hours.\n emailsSent7d Emails sent in the last 7 days.\n emailsSent30d Emails sent in the last 30 days.\n bounceRate30d Bounced / sent over the last 30 days (0..1).\n unsubscribeRate Unsubscribed / total preferences (0..1).\n\nOptions:\n --url <baseUrl> API base URL (default HOGSEND_API_URL or http://localhost:3002).\n --admin-key <key> Admin bearer key (default HOGSEND_ADMIN_KEY / ADMIN_API_KEY).\n --json Emit machine-readable JSON only.\n -h, --help Show this help.`;\n\n/** Shape returned by GET /v1/admin/metrics/overview. */\ninterface OverviewMetrics {\n totalContacts: number;\n activeJourneys: number;\n emailsSent24h: number;\n emailsSent7d: number;\n emailsSent30d: number;\n bounceRate30d: number;\n unsubscribeRate: number;\n}\n\n/** Render a 0..1 rate as a percentage with two decimals, e.g. 0.0123 -> \"1.23%\". */\nfunction pct(rate: number): string {\n return `${(rate * 100).toFixed(2)}%`;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const metrics = await ctx.out.step(\"Fetching overview metrics\", () =>\n ctx.http.get<OverviewMetrics>(\"/v1/admin/metrics/overview\"),\n );\n\n if (ctx.json) {\n ctx.out.json(metrics);\n return;\n }\n\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} stats`);\n\n ctx.out.kv(\n {\n \"Total contacts\": metrics.totalContacts,\n \"Active journeys\": metrics.activeJourneys,\n \"Emails sent (24h)\": metrics.emailsSent24h,\n \"Emails sent (7d)\": metrics.emailsSent7d,\n \"Emails sent (30d)\": metrics.emailsSent30d,\n \"Bounce rate (30d)\": pct(metrics.bounceRate30d),\n \"Unsubscribe rate\": pct(metrics.unsubscribeRate),\n },\n \"Overview\",\n );\n\n ctx.out.outro(color.dim(ctx.http.cfg.baseUrl));\n}\n\nexport const statsCommand: Command = {\n name: \"stats\",\n summary: \"Show system-wide overview metrics\",\n usage,\n run,\n};\n","import { spawn } from \"node:child_process\";\nimport { createReadStream, existsSync, readFileSync, statSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { extname, join, normalize, resolve, sep } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { parseArgs } from \"node:util\";\nimport { color } from \"../lib/output.js\";\nimport { runStudioAdmin } from \"./studio-admin.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend studio [options]\n\nSubcommands:\n admin create | reset | list Shell-gated Studio admin recovery (DB + secret).\n Run \\`hogsend studio admin --help\\` for details.\n\nServe the bundled Hogsend Studio (the admin SPA) locally and open it in a\nbrowser. The Studio is a static single-page app; this command starts a tiny\nlocal web server for it on a port of your choosing.\n\nBy default the Studio talks to the API at the same origin it is served from,\nwhich won't be a running API here — so point it at your instance with\n--base-url (the SPA uses cookie auth, so the instance must allow CORS from the\nStudio origin, or you can simply open the Studio that the engine mounts at\n\\`<instance>/studio\\` instead).\n\nOptions:\n --port <n> Local port to serve on (default 3333).\n --base-url <url> API instance the Studio should call (injected at runtime).\n Omit to use same-origin (the local server, for static\n preview only).\n --open Open the Studio in your default browser after starting.\n --dist <path> Override the Studio dist directory (advanced).\n -h, --help Show this help.\n\nExamples:\n hogsend studio --open\n hogsend studio --base-url https://api.example.com --open\n hogsend studio --port 4000`;\n\n/**\n * Resolve the built Studio `dist/` directory.\n *\n * Resolution order:\n * 1. Explicit --dist override (positional path; absolute or cwd-relative).\n * 2. The dist bundled inside this CLI package (shipped via package.json files[];\n * at runtime bin.js is <pkg>/dist/bin.js, so the bundled studio is one level\n * up at <pkg>/studio).\n * 3. Monorepo source layout: packages/studio/dist relative to this file.\n * 4. cwd-relative packages/studio/dist (running from repo root).\n */\nfunction resolveStudioDist(distFlag: string | undefined): string | null {\n const candidates: string[] = [];\n\n if (distFlag && distFlag.length > 0) {\n candidates.push(resolve(process.cwd(), distFlag));\n }\n\n // Bundled in the published CLI tarball at <pkg>/studio.\n candidates.push(fileURLToPath(new URL(\"../studio\", import.meta.url)));\n\n // Monorepo: this file is packages/cli/src/commands/studio.ts (or built into\n // dist/), so the studio dist sits at ../../studio/dist relative to dist/.\n candidates.push(\n fileURLToPath(new URL(\"../../studio/dist\", import.meta.url)),\n fileURLToPath(new URL(\"../../../studio/dist\", import.meta.url)),\n );\n\n candidates.push(resolve(process.cwd(), \"packages/studio/dist\"));\n\n for (const dir of candidates) {\n if (existsSync(join(dir, \"index.html\"))) {\n return dir;\n }\n }\n return null;\n}\n\nconst MIME: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".mjs\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json; charset=utf-8\",\n};\n\nfunction mimeFor(path: string): string {\n return MIME[extname(path).toLowerCase()] ?? \"application/octet-stream\";\n}\n\n/**\n * Read index.html and, when a base URL is provided, inject a runtime global the\n * Studio reads (`window.__HOGSEND_STUDIO__ = { baseUrl }`) so the static bundle\n * can be pointed at a remote instance without a rebuild.\n */\nfunction indexHtml(distPath: string, baseUrl: string | undefined): string {\n const raw = readFileSync(join(distPath, \"index.html\"), \"utf8\");\n if (!baseUrl) return raw;\n const inject = `<script>window.__HOGSEND_STUDIO__=${JSON.stringify({\n baseUrl,\n })};</script>`;\n if (raw.includes(\"</head>\")) {\n return raw.replace(\"</head>\", `${inject}</head>`);\n }\n return `${inject}${raw}`;\n}\n\n/** Open a URL in the OS default browser (best-effort, never throws). */\nfunction openBrowser(url: string): void {\n const platform = process.platform;\n const cmd =\n platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const child = spawn(cmd, args, { stdio: \"ignore\", detached: true });\n child.on(\"error\", () => {});\n child.unref();\n } catch {\n // best-effort\n }\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n // Subcommand dispatch: `hogsend studio admin <create|reset|list> ...`.\n // Route before the static-server flag parsing so the admin flags are owned\n // by the admin handler, not the server.\n if (ctx.argv[0] === \"admin\") {\n await runStudioAdmin(ctx, ctx.argv.slice(1));\n return;\n }\n\n const { values, positionals } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n strict: false,\n options: {\n port: { type: \"string\" },\n \"base-url\": { type: \"string\" },\n open: { type: \"boolean\", default: false },\n dist: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const port = Number(values.port ?? \"3333\");\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n ctx.out.fail(`invalid --port \"${values.port}\" (expected 1-65535)`);\n }\n\n // --base-url flag, else the resolved CLI config base URL (so it \"just works\"\n // against the same instance the other commands target), unless that's the\n // local default placeholder. Keep undefined for pure static preview.\n const baseUrl =\n typeof values[\"base-url\"] === \"string\" ? values[\"base-url\"] : undefined;\n\n const distPath = resolveStudioDist(\n typeof values.dist === \"string\" ? values.dist : positionals[0],\n );\n\n if (!distPath) {\n ctx.out.fail(\n \"could not find a built Studio (dist/). Build it with \" +\n \"`pnpm --filter @hogsend/studio build`, or pass --dist <path>.\",\n );\n }\n\n const cleanBase = baseUrl ? baseUrl.replace(/\\/+$/, \"\") : undefined;\n const index = indexHtml(distPath, cleanBase);\n\n const server = createServer((req, res) => {\n const urlPath = decodeURIComponent((req.url ?? \"/\").split(\"?\")[0] ?? \"/\");\n\n // The Studio bundle is built under base \"/studio/\", so all asset URLs are\n // prefixed with /studio. Strip that prefix to map onto the dist root.\n const rel = urlPath.replace(/^\\/studio/, \"\");\n if (rel === \"\" || rel === \"/\") {\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(index);\n return;\n }\n\n // Resolve safely inside distPath (defend against path traversal).\n const target = normalize(join(distPath, rel));\n if (target !== distPath && !target.startsWith(distPath + sep)) {\n res.writeHead(403);\n res.end(\"Forbidden\");\n return;\n }\n\n if (existsSync(target) && statSync(target).isFile()) {\n res.writeHead(200, { \"content-type\": mimeFor(target) });\n createReadStream(target).pipe(res);\n return;\n }\n\n // SPA fallback: unknown paths serve index.html so client-side routes work.\n res.writeHead(200, { \"content-type\": \"text/html; charset=utf-8\" });\n res.end(index);\n });\n\n await new Promise<void>((resolveListen, reject) => {\n server.once(\"error\", reject);\n server.listen(port, () => resolveListen());\n }).catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.out.fail(`could not start server on port ${port}: ${msg}`);\n });\n\n const localUrl = `http://localhost:${port}/studio/`;\n\n if (ctx.json) {\n ctx.out.json({\n url: localUrl,\n port,\n baseUrl: cleanBase ?? null,\n dist: distPath,\n });\n // In json mode we still keep the server running (foreground). Agents that\n // don't want a long-running process should not pass --json to `studio`.\n } else {\n ctx.out.intro(`${color.bgMagenta(color.black(\" hogsend \"))} studio`);\n ctx.out.note(\n [\n `${color.green(\"●\")} Studio serving at ${color.cyan(localUrl)}`,\n cleanBase\n ? color.dim(`API instance: ${cleanBase}`)\n : color.dim(\n \"No --base-url set (same-origin / static preview). The API \" +\n \"calls will hit this local server and fail — pass --base-url \" +\n \"<instance>, or open <instance>/studio directly.\",\n ),\n \"\",\n color.dim(\n \"No admin yet? First load shows a read-only info screen pointing to \" +\n \"'hogsend studio admin create' — there is no web sign-up.\",\n ),\n color.dim(\"Press Ctrl+C to stop.\"),\n ].join(\"\\n\"),\n \"Studio\",\n );\n }\n\n if (values.open) {\n openBrowser(localUrl);\n }\n\n // Keep the process alive until interrupted.\n await new Promise<void>((resolveForever) => {\n const stop = () => {\n server.close(() => resolveForever());\n };\n process.on(\"SIGINT\", stop);\n process.on(\"SIGTERM\", stop);\n });\n}\n\nexport const studioCommand: Command = {\n name: \"studio\",\n summary: \"Serve the bundled Hogsend Studio admin SPA locally\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { password as passwordPrompt, text } from \"@clack/prompts\";\nimport {\n type AdminRecovery,\n AdminRecoveryConfigError,\n type AdminSummary,\n createAdminRecovery,\n} from \"../lib/admin-recovery.js\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport type { CommandContext } from \"./types.js\";\n\n/**\n * `hogsend studio admin <create|reset|list>` — the shell-gated Studio admin\n * recovery primitive. Routed here from the `studio` command's subcommand\n * dispatch.\n *\n * Security posture (see lib/admin-recovery.ts for the invariants):\n * - Gated by holding both DATABASE_URL and BETTER_AUTH_SECRET. No HTTP.\n * - Passwords go ONLY through better-auth's server API (scrypt). No raw SQL.\n * - The password is NEVER echoed (masked prompt) and NEVER logged. When the\n * `--password` flag is used we warn (interactively) about shell history.\n */\n\nexport const adminUsage = `hogsend studio admin <command> [options]\n\nShell-gated Studio admin recovery (PostHog/GitLab/Rails-style). Constructs a\nbetter-auth instance directly against your database and uses better-auth's\nserver API so password hashing is identical to the running app. NO HTTP and no\nrunning API are required — this is gated by holding the DB URL and app secret.\n\nDATABASE_URL and BETTER_AUTH_SECRET are read from the ENVIRONMENT only (not from\na .env file). Run with your app env loaded, e.g.\n dotenvx run -- hogsend studio admin create\n railway run hogsend studio admin create\n pnpm studio:admin # the scaffold's env-loaded wrapper\n\nCommands:\n ${color.cyan(\"create\")} Create a Studio admin user (the first admin, or another).\n ${color.cyan(\"reset\")} Set a new password for an existing admin (by email).\n ${color.cyan(\"list\")} List existing admins (id, email, name, createdAt). No secrets.\n\nOptions:\n --email <e> Admin email (required; prompted in a TTY if omitted).\n --name <n> Display name for create (defaults to the email local-part).\n --password <p> Password for create/reset. PREFER the masked prompt — a\n value passed here can leak into your shell history.\n --no-revoke (reset) Keep existing sessions instead of revoking them.\n --database-url <u> Override DATABASE_URL (else read from the environment).\n --json Emit a single JSON result document (non-interactive).\n -h, --help Show this help.\n\nExamples:\n hogsend studio admin create --email admin@example.com\n hogsend studio admin reset --email admin@example.com\n hogsend studio admin list --json\n\nSecurity: passwords are written ONLY via better-auth (scrypt) — never raw SQL,\nnever plaintext at rest, never logged. Prefer the masked prompt over --password.`;\n\ninterface AdminFlags {\n email?: string;\n name?: string;\n password?: string;\n revoke: boolean;\n databaseUrl?: string;\n}\n\n/** Parse the admin subcommand argv (after the `admin <sub>` tokens). */\nfunction parseAdminFlags(argv: string[]): AdminFlags {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n strict: false,\n options: {\n email: { type: \"string\" },\n name: { type: \"string\" },\n password: { type: \"string\" },\n revoke: { type: \"boolean\", default: true },\n \"database-url\": { type: \"string\" },\n },\n });\n return {\n email: typeof values.email === \"string\" ? values.email : undefined,\n name: typeof values.name === \"string\" ? values.name : undefined,\n password: typeof values.password === \"string\" ? values.password : undefined,\n revoke: values.revoke !== false,\n databaseUrl:\n typeof values[\"database-url\"] === \"string\"\n ? values[\"database-url\"]\n : undefined,\n };\n}\n\n/**\n * Resolve the gating env (DATABASE_URL + BETTER_AUTH_SECRET) from flags then\n * `process.env` ONLY — there is no cwd `.env` read here (consistent with\n * `db:migrate`, which also reads the environment directly). Holding both IS the\n * gate; there is no HTTP fallback. Fails fast and clearly if either is missing,\n * telling the operator how to run the command with its env loaded.\n */\nfunction resolveGatingEnv(\n ctx: CommandContext,\n flags: AdminFlags,\n): { databaseUrl: string; secret: string; baseURL: string | undefined } {\n const databaseUrl = flags.databaseUrl ?? process.env.DATABASE_URL;\n const secret = process.env.BETTER_AUTH_SECRET;\n const baseURL = process.env.BETTER_AUTH_URL ?? process.env.API_PUBLIC_URL;\n\n const missing: string[] = [];\n if (!databaseUrl) missing.push(\"DATABASE_URL\");\n if (!secret) missing.push(\"BETTER_AUTH_SECRET\");\n if (missing.length > 0) {\n ctx.out.fail(\n `${missing.join(\" and \")} ${missing.length > 1 ? \"are\" : \"is\"} ` +\n \"required, and are read from the environment only (not a .env file). \" +\n \"Run this command with your app env loaded, e.g.\\n\" +\n \" export DATABASE_URL=… BETTER_AUTH_SECRET=…\\n\" +\n \" dotenvx run -- hogsend studio admin create\\n\" +\n \" railway run hogsend studio admin create\\n\" +\n \" pnpm studio:admin # the scaffold's env-loaded wrapper\\n\" +\n \"This command is gated by DB + secret access (no HTTP fallback).\",\n );\n }\n\n // Non-null assertions are safe: ctx.out.fail above exits the process.\n return {\n databaseUrl: databaseUrl as string,\n secret: secret as string,\n baseURL,\n };\n}\n\n/** Prompt for an email in a TTY, or fail with guidance otherwise. */\nasync function resolveEmail(\n ctx: CommandContext,\n flags: AdminFlags,\n defaultEmail?: string,\n): Promise<string> {\n if (flags.email && flags.email.length > 0) return flags.email;\n if (!ctx.out.interactive) {\n ctx.out.fail(\"--email is required (no TTY to prompt).\");\n }\n const value = bail(\n await text({\n message: \"Admin email\",\n placeholder: defaultEmail ?? \"admin@example.com\",\n initialValue: defaultEmail,\n validate: (v) =>\n v?.includes(\"@\") ? undefined : \"Enter a valid email address.\",\n }),\n );\n return value.trim();\n}\n\n/**\n * Resolve a password: from the flag if provided (with an interactive shell-\n * history warning), otherwise via a masked prompt typed twice (confirm).\n * NEVER echoed, NEVER logged.\n */\nasync function resolvePassword(\n ctx: CommandContext,\n flags: AdminFlags,\n): Promise<string> {\n if (flags.password && flags.password.length > 0) {\n if (ctx.out.interactive) {\n ctx.out.log(\n color.yellow(\n \"warning: --password can leak into your shell history; \" +\n \"prefer the masked prompt next time.\",\n ),\n );\n }\n return flags.password;\n }\n if (!ctx.out.interactive) {\n ctx.out.fail(\n \"--password is required (no TTY for the masked prompt). \" +\n \"Note: a value passed via --password may leak into shell history.\",\n );\n }\n const first = bail(\n await passwordPrompt({\n message: \"New password (min 8 chars)\",\n validate: (v) =>\n v && v.length >= 8 ? undefined : \"Password must be at least 8 chars.\",\n }),\n );\n const second = bail(\n await passwordPrompt({\n message: \"Confirm password\",\n validate: (v) => (v === first ? undefined : \"Passwords do not match.\"),\n }),\n );\n if (first !== second) {\n ctx.out.fail(\"Passwords do not match.\");\n }\n return first;\n}\n\n/** Render an admin summary for human output (no secrets present in the type). */\nfunction printAdmin(ctx: CommandContext, action: string, admin: AdminSummary) {\n ctx.out.kv(\n {\n id: admin.id,\n email: admin.email,\n name: admin.name,\n createdAt: admin.createdAt,\n },\n `${action} admin`,\n );\n}\n\nasync function runCreate(\n ctx: CommandContext,\n flags: AdminFlags,\n recovery: AdminRecovery,\n): Promise<void> {\n const email = await resolveEmail(ctx, flags);\n const passwordValue = await resolvePassword(ctx, flags);\n const admin = await recovery.create({\n email,\n password: passwordValue,\n name: flags.name,\n });\n if (ctx.json) {\n ctx.out.json({ action: \"create\", admin });\n return;\n }\n printAdmin(ctx, \"Created\", admin);\n ctx.out.outro(`${color.green(\"✓\")} Admin created. You can now sign in.`);\n}\n\nasync function runReset(\n ctx: CommandContext,\n flags: AdminFlags,\n recovery: AdminRecovery,\n): Promise<void> {\n // If exactly one admin exists and --email is omitted in a TTY, offer it.\n let defaultEmail: string | undefined;\n if (!flags.email && ctx.out.interactive) {\n const admins = await recovery.list();\n if (admins.length === 1) defaultEmail = admins[0]?.email;\n }\n const email = await resolveEmail(ctx, flags, defaultEmail);\n const passwordValue = await resolvePassword(ctx, flags);\n const admin = await recovery.reset({\n email,\n password: passwordValue,\n revokeSessions: flags.revoke,\n });\n if (ctx.json) {\n ctx.out.json({ action: \"reset\", admin, revokedSessions: flags.revoke });\n return;\n }\n printAdmin(ctx, \"Reset password for\", admin);\n ctx.out.outro(\n `${color.green(\"✓\")} Password reset.` +\n (flags.revoke ? \" Existing sessions were revoked.\" : \"\"),\n );\n}\n\nasync function runList(\n ctx: CommandContext,\n recovery: AdminRecovery,\n): Promise<void> {\n const admins = await recovery.list();\n if (ctx.json) {\n ctx.out.json(admins);\n return;\n }\n if (admins.length === 0) {\n ctx.out.note(\n \"No admins exist yet. Create one with `hogsend studio admin create`.\",\n \"Admins\",\n );\n return;\n }\n ctx.out.table(\n admins.map((a) => ({ ...a })),\n [\"id\", \"email\", \"name\", \"createdAt\"],\n );\n}\n\n/**\n * Entry point for `hogsend studio admin ...`. `argv` is everything AFTER the\n * `admin` token (i.e. the subcommand + its flags). Routed from `studio.ts`.\n */\nexport async function runStudioAdmin(\n ctx: CommandContext,\n argv: string[],\n): Promise<void> {\n const [sub, ...rest] = argv;\n\n if (!sub || sub === \"-h\" || sub === \"--help\") {\n ctx.out.log(adminUsage);\n if (!sub) return;\n return;\n }\n\n if (![\"create\", \"reset\", \"list\"].includes(sub)) {\n ctx.out.log(adminUsage);\n ctx.out.fail(`unknown subcommand \"${sub}\"`);\n }\n\n // Per-subcommand --help.\n if (rest.includes(\"-h\") || rest.includes(\"--help\")) {\n ctx.out.log(adminUsage);\n return;\n }\n\n const flags = parseAdminFlags(rest);\n const env = resolveGatingEnv(ctx, flags);\n\n let recovery: AdminRecovery;\n try {\n recovery = createAdminRecovery({\n databaseUrl: env.databaseUrl,\n secret: env.secret,\n baseURL: env.baseURL,\n });\n } catch (err) {\n if (err instanceof AdminRecoveryConfigError) {\n ctx.out.fail(err.message);\n }\n throw err;\n }\n\n try {\n if (sub === \"create\") {\n await runCreate(ctx, flags, recovery);\n } else if (sub === \"reset\") {\n await runReset(ctx, flags, recovery);\n } else {\n await runList(ctx, recovery);\n }\n } finally {\n await recovery.close();\n }\n}\n","import os from 'os'\nimport fs from 'fs'\n\nimport {\n mergeUserTypes,\n inferType,\n Parameter,\n Identifier,\n Builder,\n toPascal,\n pascal,\n toCamel,\n camel,\n toKebab,\n kebab,\n fromPascal,\n fromCamel,\n fromKebab\n} from './types.js'\n\nimport Connection from './connection.js'\nimport { Query, CLOSE } from './query.js'\nimport Queue from './queue.js'\nimport { Errors, PostgresError } from './errors.js'\nimport Subscribe from './subscribe.js'\nimport largeObject from './large.js'\n\nObject.assign(Postgres, {\n PostgresError,\n toPascal,\n pascal,\n toCamel,\n camel,\n toKebab,\n kebab,\n fromPascal,\n fromCamel,\n fromKebab,\n BigInt: {\n to: 20,\n from: [20],\n parse: x => BigInt(x), // eslint-disable-line\n serialize: x => x.toString()\n }\n})\n\nexport default Postgres\n\nfunction Postgres(a, b) {\n const options = parseOptions(a, b)\n , subscribe = options.no_subscribe || Subscribe(Postgres, { ...options })\n\n let ending = false\n\n const queries = Queue()\n , connecting = Queue()\n , reserved = Queue()\n , closed = Queue()\n , ended = Queue()\n , open = Queue()\n , busy = Queue()\n , full = Queue()\n , queues = { connecting, reserved, closed, ended, open, busy, full }\n\n const connections = [...Array(options.max)].map(() => Connection(options, queues, { onopen, onend, onclose }))\n\n const sql = Sql(handler)\n\n Object.assign(sql, {\n get parameters() { return options.parameters },\n largeObject: largeObject.bind(null, sql),\n subscribe,\n CLOSE,\n END: CLOSE,\n PostgresError,\n options,\n reserve,\n listen,\n begin,\n close,\n end\n })\n\n return sql\n\n function Sql(handler) {\n handler.debug = options.debug\n\n Object.entries(options.types).reduce((acc, [name, type]) => {\n acc[name] = (x) => new Parameter(x, type.to)\n return acc\n }, typed)\n\n Object.assign(sql, {\n types: typed,\n typed,\n unsafe,\n notify,\n array,\n json,\n file\n })\n\n return sql\n\n function typed(value, type) {\n return new Parameter(value, type)\n }\n\n function sql(strings, ...args) {\n const query = strings && Array.isArray(strings.raw)\n ? new Query(strings, args, handler, cancel)\n : typeof strings === 'string' && !args.length\n ? new Identifier(options.transform.column.to ? options.transform.column.to(strings) : strings)\n : new Builder(strings, args)\n return query\n }\n\n function unsafe(string, args = [], options = {}) {\n arguments.length === 2 && !Array.isArray(args) && (options = args, args = [])\n const query = new Query([string], args, handler, cancel, {\n prepare: false,\n ...options,\n simple: 'simple' in options ? options.simple : args.length === 0\n })\n return query\n }\n\n function file(path, args = [], options = {}) {\n arguments.length === 2 && !Array.isArray(args) && (options = args, args = [])\n const query = new Query([], args, (query) => {\n fs.readFile(path, 'utf8', (err, string) => {\n if (err)\n return query.reject(err)\n\n query.strings = [string]\n handler(query)\n })\n }, cancel, {\n ...options,\n simple: 'simple' in options ? options.simple : args.length === 0\n })\n return query\n }\n }\n\n async function listen(name, fn, onlisten) {\n const listener = { fn, onlisten }\n\n const sql = listen.sql || (listen.sql = Postgres({\n ...options,\n max: 1,\n idle_timeout: null,\n max_lifetime: null,\n fetch_types: false,\n onclose() {\n Object.entries(listen.channels).forEach(([name, { listeners }]) => {\n delete listen.channels[name]\n Promise.all(listeners.map(l => listen(name, l.fn, l.onlisten).catch(() => { /* noop */ })))\n })\n },\n onnotify(c, x) {\n c in listen.channels && listen.channels[c].listeners.forEach(l => l.fn(x))\n }\n }))\n\n const channels = listen.channels || (listen.channels = {})\n , exists = name in channels\n\n if (exists) {\n channels[name].listeners.push(listener)\n const result = await channels[name].result\n listener.onlisten && listener.onlisten()\n return { state: result.state, unlisten }\n }\n\n channels[name] = { result: sql`listen ${\n sql.unsafe('\"' + name.replace(/\"/g, '\"\"') + '\"')\n }`, listeners: [listener] }\n const result = await channels[name].result\n listener.onlisten && listener.onlisten()\n return { state: result.state, unlisten }\n\n async function unlisten() {\n if (name in channels === false)\n return\n\n channels[name].listeners = channels[name].listeners.filter(x => x !== listener)\n if (channels[name].listeners.length)\n return\n\n delete channels[name]\n return sql`unlisten ${\n sql.unsafe('\"' + name.replace(/\"/g, '\"\"') + '\"')\n }`\n }\n }\n\n async function notify(channel, payload) {\n return await sql`select pg_notify(${ channel }, ${ '' + payload })`\n }\n\n async function reserve() {\n const queue = Queue()\n const c = open.length\n ? open.shift()\n : await new Promise((resolve, reject) => {\n const query = { reserve: resolve, reject }\n queries.push(query)\n closed.length && connect(closed.shift(), query)\n })\n\n move(c, reserved)\n c.reserved = () => queue.length\n ? c.execute(queue.shift())\n : move(c, reserved)\n c.reserved.release = true\n\n const sql = Sql(handler)\n sql.release = () => {\n c.reserved = null\n onopen(c)\n }\n\n return sql\n\n function handler(q) {\n c.queue === full\n ? queue.push(q)\n : c.execute(q) || move(c, full)\n }\n }\n\n async function begin(options, fn) {\n !fn && (fn = options, options = '')\n const queries = Queue()\n let savepoints = 0\n , connection\n , prepare = null\n\n try {\n await sql.unsafe('begin ' + options.replace(/[^a-z ]/ig, ''), [], { onexecute }).execute()\n return await Promise.race([\n scope(connection, fn),\n new Promise((_, reject) => connection.onclose = reject)\n ])\n } catch (error) {\n throw error\n }\n\n async function scope(c, fn, name) {\n const sql = Sql(handler)\n sql.savepoint = savepoint\n sql.prepare = x => prepare = x.replace(/[^a-z0-9$-_. ]/gi)\n let uncaughtError\n , result\n\n name && await sql`savepoint ${ sql(name) }`\n try {\n result = await new Promise((resolve, reject) => {\n const x = fn(sql)\n Promise.resolve(Array.isArray(x) ? Promise.all(x) : x).then(resolve, reject)\n })\n\n if (uncaughtError)\n throw uncaughtError\n } catch (e) {\n await (name\n ? sql`rollback to ${ sql(name) }`\n : sql`rollback`\n )\n throw e instanceof PostgresError && e.code === '25P02' && uncaughtError || e\n }\n\n if (!name) {\n prepare\n ? await sql`prepare transaction '${ sql.unsafe(prepare) }'`\n : await sql`commit`\n }\n\n return result\n\n function savepoint(name, fn) {\n if (name && Array.isArray(name.raw))\n return savepoint(sql => sql.apply(sql, arguments))\n\n arguments.length === 1 && (fn = name, name = null)\n return scope(c, fn, 's' + savepoints++ + (name ? '_' + name : ''))\n }\n\n function handler(q) {\n q.catch(e => uncaughtError || (uncaughtError = e))\n c.queue === full\n ? queries.push(q)\n : c.execute(q) || move(c, full)\n }\n }\n\n function onexecute(c) {\n connection = c\n move(c, reserved)\n c.reserved = () => queries.length\n ? c.execute(queries.shift())\n : move(c, reserved)\n }\n }\n\n function move(c, queue) {\n c.queue.remove(c)\n queue.push(c)\n c.queue = queue\n queue === open\n ? c.idleTimer.start()\n : c.idleTimer.cancel()\n return c\n }\n\n function json(x) {\n return new Parameter(x, 3802)\n }\n\n function array(x, type) {\n if (!Array.isArray(x))\n return array(Array.from(arguments))\n\n return new Parameter(x, type || (x.length ? inferType(x) || 25 : 0), options.shared.typeArrayMap)\n }\n\n function handler(query) {\n if (ending)\n return query.reject(Errors.connection('CONNECTION_ENDED', options, options))\n\n if (open.length)\n return go(open.shift(), query)\n\n if (closed.length)\n return connect(closed.shift(), query)\n\n busy.length\n ? go(busy.shift(), query)\n : queries.push(query)\n }\n\n function go(c, query) {\n return c.execute(query)\n ? move(c, busy)\n : move(c, full)\n }\n\n function cancel(query) {\n return new Promise((resolve, reject) => {\n query.state\n ? query.active\n ? Connection(options).cancel(query.state, resolve, reject)\n : query.cancelled = { resolve, reject }\n : (\n queries.remove(query),\n query.cancelled = true,\n query.reject(Errors.generic('57014', 'canceling statement due to user request')),\n resolve()\n )\n })\n }\n\n async function end({ timeout = null } = {}) {\n if (ending)\n return ending\n\n await 1\n let timer\n return ending = Promise.race([\n new Promise(r => timeout !== null && (timer = setTimeout(destroy, timeout * 1000, r))),\n Promise.all(connections.map(c => c.end()).concat(\n listen.sql ? listen.sql.end({ timeout: 0 }) : [],\n subscribe.sql ? subscribe.sql.end({ timeout: 0 }) : []\n ))\n ]).then(() => clearTimeout(timer))\n }\n\n async function close() {\n await Promise.all(connections.map(c => c.end()))\n }\n\n async function destroy(resolve) {\n await Promise.all(connections.map(c => c.terminate()))\n while (queries.length)\n queries.shift().reject(Errors.connection('CONNECTION_DESTROYED', options))\n resolve()\n }\n\n function connect(c, query) {\n move(c, connecting)\n c.connect(query)\n return c\n }\n\n function onend(c) {\n move(c, ended)\n }\n\n function onopen(c) {\n if (queries.length === 0)\n return move(c, open)\n\n let max = Math.ceil(queries.length / (connecting.length + 1))\n , ready = true\n\n while (ready && queries.length && max-- > 0) {\n const query = queries.shift()\n if (query.reserve)\n return query.reserve(c)\n\n ready = c.execute(query)\n }\n\n ready\n ? move(c, busy)\n : move(c, full)\n }\n\n function onclose(c, e) {\n move(c, closed)\n c.reserved = null\n c.onclose && (c.onclose(e), c.onclose = null)\n options.onclose && options.onclose(c.id)\n queries.length && connect(c, queries.shift())\n }\n}\n\nfunction parseOptions(a, b) {\n if (a && a.shared)\n return a\n\n const env = process.env // eslint-disable-line\n , o = (!a || typeof a === 'string' ? b : a) || {}\n , { url, multihost } = parseUrl(a)\n , query = [...url.searchParams].reduce((a, [b, c]) => (a[b] = c, a), {})\n , host = o.hostname || o.host || multihost || url.hostname || env.PGHOST || 'localhost'\n , port = o.port || url.port || env.PGPORT || 5432\n , user = o.user || o.username || url.username || env.PGUSERNAME || env.PGUSER || osUsername()\n\n o.no_prepare && (o.prepare = false)\n query.sslmode && (query.ssl = query.sslmode, delete query.sslmode)\n 'timeout' in o && (console.log('The timeout option is deprecated, use idle_timeout instead'), o.idle_timeout = o.timeout) // eslint-disable-line\n query.sslrootcert === 'system' && (query.ssl = 'verify-full')\n\n const ints = ['idle_timeout', 'connect_timeout', 'max_lifetime', 'max_pipeline', 'backoff', 'keep_alive']\n const defaults = {\n max : globalThis.Cloudflare ? 3 : 10,\n ssl : false,\n sslnegotiation : null,\n idle_timeout : null,\n connect_timeout : 30,\n max_lifetime : max_lifetime,\n max_pipeline : 100,\n backoff : backoff,\n keep_alive : 60,\n prepare : true,\n debug : false,\n fetch_types : true,\n publications : 'alltables',\n target_session_attrs: null\n }\n\n return {\n host : Array.isArray(host) ? host : host.split(',').map(x => x.split(':')[0]),\n port : Array.isArray(port) ? port : host.split(',').map(x => parseInt(x.split(':')[1] || port)),\n path : o.path || host.indexOf('/') > -1 && host + '/.s.PGSQL.' + port,\n database : o.database || o.db || (url.pathname || '').slice(1) || env.PGDATABASE || user,\n user : user,\n pass : o.pass || o.password || url.password || env.PGPASSWORD || '',\n ...Object.entries(defaults).reduce(\n (acc, [k, d]) => {\n const value = k in o ? o[k] : k in query\n ? (query[k] === 'disable' || query[k] === 'false' ? false : query[k])\n : env['PG' + k.toUpperCase()] || d\n acc[k] = typeof value === 'string' && ints.includes(k)\n ? +value\n : value\n return acc\n },\n {}\n ),\n connection : {\n application_name: env.PGAPPNAME || 'postgres.js',\n ...o.connection,\n ...Object.entries(query).reduce((acc, [k, v]) => (k in defaults || (acc[k] = v), acc), {})\n },\n types : o.types || {},\n target_session_attrs: tsa(o, url, env),\n onnotice : o.onnotice,\n onnotify : o.onnotify,\n onclose : o.onclose,\n onparameter : o.onparameter,\n socket : o.socket,\n transform : parseTransform(o.transform || { undefined: undefined }),\n parameters : {},\n shared : { retries: 0, typeArrayMap: {} },\n ...mergeUserTypes(o.types)\n }\n}\n\nfunction tsa(o, url, env) {\n const x = o.target_session_attrs || url.searchParams.get('target_session_attrs') || env.PGTARGETSESSIONATTRS\n if (!x || ['read-write', 'read-only', 'primary', 'standby', 'prefer-standby'].includes(x))\n return x\n\n throw new Error('target_session_attrs ' + x + ' is not supported')\n}\n\nfunction backoff(retries) {\n return (0.5 + Math.random() / 2) * Math.min(3 ** retries / 100, 20)\n}\n\nfunction max_lifetime() {\n return 60 * (30 + Math.random() * 30)\n}\n\nfunction parseTransform(x) {\n return {\n undefined: x.undefined,\n column: {\n from: typeof x.column === 'function' ? x.column : x.column && x.column.from,\n to: x.column && x.column.to\n },\n value: {\n from: typeof x.value === 'function' ? x.value : x.value && x.value.from,\n to: x.value && x.value.to\n },\n row: {\n from: typeof x.row === 'function' ? x.row : x.row && x.row.from,\n to: x.row && x.row.to\n }\n }\n}\n\nfunction parseUrl(url) {\n if (!url || typeof url !== 'string')\n return { url: { searchParams: new Map() } }\n\n let host = url\n host = host.slice(host.indexOf('://') + 3).split(/[?/]/)[0]\n host = decodeURIComponent(host.slice(host.indexOf('@') + 1))\n\n const urlObj = new URL(url.replace(host, host.split(',')[0]))\n\n return {\n url: {\n username: decodeURIComponent(urlObj.username),\n password: decodeURIComponent(urlObj.password),\n host: urlObj.host,\n hostname: urlObj.hostname,\n port: urlObj.port,\n pathname: urlObj.pathname,\n searchParams: urlObj.searchParams\n },\n multihost: host.indexOf(',') > -1 && host\n }\n}\n\nfunction osUsername() {\n try {\n return os.userInfo().username // eslint-disable-line\n } catch (_) {\n return process.env.USERNAME || process.env.USER || process.env.LOGNAME // eslint-disable-line\n }\n}\n","const originCache = new Map()\n , originStackCache = new Map()\n , originError = Symbol('OriginError')\n\nexport const CLOSE = {}\nexport class Query extends Promise {\n constructor(strings, args, handler, canceller, options = {}) {\n let resolve\n , reject\n\n super((a, b) => {\n resolve = a\n reject = b\n })\n\n this.tagged = Array.isArray(strings.raw)\n this.strings = strings\n this.args = args\n this.handler = handler\n this.canceller = canceller\n this.options = options\n\n this.state = null\n this.statement = null\n\n this.resolve = x => (this.active = false, resolve(x))\n this.reject = x => (this.active = false, reject(x))\n\n this.active = false\n this.cancelled = null\n this.executed = false\n this.signature = ''\n\n this[originError] = this.handler.debug\n ? new Error()\n : this.tagged && cachedError(this.strings)\n }\n\n get origin() {\n return (this.handler.debug\n ? this[originError].stack\n : this.tagged && originStackCache.has(this.strings)\n ? originStackCache.get(this.strings)\n : originStackCache.set(this.strings, this[originError].stack).get(this.strings)\n ) || ''\n }\n\n static get [Symbol.species]() {\n return Promise\n }\n\n cancel() {\n return this.canceller && (this.canceller(this), this.canceller = null)\n }\n\n simple() {\n this.options.simple = true\n this.options.prepare = false\n return this\n }\n\n async readable() {\n this.simple()\n this.streaming = true\n return this\n }\n\n async writable() {\n this.simple()\n this.streaming = true\n return this\n }\n\n cursor(rows = 1, fn) {\n this.options.simple = false\n if (typeof rows === 'function') {\n fn = rows\n rows = 1\n }\n\n this.cursorRows = rows\n\n if (typeof fn === 'function')\n return (this.cursorFn = fn, this)\n\n let prev\n return {\n [Symbol.asyncIterator]: () => ({\n next: () => {\n if (this.executed && !this.active)\n return { done: true }\n\n prev && prev()\n const promise = new Promise((resolve, reject) => {\n this.cursorFn = value => {\n resolve({ value, done: false })\n return new Promise(r => prev = r)\n }\n this.resolve = () => (this.active = false, resolve({ done: true }))\n this.reject = x => (this.active = false, reject(x))\n })\n this.execute()\n return promise\n },\n return() {\n prev && prev(CLOSE)\n return { done: true }\n }\n })\n }\n }\n\n describe() {\n this.options.simple = false\n this.onlyDescribe = this.options.prepare = true\n return this\n }\n\n stream() {\n throw new Error('.stream has been renamed to .forEach')\n }\n\n forEach(fn) {\n this.forEachFn = fn\n this.handle()\n return this\n }\n\n raw() {\n this.isRaw = true\n return this\n }\n\n values() {\n this.isRaw = 'values'\n return this\n }\n\n async handle() {\n !this.executed && (this.executed = true) && await 1 && this.handler(this)\n }\n\n execute() {\n this.handle()\n return this\n }\n\n then() {\n this.handle()\n return super.then.apply(this, arguments)\n }\n\n catch() {\n this.handle()\n return super.catch.apply(this, arguments)\n }\n\n finally() {\n this.handle()\n return super.finally.apply(this, arguments)\n }\n}\n\nfunction cachedError(xs) {\n if (originCache.has(xs))\n return originCache.get(xs)\n\n const x = Error.stackTraceLimit\n Error.stackTraceLimit = 4\n originCache.set(xs, new Error())\n Error.stackTraceLimit = x\n return originCache.get(xs)\n}\n","export class PostgresError extends Error {\n constructor(x) {\n super(x.message)\n this.name = this.constructor.name\n Object.assign(this, x)\n }\n}\n\nexport const Errors = {\n connection,\n postgres,\n generic,\n notSupported\n}\n\nfunction connection(x, options, socket) {\n const { host, port } = socket || options\n const error = Object.assign(\n new Error(('write ' + x + ' ' + (options.path || (host + ':' + port)))),\n {\n code: x,\n errno: x,\n address: options.path || host\n }, options.path ? {} : { port: port }\n )\n Error.captureStackTrace(error, connection)\n return error\n}\n\nfunction postgres(x) {\n const error = new PostgresError(x)\n Error.captureStackTrace(error, postgres)\n return error\n}\n\nfunction generic(code, message) {\n const error = Object.assign(new Error(code + ': ' + message), { code })\n Error.captureStackTrace(error, generic)\n return error\n}\n\n/* c8 ignore next 10 */\nfunction notSupported(x) {\n const error = Object.assign(\n new Error(x + ' (B) is not supported'),\n {\n code: 'MESSAGE_NOT_SUPPORTED',\n name: x\n }\n )\n Error.captureStackTrace(error, notSupported)\n return error\n}\n","import { Query } from './query.js'\nimport { Errors } from './errors.js'\n\nexport const types = {\n string: {\n to: 25,\n from: null, // defaults to string\n serialize: x => '' + x\n },\n number: {\n to: 0,\n from: [21, 23, 26, 700, 701],\n serialize: x => '' + x,\n parse: x => +x\n },\n json: {\n to: 114,\n from: [114, 3802],\n serialize: x => JSON.stringify(x),\n parse: x => JSON.parse(x)\n },\n boolean: {\n to: 16,\n from: 16,\n serialize: x => x === true ? 't' : 'f',\n parse: x => x === 't'\n },\n date: {\n to: 1184,\n from: [1082, 1114, 1184],\n serialize: x => (x instanceof Date ? x : new Date(x)).toISOString(),\n parse: x => new Date(x)\n },\n bytea: {\n to: 17,\n from: 17,\n serialize: x => '\\\\x' + Buffer.from(x).toString('hex'),\n parse: x => Buffer.from(x.slice(2), 'hex')\n }\n}\n\nclass NotTagged { then() { notTagged() } catch() { notTagged() } finally() { notTagged() }}\n\nexport class Identifier extends NotTagged {\n constructor(value) {\n super()\n this.value = escapeIdentifier(value)\n }\n}\n\nexport class Parameter extends NotTagged {\n constructor(value, type, array) {\n super()\n this.value = value\n this.type = type\n this.array = array\n }\n}\n\nexport class Builder extends NotTagged {\n constructor(first, rest) {\n super()\n this.first = first\n this.rest = rest\n }\n\n build(before, parameters, types, options) {\n const keyword = builders.map(([x, fn]) => ({ fn, i: before.search(x) })).sort((a, b) => a.i - b.i).pop()\n return keyword.i === -1\n ? escapeIdentifiers(this.first, options)\n : keyword.fn(this.first, this.rest, parameters, types, options)\n }\n}\n\nexport function handleValue(x, parameters, types, options) {\n let value = x instanceof Parameter ? x.value : x\n if (value === undefined) {\n x instanceof Parameter\n ? x.value = options.transform.undefined\n : value = x = options.transform.undefined\n\n if (value === undefined)\n throw Errors.generic('UNDEFINED_VALUE', 'Undefined values are not allowed')\n }\n\n return '$' + (types.push(\n x instanceof Parameter\n ? (parameters.push(x.value), x.array\n ? x.array[x.type || inferType(x.value)] || x.type || firstIsString(x.value)\n : x.type\n )\n : (parameters.push(x), inferType(x))\n ))\n}\n\nconst defaultHandlers = typeHandlers(types)\n\nexport function stringify(q, string, value, parameters, types, options) { // eslint-disable-line\n for (let i = 1; i < q.strings.length; i++) {\n string += (stringifyValue(string, value, parameters, types, options)) + q.strings[i]\n value = q.args[i]\n }\n\n return string\n}\n\nfunction stringifyValue(string, value, parameters, types, o) {\n return (\n value instanceof Builder ? value.build(string, parameters, types, o) :\n value instanceof Query ? fragment(value, parameters, types, o) :\n value instanceof Identifier ? value.value :\n value && value[0] instanceof Query ? value.reduce((acc, x) => acc + ' ' + fragment(x, parameters, types, o), '') :\n handleValue(value, parameters, types, o)\n )\n}\n\nfunction fragment(q, parameters, types, options) {\n q.fragment = true\n return stringify(q, q.strings[0], q.args[0], parameters, types, options)\n}\n\nfunction valuesBuilder(first, parameters, types, columns, options) {\n return first.map(row =>\n '(' + columns.map(column =>\n stringifyValue('values', row[column], parameters, types, options)\n ).join(',') + ')'\n ).join(',')\n}\n\nfunction values(first, rest, parameters, types, options) {\n const multi = Array.isArray(first[0])\n const columns = rest.length ? rest.flat() : Object.keys(multi ? first[0] : first)\n return valuesBuilder(multi ? first : [first], parameters, types, columns, options)\n}\n\nfunction select(first, rest, parameters, types, options) {\n typeof first === 'string' && (first = [first].concat(rest))\n if (Array.isArray(first))\n return escapeIdentifiers(first, options)\n\n let value\n const columns = rest.length ? rest.flat() : Object.keys(first)\n return columns.map(x => {\n value = first[x]\n return (\n value instanceof Query ? fragment(value, parameters, types, options) :\n value instanceof Identifier ? value.value :\n handleValue(value, parameters, types, options)\n ) + ' as ' + escapeIdentifier(options.transform.column.to ? options.transform.column.to(x) : x)\n }).join(',')\n}\n\nconst builders = Object.entries({\n values,\n in: (...xs) => {\n const x = values(...xs)\n return x === '()' ? '(null)' : x\n },\n select,\n as: select,\n returning: select,\n '\\\\(': select,\n\n update(first, rest, parameters, types, options) {\n return (rest.length ? rest.flat() : Object.keys(first)).map(x =>\n escapeIdentifier(options.transform.column.to ? options.transform.column.to(x) : x) +\n '=' + stringifyValue('values', first[x], parameters, types, options)\n )\n },\n\n insert(first, rest, parameters, types, options) {\n const columns = rest.length ? rest.flat() : Object.keys(Array.isArray(first) ? first[0] : first)\n return '(' + escapeIdentifiers(columns, options) + ')values' +\n valuesBuilder(Array.isArray(first) ? first : [first], parameters, types, columns, options)\n }\n}).map(([x, fn]) => ([new RegExp('((?:^|[\\\\s(])' + x + '(?:$|[\\\\s(]))(?![\\\\s\\\\S]*\\\\1)', 'i'), fn]))\n\nfunction notTagged() {\n throw Errors.generic('NOT_TAGGED_CALL', 'Query not called as a tagged template literal')\n}\n\nexport const serializers = defaultHandlers.serializers\nexport const parsers = defaultHandlers.parsers\n\nexport const END = {}\n\nfunction firstIsString(x) {\n if (Array.isArray(x))\n return firstIsString(x[0])\n return typeof x === 'string' ? 1009 : 0\n}\n\nexport const mergeUserTypes = function(types) {\n const user = typeHandlers(types || {})\n return {\n serializers: Object.assign({}, serializers, user.serializers),\n parsers: Object.assign({}, parsers, user.parsers)\n }\n}\n\nfunction typeHandlers(types) {\n return Object.keys(types).reduce((acc, k) => {\n types[k].from && [].concat(types[k].from).forEach(x => acc.parsers[x] = types[k].parse)\n if (types[k].serialize) {\n acc.serializers[types[k].to] = types[k].serialize\n types[k].from && [].concat(types[k].from).forEach(x => acc.serializers[x] = types[k].serialize)\n }\n return acc\n }, { parsers: {}, serializers: {} })\n}\n\nfunction escapeIdentifiers(xs, { transform: { column } }) {\n return xs.map(x => escapeIdentifier(column.to ? column.to(x) : x)).join(',')\n}\n\nexport const escapeIdentifier = function escape(str) {\n return '\"' + str.replace(/\"/g, '\"\"').replace(/\\./g, '\".\"') + '\"'\n}\n\nexport const inferType = function inferType(x) {\n return (\n x instanceof Parameter ? x.type :\n x instanceof Date ? 1184 :\n x instanceof Uint8Array ? 17 :\n (x === true || x === false) ? 16 :\n typeof x === 'bigint' ? 20 :\n Array.isArray(x) ? inferType(x[0]) :\n 0\n )\n}\n\nconst escapeBackslash = /\\\\/g\nconst escapeQuote = /\"/g\n\nfunction arrayEscape(x) {\n return x\n .replace(escapeBackslash, '\\\\\\\\')\n .replace(escapeQuote, '\\\\\"')\n}\n\nexport const arraySerializer = function arraySerializer(xs, serializer, options, typarray) {\n if (Array.isArray(xs) === false)\n return xs\n\n if (!xs.length)\n return '{}'\n\n const first = xs[0]\n // Only _box (1020) has the ';' delimiter for arrays, all other types use the ',' delimiter\n const delimiter = typarray === 1020 ? ';' : ','\n\n if (Array.isArray(first) && !first.type)\n return '{' + xs.map(x => arraySerializer(x, serializer, options, typarray)).join(delimiter) + '}'\n\n return '{' + xs.map(x => {\n if (x === undefined) {\n x = options.transform.undefined\n if (x === undefined)\n throw Errors.generic('UNDEFINED_VALUE', 'Undefined values are not allowed')\n }\n\n return x === null\n ? 'null'\n : '\"' + arrayEscape(serializer ? serializer(x.type ? x.value : x) : '' + x) + '\"'\n }).join(delimiter) + '}'\n}\n\nconst arrayParserState = {\n i: 0,\n char: null,\n str: '',\n quoted: false,\n last: 0\n}\n\nexport const arrayParser = function arrayParser(x, parser, typarray) {\n arrayParserState.i = arrayParserState.last = 0\n return arrayParserLoop(arrayParserState, x, parser, typarray)\n}\n\nfunction arrayParserLoop(s, x, parser, typarray) {\n const xs = []\n // Only _box (1020) has the ';' delimiter for arrays, all other types use the ',' delimiter\n const delimiter = typarray === 1020 ? ';' : ','\n for (; s.i < x.length; s.i++) {\n s.char = x[s.i]\n if (s.quoted) {\n if (s.char === '\\\\') {\n s.str += x[++s.i]\n } else if (s.char === '\"') {\n xs.push(parser ? parser(s.str) : s.str)\n s.str = ''\n s.quoted = x[s.i + 1] === '\"'\n s.last = s.i + 2\n } else {\n s.str += s.char\n }\n } else if (s.char === '\"') {\n s.quoted = true\n } else if (s.char === '{') {\n s.last = ++s.i\n xs.push(arrayParserLoop(s, x, parser, typarray))\n } else if (s.char === '}') {\n s.quoted = false\n s.last < s.i && xs.push(parser ? parser(x.slice(s.last, s.i)) : x.slice(s.last, s.i))\n s.last = s.i + 1\n break\n } else if (s.char === delimiter && s.p !== '}' && s.p !== '\"') {\n xs.push(parser ? parser(x.slice(s.last, s.i)) : x.slice(s.last, s.i))\n s.last = s.i + 1\n }\n s.p = s.char\n }\n s.last < s.i && xs.push(parser ? parser(x.slice(s.last, s.i + 1)) : x.slice(s.last, s.i + 1))\n return xs\n}\n\nexport const toCamel = x => {\n let str = x[0]\n for (let i = 1; i < x.length; i++)\n str += x[i] === '_' ? x[++i].toUpperCase() : x[i]\n return str\n}\n\nexport const toPascal = x => {\n let str = x[0].toUpperCase()\n for (let i = 1; i < x.length; i++)\n str += x[i] === '_' ? x[++i].toUpperCase() : x[i]\n return str\n}\n\nexport const toKebab = x => x.replace(/_/g, '-')\n\nexport const fromCamel = x => x.replace(/([A-Z])/g, '_$1').toLowerCase()\nexport const fromPascal = x => (x.slice(0, 1) + x.slice(1).replace(/([A-Z])/g, '_$1')).toLowerCase()\nexport const fromKebab = x => x.replace(/-/g, '_')\n\nfunction createJsonTransform(fn) {\n return function jsonTransform(x, column) {\n return typeof x === 'object' && x !== null && (column.type === 114 || column.type === 3802)\n ? Array.isArray(x)\n ? x.map(x => jsonTransform(x, column))\n : Object.entries(x).reduce((acc, [k, v]) => Object.assign(acc, { [fn(k)]: jsonTransform(v, column) }), {})\n : x\n }\n}\n\ntoCamel.column = { from: toCamel }\ntoCamel.value = { from: createJsonTransform(toCamel) }\nfromCamel.column = { to: fromCamel }\n\nexport const camel = { ...toCamel }\ncamel.column.to = fromCamel\n\ntoPascal.column = { from: toPascal }\ntoPascal.value = { from: createJsonTransform(toPascal) }\nfromPascal.column = { to: fromPascal }\n\nexport const pascal = { ...toPascal }\npascal.column.to = fromPascal\n\ntoKebab.column = { from: toKebab }\ntoKebab.value = { from: createJsonTransform(toKebab) }\nfromKebab.column = { to: fromKebab }\n\nexport const kebab = { ...toKebab }\nkebab.column.to = fromKebab\n","import net from 'net'\nimport tls from 'tls'\nimport crypto from 'crypto'\nimport Stream from 'stream'\nimport { performance } from 'perf_hooks'\n\nimport { stringify, handleValue, arrayParser, arraySerializer } from './types.js'\nimport { Errors } from './errors.js'\nimport Result from './result.js'\nimport Queue from './queue.js'\nimport { Query, CLOSE } from './query.js'\nimport b from './bytes.js'\n\nexport default Connection\n\nlet uid = 1\n\nconst Sync = b().S().end()\n , Flush = b().H().end()\n , SSLRequest = b().i32(8).i32(80877103).end(8)\n , ExecuteUnnamed = Buffer.concat([b().E().str(b.N).i32(0).end(), Sync])\n , DescribeUnnamed = b().D().str('S').str(b.N).end()\n , noop = () => { /* noop */ }\n\nconst retryRoutines = new Set([\n 'FetchPreparedStatement',\n 'RevalidateCachedQuery',\n 'transformAssignedExpr'\n])\n\nconst errorFields = {\n 83 : 'severity_local', // S\n 86 : 'severity', // V\n 67 : 'code', // C\n 77 : 'message', // M\n 68 : 'detail', // D\n 72 : 'hint', // H\n 80 : 'position', // P\n 112 : 'internal_position', // p\n 113 : 'internal_query', // q\n 87 : 'where', // W\n 115 : 'schema_name', // s\n 116 : 'table_name', // t\n 99 : 'column_name', // c\n 100 : 'data type_name', // d\n 110 : 'constraint_name', // n\n 70 : 'file', // F\n 76 : 'line', // L\n 82 : 'routine' // R\n}\n\nfunction Connection(options, queues = {}, { onopen = noop, onend = noop, onclose = noop } = {}) {\n const {\n sslnegotiation,\n ssl,\n max,\n user,\n host,\n port,\n database,\n parsers,\n transform,\n onnotice,\n onnotify,\n onparameter,\n max_pipeline,\n keep_alive,\n backoff,\n target_session_attrs\n } = options\n\n const sent = Queue()\n , id = uid++\n , backend = { pid: null, secret: null }\n , idleTimer = timer(end, options.idle_timeout)\n , lifeTimer = timer(end, options.max_lifetime)\n , connectTimer = timer(connectTimedOut, options.connect_timeout)\n\n let socket = null\n , cancelMessage\n , errorResponse = null\n , result = new Result()\n , incoming = Buffer.alloc(0)\n , needsTypes = options.fetch_types\n , backendParameters = {}\n , statements = {}\n , statementId = Math.random().toString(36).slice(2)\n , statementCount = 1\n , closedTime = 0\n , remaining = 0\n , hostIndex = 0\n , retries = 0\n , length = 0\n , delay = 0\n , rows = 0\n , serverSignature = null\n , nextWriteTimer = null\n , terminated = false\n , incomings = null\n , results = null\n , initial = null\n , ending = null\n , stream = null\n , chunk = null\n , ended = null\n , nonce = null\n , query = null\n , final = null\n\n const connection = {\n queue: queues.closed,\n idleTimer,\n connect(query) {\n initial = query\n reconnect()\n },\n terminate,\n execute,\n cancel,\n end,\n count: 0,\n id\n }\n\n queues.closed && queues.closed.push(connection)\n\n return connection\n\n async function createSocket() {\n let x\n try {\n x = options.socket\n ? (await Promise.resolve(options.socket(options)))\n : new net.Socket()\n } catch (e) {\n error(e)\n return\n }\n x.on('error', error)\n x.on('close', closed)\n x.on('drain', drain)\n return x\n }\n\n async function cancel({ pid, secret }, resolve, reject) {\n try {\n cancelMessage = b().i32(16).i32(80877102).i32(pid).i32(secret).end(16)\n await connect()\n socket.once('error', reject)\n socket.once('close', resolve)\n } catch (error) {\n reject(error)\n }\n }\n\n function execute(q) {\n if (terminated)\n return queryError(q, Errors.connection('CONNECTION_DESTROYED', options))\n\n if (stream)\n return queryError(q, Errors.generic('COPY_IN_PROGRESS', 'You cannot execute queries during copy'))\n\n if (q.cancelled)\n return\n\n try {\n q.state = backend\n query\n ? sent.push(q)\n : (query = q, query.active = true)\n\n build(q)\n return write(toBuffer(q))\n && !q.describeFirst\n && !q.cursorFn\n && sent.length < max_pipeline\n && (!q.options.onexecute || q.options.onexecute(connection))\n } catch (error) {\n sent.length === 0 && write(Sync)\n errored(error)\n return true\n }\n }\n\n function toBuffer(q) {\n if (q.parameters.length >= 65534)\n throw Errors.generic('MAX_PARAMETERS_EXCEEDED', 'Max number of parameters (65534) exceeded')\n\n return q.options.simple\n ? b().Q().str(q.statement.string + b.N).end()\n : q.describeFirst\n ? Buffer.concat([describe(q), Flush])\n : q.prepare\n ? q.prepared\n ? prepared(q)\n : Buffer.concat([describe(q), prepared(q)])\n : unnamed(q)\n }\n\n function describe(q) {\n return Buffer.concat([\n Parse(q.statement.string, q.parameters, q.statement.types, q.statement.name),\n Describe('S', q.statement.name)\n ])\n }\n\n function prepared(q) {\n return Buffer.concat([\n Bind(q.parameters, q.statement.types, q.statement.name, q.cursorName),\n q.cursorFn\n ? Execute('', q.cursorRows)\n : ExecuteUnnamed\n ])\n }\n\n function unnamed(q) {\n return Buffer.concat([\n Parse(q.statement.string, q.parameters, q.statement.types),\n DescribeUnnamed,\n prepared(q)\n ])\n }\n\n function build(q) {\n const parameters = []\n , types = []\n\n const string = stringify(q, q.strings[0], q.args[0], parameters, types, options)\n\n !q.tagged && q.args.forEach(x => handleValue(x, parameters, types, options))\n\n q.prepare = options.prepare && ('prepare' in q.options ? q.options.prepare : true)\n q.string = string\n q.signature = q.prepare && types + string\n q.onlyDescribe && (delete statements[q.signature])\n q.parameters = q.parameters || parameters\n q.prepared = q.prepare && q.signature in statements\n q.describeFirst = q.onlyDescribe || (parameters.length && !q.prepared)\n q.statement = q.prepared\n ? statements[q.signature]\n : { string, types, name: q.prepare ? statementId + statementCount++ : '' }\n\n typeof options.debug === 'function' && options.debug(id, string, parameters, types)\n }\n\n function write(x, fn) {\n chunk = chunk ? Buffer.concat([chunk, x]) : Buffer.from(x)\n if (fn || chunk.length >= 1024)\n return nextWrite(fn)\n nextWriteTimer === null && (nextWriteTimer = setImmediate(nextWrite))\n return true\n }\n\n function nextWrite(fn) {\n const x = socket.write(chunk, fn)\n nextWriteTimer !== null && clearImmediate(nextWriteTimer)\n chunk = nextWriteTimer = null\n return x\n }\n\n function connectTimedOut() {\n errored(Errors.connection('CONNECT_TIMEOUT', options, socket))\n socket.destroy()\n }\n\n async function secure() {\n if (sslnegotiation !== 'direct') {\n write(SSLRequest)\n const canSSL = await new Promise(r => socket.once('data', x => r(x[0] === 83))) // S\n\n if (!canSSL && ssl === 'prefer')\n return connected()\n }\n\n const options = {\n socket,\n servername: net.isIP(socket.host) ? undefined : socket.host\n }\n\n if (sslnegotiation === 'direct')\n options.ALPNProtocols = ['postgresql']\n\n if (ssl === 'require' || ssl === 'allow' || ssl === 'prefer')\n options.rejectUnauthorized = false\n else if (typeof ssl === 'object')\n Object.assign(options, ssl)\n\n socket.removeAllListeners()\n socket = tls.connect(options)\n socket.on('secureConnect', connected)\n socket.on('error', error)\n socket.on('close', closed)\n socket.on('drain', drain)\n }\n\n /* c8 ignore next 3 */\n function drain() {\n !query && onopen(connection)\n }\n\n function data(x) {\n if (incomings) {\n incomings.push(x)\n remaining -= x.length\n if (remaining > 0)\n return\n }\n\n incoming = incomings\n ? Buffer.concat(incomings, length - remaining)\n : incoming.length === 0\n ? x\n : Buffer.concat([incoming, x], incoming.length + x.length)\n\n while (incoming.length > 4) {\n length = incoming.readUInt32BE(1)\n if (length >= incoming.length) {\n remaining = length - incoming.length\n incomings = [incoming]\n break\n }\n\n try {\n handle(incoming.subarray(0, length + 1))\n } catch (e) {\n query && (query.cursorFn || query.describeFirst) && write(Sync)\n errored(e)\n }\n incoming = incoming.subarray(length + 1)\n remaining = 0\n incomings = null\n }\n }\n\n async function connect() {\n terminated = false\n backendParameters = {}\n socket || (socket = await createSocket())\n\n if (!socket)\n return\n\n connectTimer.start()\n\n if (options.socket)\n return ssl ? secure() : connected()\n\n socket.on('connect', ssl ? secure : connected)\n\n if (options.path)\n return socket.connect(options.path)\n\n socket.ssl = ssl\n socket.connect(port[hostIndex], host[hostIndex])\n socket.host = host[hostIndex]\n socket.port = port[hostIndex]\n\n hostIndex = (hostIndex + 1) % port.length\n }\n\n function reconnect() {\n setTimeout(connect, closedTime ? Math.max(0, closedTime + delay - performance.now()) : 0)\n }\n\n function connected() {\n try {\n statements = {}\n needsTypes = options.fetch_types\n statementId = Math.random().toString(36).slice(2)\n statementCount = 1\n lifeTimer.start()\n socket.on('data', data)\n keep_alive && socket.setKeepAlive && socket.setKeepAlive(true, 1000 * keep_alive)\n const s = StartupMessage()\n write(s)\n } catch (err) {\n error(err)\n }\n }\n\n function error(err) {\n if (connection.queue === queues.connecting && options.host[retries + 1])\n return\n\n errored(err)\n while (sent.length)\n queryError(sent.shift(), err)\n }\n\n function errored(err) {\n stream && (stream.destroy(err), stream = null)\n query && queryError(query, err)\n initial && (queryError(initial, err), initial = null)\n }\n\n function queryError(query, err) {\n if (query.reserve)\n return query.reject(err)\n\n if (!err || typeof err !== 'object')\n err = new Error(err)\n\n 'query' in err || 'parameters' in err || Object.defineProperties(err, {\n stack: { value: err.stack + query.origin.replace(/.*\\n/, '\\n'), enumerable: options.debug },\n query: { value: query.string, enumerable: options.debug },\n parameters: { value: query.parameters, enumerable: options.debug },\n args: { value: query.args, enumerable: options.debug },\n types: { value: query.statement && query.statement.types, enumerable: options.debug }\n })\n query.reject(err)\n }\n\n function end() {\n return ending || (\n !connection.reserved && onend(connection),\n !connection.reserved && !initial && !query && sent.length === 0\n ? (terminate(), new Promise(r => socket && socket.readyState !== 'closed' ? socket.once('close', r) : r()))\n : ending = new Promise(r => ended = r)\n )\n }\n\n function terminate() {\n terminated = true\n if (stream || query || initial || sent.length)\n error(Errors.connection('CONNECTION_DESTROYED', options))\n\n clearImmediate(nextWriteTimer)\n if (socket) {\n socket.removeListener('data', data)\n socket.removeListener('connect', connected)\n socket.readyState === 'open' && socket.end(b().X().end())\n }\n ended && (ended(), ending = ended = null)\n }\n\n async function closed(hadError) {\n incoming = Buffer.alloc(0)\n remaining = 0\n incomings = null\n clearImmediate(nextWriteTimer)\n socket.removeListener('data', data)\n socket.removeListener('connect', connected)\n idleTimer.cancel()\n lifeTimer.cancel()\n connectTimer.cancel()\n\n socket.removeAllListeners()\n socket = null\n\n if (initial)\n return reconnect()\n\n !hadError && (query || sent.length) && error(Errors.connection('CONNECTION_CLOSED', options, socket))\n closedTime = performance.now()\n hadError && options.shared.retries++\n delay = (typeof backoff === 'function' ? backoff(options.shared.retries) : backoff) * 1000\n onclose(connection, Errors.connection('CONNECTION_CLOSED', options, socket))\n }\n\n /* Handlers */\n function handle(xs, x = xs[0]) {\n (\n x === 68 ? DataRow : // D\n x === 100 ? CopyData : // d\n x === 65 ? NotificationResponse : // A\n x === 83 ? ParameterStatus : // S\n x === 90 ? ReadyForQuery : // Z\n x === 67 ? CommandComplete : // C\n x === 50 ? BindComplete : // 2\n x === 49 ? ParseComplete : // 1\n x === 116 ? ParameterDescription : // t\n x === 84 ? RowDescription : // T\n x === 82 ? Authentication : // R\n x === 110 ? NoData : // n\n x === 75 ? BackendKeyData : // K\n x === 69 ? ErrorResponse : // E\n x === 115 ? PortalSuspended : // s\n x === 51 ? CloseComplete : // 3\n x === 71 ? CopyInResponse : // G\n x === 78 ? NoticeResponse : // N\n x === 72 ? CopyOutResponse : // H\n x === 99 ? CopyDone : // c\n x === 73 ? EmptyQueryResponse : // I\n x === 86 ? FunctionCallResponse : // V\n x === 118 ? NegotiateProtocolVersion : // v\n x === 87 ? CopyBothResponse : // W\n /* c8 ignore next */\n UnknownMessage\n )(xs)\n }\n\n function DataRow(x) {\n let index = 7\n let length\n let column\n let value\n\n const row = query.isRaw ? new Array(query.statement.columns.length) : {}\n for (let i = 0; i < query.statement.columns.length; i++) {\n column = query.statement.columns[i]\n length = x.readInt32BE(index)\n index += 4\n\n value = length === -1\n ? null\n : query.isRaw === true\n ? x.subarray(index, index += length)\n : column.parser === undefined\n ? x.toString('utf8', index, index += length)\n : column.parser.array === true\n ? column.parser(x.toString('utf8', index + 1, index += length))\n : column.parser(x.toString('utf8', index, index += length))\n\n query.isRaw\n ? (row[i] = query.isRaw === true\n ? value\n : transform.value.from ? transform.value.from(value, column) : value)\n : (row[column.name] = transform.value.from ? transform.value.from(value, column) : value)\n }\n\n query.forEachFn\n ? query.forEachFn(transform.row.from ? transform.row.from(row) : row, result)\n : (result[rows++] = transform.row.from ? transform.row.from(row) : row)\n }\n\n function ParameterStatus(x) {\n const [k, v] = x.toString('utf8', 5, x.length - 1).split(b.N)\n backendParameters[k] = v\n if (options.parameters[k] !== v) {\n options.parameters[k] = v\n onparameter && onparameter(k, v)\n }\n }\n\n function ReadyForQuery(x) {\n if (query) {\n if (errorResponse) {\n query.retried\n ? errored(query.retried)\n : query.prepared && retryRoutines.has(errorResponse.routine)\n ? retry(query, errorResponse)\n : errored(errorResponse)\n } else {\n query.resolve(results || result)\n }\n } else if (errorResponse) {\n errored(errorResponse)\n }\n\n query = results = errorResponse = null\n result = new Result()\n connectTimer.cancel()\n\n if (initial) {\n if (target_session_attrs) {\n if (!backendParameters.in_hot_standby || !backendParameters.default_transaction_read_only)\n return fetchState()\n else if (tryNext(target_session_attrs, backendParameters))\n return terminate()\n }\n\n if (needsTypes) {\n initial.reserve && (initial = null)\n return fetchArrayTypes()\n }\n\n initial && !initial.reserve && execute(initial)\n options.shared.retries = retries = 0\n initial = null\n return\n }\n\n while (sent.length && (query = sent.shift()) && (query.active = true, query.cancelled))\n Connection(options).cancel(query.state, query.cancelled.resolve, query.cancelled.reject)\n\n if (query)\n return // Consider opening if able and sent.length < 50\n\n connection.reserved\n ? !connection.reserved.release && x[5] === 73 // I\n ? ending\n ? terminate()\n : (connection.reserved = null, onopen(connection))\n : connection.reserved()\n : ending\n ? terminate()\n : onopen(connection)\n }\n\n function CommandComplete(x) {\n rows = 0\n\n for (let i = x.length - 1; i > 0; i--) {\n if (x[i] === 32 && x[i + 1] < 58 && result.count === null)\n result.count = +x.toString('utf8', i + 1, x.length - 1)\n if (x[i - 1] >= 65) {\n result.command = x.toString('utf8', 5, i)\n result.state = backend\n break\n }\n }\n\n final && (final(), final = null)\n\n if (result.command === 'BEGIN' && max !== 1 && !connection.reserved)\n return errored(Errors.generic('UNSAFE_TRANSACTION', 'Only use sql.begin, sql.reserved or max: 1'))\n\n if (query.options.simple)\n return BindComplete()\n\n if (query.cursorFn) {\n result.count && query.cursorFn(result)\n write(Sync)\n }\n }\n\n function ParseComplete() {\n query.parsing = false\n }\n\n function BindComplete() {\n !result.statement && (result.statement = query.statement)\n result.columns = query.statement.columns\n }\n\n function ParameterDescription(x) {\n const length = x.readUInt16BE(5)\n\n for (let i = 0; i < length; ++i)\n !query.statement.types[i] && (query.statement.types[i] = x.readUInt32BE(7 + i * 4))\n\n query.prepare && (statements[query.signature] = query.statement)\n query.describeFirst && !query.onlyDescribe && (write(prepared(query)), query.describeFirst = false)\n }\n\n function RowDescription(x) {\n if (result.command) {\n results = results || [result]\n results.push(result = new Result())\n result.count = null\n query.statement.columns = null\n }\n\n const length = x.readUInt16BE(5)\n let index = 7\n let start\n\n query.statement.columns = Array(length)\n\n for (let i = 0; i < length; ++i) {\n start = index\n while (x[index++] !== 0);\n const table = x.readUInt32BE(index)\n const number = x.readUInt16BE(index + 4)\n const type = x.readUInt32BE(index + 6)\n query.statement.columns[i] = {\n name: transform.column.from\n ? transform.column.from(x.toString('utf8', start, index - 1))\n : x.toString('utf8', start, index - 1),\n parser: parsers[type],\n table,\n number,\n type\n }\n index += 18\n }\n\n result.statement = query.statement\n if (query.onlyDescribe)\n return (query.resolve(query.statement), write(Sync))\n }\n\n async function Authentication(x, type = x.readUInt32BE(5)) {\n (\n type === 3 ? AuthenticationCleartextPassword :\n type === 5 ? AuthenticationMD5Password :\n type === 10 ? SASL :\n type === 11 ? SASLContinue :\n type === 12 ? SASLFinal :\n type !== 0 ? UnknownAuth :\n noop\n )(x, type)\n }\n\n /* c8 ignore next 5 */\n async function AuthenticationCleartextPassword() {\n const payload = await Pass()\n write(\n b().p().str(payload).z(1).end()\n )\n }\n\n async function AuthenticationMD5Password(x) {\n const payload = 'md5' + (\n await md5(\n Buffer.concat([\n Buffer.from(await md5((await Pass()) + user)),\n x.subarray(9)\n ])\n )\n )\n write(\n b().p().str(payload).z(1).end()\n )\n }\n\n async function SASL() {\n nonce = (await crypto.randomBytes(18)).toString('base64')\n b().p().str('SCRAM-SHA-256' + b.N)\n const i = b.i\n write(b.inc(4).str('n,,n=*,r=' + nonce).i32(b.i - i - 4, i).end())\n }\n\n async function SASLContinue(x) {\n const res = x.toString('utf8', 9).split(',').reduce((acc, x) => (acc[x[0]] = x.slice(2), acc), {})\n\n const saltedPassword = await crypto.pbkdf2Sync(\n await Pass(),\n Buffer.from(res.s, 'base64'),\n parseInt(res.i), 32,\n 'sha256'\n )\n\n const clientKey = await hmac(saltedPassword, 'Client Key')\n\n const auth = 'n=*,r=' + nonce + ','\n + 'r=' + res.r + ',s=' + res.s + ',i=' + res.i\n + ',c=biws,r=' + res.r\n\n serverSignature = (await hmac(await hmac(saltedPassword, 'Server Key'), auth)).toString('base64')\n\n const payload = 'c=biws,r=' + res.r + ',p=' + xor(\n clientKey, Buffer.from(await hmac(await sha256(clientKey), auth))\n ).toString('base64')\n\n write(\n b().p().str(payload).end()\n )\n }\n\n function SASLFinal(x) {\n if (x.toString('utf8', 9).split(b.N, 1)[0].slice(2) === serverSignature)\n return\n /* c8 ignore next 5 */\n errored(Errors.generic('SASL_SIGNATURE_MISMATCH', 'The server did not return the correct signature'))\n socket.destroy()\n }\n\n function Pass() {\n return Promise.resolve(typeof options.pass === 'function'\n ? options.pass()\n : options.pass\n )\n }\n\n function NoData() {\n result.statement = query.statement\n result.statement.columns = []\n if (query.onlyDescribe)\n return (query.resolve(query.statement), write(Sync))\n }\n\n function BackendKeyData(x) {\n backend.pid = x.readUInt32BE(5)\n backend.secret = x.readUInt32BE(9)\n }\n\n async function fetchArrayTypes() {\n needsTypes = false\n const types = await new Query([`\n select b.oid, b.typarray\n from pg_catalog.pg_type a\n left join pg_catalog.pg_type b on b.oid = a.typelem\n where a.typcategory = 'A'\n group by b.oid, b.typarray\n order by b.oid\n `], [], execute)\n types.forEach(({ oid, typarray }) => addArrayType(oid, typarray))\n }\n\n function addArrayType(oid, typarray) {\n if (!!options.parsers[typarray] && !!options.serializers[typarray]) return\n const parser = options.parsers[oid]\n options.shared.typeArrayMap[oid] = typarray\n options.parsers[typarray] = (xs) => arrayParser(xs, parser, typarray)\n options.parsers[typarray].array = true\n options.serializers[typarray] = (xs) => arraySerializer(xs, options.serializers[oid], options, typarray)\n }\n\n function tryNext(x, xs) {\n return (\n (x === 'read-write' && xs.default_transaction_read_only === 'on') ||\n (x === 'read-only' && xs.default_transaction_read_only === 'off') ||\n (x === 'primary' && xs.in_hot_standby === 'on') ||\n (x === 'standby' && xs.in_hot_standby === 'off') ||\n (x === 'prefer-standby' && xs.in_hot_standby === 'off' && options.host[retries])\n )\n }\n\n function fetchState() {\n const query = new Query([`\n show transaction_read_only;\n select pg_catalog.pg_is_in_recovery()\n `], [], execute, null, { simple: true })\n query.resolve = ([[a], [b]]) => {\n backendParameters.default_transaction_read_only = a.transaction_read_only\n backendParameters.in_hot_standby = b.pg_is_in_recovery ? 'on' : 'off'\n }\n query.execute()\n }\n\n function ErrorResponse(x) {\n if (query) {\n (query.cursorFn || query.describeFirst) && write(Sync)\n errorResponse = Errors.postgres(parseError(x))\n } else {\n errored(Errors.postgres(parseError(x)))\n }\n }\n\n function retry(q, error) {\n delete statements[q.signature]\n q.retried = error\n execute(q)\n }\n\n function NotificationResponse(x) {\n if (!onnotify)\n return\n\n let index = 9\n while (x[index++] !== 0);\n onnotify(\n x.toString('utf8', 9, index - 1),\n x.toString('utf8', index, x.length - 1)\n )\n }\n\n async function PortalSuspended() {\n try {\n const x = await Promise.resolve(query.cursorFn(result))\n rows = 0\n x === CLOSE\n ? write(Close(query.portal))\n : (result = new Result(), write(Execute('', query.cursorRows)))\n } catch (err) {\n write(Sync)\n query.reject(err)\n }\n }\n\n function CloseComplete() {\n result.count && query.cursorFn(result)\n query.resolve(result)\n }\n\n function CopyInResponse() {\n stream = new Stream.Writable({\n autoDestroy: true,\n write(chunk, encoding, callback) {\n socket.write(b().d().raw(chunk).end(), callback)\n },\n destroy(error, callback) {\n callback(error)\n socket.write(b().f().str(error + b.N).end())\n stream = null\n },\n final(callback) {\n socket.write(b().c().end())\n final = callback\n stream = null\n }\n })\n query.resolve(stream)\n }\n\n function CopyOutResponse() {\n stream = new Stream.Readable({\n read() { socket.resume() }\n })\n query.resolve(stream)\n }\n\n /* c8 ignore next 3 */\n function CopyBothResponse() {\n stream = new Stream.Duplex({\n autoDestroy: true,\n read() { socket.resume() },\n /* c8 ignore next 11 */\n write(chunk, encoding, callback) {\n socket.write(b().d().raw(chunk).end(), callback)\n },\n destroy(error, callback) {\n callback(error)\n socket.write(b().f().str(error + b.N).end())\n stream = null\n },\n final(callback) {\n socket.write(b().c().end())\n final = callback\n }\n })\n query.resolve(stream)\n }\n\n function CopyData(x) {\n stream && (stream.push(x.subarray(5)) || socket.pause())\n }\n\n function CopyDone() {\n stream && stream.push(null)\n stream = null\n }\n\n function NoticeResponse(x) {\n onnotice\n ? onnotice(parseError(x))\n : console.log(parseError(x)) // eslint-disable-line\n\n }\n\n /* c8 ignore next 3 */\n function EmptyQueryResponse() {\n /* noop */\n }\n\n /* c8 ignore next 3 */\n function FunctionCallResponse() {\n errored(Errors.notSupported('FunctionCallResponse'))\n }\n\n /* c8 ignore next 3 */\n function NegotiateProtocolVersion() {\n errored(Errors.notSupported('NegotiateProtocolVersion'))\n }\n\n /* c8 ignore next 3 */\n function UnknownMessage(x) {\n console.error('Postgres.js : Unknown Message:', x[0]) // eslint-disable-line\n }\n\n /* c8 ignore next 3 */\n function UnknownAuth(x, type) {\n console.error('Postgres.js : Unknown Auth:', type) // eslint-disable-line\n }\n\n /* Messages */\n function Bind(parameters, types, statement = '', portal = '') {\n let prev\n , type\n\n b().B().str(portal + b.N).str(statement + b.N).i16(0).i16(parameters.length)\n\n parameters.forEach((x, i) => {\n if (x === null)\n return b.i32(0xFFFFFFFF)\n\n type = types[i]\n parameters[i] = x = type in options.serializers\n ? options.serializers[type](x)\n : '' + x\n\n prev = b.i\n b.inc(4).str(x).i32(b.i - prev - 4, prev)\n })\n\n b.i16(0)\n\n return b.end()\n }\n\n function Parse(str, parameters, types, name = '') {\n b().P().str(name + b.N).str(str + b.N).i16(parameters.length)\n parameters.forEach((x, i) => b.i32(types[i] || 0))\n return b.end()\n }\n\n function Describe(x, name = '') {\n return b().D().str(x).str(name + b.N).end()\n }\n\n function Execute(portal = '', rows = 0) {\n return Buffer.concat([\n b().E().str(portal + b.N).i32(rows).end(),\n Flush\n ])\n }\n\n function Close(portal = '') {\n return Buffer.concat([\n b().C().str('P').str(portal + b.N).end(),\n b().S().end()\n ])\n }\n\n function StartupMessage() {\n return cancelMessage || b().inc(4).i16(3).z(2).str(\n Object.entries(Object.assign({\n user,\n database,\n client_encoding: 'UTF8'\n },\n options.connection\n )).filter(([, v]) => v).map(([k, v]) => k + b.N + v).join(b.N)\n ).z(2).end(0)\n }\n\n}\n\nfunction parseError(x) {\n const error = {}\n let start = 5\n for (let i = 5; i < x.length - 1; i++) {\n if (x[i] === 0) {\n error[errorFields[x[start]]] = x.toString('utf8', start + 1, i)\n start = i + 1\n }\n }\n return error\n}\n\nfunction md5(x) {\n return crypto.createHash('md5').update(x).digest('hex')\n}\n\nfunction hmac(key, x) {\n return crypto.createHmac('sha256', key).update(x).digest()\n}\n\nfunction sha256(x) {\n return crypto.createHash('sha256').update(x).digest()\n}\n\nfunction xor(a, b) {\n const length = Math.max(a.length, b.length)\n const buffer = Buffer.allocUnsafe(length)\n for (let i = 0; i < length; i++)\n buffer[i] = a[i] ^ b[i]\n return buffer\n}\n\nfunction timer(fn, seconds) {\n seconds = typeof seconds === 'function' ? seconds() : seconds\n if (!seconds)\n return { cancel: noop, start: noop }\n\n let timer\n return {\n cancel() {\n timer && (clearTimeout(timer), timer = null)\n },\n start() {\n timer && clearTimeout(timer)\n timer = setTimeout(done, seconds * 1000, arguments)\n }\n }\n\n function done(args) {\n fn.apply(null, args)\n timer = null\n }\n}\n","export default class Result extends Array {\n constructor() {\n super()\n Object.defineProperties(this, {\n count: { value: null, writable: true },\n state: { value: null, writable: true },\n command: { value: null, writable: true },\n columns: { value: null, writable: true },\n statement: { value: null, writable: true }\n })\n }\n\n static get [Symbol.species]() {\n return Array\n }\n}\n","export default Queue\n\nfunction Queue(initial = []) {\n let xs = initial.slice()\n let index = 0\n\n return {\n get length() {\n return xs.length - index\n },\n remove: (x) => {\n const index = xs.indexOf(x)\n return index === -1\n ? null\n : (xs.splice(index, 1), x)\n },\n push: (x) => (xs.push(x), x),\n shift: () => {\n const out = xs[index++]\n\n if (index === xs.length) {\n index = 0\n xs = []\n } else {\n xs[index - 1] = undefined\n }\n\n return out\n }\n }\n}\n","const size = 256\nlet buffer = Buffer.allocUnsafe(size)\n\nconst messages = 'BCcDdEFfHPpQSX'.split('').reduce((acc, x) => {\n const v = x.charCodeAt(0)\n acc[x] = () => {\n buffer[0] = v\n b.i = 5\n return b\n }\n return acc\n}, {})\n\nconst b = Object.assign(reset, messages, {\n N: String.fromCharCode(0),\n i: 0,\n inc(x) {\n b.i += x\n return b\n },\n str(x) {\n const length = Buffer.byteLength(x)\n fit(length)\n b.i += buffer.write(x, b.i, length, 'utf8')\n return b\n },\n i16(x) {\n fit(2)\n buffer.writeUInt16BE(x, b.i)\n b.i += 2\n return b\n },\n i32(x, i) {\n if (i || i === 0) {\n buffer.writeUInt32BE(x, i)\n return b\n }\n fit(4)\n buffer.writeUInt32BE(x, b.i)\n b.i += 4\n return b\n },\n z(x) {\n fit(x)\n buffer.fill(0, b.i, b.i + x)\n b.i += x\n return b\n },\n raw(x) {\n buffer = Buffer.concat([buffer.subarray(0, b.i), x])\n b.i = buffer.length\n return b\n },\n end(at = 1) {\n buffer.writeUInt32BE(b.i - at, at)\n const out = buffer.subarray(0, b.i)\n b.i = 0\n buffer = Buffer.allocUnsafe(size)\n return out\n }\n})\n\nexport default b\n\nfunction fit(x) {\n if (buffer.length - b.i < x) {\n const prev = buffer\n , length = prev.length\n\n buffer = Buffer.allocUnsafe(length + (length >> 1) + x)\n prev.copy(buffer)\n }\n}\n\nfunction reset() {\n b.i = 0\n return b\n}\n","const noop = () => { /* noop */ }\n\nexport default function Subscribe(postgres, options) {\n const subscribers = new Map()\n , slot = 'postgresjs_' + Math.random().toString(36).slice(2)\n , state = {}\n\n let connection\n , stream\n , ended = false\n\n const sql = subscribe.sql = postgres({\n ...options,\n transform: { column: {}, value: {}, row: {} },\n max: 1,\n fetch_types: false,\n idle_timeout: null,\n max_lifetime: null,\n connection: {\n ...options.connection,\n replication: 'database'\n },\n onclose: async function() {\n if (ended)\n return\n stream = null\n state.pid = state.secret = undefined\n connected(await init(sql, slot, options.publications))\n subscribers.forEach(event => event.forEach(({ onsubscribe }) => onsubscribe()))\n },\n no_subscribe: true\n })\n\n const end = sql.end\n , close = sql.close\n\n sql.end = async() => {\n ended = true\n stream && (await new Promise(r => (stream.once('close', r), stream.end())))\n return end()\n }\n\n sql.close = async() => {\n stream && (await new Promise(r => (stream.once('close', r), stream.end())))\n return close()\n }\n\n return subscribe\n\n async function subscribe(event, fn, onsubscribe = noop, onerror = noop) {\n event = parseEvent(event)\n\n if (!connection)\n connection = init(sql, slot, options.publications)\n\n const subscriber = { fn, onsubscribe }\n const fns = subscribers.has(event)\n ? subscribers.get(event).add(subscriber)\n : subscribers.set(event, new Set([subscriber])).get(event)\n\n const unsubscribe = () => {\n fns.delete(subscriber)\n fns.size === 0 && subscribers.delete(event)\n }\n\n return connection.then(x => {\n connected(x)\n onsubscribe()\n stream && stream.on('error', onerror)\n return { unsubscribe, state, sql }\n })\n }\n\n function connected(x) {\n stream = x.stream\n state.pid = x.state.pid\n state.secret = x.state.secret\n }\n\n async function init(sql, slot, publications) {\n if (!publications)\n throw new Error('Missing publication names')\n\n const xs = await sql.unsafe(\n `CREATE_REPLICATION_SLOT ${ slot } TEMPORARY LOGICAL pgoutput NOEXPORT_SNAPSHOT`\n )\n\n const [x] = xs\n\n const stream = await sql.unsafe(\n `START_REPLICATION SLOT ${ slot } LOGICAL ${\n x.consistent_point\n } (proto_version '1', publication_names '${ publications }')`\n ).writable()\n\n const state = {\n lsn: Buffer.concat(x.consistent_point.split('/').map(x => Buffer.from(('00000000' + x).slice(-8), 'hex')))\n }\n\n stream.on('data', data)\n stream.on('error', error)\n stream.on('close', sql.close)\n\n return { stream, state: xs.state }\n\n function error(e) {\n console.error('Unexpected error during logical streaming - reconnecting', e) // eslint-disable-line\n }\n\n function data(x) {\n if (x[0] === 0x77) {\n parse(x.subarray(25), state, sql.options.parsers, handle, options.transform)\n } else if (x[0] === 0x6b && x[17]) {\n state.lsn = x.subarray(1, 9)\n pong()\n }\n }\n\n function handle(a, b) {\n const path = b.relation.schema + '.' + b.relation.table\n call('*', a, b)\n call('*:' + path, a, b)\n b.relation.keys.length && call('*:' + path + '=' + b.relation.keys.map(x => a[x.name]), a, b)\n call(b.command, a, b)\n call(b.command + ':' + path, a, b)\n b.relation.keys.length && call(b.command + ':' + path + '=' + b.relation.keys.map(x => a[x.name]), a, b)\n }\n\n function pong() {\n const x = Buffer.alloc(34)\n x[0] = 'r'.charCodeAt(0)\n x.fill(state.lsn, 1)\n x.writeBigInt64BE(BigInt(Date.now() - Date.UTC(2000, 0, 1)) * BigInt(1000), 25)\n stream.write(x)\n }\n }\n\n function call(x, a, b) {\n subscribers.has(x) && subscribers.get(x).forEach(({ fn }) => fn(a, b, x))\n }\n}\n\nfunction Time(x) {\n return new Date(Date.UTC(2000, 0, 1) + Number(x / BigInt(1000)))\n}\n\nfunction parse(x, state, parsers, handle, transform) {\n const char = (acc, [k, v]) => (acc[k.charCodeAt(0)] = v, acc)\n\n Object.entries({\n R: x => { // Relation\n let i = 1\n const r = state[x.readUInt32BE(i)] = {\n schema: x.toString('utf8', i += 4, i = x.indexOf(0, i)) || 'pg_catalog',\n table: x.toString('utf8', i + 1, i = x.indexOf(0, i + 1)),\n columns: Array(x.readUInt16BE(i += 2)),\n keys: []\n }\n i += 2\n\n let columnIndex = 0\n , column\n\n while (i < x.length) {\n column = r.columns[columnIndex++] = {\n key: x[i++],\n name: transform.column.from\n ? transform.column.from(x.toString('utf8', i, i = x.indexOf(0, i)))\n : x.toString('utf8', i, i = x.indexOf(0, i)),\n type: x.readUInt32BE(i += 1),\n parser: parsers[x.readUInt32BE(i)],\n atttypmod: x.readUInt32BE(i += 4)\n }\n\n column.key && r.keys.push(column)\n i += 4\n }\n },\n Y: () => { /* noop */ }, // Type\n O: () => { /* noop */ }, // Origin\n B: x => { // Begin\n state.date = Time(x.readBigInt64BE(9))\n state.lsn = x.subarray(1, 9)\n },\n I: x => { // Insert\n let i = 1\n const relation = state[x.readUInt32BE(i)]\n const { row } = tuples(x, relation.columns, i += 7, transform)\n\n handle(row, {\n command: 'insert',\n relation\n })\n },\n D: x => { // Delete\n let i = 1\n const relation = state[x.readUInt32BE(i)]\n i += 4\n const key = x[i] === 75\n handle(key || x[i] === 79\n ? tuples(x, relation.columns, i += 3, transform).row\n : null\n , {\n command: 'delete',\n relation,\n key\n })\n },\n U: x => { // Update\n let i = 1\n const relation = state[x.readUInt32BE(i)]\n i += 4\n const key = x[i] === 75\n const xs = key || x[i] === 79\n ? tuples(x, relation.columns, i += 3, transform)\n : null\n\n xs && (i = xs.i)\n\n const { row } = tuples(x, relation.columns, i + 3, transform)\n\n handle(row, {\n command: 'update',\n relation,\n key,\n old: xs && xs.row\n })\n },\n T: () => { /* noop */ }, // Truncate,\n C: () => { /* noop */ } // Commit\n }).reduce(char, {})[x[0]](x)\n}\n\nfunction tuples(x, columns, xi, transform) {\n let type\n , column\n , value\n\n const row = transform.raw ? new Array(columns.length) : {}\n for (let i = 0; i < columns.length; i++) {\n type = x[xi++]\n column = columns[i]\n value = type === 110 // n\n ? null\n : type === 117 // u\n ? undefined\n : column.parser === undefined\n ? x.toString('utf8', xi + 4, xi += 4 + x.readUInt32BE(xi))\n : column.parser.array === true\n ? column.parser(x.toString('utf8', xi + 5, xi += 4 + x.readUInt32BE(xi)))\n : column.parser(x.toString('utf8', xi + 4, xi += 4 + x.readUInt32BE(xi)))\n\n transform.raw\n ? (row[i] = transform.raw === true\n ? value\n : transform.value.from ? transform.value.from(value, column) : value)\n : (row[column.name] = transform.value.from\n ? transform.value.from(value, column)\n : value\n )\n }\n\n return { i: xi, row: transform.row.from ? transform.row.from(row) : row }\n}\n\nfunction parseEvent(x) {\n const xs = x.match(/^(\\*|insert|update|delete)?:?([^.]+?\\.?[^=]+)?=?(.+)?/i) || []\n\n if (!xs)\n throw new Error('Malformed subscribe pattern: ' + x)\n\n const [, command, path, key] = xs\n\n return (command || '*')\n + (path ? ':' + (path.indexOf('.') === -1 ? 'public.' + path : path) : '')\n + (key ? '=' + key : '')\n}\n","import Stream from 'stream'\n\nexport default function largeObject(sql, oid, mode = 0x00020000 | 0x00040000) {\n return new Promise(async(resolve, reject) => {\n await sql.begin(async sql => {\n let finish\n !oid && ([{ oid }] = await sql`select lo_creat(-1) as oid`)\n const [{ fd }] = await sql`select lo_open(${ oid }, ${ mode }) as fd`\n\n const lo = {\n writable,\n readable,\n close : () => sql`select lo_close(${ fd })`.then(finish),\n tell : () => sql`select lo_tell64(${ fd })`,\n read : (x) => sql`select loread(${ fd }, ${ x }) as data`,\n write : (x) => sql`select lowrite(${ fd }, ${ x })`,\n truncate : (x) => sql`select lo_truncate64(${ fd }, ${ x })`,\n seek : (x, whence = 0) => sql`select lo_lseek64(${ fd }, ${ x }, ${ whence })`,\n size : () => sql`\n select\n lo_lseek64(${ fd }, location, 0) as position,\n seek.size\n from (\n select\n lo_lseek64($1, 0, 2) as size,\n tell.location\n from (select lo_tell64($1) as location) tell\n ) seek\n `\n }\n\n resolve(lo)\n\n return new Promise(async r => finish = r)\n\n async function readable({\n highWaterMark = 2048 * 8,\n start = 0,\n end = Infinity\n } = {}) {\n let max = end - start\n start && await lo.seek(start)\n return new Stream.Readable({\n highWaterMark,\n async read(size) {\n const l = size > max ? size - max : size\n max -= size\n const [{ data }] = await lo.read(l)\n this.push(data)\n if (data.length < size)\n this.push(null)\n }\n })\n }\n\n async function writable({\n highWaterMark = 2048 * 8,\n start = 0\n } = {}) {\n start && await lo.seek(start)\n return new Stream.Writable({\n highWaterMark,\n write(chunk, encoding, callback) {\n lo.write(chunk).then(() => callback(), callback)\n }\n })\n }\n }).catch(reject)\n })\n}\n","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value).constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import { entityKind } from '~/entity.ts';\n\nexport interface Logger {\n\tlogQuery(query: string, params: unknown[]): void;\n}\n\nexport interface LogWriter {\n\twrite(message: string): void;\n}\n\nexport class ConsoleLogWriter implements LogWriter {\n\tstatic readonly [entityKind]: string = 'ConsoleLogWriter';\n\n\twrite(message: string) {\n\t\tconsole.log(message);\n\t}\n}\n\nexport class DefaultLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'DefaultLogger';\n\n\treadonly writer: LogWriter;\n\n\tconstructor(config?: { writer: LogWriter }) {\n\t\tthis.writer = config?.writer ?? new ConsoleLogWriter();\n\t}\n\n\tlogQuery(query: string, params: unknown[]): void {\n\t\tconst stringifiedParams = params.map((p) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(p);\n\t\t\t} catch {\n\t\t\t\treturn String(p);\n\t\t\t}\n\t\t});\n\t\tconst paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(', ')}]` : '';\n\t\tthis.writer.write(`Query: ${query}${paramsStr}`);\n\t}\n}\n\nexport class NoopLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'NoopLogger';\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\n\t[Symbol.toStringTag] = 'QueryPromise';\n\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n\t): Promise<T | TResult> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<T> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tthen<TResult1 = T, TResult2 = never>(\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n\t\tonRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn this.execute().then(onFulfilled, onRejected);\n\t}\n\n\tabstract execute(): Promise<T>;\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\tidentity: undefined | 'always' | 'byDefault';\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { GelColumn, GelExtraConfigColumn } from './gel-core/index.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SingleStoreColumn } from './singlestore-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Assume, Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer'\n\t| 'dateDuration'\n\t| 'duration'\n\t| 'relDuration'\n\t| 'localTime'\n\t| 'localDate'\n\t| 'localDateTime';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common' | 'gel';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tidentity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;\n\tgenerated: T extends { generated: infer G } ? unknown extends G ? undefined\n\t\t: G extends undefined ? undefined\n\t\t: G\n\t\t: undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tidentity: T extends { identity: infer U } ? U : unknown;\n\t\tgenerated: T extends { generated: infer G } ? G extends undefined ? unknown : G : unknown;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {\n\t\ttype: 'always';\n\t}>;\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<\n\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t{},\n\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t>\n\t: TDialect extends 'mysql' ? MySqlColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'mysqlColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'common' ? Column<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'singlestore' ? SingleStoreColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'singlestoreColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'gel' ? GelColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn\n\t: TDialect extends 'gel' ? GelExtraConfigColumn\n\t: never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, {\n\t\t\t_:\n\t\t\t\t& Omit<TConfigMap[Key]['_'], 'name'>\n\t\t\t\t& { name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'] };\n\t\t}, TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'gel' ? GelColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n","/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Simplify, Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tsize: TSize;\n\t\t\tbaseBuilder: T;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size as any);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type PgArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array', 'PgArray'> & {\n\tsize: number | undefined;\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n};\n\nexport class PgArrayBuilder<\n\tT extends PgArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string> | PgArrayColumnBuilderBaseConfig,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t},\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: T['size'],\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'> & {\n\t\tsize: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, {}, { size: T['size']; baseBuilder: T['baseBuilder'] }> {\n\treadonly size: T['size'];\n\n\tstatic override readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { NonArray, Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\n// Enum as ts enum\n\nexport type PgEnumObjectColumnBuilderInitial<TName extends string, TValues extends object> = PgEnumObjectColumnBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgEnumObjectColumn';\n\tdata: TValues[keyof TValues];\n\tenumValues: string[];\n\tdriverParam: string;\n}>;\n\nexport interface PgEnumObject<TValues extends object> {\n\t(): PgEnumObjectColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumObjectColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumObjectColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: string[];\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport class PgEnumObjectColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumObjectColumn'> & { enumValues: string[] },\n> extends PgColumnBuilder<T, { enum: PgEnumObject<any> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumObjectColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnumObject<any>) {\n\t\tsuper(name, 'string', 'PgEnumObjectColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumObjectColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumObjectColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumObjectColumn<T extends ColumnBaseConfig<'string', 'PgEnumObjectColumn'> & { enumValues: object }>\n\textends PgColumn<T, { enum: PgEnumObject<object> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumObjectColumn';\n\n\treadonly enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumObjectColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Enum as string union\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t(): PgEnumColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>>;\n\nexport function pgEnum<E extends Record<string, string>>(\n\tenumName: string,\n\tenumObj: NonArray<E>,\n): PgEnumObject<E>;\n\nexport function pgEnum(\n\tenumName: any,\n\tinput: any,\n): any {\n\treturn Array.isArray(input)\n\t\t? pgEnumWithSchema(enumName, [...input] as [string, ...string[]], undefined)\n\t\t: pgEnumObjectWithSchema(enumName, input, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n\n/** @internal */\nexport function pgEnumObjectWithSchema<T extends object>(\n\tenumName: string,\n\tvalues: T,\n\tschema?: string,\n): PgEnumObject<T> {\n\tconst enumInstance: PgEnumObject<T> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumObjectColumnBuilderInitial<TName, T> =>\n\t\t\tnew PgEnumObjectColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: Object.values(values),\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t\tusedTables?: string[];\n\t};\n\n\tconstructor(sql: SQL, fields: TSelectedFields, alias: string, isWith = false, usedTables: string[] = []) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t\tusedTables,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n","// package.json\nvar version = \"0.45.2\";\n\n// src/version.ts\nvar compatibilityVersion = 10;\nexport {\n compatibilityVersion,\n version as npmVersion\n};\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, unknown>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n\nexport type InferEnum<T> = T extends { enumValues: readonly (infer U)[] } ? U\n\t: never;\n","import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\t/** @internal */\n\tusedTables: string[] = [];\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {\n\t\tfor (const chunk of queryChunks) {\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\n\t\t\t\tthis.usedTables.push(\n\t\t\t\t\tschemaName === undefined\n\t\t\t\t\t\t? chunk[Table.Symbol.Name]\n\t\t\t\t\t\t: schemaName + '.' + chunk[Table.Symbol.Name],\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { Relation } from './relations.ts';\nimport type { View } from './sql/sql.ts';\nimport { SQL, sql } from './sql/sql.ts';\nimport { Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\n\tconstructor(private table: Table | View) {}\n\n\tget(columnObj: TColumn, prop: string | symbol): any {\n\t\tif (prop === 'table') {\n\t\t\treturn this.table;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === Table.Symbol.IsAlias) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Name) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...target[ViewBaseConfig as keyof typeof target],\n\t\t\t\tname: this.alias,\n\t\t\t\tisAlias: true,\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) {\n\t\t\t\treturn columns;\n\t\t\t}\n\n\t\t\tconst proxiedColumns: { [key: string]: any } = {};\n\n\t\t\tObject.keys(columns).map((key) => {\n\t\t\t\tproxiedColumns[key] = new Proxy(\n\t\t\t\t\tcolumns[key]!,\n\t\t\t\t\tnew ColumnAliasProxyHandler(new Proxy(target, this)),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn proxiedColumns;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (is(value, Column)) {\n\t\t\treturn new Proxy(value as AnyColumn, new ColumnAliasProxyHandler(new Proxy(target, this)));\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === 'sourceTable') {\n\t\t\treturn aliasedTable(target.sourceTable, this.alias);\n\t\t}\n\n\t\treturn target[prop as keyof typeof target];\n\t}\n}\n\nexport function aliasedTable<T extends Table | View>(\n\ttable: T,\n\ttableAlias: string,\n): T {\n\treturn new Proxy(table, new TableAliasProxyHandler(tableAlias, false)) as any;\n}\n\nexport function aliasedRelation<T extends Relation>(relation: T, tableAlias: string): T {\n\treturn new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\n\nexport function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {\n\treturn new Proxy(\n\t\tcolumn,\n\t\tnew ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))),\n\t);\n}\n\nexport function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {\n\treturn new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\n\nexport function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {\n\treturn sql.join(query.queryChunks.map((c) => {\n\t\tif (is(c, Column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (is(c, SQL)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (is(c, SQL.Aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n","import { ColumnAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { SQL, View } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class SelectionProxyHandler<T extends Subquery | Record<string, unknown> | View>\n\timplements ProxyHandler<Subquery | Record<string, unknown> | View>\n{\n\tstatic readonly [entityKind]: string = 'SelectionProxyHandler';\n\n\tprivate config: {\n\t\t/**\n\t\t * Table alias for the columns\n\t\t */\n\t\talias?: string;\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL.Aliased` and it's not a selection field (from a subquery)\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `alias` - return the field alias\n\t\t */\n\t\tsqlAliasedBehavior: 'sql' | 'alias';\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL` and it doesn't have an alias declared\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `error` - return a DrizzleTypeError on type level and throw an error on runtime\n\t\t */\n\t\tsqlBehavior: 'sql' | 'error';\n\n\t\t/**\n\t\t * Whether to replace the original name of the column with the alias\n\t\t * Should be set to `true` for views creation\n\t\t * @default false\n\t\t */\n\t\treplaceOriginalName?: boolean;\n\t};\n\n\tconstructor(config: SelectionProxyHandler<T>['config']) {\n\t\tthis.config = { ...config };\n\t}\n\n\tget(subquery: T, prop: string | symbol): any {\n\t\tif (prop === '_') {\n\t\t\treturn {\n\t\t\t\t...subquery['_' as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as Subquery)._.selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...subquery[ViewBaseConfig as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as View)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof prop === 'symbol') {\n\t\t\treturn subquery[prop as keyof typeof subquery];\n\t\t}\n\n\t\tconst columns = is(subquery, Subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: is(subquery, View)\n\t\t\t? subquery[ViewBaseConfig].selectedFields\n\t\t\t: subquery;\n\t\tconst value: unknown = columns[prop as keyof typeof columns];\n\n\t\tif (is(value, SQL.Aliased)) {\n\t\t\t// Never return the underlying SQL expression for a field previously selected in a subquery\n\t\t\tif (this.config.sqlAliasedBehavior === 'sql' && !value.isSelectionField) {\n\t\t\t\treturn value.sql;\n\t\t\t}\n\n\t\t\tconst newValue = value.clone();\n\t\t\tnewValue.isSelectionField = true;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (is(value, SQL)) {\n\t\t\tif (this.config.sqlBehavior === 'sql') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`,\n\t\t\t);\n\t\t}\n\n\t\tif (is(value, Column)) {\n\t\t\tif (this.config.alias) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tvalue,\n\t\t\t\t\tnew ColumnAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\t\tvalue.table,\n\t\t\t\t\t\t\tnew TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Proxy(value, new SelectionProxyHandler(this.config));\n\t}\n}\n","import type { Cache } from './cache/core/cache.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tdecoder = field._.sql.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased) || is(field, Subquery)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type Not<T extends boolean> = T extends true ? false : true;\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false\n\t: true;\n\nexport type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: T;\n\nexport type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: Result;\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport type NonArray<T> = T extends any[] ? never : T;\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport type Casing = 'snake_case' | 'camelCase';\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n\tcasing?: Casing;\n\tcache?: Cache;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t};\n\tschema?: Record<string, never>;\n\tcasing?: 'snake_case' | 'camelCase';\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['schema'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('casing' in data) {\n\t\tconst type = typeof data['casing'];\n\t\tif (type !== 'string' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('mode' in data) {\n\t\tif (data['mode'] !== 'default' || data['mode'] !== 'planetscale' || data['mode'] !== undefined) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n\nexport const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();\n","import type { ColumnBuilderBaseConfig, ColumnDataType, GeneratedIdentityConfig, IsIdentity } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgSequenceOptions } from '../sequence.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgIntColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumnBuilder<\n\tT,\n\t{ generatedIdentity: GeneratedIdentityConfig }\n> {\n\tstatic override readonly [entityKind]: string = 'PgIntColumnBaseBuilder';\n\n\tgeneratedAlwaysAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'always'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'always',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'always'>;\n\t}\n\n\tgeneratedByDefaultAsIdentity(\n\t\tsequence?: PgSequenceOptions & { name?: string },\n\t): IsIdentity<this, 'byDefault'> {\n\t\tif (sequence) {\n\t\t\tconst { name, ...options } = sequence;\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t\tsequenceName: name,\n\t\t\t\tsequenceOptions: options,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.config.generatedIdentity = {\n\t\t\t\ttype: 'byDefault',\n\t\t\t};\n\t\t}\n\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\n\t\treturn this as IsIdentity<this, 'byDefault'>;\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgBigInt53BuilderInitial<TName extends string> = PgBigInt53Builder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgBigInt53';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgBigInt53Builder<T extends ColumnBuilderBaseConfig<'number', 'PgBigInt53'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigInt53Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgBigInt53');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigInt53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigInt53<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgBigInt53<T extends ColumnBaseConfig<'number', 'PgBigInt53'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type PgBigInt64BuilderInitial<TName extends string> = PgBigInt64Builder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'PgBigInt64';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgBigInt64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'PgBigInt64'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigInt64Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'PgBigInt64');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigInt64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigInt64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigInt64<T extends ColumnBaseConfig<'bigint', 'PgBigInt64'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigInt64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigint';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface PgBigIntConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigint<TMode extends PgBigIntConfig['mode']>(\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'number' ? PgBigInt53BuilderInitial<''> : PgBigInt64BuilderInitial<''>;\nexport function bigint<TName extends string, TMode extends PgBigIntConfig['mode']>(\n\tname: TName,\n\tconfig: PgBigIntConfig<TMode>,\n): TMode extends 'number' ? PgBigInt53BuilderInitial<TName> : PgBigInt64BuilderInitial<TName>;\nexport function bigint(a: string | PgBigIntConfig, b?: PgBigIntConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigIntConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigInt53Builder(name);\n\t}\n\treturn new PgBigInt64Builder(name);\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgBigSerial53BuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgBigSerial53Builder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgBigSerial53';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgBigSerial53Builder<T extends ColumnBuilderBaseConfig<'number', 'PgBigSerial53'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number', 'PgBigSerial53');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigSerial53<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigSerial53<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial53<T extends ColumnBaseConfig<'number', 'PgBigSerial53'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial53';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\toverride mapFromDriverValue(value: number): number {\n\t\tif (typeof value === 'number') {\n\t\t\treturn value;\n\t\t}\n\t\treturn Number(value);\n\t}\n}\n\nexport type PgBigSerial64BuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgBigSerial64Builder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'bigint';\n\t\t\tcolumnType: 'PgBigSerial64';\n\t\t\tdata: bigint;\n\t\t\tdriverParam: string;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgBigSerial64Builder<T extends ColumnBuilderBaseConfig<'bigint', 'PgBigSerial64'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64Builder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint', 'PgBigSerial64');\n\t\tthis.config.hasDefault = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBigSerial64<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBigSerial64<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBigSerial64<T extends ColumnBaseConfig<'bigint', 'PgBigSerial64'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBigSerial64';\n\n\tgetSQLType(): string {\n\t\treturn 'bigserial';\n\t}\n\n\t// eslint-disable-next-line unicorn/prefer-native-coercion-functions\n\toverride mapFromDriverValue(value: string): bigint {\n\t\treturn BigInt(value);\n\t}\n}\n\nexport interface PgBigSerialConfig<T extends 'number' | 'bigint' = 'number' | 'bigint'> {\n\tmode: T;\n}\n\nexport function bigserial<TMode extends PgBigSerialConfig['mode']>(\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53BuilderInitial<''> : PgBigSerial64BuilderInitial<''>;\nexport function bigserial<TName extends string, TMode extends PgBigSerialConfig['mode']>(\n\tname: TName,\n\tconfig: PgBigSerialConfig<TMode>,\n): TMode extends 'number' ? PgBigSerial53BuilderInitial<TName> : PgBigSerial64BuilderInitial<TName>;\nexport function bigserial(a: string | PgBigSerialConfig, b?: PgBigSerialConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBigSerialConfig>(a, b);\n\tif (config.mode === 'number') {\n\t\treturn new PgBigSerial53Builder(name);\n\t}\n\treturn new PgBigSerial64Builder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgBooleanBuilderInitial<TName extends string> = PgBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'PgBoolean';\n\tdata: boolean;\n\tdriverParam: boolean;\n\tenumValues: undefined;\n}>;\n\nexport class PgBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'PgBoolean'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgBooleanBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'boolean', 'PgBoolean');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgBoolean<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgBoolean<T extends ColumnBaseConfig<'boolean', 'PgBoolean'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgBoolean';\n\n\tgetSQLType(): string {\n\t\treturn 'boolean';\n\t}\n}\n\nexport function boolean(): PgBooleanBuilderInitial<''>;\nexport function boolean<TName extends string>(name: TName): PgBooleanBuilderInitial<TName>;\nexport function boolean(name?: string) {\n\treturn new PgBooleanBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgCharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = PgCharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgChar';\n\tdata: TEnum[number];\n\tenumValues: TEnum;\n\tdriverParam: string;\n\tlength: TLength;\n}>;\n\nexport class PgCharBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ length: T['length']; enumValues: T['enumValues'] },\n\t\t{ length: T['length'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgCharBuilder';\n\n\tconstructor(name: T['name'], config: PgCharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'PgChar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new PgChar<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgChar<T extends ColumnBaseConfig<'string', 'PgChar'> & { length?: number | undefined }>\n\textends PgColumn<T, { length: T['length']; enumValues: T['enumValues'] }, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgChar';\n\n\treadonly length = this.config.length;\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `char` : `char(${this.length})`;\n\t}\n}\n\nexport interface PgCharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function char(): PgCharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function char<U extends string, T extends Readonly<[U, ...U[]]>, L extends number | undefined>(\n\tconfig?: PgCharConfig<T | Writable<T>, L>,\n): PgCharBuilderInitial<'', Writable<T>, L>;\nexport function char<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: PgCharConfig<T | Writable<T>, L>,\n): PgCharBuilderInitial<TName, Writable<T>, L>;\nexport function char(a?: string | PgCharConfig, b: PgCharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgCharConfig>(a, b);\n\treturn new PgCharBuilder(name, config as any);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgCidrBuilderInitial<TName extends string> = PgCidrBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgCidr';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgCidrBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgCidr'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgCidrBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgCidr');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgCidr<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgCidr<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgCidr<T extends ColumnBaseConfig<'string', 'PgCidr'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgCidr';\n\n\tgetSQLType(): string {\n\t\treturn 'cidr';\n\t}\n}\n\nexport function cidr(): PgCidrBuilderInitial<''>;\nexport function cidr<TName extends string>(name: TName): PgCidrBuilderInitial<TName>;\nexport function cidr(name?: string) {\n\treturn new PgCidrBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'PgCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface PgCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class PgCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'PgCustomColumn'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tpgColumnBuilderBrand: 'PgCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'PgCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgCustomColumn<T extends ColumnBaseConfig<'custom', 'PgCustomColumn'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom pg database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): PgCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new PgCustomColumnBuilder(name as ConvertCustomConfig<TName, T>['name'], config, customTypeParams);\n\t};\n}\n","import type { ColumnBuilderBaseConfig, ColumnDataType } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumnBuilder } from './common.ts';\n\nexport abstract class PgDateColumnBaseBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends PgColumnBuilder<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'PgDateColumnBaseBuilder';\n\n\tdefaultNow() {\n\t\treturn this.default(sql`now()`);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\n\nexport type PgDateBuilderInitial<TName extends string> = PgDateBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'PgDate';\n\tdata: Date;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgDateBuilder<T extends ColumnBuilderBaseConfig<'date', 'PgDate'>> extends PgDateColumnBaseBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgDateBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'date', 'PgDate');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDate<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDate<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgDate<T extends ColumnBaseConfig<'date', 'PgDate'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDate';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: string | Date): Date {\n\t\tif (typeof value === 'string') return new Date(value);\n\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: Date): string {\n\t\treturn value.toISOString();\n\t}\n}\n\nexport type PgDateStringBuilderInitial<TName extends string> = PgDateStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgDateString';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgDateStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgDateString'>>\n\textends PgDateColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgDateStringBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgDateString');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDateString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDateString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgDateString<T extends ColumnBaseConfig<'string', 'PgDateString'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDateString';\n\n\tgetSQLType(): string {\n\t\treturn 'date';\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn value.toISOString().slice(0, -14);\n\t}\n}\n\nexport interface PgDateConfig<T extends 'date' | 'string' = 'date' | 'string'> {\n\tmode: T;\n}\n\nexport function date(): PgDateStringBuilderInitial<''>;\nexport function date<TMode extends PgDateConfig['mode'] & {}>(\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilderInitial<''> : PgDateStringBuilderInitial<''>;\nexport function date<TName extends string, TMode extends PgDateConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgDateConfig<TMode>,\n): Equal<TMode, 'date'> extends true ? PgDateBuilderInitial<TName> : PgDateStringBuilderInitial<TName>;\nexport function date(a?: string | PgDateConfig, b?: PgDateConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgDateConfig>(a, b);\n\tif (config?.mode === 'date') {\n\t\treturn new PgDateBuilder(name);\n\t}\n\treturn new PgDateStringBuilder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgDoublePrecisionBuilderInitial<TName extends string> = PgDoublePrecisionBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgDoublePrecision';\n\tdata: number;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class PgDoublePrecisionBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgDoublePrecision'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecisionBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgDoublePrecision');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgDoublePrecision<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgDoublePrecision<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgDoublePrecision<T extends ColumnBaseConfig<'number', 'PgDoublePrecision'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgDoublePrecision';\n\n\tgetSQLType(): string {\n\t\treturn 'double precision';\n\t}\n\n\toverride mapFromDriverValue(value: string | number): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function doublePrecision(): PgDoublePrecisionBuilderInitial<''>;\nexport function doublePrecision<TName extends string>(name: TName): PgDoublePrecisionBuilderInitial<TName>;\nexport function doublePrecision(name?: string) {\n\treturn new PgDoublePrecisionBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgInetBuilderInitial<TName extends string> = PgInetBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgInet';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgInetBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgInet'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgInetBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgInet');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInet<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInet<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInet<T extends ColumnBaseConfig<'string', 'PgInet'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgInet';\n\n\tgetSQLType(): string {\n\t\treturn 'inet';\n\t}\n}\n\nexport function inet(): PgInetBuilderInitial<''>;\nexport function inet<TName extends string>(name: TName): PgInetBuilderInitial<TName>;\nexport function inet(name?: string) {\n\treturn new PgInetBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgIntegerBuilderInitial<TName extends string> = PgIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgInteger';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgInteger'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgInteger');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInteger<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInteger<T extends ColumnBaseConfig<'number', 'PgInteger'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgInteger';\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n\n\toverride mapFromDriverValue(value: number | string): number {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseInt(value);\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function integer(): PgIntegerBuilderInitial<''>;\nexport function integer<TName extends string>(name: TName): PgIntegerBuilderInitial<TName>;\nexport function integer(name?: string) {\n\treturn new PgIntegerBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport type PgIntervalBuilderInitial<TName extends string> = PgIntervalBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgInterval';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgIntervalBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgInterval'>>\n\textends PgColumnBuilder<T, { intervalConfig: IntervalConfig }>\n{\n\tstatic override readonly [entityKind]: string = 'PgIntervalBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tintervalConfig: IntervalConfig,\n\t) {\n\t\tsuper(name, 'string', 'PgInterval');\n\t\tthis.config.intervalConfig = intervalConfig;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgInterval<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgInterval<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgInterval<T extends ColumnBaseConfig<'string', 'PgInterval'>>\n\textends PgColumn<T, { intervalConfig: IntervalConfig }>\n{\n\tstatic override readonly [entityKind]: string = 'PgInterval';\n\n\treadonly fields: IntervalConfig['fields'] = this.config.intervalConfig.fields;\n\treadonly precision: IntervalConfig['precision'] = this.config.intervalConfig.precision;\n\n\tgetSQLType(): string {\n\t\tconst fields = this.fields ? ` ${this.fields}` : '';\n\t\tconst precision = this.precision ? `(${this.precision})` : '';\n\t\treturn `interval${fields}${precision}`;\n\t}\n}\n\nexport interface IntervalConfig {\n\tfields?:\n\t\t| 'year'\n\t\t| 'month'\n\t\t| 'day'\n\t\t| 'hour'\n\t\t| 'minute'\n\t\t| 'second'\n\t\t| 'year to month'\n\t\t| 'day to hour'\n\t\t| 'day to minute'\n\t\t| 'day to second'\n\t\t| 'hour to minute'\n\t\t| 'hour to second'\n\t\t| 'minute to second';\n\tprecision?: Precision;\n}\n\nexport function interval(): PgIntervalBuilderInitial<''>;\nexport function interval(\n\tconfig?: IntervalConfig,\n): PgIntervalBuilderInitial<''>;\nexport function interval<TName extends string>(\n\tname: TName,\n\tconfig?: IntervalConfig,\n): PgIntervalBuilderInitial<TName>;\nexport function interval(a?: string | IntervalConfig, b: IntervalConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<IntervalConfig>(a, b);\n\treturn new PgIntervalBuilder(name, config);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgJsonBuilderInitial<TName extends string> = PgJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgJson';\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: undefined;\n}>;\n\nexport class PgJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgJson'>> extends PgColumnBuilder<\n\tT\n> {\n\tstatic override readonly [entityKind]: string = 'PgJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgJson<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgJson<T extends ColumnBaseConfig<'json', 'PgJson'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgJson';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'json';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: T['data'] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value as T['data'];\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function json(): PgJsonBuilderInitial<''>;\nexport function json<TName extends string>(name: TName): PgJsonBuilderInitial<TName>;\nexport function json(name?: string) {\n\treturn new PgJsonBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgJsonbBuilderInitial<TName extends string> = PgJsonbBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgJsonb';\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: undefined;\n}>;\n\nexport class PgJsonbBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgJsonb'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgJsonbBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgJsonb');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgJsonb<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgJsonb<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgJsonb<T extends ColumnBaseConfig<'json', 'PgJsonb'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgJsonb';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgJsonbBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'jsonb';\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: T['data'] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(value);\n\t\t\t} catch {\n\t\t\t\treturn value as T['data'];\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t}\n}\n\nexport function jsonb(): PgJsonbBuilderInitial<''>;\nexport function jsonb<TName extends string>(name: TName): PgJsonbBuilderInitial<TName>;\nexport function jsonb(name?: string) {\n\treturn new PgJsonbBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgLineBuilderInitial<TName extends string> = PgLineBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgLine';\n\tdata: [number, number, number];\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgLineBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgLine'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'array', 'PgLine');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgLineTuple<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgLineTuple<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgLineTuple<T extends ColumnBaseConfig<'array', 'PgLine'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgLine';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): [number, number, number] {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn [Number.parseFloat(a!), Number.parseFloat(b!), Number.parseFloat(c!)];\n\t}\n\n\toverride mapToDriverValue(value: [number, number, number]): string {\n\t\treturn `{${value[0]},${value[1]},${value[2]}}`;\n\t}\n}\n\nexport type PgLineABCBuilderInitial<TName extends string> = PgLineABCBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgLineABC';\n\tdata: { a: number; b: number; c: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgLineABCBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgLineABC'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineABCBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgLineABC');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgLineABC<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgLineABC<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgLineABC<T extends ColumnBaseConfig<'json', 'PgLineABC'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgLineABC';\n\n\tgetSQLType(): string {\n\t\treturn 'line';\n\t}\n\n\toverride mapFromDriverValue(value: string): { a: number; b: number; c: number } {\n\t\tconst [a, b, c] = value.slice(1, -1).split(',');\n\t\treturn { a: Number.parseFloat(a!), b: Number.parseFloat(b!), c: Number.parseFloat(c!) };\n\t}\n\n\toverride mapToDriverValue(value: { a: number; b: number; c: number }): string {\n\t\treturn `{${value.a},${value.b},${value.c}}`;\n\t}\n}\n\nexport interface PgLineTypeConfig<T extends 'tuple' | 'abc' = 'tuple' | 'abc'> {\n\tmode?: T;\n}\n\nexport function line(): PgLineBuilderInitial<''>;\nexport function line<TMode extends PgLineTypeConfig['mode'] & {}>(\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilderInitial<''>\n\t: PgLineBuilderInitial<''>;\nexport function line<TName extends string, TMode extends PgLineTypeConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgLineTypeConfig<TMode>,\n): Equal<TMode, 'abc'> extends true ? PgLineABCBuilderInitial<TName>\n\t: PgLineBuilderInitial<TName>;\nexport function line(a?: string | PgLineTypeConfig, b?: PgLineTypeConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgLineTypeConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgLineBuilder(name);\n\t}\n\treturn new PgLineABCBuilder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgMacaddrBuilderInitial<TName extends string> = PgMacaddrBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgMacaddr';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgMacaddrBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgMacaddr'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddrBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgMacaddr');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgMacaddr<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgMacaddr<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgMacaddr<T extends ColumnBaseConfig<'string', 'PgMacaddr'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr';\n\t}\n}\n\nexport function macaddr(): PgMacaddrBuilderInitial<''>;\nexport function macaddr<TName extends string>(name: TName): PgMacaddrBuilderInitial<TName>;\nexport function macaddr(name?: string) {\n\treturn new PgMacaddrBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '../table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgMacaddr8BuilderInitial<TName extends string> = PgMacaddr8Builder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgMacaddr8';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgMacaddr8Builder<T extends ColumnBuilderBaseConfig<'string', 'PgMacaddr8'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8Builder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgMacaddr8');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgMacaddr8<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgMacaddr8<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgMacaddr8<T extends ColumnBaseConfig<'string', 'PgMacaddr8'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgMacaddr8';\n\n\tgetSQLType(): string {\n\t\treturn 'macaddr8';\n\t}\n}\n\nexport function macaddr8(): PgMacaddr8BuilderInitial<''>;\nexport function macaddr8<TName extends string>(name: TName): PgMacaddr8BuilderInitial<TName>;\nexport function macaddr8(name?: string) {\n\treturn new PgMacaddr8Builder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgNumericBuilderInitial<TName extends string> = PgNumericBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgNumeric';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgNumeric'>> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tprecision: number | undefined;\n\t\tscale: number | undefined;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'string', 'PgNumeric');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumeric<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumeric<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgNumeric<T extends ColumnBaseConfig<'string', 'PgNumeric'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumeric';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\treturn String(value);\n\t}\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericNumberBuilderInitial<TName extends string> = PgNumericNumberBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgNumericNumber';\n\tdata: number;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericNumberBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgNumericNumber'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tprecision: number | undefined;\n\t\t\tscale: number | undefined;\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgNumericNumberBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'number', 'PgNumericNumber');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumericNumber<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumericNumber<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgNumericNumber<T extends ColumnBaseConfig<'number', 'PgNumericNumber'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumericNumber';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericNumberBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue(value: unknown): number {\n\t\tif (typeof value === 'number') return value;\n\n\t\treturn Number(value);\n\t}\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericBigIntBuilderInitial<TName extends string> = PgNumericBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'PgNumericBigInt';\n\tdata: bigint;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgNumericBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'PgNumericBigInt'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tprecision: number | undefined;\n\t\t\tscale: number | undefined;\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgNumericBigIntBuilder';\n\n\tconstructor(name: T['name'], precision?: number, scale?: number) {\n\t\tsuper(name, 'bigint', 'PgNumericBigInt');\n\t\tthis.config.precision = precision;\n\t\tthis.config.scale = scale;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgNumericBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgNumericBigInt<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgNumericBigInt<T extends ColumnBaseConfig<'bigint', 'PgNumericBigInt'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgNumericBigInt';\n\n\treadonly precision: number | undefined;\n\treadonly scale: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgNumericBigIntBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.precision = config.precision;\n\t\tthis.scale = config.scale;\n\t}\n\n\toverride mapFromDriverValue = BigInt;\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\tif (this.precision !== undefined && this.scale !== undefined) {\n\t\t\treturn `numeric(${this.precision}, ${this.scale})`;\n\t\t} else if (this.precision === undefined) {\n\t\t\treturn 'numeric';\n\t\t} else {\n\t\t\treturn `numeric(${this.precision})`;\n\t\t}\n\t}\n}\n\nexport type PgNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> =\n\t| { precision: number; scale?: number; mode?: T }\n\t| { precision?: number; scale: number; mode?: T }\n\t| { precision?: number; scale?: number; mode: T };\n\nexport function numeric<TMode extends 'string' | 'number' | 'bigint'>(\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilderInitial<''>\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilderInitial<''>\n\t: PgNumericBuilderInitial<''>;\nexport function numeric<TName extends string, TMode extends 'string' | 'number' | 'bigint'>(\n\tname: TName,\n\tconfig?: PgNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? PgNumericNumberBuilderInitial<TName>\n\t: Equal<TMode, 'bigint'> extends true ? PgNumericBigIntBuilderInitial<TName>\n\t: PgNumericBuilderInitial<TName>;\nexport function numeric(a?: string | PgNumericConfig, b?: PgNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new PgNumericNumberBuilder(name, config?.precision, config?.scale)\n\t\t: mode === 'bigint'\n\t\t? new PgNumericBigIntBuilder(name, config?.precision, config?.scale)\n\t\t: new PgNumericBuilder(name, config?.precision, config?.scale);\n}\n\nexport const decimal = numeric;\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgPointTupleBuilderInitial<TName extends string> = PgPointTupleBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgPointTuple';\n\tdata: [number, number];\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgPointTupleBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgPointTuple'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgPointTupleBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'array', 'PgPointTuple');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgPointTuple<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgPointTuple<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgPointTuple<T extends ColumnBaseConfig<'array', 'PgPointTuple'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgPointTuple';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): [number, number] {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn [Number.parseFloat(x!), Number.parseFloat(y!)];\n\t\t}\n\t\treturn [value.x, value.y];\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `(${value[0]},${value[1]})`;\n\t}\n}\n\nexport type PgPointObjectBuilderInitial<TName extends string> = PgPointObjectBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgPointObject';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgPointObjectBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgPointObject'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgPointObjectBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'json', 'PgPointObject');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgPointObject<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgPointObject<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgPointObject<T extends ColumnBaseConfig<'json', 'PgPointObject'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgPointObject';\n\n\tgetSQLType(): string {\n\t\treturn 'point';\n\t}\n\n\toverride mapFromDriverValue(value: string | { x: number; y: number }): { x: number; y: number } {\n\t\tif (typeof value === 'string') {\n\t\t\tconst [x, y] = value.slice(1, -1).split(',');\n\t\t\treturn { x: Number.parseFloat(x!), y: Number.parseFloat(y!) };\n\t\t}\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `(${value.x},${value.y})`;\n\t}\n}\n\nexport interface PgPointConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n}\n\nexport function point(): PgPointTupleBuilderInitial<''>;\nexport function point<TMode extends PgPointConfig['mode'] & {}>(\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilderInitial<''>\n\t: PgPointTupleBuilderInitial<''>;\nexport function point<TName extends string, TMode extends PgPointConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgPointConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgPointObjectBuilderInitial<TName>\n\t: PgPointTupleBuilderInitial<TName>;\nexport function point(a?: string | PgPointConfig, b?: PgPointConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgPointConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgPointTupleBuilder(name);\n\t}\n\treturn new PgPointObjectBuilder(name);\n}\n","function hexToBytes(hex: string): Uint8Array {\n\tconst bytes: number[] = [];\n\tfor (let c = 0; c < hex.length; c += 2) {\n\t\tbytes.push(Number.parseInt(hex.slice(c, c + 2), 16));\n\t}\n\treturn new Uint8Array(bytes);\n}\n\nfunction bytesToFloat64(bytes: Uint8Array, offset: number): number {\n\tconst buffer = new ArrayBuffer(8);\n\tconst view = new DataView(buffer);\n\tfor (let i = 0; i < 8; i++) {\n\t\tview.setUint8(i, bytes[offset + i]!);\n\t}\n\treturn view.getFloat64(0, true);\n}\n\nexport function parseEWKB(hex: string): [number, number] {\n\tconst bytes = hexToBytes(hex);\n\n\tlet offset = 0;\n\n\t// Byte order: 1 is little-endian, 0 is big-endian\n\tconst byteOrder = bytes[offset];\n\toffset += 1;\n\n\tconst view = new DataView(bytes.buffer);\n\tconst geomType = view.getUint32(offset, byteOrder === 1);\n\toffset += 4;\n\n\tlet _srid: number | undefined;\n\tif (geomType & 0x20000000) { // SRID flag\n\t\t_srid = view.getUint32(offset, byteOrder === 1);\n\t\toffset += 4;\n\t}\n\n\tif ((geomType & 0xFFFF) === 1) {\n\t\tconst x = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\t\tconst y = bytesToFloat64(bytes, offset);\n\t\toffset += 8;\n\n\t\treturn [x, y];\n\t}\n\n\tthrow new Error('Unsupported geometry type');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\n\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\nimport { parseEWKB } from './utils.ts';\n\nexport type PgGeometryBuilderInitial<TName extends string> = PgGeometryBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgGeometry';\n\tdata: [number, number];\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgGeometryBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgGeometry'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'array', 'PgGeometry');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgGeometry<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgGeometry<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgGeometry<T extends ColumnBaseConfig<'array', 'PgGeometry'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometry';\n\n\tgetSQLType(): string {\n\t\treturn 'geometry(point)';\n\t}\n\n\toverride mapFromDriverValue(value: string): [number, number] {\n\t\treturn parseEWKB(value);\n\t}\n\n\toverride mapToDriverValue(value: [number, number]): string {\n\t\treturn `point(${value[0]} ${value[1]})`;\n\t}\n}\n\nexport type PgGeometryObjectBuilderInitial<TName extends string> = PgGeometryObjectBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'PgGeometryObject';\n\tdata: { x: number; y: number };\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgGeometryObjectBuilder<T extends ColumnBuilderBaseConfig<'json', 'PgGeometryObject'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgGeometryObjectBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'PgGeometryObject');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgGeometryObject<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgGeometryObject<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgGeometryObject<T extends ColumnBaseConfig<'json', 'PgGeometryObject'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgGeometryObject';\n\n\tgetSQLType(): string {\n\t\treturn 'geometry(point)';\n\t}\n\n\toverride mapFromDriverValue(value: string): { x: number; y: number } {\n\t\tconst parsed = parseEWKB(value);\n\t\treturn { x: parsed[0], y: parsed[1] };\n\t}\n\n\toverride mapToDriverValue(value: { x: number; y: number }): string {\n\t\treturn `point(${value.x} ${value.y})`;\n\t}\n}\n\nexport interface PgGeometryConfig<T extends 'tuple' | 'xy' = 'tuple' | 'xy'> {\n\tmode?: T;\n\ttype?: 'point' | (string & {});\n\tsrid?: number;\n}\n\nexport function geometry(): PgGeometryBuilderInitial<''>;\nexport function geometry<TMode extends PgGeometryConfig['mode'] & {}>(\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilderInitial<''> : PgGeometryBuilderInitial<''>;\nexport function geometry<TName extends string, TMode extends PgGeometryConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgGeometryConfig<TMode>,\n): Equal<TMode, 'xy'> extends true ? PgGeometryObjectBuilderInitial<TName> : PgGeometryBuilderInitial<TName>;\nexport function geometry(a?: string | PgGeometryConfig, b?: PgGeometryConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgGeometryConfig>(a, b);\n\tif (!config?.mode || config.mode === 'tuple') {\n\t\treturn new PgGeometryBuilder(name);\n\t}\n\treturn new PgGeometryObjectBuilder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgRealBuilderInitial<TName extends string> = PgRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgReal';\n\tdata: number;\n\tdriverParam: string | number;\n\tenumValues: undefined;\n}>;\n\nexport class PgRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgReal'>> extends PgColumnBuilder<\n\tT,\n\t{ length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgRealBuilder';\n\n\tconstructor(name: T['name'], length?: number) {\n\t\tsuper(name, 'number', 'PgReal');\n\t\tthis.config.length = length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgReal<T extends ColumnBaseConfig<'number', 'PgReal'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgReal';\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgRealBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n\n\toverride mapFromDriverValue = (value: string | number): number => {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number.parseFloat(value);\n\t\t}\n\t\treturn value;\n\t};\n}\n\nexport function real(): PgRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): PgRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new PgRealBuilder(name ?? '');\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgSerialBuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgSerialBuilder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgSerial';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSerial'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSerial<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgSerial<T extends ColumnBaseConfig<'number', 'PgSerial'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'serial';\n\t}\n}\n\nexport function serial(): PgSerialBuilderInitial<''>;\nexport function serial<TName extends string>(name: TName): PgSerialBuilderInitial<TName>;\nexport function serial(name?: string) {\n\treturn new PgSerialBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn } from './common.ts';\nimport { PgIntColumnBaseBuilder } from './int.common.ts';\n\nexport type PgSmallIntBuilderInitial<TName extends string> = PgSmallIntBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'PgSmallInt';\n\tdata: number;\n\tdriverParam: number | string;\n\tenumValues: undefined;\n}>;\n\nexport class PgSmallIntBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSmallInt'>>\n\textends PgIntColumnBaseBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgSmallIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSmallInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSmallInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSmallInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgSmallInt<T extends ColumnBaseConfig<'number', 'PgSmallInt'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSmallInt';\n\n\tgetSQLType(): string {\n\t\treturn 'smallint';\n\t}\n\n\toverride mapFromDriverValue = (value: number | string): number => {\n\t\tif (typeof value === 'string') {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn value;\n\t};\n}\n\nexport function smallint(): PgSmallIntBuilderInitial<''>;\nexport function smallint<TName extends string>(name: TName): PgSmallIntBuilderInitial<TName>;\nexport function smallint(name?: string) {\n\treturn new PgSmallIntBuilder(name ?? '');\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tHasDefault,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgSmallSerialBuilderInitial<TName extends string> = NotNull<\n\tHasDefault<\n\t\tPgSmallSerialBuilder<{\n\t\t\tname: TName;\n\t\t\tdataType: 'number';\n\t\t\tcolumnType: 'PgSmallSerial';\n\t\t\tdata: number;\n\t\t\tdriverParam: number;\n\t\t\tenumValues: undefined;\n\t\t}>\n\t>\n>;\n\nexport class PgSmallSerialBuilder<T extends ColumnBuilderBaseConfig<'number', 'PgSmallSerial'>>\n\textends PgColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'PgSmallSerialBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'PgSmallSerial');\n\t\tthis.config.hasDefault = true;\n\t\tthis.config.notNull = true;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSmallSerial<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSmallSerial<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgSmallSerial<T extends ColumnBaseConfig<'number', 'PgSmallSerial'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgSmallSerial';\n\n\tgetSQLType(): string {\n\t\treturn 'smallserial';\n\t}\n}\n\nexport function smallserial(): PgSmallSerialBuilderInitial<''>;\nexport function smallserial<TName extends string>(name: TName): PgSmallSerialBuilderInitial<TName>;\nexport function smallserial(name?: string) {\n\treturn new PgSmallSerialBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgTextBuilderInitial<TName extends string, TEnum extends [string, ...string[]]> = PgTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgText';\n\tdata: TEnum[number];\n\tenumValues: TEnum;\n\tdriverParam: string;\n}>;\n\nexport class PgTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgText'>,\n> extends PgColumnBuilder<T, { enumValues: T['enumValues'] }> {\n\tstatic override readonly [entityKind]: string = 'PgTextBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tconfig: PgTextConfig<T['enumValues']>,\n\t) {\n\t\tsuper(name, 'string', 'PgText');\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgText<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgText<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgText<T extends ColumnBaseConfig<'string', 'PgText'>>\n\textends PgColumn<T, { enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n}\n\nexport interface PgTextConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n> {\n\tenum?: TEnum;\n}\n\nexport function text(): PgTextBuilderInitial<'', [string, ...string[]]>;\nexport function text<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tconfig?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<'', Writable<T>>;\nexport function text<TName extends string, U extends string, T extends Readonly<[U, ...U[]]>>(\n\tname: TName,\n\tconfig?: PgTextConfig<T | Writable<T>>,\n): PgTextBuilderInitial<TName, Writable<T>>;\nexport function text(a?: string | PgTextConfig, b: PgTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgTextConfig>(a, b);\n\treturn new PgTextBuilder(name, config as any);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\nimport type { Precision } from './timestamp.ts';\n\nexport type PgTimeBuilderInitial<TName extends string> = PgTimeBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgTime';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimeBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgTime'>> extends PgDateColumnBaseBuilder<\n\tT,\n\t{ withTimezone: boolean; precision: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'PgTimeBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\treadonly withTimezone: boolean,\n\t\treadonly precision: number | undefined,\n\t) {\n\t\tsuper(name, 'string', 'PgTime');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTime<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTime<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgTime<T extends ColumnBaseConfig<'string', 'PgTime'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTime';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimeBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `time${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n}\n\nexport interface TimeConfig {\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function time(): PgTimeBuilderInitial<''>;\nexport function time(config?: TimeConfig): PgTimeBuilderInitial<''>;\nexport function time<TName extends string>(name: TName, config?: TimeConfig): PgTimeBuilderInitial<TName>;\nexport function time(a?: string | TimeConfig, b: TimeConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<TimeConfig>(a, b);\n\treturn new PgTimeBuilder(name, config.withTimezone ?? false, config.precision);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn } from './common.ts';\nimport { PgDateColumnBaseBuilder } from './date.common.ts';\n\nexport type PgTimestampBuilderInitial<TName extends string> = PgTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'PgTimestamp';\n\tdata: Date;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'PgTimestamp'>>\n\textends PgDateColumnBaseBuilder<\n\t\tT,\n\t\t{ withTimezone: boolean; precision: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgTimestampBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'date', 'PgTimestamp');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTimestamp<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgTimestamp<T extends ColumnBaseConfig<'date', 'PgTimestamp'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTimestamp';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimestampBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : ` (${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): Date {\n\t\tif (typeof value === 'string') return new Date(this.withTimezone ? value : value + '+0000');\n\n\t\treturn value;\n\t}\n\n\toverride mapToDriverValue = (value: Date): string => {\n\t\treturn value.toISOString();\n\t};\n}\n\nexport type PgTimestampStringBuilderInitial<TName extends string> = PgTimestampStringBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgTimestampString';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgTimestampStringBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgTimestampString'>>\n\textends PgDateColumnBaseBuilder<\n\t\tT,\n\t\t{ withTimezone: boolean; precision: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgTimestampStringBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\twithTimezone: boolean,\n\t\tprecision: number | undefined,\n\t) {\n\t\tsuper(name, 'string', 'PgTimestampString');\n\t\tthis.config.withTimezone = withTimezone;\n\t\tthis.config.precision = precision;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgTimestampString<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgTimestampString<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgTimestampString<T extends ColumnBaseConfig<'string', 'PgTimestampString'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgTimestampString';\n\n\treadonly withTimezone: boolean;\n\treadonly precision: number | undefined;\n\n\tconstructor(table: AnyPgTable<{ name: T['tableName'] }>, config: PgTimestampStringBuilder<T>['config']) {\n\t\tsuper(table, config);\n\t\tthis.withTimezone = config.withTimezone;\n\t\tthis.precision = config.precision;\n\t}\n\n\tgetSQLType(): string {\n\t\tconst precision = this.precision === undefined ? '' : `(${this.precision})`;\n\t\treturn `timestamp${precision}${this.withTimezone ? ' with time zone' : ''}`;\n\t}\n\n\toverride mapFromDriverValue(value: Date | string): string {\n\t\tif (typeof value === 'string') return value;\n\n\t\tconst shortened = value.toISOString().slice(0, -1).replace('T', ' ');\n\t\tif (this.withTimezone) {\n\t\t\tconst offset = value.getTimezoneOffset();\n\t\t\tconst sign = offset <= 0 ? '+' : '-';\n\t\t\treturn `${shortened}${sign}${Math.floor(Math.abs(offset) / 60).toString().padStart(2, '0')}`;\n\t\t}\n\n\t\treturn shortened;\n\t}\n}\n\nexport type Precision = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface PgTimestampConfig<TMode extends 'date' | 'string' = 'date' | 'string'> {\n\tmode?: TMode;\n\tprecision?: Precision;\n\twithTimezone?: boolean;\n}\n\nexport function timestamp(): PgTimestampBuilderInitial<''>;\nexport function timestamp<TMode extends PgTimestampConfig['mode'] & {}>(\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilderInitial<''> : PgTimestampBuilderInitial<''>;\nexport function timestamp<TName extends string, TMode extends PgTimestampConfig['mode'] & {}>(\n\tname: TName,\n\tconfig?: PgTimestampConfig<TMode>,\n): Equal<TMode, 'string'> extends true ? PgTimestampStringBuilderInitial<TName> : PgTimestampBuilderInitial<TName>;\nexport function timestamp(a?: string | PgTimestampConfig, b: PgTimestampConfig = {}) {\n\tconst { name, config } = getColumnNameAndConfig<PgTimestampConfig | undefined>(a, b);\n\tif (config?.mode === 'string') {\n\t\treturn new PgTimestampStringBuilder(name, config.withTimezone ?? false, config.precision);\n\t}\n\treturn new PgTimestampBuilder(name, config?.withTimezone ?? false, config?.precision);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgUUIDBuilderInitial<TName extends string> = PgUUIDBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgUUID';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgUUIDBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgUUID'>> extends PgColumnBuilder<T> {\n\tstatic override readonly [entityKind]: string = 'PgUUIDBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'PgUUID');\n\t}\n\n\t/**\n\t * Adds `default gen_random_uuid()` to the column definition.\n\t */\n\tdefaultRandom(): ReturnType<this['default']> {\n\t\treturn this.default(sql`gen_random_uuid()`) as ReturnType<this['default']>;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgUUID<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgUUID<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class PgUUID<T extends ColumnBaseConfig<'string', 'PgUUID'>> extends PgColumn<T> {\n\tstatic override readonly [entityKind]: string = 'PgUUID';\n\n\tgetSQLType(): string {\n\t\treturn 'uuid';\n\t}\n}\n\nexport function uuid(): PgUUIDBuilderInitial<''>;\nexport function uuid<TName extends string>(name: TName): PgUUIDBuilderInitial<TName>;\nexport function uuid(name?: string) {\n\treturn new PgUUIDBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgVarcharBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = PgVarcharBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgVarchar';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class PgVarcharBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgVarchar'> & { length?: number | undefined },\n> extends PgColumnBuilder<\n\tT,\n\t{ length: T['length']; enumValues: T['enumValues'] },\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'PgVarcharBuilder';\n\n\tconstructor(name: T['name'], config: PgVarcharConfig<T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'PgVarchar');\n\t\tthis.config.length = config.length;\n\t\tthis.config.enumValues = config.enum;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgVarchar<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new PgVarchar<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgVarchar<T extends ColumnBaseConfig<'string', 'PgVarchar'> & { length?: number | undefined }>\n\textends PgColumn<T, { length: T['length']; enumValues: T['enumValues'] }, { length: T['length'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgVarchar';\n\n\treadonly length = this.config.length;\n\toverride readonly enumValues = this.config.enumValues;\n\n\tgetSQLType(): string {\n\t\treturn this.length === undefined ? `varchar` : `varchar(${this.length})`;\n\t}\n}\n\nexport interface PgVarcharConfig<\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> {\n\tenum?: TEnum;\n\tlength?: TLength;\n}\n\nexport function varchar(): PgVarcharBuilderInitial<'', [string, ...string[]], undefined>;\nexport function varchar<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tconfig?: PgVarcharConfig<T | Writable<T>, L>,\n): PgVarcharBuilderInitial<'', Writable<T>, L>;\nexport function varchar<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n>(\n\tname: TName,\n\tconfig?: PgVarcharConfig<T | Writable<T>, L>,\n): PgVarcharBuilderInitial<TName, Writable<T>, L>;\nexport function varchar(a?: string | PgVarcharConfig, b: PgVarcharConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<PgVarcharConfig>(a, b);\n\treturn new PgVarcharBuilder(name, config as any);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgBinaryVectorBuilderInitial<TName extends string, TDimensions extends number> = PgBinaryVectorBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgBinaryVector';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgBinaryVectorBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgBinaryVector'> & { dimensions: number },\n> extends PgColumnBuilder<\n\tT,\n\t{ dimensions: T['dimensions'] }\n> {\n\tstatic override readonly [entityKind]: string = 'PgBinaryVectorBuilder';\n\n\tconstructor(name: string, config: PgBinaryVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'string', 'PgBinaryVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgBinaryVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgBinaryVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgBinaryVector<T extends ColumnBaseConfig<'string', 'PgBinaryVector'> & { dimensions: number }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgBinaryVector';\n\n\treadonly dimensions = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `bit(${this.dimensions})`;\n\t}\n}\n\nexport interface PgBinaryVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function bit<D extends number>(\n\tconfig: PgBinaryVectorConfig<D>,\n): PgBinaryVectorBuilderInitial<'', D>;\nexport function bit<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgBinaryVectorConfig<D>,\n): PgBinaryVectorBuilderInitial<TName, D>;\nexport function bit(a: string | PgBinaryVectorConfig, b?: PgBinaryVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgBinaryVectorConfig>(a, b);\n\treturn new PgBinaryVectorBuilder(name, config);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgHalfVectorBuilderInitial<TName extends string, TDimensions extends number> = PgHalfVectorBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgHalfVector';\n\tdata: number[];\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgHalfVectorBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgHalfVector'> & { dimensions: number }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: T['dimensions'] },\n\t\t{ dimensions: T['dimensions'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgHalfVectorBuilder';\n\n\tconstructor(name: string, config: PgHalfVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'array', 'PgHalfVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgHalfVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgHalfVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgHalfVector<T extends ColumnBaseConfig<'array', 'PgHalfVector'> & { dimensions: number }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgHalfVector';\n\n\treadonly dimensions: T['dimensions'] = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `halfvec(${this.dimensions})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgHalfVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function halfvec<D extends number>(\n\tconfig: PgHalfVectorConfig<D>,\n): PgHalfVectorBuilderInitial<'', D>;\nexport function halfvec<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgHalfVectorConfig,\n): PgHalfVectorBuilderInitial<TName, D>;\nexport function halfvec(a: string | PgHalfVectorConfig, b?: PgHalfVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgHalfVectorConfig>(a, b);\n\treturn new PgHalfVectorBuilder(name, config);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgSparseVectorBuilderInitial<TName extends string> = PgSparseVectorBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'PgSparseVector';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class PgSparseVectorBuilder<T extends ColumnBuilderBaseConfig<'string', 'PgSparseVector'>>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: number | undefined }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVectorBuilder';\n\n\tconstructor(name: string, config: PgSparseVectorConfig) {\n\t\tsuper(name, 'string', 'PgSparseVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgSparseVector<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgSparseVector<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgSparseVector<T extends ColumnBaseConfig<'string', 'PgSparseVector'>>\n\textends PgColumn<T, { dimensions: number | undefined }>\n{\n\tstatic override readonly [entityKind]: string = 'PgSparseVector';\n\n\treadonly dimensions = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `sparsevec(${this.dimensions})`;\n\t}\n}\n\nexport interface PgSparseVectorConfig {\n\tdimensions: number;\n}\n\nexport function sparsevec(\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilderInitial<''>;\nexport function sparsevec<TName extends string>(\n\tname: TName,\n\tconfig: PgSparseVectorConfig,\n): PgSparseVectorBuilderInitial<TName>;\nexport function sparsevec(a: string | PgSparseVectorConfig, b?: PgSparseVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgSparseVectorConfig>(a, b);\n\treturn new PgSparseVectorBuilder(name, config);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport { getColumnNameAndConfig } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from '../common.ts';\n\nexport type PgVectorBuilderInitial<TName extends string, TDimensions extends number> = PgVectorBuilder<{\n\tname: TName;\n\tdataType: 'array';\n\tcolumnType: 'PgVector';\n\tdata: number[];\n\tdriverParam: string;\n\tenumValues: undefined;\n\tdimensions: TDimensions;\n}>;\n\nexport class PgVectorBuilder<T extends ColumnBuilderBaseConfig<'array', 'PgVector'> & { dimensions: number }>\n\textends PgColumnBuilder<\n\t\tT,\n\t\t{ dimensions: T['dimensions'] },\n\t\t{ dimensions: T['dimensions'] }\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'PgVectorBuilder';\n\n\tconstructor(name: string, config: PgVectorConfig<T['dimensions']>) {\n\t\tsuper(name, 'array', 'PgVector');\n\t\tthis.config.dimensions = config.dimensions;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }> {\n\t\treturn new PgVector<MakeColumnConfig<T, TTableName> & { dimensions: T['dimensions'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgVector<T extends ColumnBaseConfig<'array', 'PgVector'> & { dimensions: number | undefined }>\n\textends PgColumn<T, { dimensions: T['dimensions'] }, { dimensions: T['dimensions'] }>\n{\n\tstatic override readonly [entityKind]: string = 'PgVector';\n\n\treadonly dimensions: T['dimensions'] = this.config.dimensions;\n\n\tgetSQLType(): string {\n\t\treturn `vector(${this.dimensions})`;\n\t}\n\n\toverride mapToDriverValue(value: unknown): unknown {\n\t\treturn JSON.stringify(value);\n\t}\n\n\toverride mapFromDriverValue(value: string): unknown {\n\t\treturn value\n\t\t\t.slice(1, -1)\n\t\t\t.split(',')\n\t\t\t.map((v) => Number.parseFloat(v));\n\t}\n}\n\nexport interface PgVectorConfig<TDimensions extends number = number> {\n\tdimensions: TDimensions;\n}\n\nexport function vector<D extends number>(\n\tconfig: PgVectorConfig<D>,\n): PgVectorBuilderInitial<'', D>;\nexport function vector<TName extends string, D extends number>(\n\tname: TName,\n\tconfig: PgVectorConfig<D>,\n): PgVectorBuilderInitial<TName, D>;\nexport function vector(a: string | PgVectorConfig, b?: PgVectorConfig) {\n\tconst { name, config } = getColumnNameAndConfig<PgVectorConfig>(a, b);\n\treturn new PgVectorBuilder(name, config);\n}\n","import { bigint } from './bigint.ts';\nimport { bigserial } from './bigserial.ts';\nimport { boolean } from './boolean.ts';\nimport { char } from './char.ts';\nimport { cidr } from './cidr.ts';\nimport { customType } from './custom.ts';\nimport { date } from './date.ts';\nimport { doublePrecision } from './double-precision.ts';\nimport { inet } from './inet.ts';\nimport { integer } from './integer.ts';\nimport { interval } from './interval.ts';\nimport { json } from './json.ts';\nimport { jsonb } from './jsonb.ts';\nimport { line } from './line.ts';\nimport { macaddr } from './macaddr.ts';\nimport { macaddr8 } from './macaddr8.ts';\nimport { numeric } from './numeric.ts';\nimport { point } from './point.ts';\nimport { geometry } from './postgis_extension/geometry.ts';\nimport { real } from './real.ts';\nimport { serial } from './serial.ts';\nimport { smallint } from './smallint.ts';\nimport { smallserial } from './smallserial.ts';\nimport { text } from './text.ts';\nimport { time } from './time.ts';\nimport { timestamp } from './timestamp.ts';\nimport { uuid } from './uuid.ts';\nimport { varchar } from './varchar.ts';\nimport { bit } from './vector_extension/bit.ts';\nimport { halfvec } from './vector_extension/halfvec.ts';\nimport { sparsevec } from './vector_extension/sparsevec.ts';\nimport { vector } from './vector_extension/vector.ts';\n\nexport function getPgColumnBuilders() {\n\treturn {\n\t\tbigint,\n\t\tbigserial,\n\t\tboolean,\n\t\tchar,\n\t\tcidr,\n\t\tcustomType,\n\t\tdate,\n\t\tdoublePrecision,\n\t\tinet,\n\t\tinteger,\n\t\tinterval,\n\t\tjson,\n\t\tjsonb,\n\t\tline,\n\t\tmacaddr,\n\t\tmacaddr8,\n\t\tnumeric,\n\t\tpoint,\n\t\tgeometry,\n\t\treal,\n\t\tserial,\n\t\tsmallint,\n\t\tsmallserial,\n\t\ttext,\n\t\ttime,\n\t\ttimestamp,\n\t\tuuid,\n\t\tvarchar,\n\t\tbit,\n\t\thalfvec,\n\t\tsparsevec,\n\t\tvector,\n\t};\n}\n\nexport type PgColumnsBuilders = ReturnType<typeof getPgColumnBuilders>;\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type { ExtraConfigColumn, PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\tPgTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigColumns]: Record<string, ExtraConfigColumn> = {};\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t}\n\t& {\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t});\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { SQL } from '~/sql/sql.ts';\n\nimport { entityKind, is } from '~/entity.ts';\nimport type { ExtraConfigColumn, PgColumn } from './columns/index.ts';\nimport { IndexedColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\ninterface IndexConfig {\n\tname?: string;\n\n\tcolumns: Partial<IndexedColumn | SQL>[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index concurrently` instead of `create index`.\n\t */\n\tconcurrently?: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index ... on only <table>` instead of `create index ... on <table>`.\n\t */\n\tonly: boolean;\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere?: SQL;\n\n\t/**\n\t * The optional WITH clause specifies storage parameters for the index\n\t */\n\twith?: Record<string, any>;\n\n\t/**\n\t * The optional WITH clause method for the index\n\t */\n\tmethod?: 'btree' | string;\n}\n\nexport type IndexColumn = PgColumn;\n\nexport type PgIndexMethod = 'btree' | 'hash' | 'gist' | 'spgist' | 'gin' | 'brin' | 'hnsw' | 'ivfflat' | (string & {});\n\nexport type PgIndexOpClass =\n\t| 'abstime_ops'\n\t| 'access_method'\n\t| 'anyarray_eq'\n\t| 'anyarray_ge'\n\t| 'anyarray_gt'\n\t| 'anyarray_le'\n\t| 'anyarray_lt'\n\t| 'anyarray_ne'\n\t| 'bigint_ops'\n\t| 'bit_ops'\n\t| 'bool_ops'\n\t| 'box_ops'\n\t| 'bpchar_ops'\n\t| 'char_ops'\n\t| 'cidr_ops'\n\t| 'cstring_ops'\n\t| 'date_ops'\n\t| 'float_ops'\n\t| 'int2_ops'\n\t| 'int4_ops'\n\t| 'int8_ops'\n\t| 'interval_ops'\n\t| 'jsonb_ops'\n\t| 'macaddr_ops'\n\t| 'name_ops'\n\t| 'numeric_ops'\n\t| 'oid_ops'\n\t| 'oidint4_ops'\n\t| 'oidint8_ops'\n\t| 'oidname_ops'\n\t| 'oidvector_ops'\n\t| 'point_ops'\n\t| 'polygon_ops'\n\t| 'range_ops'\n\t| 'record_eq'\n\t| 'record_ge'\n\t| 'record_gt'\n\t| 'record_le'\n\t| 'record_lt'\n\t| 'record_ne'\n\t| 'text_ops'\n\t| 'time_ops'\n\t| 'timestamp_ops'\n\t| 'timestamptz_ops'\n\t| 'timetz_ops'\n\t| 'uuid_ops'\n\t| 'varbit_ops'\n\t| 'varchar_ops'\n\t// pg_vector types\n\t| 'xml_ops'\n\t| 'vector_l2_ops'\n\t| 'vector_ip_ops'\n\t| 'vector_cosine_ops'\n\t| 'vector_l1_ops'\n\t| 'bit_hamming_ops'\n\t| 'bit_jaccard_ops'\n\t| 'halfvec_l2_ops'\n\t| 'sparsevec_l2_op'\n\t| (string & {});\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilderOn';\n\n\tconstructor(private unique: boolean, private name?: string) {}\n\n\ton(...columns: [Partial<ExtraConfigColumn> | SQL, ...Partial<ExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\tfalse,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\tonOnly(...columns: [Partial<ExtraConfigColumn | SQL>, ...Partial<ExtraConfigColumn | SQL>[]]): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = it.defaultConfig;\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\t/**\n\t * Specify what index method to use. Choices are `btree`, `hash`, `gist`, `spgist`, `gin`, `brin`, or user-installed access methods like `bloom`. The default method is `btree.\n\t *\n\t * If you have the `pg_vector` extension installed in your database, you can use the `hnsw` and `ivfflat` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the method, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param method The name of the index method to be used\n\t * @param columns\n\t * @returns\n\t */\n\tusing(\n\t\tmethod: PgIndexMethod,\n\t\t...columns: [Partial<ExtraConfigColumn | SQL>, ...Partial<ExtraConfigColumn | SQL>[]]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\t\t\t\tit = it as ExtraConfigColumn;\n\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(it.name, !!it.keyAsName, it.columnType!, it.indexConfig!);\n\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\treturn clonedIndexedColumn;\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t\tmethod,\n\t\t);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: PgTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'PgIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(\n\t\tcolumns: Partial<IndexedColumn | SQL>[],\n\t\tunique: boolean,\n\t\tonly: boolean,\n\t\tname?: string,\n\t\tmethod: string = 'btree',\n\t) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\tonly,\n\t\t\tmethod,\n\t\t};\n\t}\n\n\tconcurrently(): this {\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twith(obj: Record<string, any>): this {\n\t\tthis.config.with = obj;\n\t\treturn this;\n\t}\n\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'PgIndex';\n\n\treadonly config: IndexConfig & { table: PgTable };\n\n\tconstructor(config: IndexConfig, table: PgTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends PgColumn ? TColumns['_']['name']\n\t: TColumns extends PgColumn[] ? TColumns[number]['_']['name']\n\t: never;\n\nexport function index(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(false, name);\n}\n\nexport function uniqueIndex(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(true, name);\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n","import type { Column } from '~/column.ts';\nimport { entityKind } from './entity.ts';\nimport { Table } from './table.ts';\nimport type { Casing } from './utils.ts';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nfunction noopCase(input: string) {\n\treturn input;\n}\n\nexport class CasingCache {\n\tstatic readonly [entityKind]: string = 'CasingCache';\n\n\t/** @internal */\n\tcache: Record<string, string> = {};\n\tprivate cachedTables: Record<string, true> = {};\n\tprivate convert: (input: string) => string;\n\n\tconstructor(casing?: Casing) {\n\t\tthis.convert = casing === 'snake_case'\n\t\t\t? toSnakeCase\n\t\t\t: casing === 'camelCase'\n\t\t\t? toCamelCase\n\t\t\t: noopCase;\n\t}\n\n\tgetColumnCasing(column: Column): string {\n\t\tif (!column.keyAsName) return column.name;\n\n\t\tconst schema = column.table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = column.table[Table.Symbol.OriginalName];\n\t\tconst key = `${schema}.${tableName}.${column.name}`;\n\n\t\tif (!this.cache[key]) {\n\t\t\tthis.cacheTable(column.table);\n\t\t}\n\t\treturn this.cache[key]!;\n\t}\n\n\tprivate cacheTable(table: Table) {\n\t\tconst schema = table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = table[Table.Symbol.OriginalName];\n\t\tconst tableKey = `${schema}.${tableName}`;\n\n\t\tif (!this.cachedTables[tableKey]) {\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tconst columnKey = `${tableKey}.${column.name}`;\n\t\t\t\tthis.cache[columnKey] = this.convert(column.name);\n\t\t\t}\n\t\t\tthis.cachedTables[tableKey] = true;\n\t\t}\n\t}\n\n\tclearCache() {\n\t\tthis.cache = {};\n\t\tthis.cachedTables = {};\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tconstructor({ message, cause }: { message?: string; cause?: unknown }) {\n\t\tsuper(message);\n\t\tthis.name = 'DrizzleError';\n\t\tthis.cause = cause;\n\t}\n}\n\nexport class DrizzleQueryError extends Error {\n\tconstructor(\n\t\tpublic query: string,\n\t\tpublic params: any[],\n\t\tpublic override cause?: Error,\n\t) {\n\t\tsuper(`Failed query: ${query}\\nparams: ${params}`);\n\t\tError.captureStackTrace(this, DrizzleQueryError);\n\n\t\t// ES2022+: preserves original error on `.cause`\n\t\tif (cause) (this as any).cause = cause;\n\t}\n}\n\nexport class TransactionRollbackError extends DrizzleError {\n\tstatic override readonly [entityKind]: string = 'TransactionRollbackError';\n\n\tconstructor() {\n\t\tsuper({ message: 'Rollback' });\n\t}\n}\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: ReadonlyArray<GetColumnData<TColumn, 'raw'> | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql } from './sql/sql.ts';\nimport type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport abstract class Relation<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\n\tdeclare readonly $brand: 'Relation';\n\treadonly referencedTableName: TTableName;\n\tfieldName!: string;\n\n\tconstructor(\n\t\treadonly sourceTable: Table,\n\t\treadonly referencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly relationName: string | undefined,\n\t) {\n\t\tthis.referencedTableName = referencedTable[Table.Symbol.Name] as TTableName;\n\t}\n\n\tabstract withFieldName(fieldName: string): Relation<TTableName>;\n}\n\nexport class Relations<\n\tTTableName extends string = string,\n\tTConfig extends Record<string, Relation> = Record<string, Relation>,\n> {\n\tstatic readonly [entityKind]: string = 'Relations';\n\n\tdeclare readonly $brand: 'Relations';\n\n\tconstructor(\n\t\treadonly table: AnyTable<{ name: TTableName }>,\n\t\treadonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig,\n\t) {}\n}\n\nexport class One<\n\tTTableName extends string = string,\n\tTIsNullable extends boolean = boolean,\n> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\n\tdeclare protected $relationBrand: 'One';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config:\n\t\t\t| RelationConfig<\n\t\t\t\tTTableName,\n\t\t\t\tstring,\n\t\t\t\tAnyColumn<{ tableName: TTableName }>[]\n\t\t\t>\n\t\t\t| undefined,\n\t\treadonly isNullable: TIsNullable,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): One<TTableName> {\n\t\tconst relation = new One(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t\tthis.isNullable,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport class Many<TTableName extends string> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config: { relationName: string } | undefined,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): Many<TTableName> {\n\t\tconst relation = new Many(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport type TableRelationsKeysOnly<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n\tK extends keyof TSchema,\n> = TSchema[K] extends Relations<TTableName> ? K : never;\n\nexport type ExtractTableRelationsFromSchema<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TableRelationsKeysOnly<\n\t\t\t\tTSchema,\n\t\t\t\tTTableName,\n\t\t\t\tK\n\t\t\t>\n\t\t]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;\n\t}\n>;\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport function getOperators() {\n\treturn {\n\t\tand,\n\t\tbetween,\n\t\teq,\n\t\texists,\n\t\tgt,\n\t\tgte,\n\t\tilike,\n\t\tinArray,\n\t\tisNull,\n\t\tisNotNull,\n\t\tlike,\n\t\tlt,\n\t\tlte,\n\t\tne,\n\t\tnot,\n\t\tnotBetween,\n\t\tnotExists,\n\t\tnotLike,\n\t\tnotIlike,\n\t\tnotInArray,\n\t\tor,\n\t\tsql,\n\t};\n}\n\nexport type Operators = ReturnType<typeof getOperators>;\n\nexport function getOrderByOperators() {\n\treturn {\n\t\tsql,\n\t\tasc,\n\t\tdesc,\n\t};\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBName<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, Relation>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTSchema extends TablesRelationalConfig,\n> {\n\tfullSchema: Record<string, unknown>;\n\tschema: TSchema;\n\ttableNamesMap: Record<string, string>;\n}\n\nexport type ExtractTablesWithRelations<\n\tTSchema extends Record<string, unknown>,\n> = {\n\t[\n\t\tK in keyof TSchema as TSchema[K] extends Table ? K\n\t\t\t: never\n\t]: TSchema[K] extends Table ? {\n\t\t\ttsName: K & string;\n\t\t\tdbName: TSchema[K]['_']['name'];\n\t\t\tcolumns: TSchema[K]['_']['columns'];\n\t\t\trelations: ExtractTableRelationsFromSchema<\n\t\t\t\tTSchema,\n\t\t\t\tTSchema[K]['_']['name']\n\t\t\t>;\n\t\t\tprimaryKey: AnyColumn[];\n\t\t}\n\t\t: never;\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTSchema extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, Relation>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTSchema,\n\t\t\tFindTableByDBName<TSchema, TRel['referencedTableName']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['isNullable'], false> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL.Aliased\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface RelationConfig<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> {\n\trelationName?: string;\n\tfields: TColumns;\n\treferences: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;\n}\n\nexport function extractTablesRelationalConfig<\n\tTTables extends TablesRelationalConfig,\n>(\n\tschema: Record<string, unknown>,\n\tconfigHelpers: (table: Table) => any,\n): { tables: TTables; tableNamesMap: Record<string, string> } {\n\tif (\n\t\tObject.keys(schema).length === 1\n\t\t&& 'default' in schema\n\t\t&& !is(schema['default'], Table)\n\t) {\n\t\tschema = schema['default'] as Record<string, unknown>;\n\t}\n\n\t// table DB name -> schema table key\n\tconst tableNamesMap: Record<string, string> = {};\n\t// Table relations found before their tables - need to buffer them until we know the schema table key\n\tconst relationsBuffer: Record<\n\t\tstring,\n\t\t{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }\n\t> = {};\n\tconst tablesConfig: TablesRelationalConfig = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (is(value, Table)) {\n\t\t\tconst dbName = getTableUniqueName(value);\n\t\t\tconst bufferedRelations = relationsBuffer[dbName];\n\t\t\ttableNamesMap[dbName] = key;\n\t\t\ttablesConfig[key] = {\n\t\t\t\ttsName: key,\n\t\t\t\tdbName: value[Table.Symbol.Name],\n\t\t\t\tschema: value[Table.Symbol.Schema],\n\t\t\t\tcolumns: value[Table.Symbol.Columns],\n\t\t\t\trelations: bufferedRelations?.relations ?? {},\n\t\t\t\tprimaryKey: bufferedRelations?.primaryKey ?? [],\n\t\t\t};\n\n\t\t\t// Fill in primary keys\n\t\t\tfor (\n\t\t\t\tconst column of Object.values(\n\t\t\t\t\t(value as Table)[Table.Symbol.Columns],\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttablesConfig[key]!.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttablesConfig[key]!.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (is(value, Relations)) {\n\t\t\tconst dbName = getTableUniqueName(value.table);\n\t\t\tconst tableName = tableNamesMap[dbName];\n\t\t\tconst relations: Record<string, Relation> = value.config(\n\t\t\t\tconfigHelpers(value.table),\n\t\t\t);\n\t\t\tlet primaryKey: AnyColumn[] | undefined;\n\n\t\t\tfor (const [relationName, relation] of Object.entries(relations)) {\n\t\t\t\tif (tableName) {\n\t\t\t\t\tconst tableConfig = tablesConfig[tableName]!;\n\t\t\t\t\ttableConfig.relations[relationName] = relation;\n\t\t\t\t\tif (primaryKey) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...primaryKey);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!(dbName in relationsBuffer)) {\n\t\t\t\t\t\trelationsBuffer[dbName] = {\n\t\t\t\t\t\t\trelations: {},\n\t\t\t\t\t\t\tprimaryKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\trelationsBuffer[dbName]!.relations[relationName] = relation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { tables: tablesConfig as TTables, tableNamesMap };\n}\n\nexport function relations<\n\tTTableName extends string,\n\tTRelations extends Record<string, Relation<any>>,\n>(\n\ttable: AnyTable<{ name: TTableName }>,\n\trelations: (helpers: TableRelationsHelpers<TTableName>) => TRelations,\n): Relations<TTableName, TRelations> {\n\treturn new Relations<TTableName, TRelations>(\n\t\ttable,\n\t\t(helpers: TableRelationsHelpers<TTableName>) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(relations(helpers)).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.withFieldName(key),\n\t\t\t\t]),\n\t\t\t) as TRelations,\n\t);\n}\n\nexport function createOne<TTableName extends string>(sourceTable: Table) {\n\treturn function one<\n\t\tTForeignTable extends Table,\n\t\tTColumns extends [\n\t\t\tAnyColumn<{ tableName: TTableName }>,\n\t\t\t...AnyColumn<{ tableName: TTableName }>[],\n\t\t],\n\t>(\n\t\ttable: TForeignTable,\n\t\tconfig?: RelationConfig<TTableName, TForeignTable['_']['name'], TColumns>,\n\t): One<\n\t\tTForeignTable['_']['name'],\n\t\tEqual<TColumns[number]['_']['notNull'], true>\n\t> {\n\t\treturn new One(\n\t\t\tsourceTable,\n\t\t\ttable,\n\t\t\tconfig,\n\t\t\t(config?.fields.reduce<boolean>((res, f) => res && f.notNull, true)\n\t\t\t\t?? false) as Equal<TColumns[number]['_']['notNull'], true>,\n\t\t);\n\t};\n}\n\nexport function createMany(sourceTable: Table) {\n\treturn function many<TForeignTable extends Table>(\n\t\treferencedTable: TForeignTable,\n\t\tconfig?: { relationName: string },\n\t): Many<TForeignTable['_']['name']> {\n\t\treturn new Many(sourceTable, referencedTable, config);\n\t};\n}\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport function normalizeRelation(\n\tschema: TablesRelationalConfig,\n\ttableNamesMap: Record<string, string>,\n\trelation: Relation,\n): NormalizedRelation {\n\tif (is(relation, One) && relation.config) {\n\t\treturn {\n\t\t\tfields: relation.config.fields,\n\t\t\treferences: relation.config.references,\n\t\t};\n\t}\n\n\tconst referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n\tif (!referencedTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst referencedTableConfig = schema[referencedTableTsName];\n\tif (!referencedTableConfig) {\n\t\tthrow new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n\t}\n\n\tconst sourceTable = relation.sourceTable;\n\tconst sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n\tif (!sourceTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst reverseRelations: Relation[] = [];\n\tfor (\n\t\tconst referencedTableRelation of Object.values(\n\t\t\treferencedTableConfig.relations,\n\t\t)\n\t) {\n\t\tif (\n\t\t\t(relation.relationName\n\t\t\t\t&& relation !== referencedTableRelation\n\t\t\t\t&& referencedTableRelation.relationName === relation.relationName)\n\t\t\t|| (!relation.relationName\n\t\t\t\t&& referencedTableRelation.referencedTable === relation.sourceTable)\n\t\t) {\n\t\t\treverseRelations.push(referencedTableRelation);\n\t\t}\n\t}\n\n\tif (reverseRelations.length > 1) {\n\t\tthrow relation.relationName\n\t\t\t? new Error(\n\t\t\t\t`There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`,\n\t\t\t)\n\t\t\t: new Error(\n\t\t\t\t`There are multiple relations between \"${referencedTableTsName}\" and \"${\n\t\t\t\t\trelation.sourceTable[Table.Symbol.Name]\n\t\t\t\t}\". Please specify relation name`,\n\t\t\t);\n\t}\n\n\tif (\n\t\treverseRelations[0]\n\t\t&& is(reverseRelations[0], One)\n\t\t&& reverseRelations[0].config\n\t) {\n\t\treturn {\n\t\t\tfields: reverseRelations[0].config.references,\n\t\t\treferences: reverseRelations[0].config.fields,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`,\n\t);\n}\n\nexport function createTableRelationsHelpers<TTableName extends string>(\n\tsourceTable: AnyTable<{ name: TTableName }>,\n) {\n\treturn {\n\t\tone: createOne<TTableName>(sourceTable),\n\t\tmany: createMany(sourceTable),\n\t};\n}\n\nexport type TableRelationsHelpers<TTableName extends string> = ReturnType<\n\ttypeof createTableRelationsHelpers<TTableName>\n>;\n\nexport interface BuildRelationalQueryResult<\n\tTTable extends Table = Table,\n\tTColumn extends Column = Column,\n> {\n\ttableTsKey: string;\n\tselection: {\n\t\tdbKey: string;\n\t\ttsKey: string;\n\t\tfield: TColumn | SQL | SQL.Aliased;\n\t\trelationTableTsKey: string | undefined;\n\t\tisJson: boolean;\n\t\tisExtra?: boolean;\n\t\tselection: BuildRelationalQueryResult<TTable>['selection'];\n\t}[];\n\tsql: TTable | SQL;\n}\n\nexport function mapRelationalRow(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst rawSubRows = row[selectionItemIndex] as\n\t\t\t\t| unknown[]\n\t\t\t\t| null\n\t\t\t\t| [null]\n\t\t\t\t| string;\n\t\t\tconst subRows = typeof rawSubRows === 'string'\n\t\t\t\t? (JSON.parse(rawSubRows) as unknown[])\n\t\t\t\t: rawSubRows;\n\t\t\tresult[selectionItem.tsKey] = is(relation, One)\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: (subRows as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n","import { entityKind } from '~/entity.ts';\nimport { type ColumnsSelection, View } from '~/sql/sql.ts';\n\nexport abstract class PgViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelectedFields extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelectedFields> {\n\tstatic override readonly [entityKind]: string = 'PgViewBase';\n\n\tdeclare readonly _: View<TName, TExisting, TSelectedFields>['_'] & {\n\t\treadonly viewBrand: 'PgViewBase';\n\t};\n}\n","import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\tPgColumn,\n\tPgDate,\n\tPgDateString,\n\tPgJson,\n\tPgJsonb,\n\tPgNumeric,\n\tPgTime,\n\tPgTimestamp,\n\tPgTimestampString,\n\tPgUUID,\n} from '~/pg-core/columns/index.ts';\nimport type {\n\tAnyPgSelectQueryBuilder,\n\tPgDeleteConfig,\n\tPgInsertConfig,\n\tPgSelectJoinConfig,\n\tPgUpdateConfig,\n} from '~/pg-core/query-builders/index.ts';\nimport type { PgSelectConfig, SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { and, eq, View } from '~/sql/index.ts';\nimport {\n\ttype DriverValueEncoder,\n\ttype Name,\n\tParam,\n\ttype QueryTypingsValue,\n\ttype QueryWithTypings,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n} from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { PgSession } from './session.ts';\nimport { PgViewBase } from './view-base.ts';\nimport type { PgMaterializedView } from './view.ts';\n\nexport interface PgDialectConfig {\n\tcasing?: Casing;\n}\n\nexport class PgDialect {\n\tstatic readonly [entityKind]: string = 'PgDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: PgDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tasync migrate(migrations: MigrationMeta[], session: PgSession, config: string | MigrationConfig): Promise<void> {\n\t\tconst migrationsTable = typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\t\tconst migrationsSchema = typeof config === 'string' ? 'drizzle' : config.migrationsSchema ?? 'drizzle';\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at bigint\n\t\t\t)\n\t\t`;\n\t\tawait session.execute(sql`CREATE SCHEMA IF NOT EXISTS ${sql.identifier(migrationsSchema)}`);\n\t\tawait session.execute(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`select id, hash, created_at from ${sql.identifier(migrationsSchema)}.${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} order by created_at desc limit 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0];\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor await (const migration of migrations) {\n\t\t\t\tif (\n\t\t\t\t\t!lastDbMigration\n\t\t\t\t\t|| Number(lastDbMigration.created_at) < migration.folderMillis\n\t\t\t\t) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.execute(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.execute(\n\t\t\t\t\t\tsql`insert into ${sql.identifier(migrationsSchema)}.${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") values(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tescapeParam(num: number): string {\n\t\treturn `$${num + 1}`;\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList }: PgDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}`;\n\t}\n\n\tbuildUpdateSet(table: PgTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\tconst value = set[colName] ?? (is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col));\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, from, joins }: PgUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\tconst origTableName = table[PgTable.Symbol.OriginalName];\n\t\tconst alias = tableName === origTableName ? undefined : tableName;\n\t\tconst tableSql = sql`${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\tsql.identifier(origTableName)\n\t\t}${alias && sql` ${sql.identifier(alias)}`}`;\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: !from })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\treturn sql`${withSql}update ${tableSql} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, PgColumn)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(field);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [string, SQL.Aliased | Column | SQL][];\n\n\t\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t\t: entry.sql.decoder;\n\n\t\t\t\t\t\tif (fieldDecoder) {\n\t\t\t\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tchunk.push(field);\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: PgSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\tif (index === 0) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t\tconst table = joinMeta.table;\n\t\t\tconst lateralSql = joinMeta.lateral ? sql` lateral` : undefined;\n\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\tif (is(table, PgTable)) {\n\t\t\t\tconst tableName = table[PgTable.Symbol.Name];\n\t\t\t\tconst tableSchema = table[PgTable.Symbol.Schema];\n\t\t\t\tconst origTableName = table[PgTable.Symbol.OriginalName];\n\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\ttableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origTableName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else if (is(table, View)) {\n\t\t\t\tconst viewName = table[ViewBaseConfig].name;\n\t\t\t\tconst viewSchema = table[ViewBaseConfig].schema;\n\t\t\t\tconst origViewName = table[ViewBaseConfig].originalName;\n\t\t\t\tconst alias = viewName === origViewName ? undefined : joinMeta.alias;\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${\n\t\t\t\t\t\tviewSchema ? sql`${sql.identifier(viewSchema)}.` : undefined\n\t\t\t\t\t}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`}${onSql}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tjoinsArray.push(\n\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table}${onSql}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (index < joins.length - 1) {\n\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | PgViewBase | PgTable | undefined,\n\t): SQL | Subquery | PgViewBase | PgTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.IsAlias]) {\n\t\t\tlet fullName = sql`${sql.identifier(table[Table.Symbol.OriginalName])}`;\n\t\t\tif (table[Table.Symbol.Schema]) {\n\t\t\t\tfullName = sql`${sql.identifier(table[Table.Symbol.Schema]!)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tlockingClause,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: PgSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<PgColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, PgViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tlet distinctSql: SQL | undefined;\n\t\tif (distinct) {\n\t\t\tdistinctSql = distinct === true ? sql` distinct` : sql` distinct on (${sql.join(distinct.on, sql`, `)})`;\n\t\t}\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\torderBySql = sql` order by ${sql.join(orderBy, sql`, `)}`;\n\t\t}\n\n\t\tlet groupBySql;\n\t\tif (groupBy && groupBy.length > 0) {\n\t\t\tgroupBySql = sql` group by ${sql.join(groupBy, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst lockingClauseSql = sql.empty();\n\t\tif (lockingClause) {\n\t\t\tconst clauseSql = sql` for ${sql.raw(lockingClause.strength)}`;\n\t\t\tif (lockingClause.config.of) {\n\t\t\t\tclauseSql.append(\n\t\t\t\t\tsql` of ${\n\t\t\t\t\t\tsql.join(\n\t\t\t\t\t\t\tArray.isArray(lockingClause.config.of) ? lockingClause.config.of : [lockingClause.config.of],\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t)\n\t\t\t\t\t}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (lockingClause.config.noWait) {\n\t\t\t\tclauseSql.append(sql` nowait`);\n\t\t\t} else if (lockingClause.config.skipLocked) {\n\t\t\t\tclauseSql.append(sql` skip locked`);\n\t\t\t}\n\t\t\tlockingClauseSql.append(clauseSql);\n\t\t}\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClauseSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: PgSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: PgSelectConfig['setOperators'][number] }): SQL {\n\t\tconst leftChunk = sql`(${leftSelect.getSQL()}) `;\n\t\tconst rightChunk = sql`(${rightSelect.getSQL()})`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, PgColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, PgColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(chunk.name);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select, overridingSystemValue_ }: PgInsertConfig,\n\t): SQL {\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, PgColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, PgColumn][] = Object.entries(columns).filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrder = colEntries.map(\n\t\t\t([, column]) => sql.identifier(this.casing.getColumnCasing(column)),\n\t\t);\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnyPgSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tconst defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tconst newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t\tvalueList.push(newValue);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvalueList.push(sql`default`);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict ? sql` on conflict ${onConflict}` : undefined;\n\n\t\tconst overridingSql = overridingSystemValue_ === true ? sql`overriding system value ` : undefined;\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${overridingSql}${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tbuildRefreshMaterializedViewQuery(\n\t\t{ view, concurrently, withNoData }: { view: PgMaterializedView; concurrently?: boolean; withNoData?: boolean },\n\t): SQL {\n\t\tconst concurrentlySql = concurrently ? sql` concurrently` : undefined;\n\t\tconst withNoDataSql = withNoData ? sql` with no data` : undefined;\n\n\t\treturn sql`refresh materialized view${concurrentlySql} ${view}${withNoDataSql}`;\n\t}\n\n\tprepareTyping(encoder: DriverValueEncoder<unknown, unknown>): QueryTypingsValue {\n\t\tif (is(encoder, PgJsonb) || is(encoder, PgJson)) {\n\t\t\treturn 'json';\n\t\t} else if (is(encoder, PgNumeric)) {\n\t\t\treturn 'decimal';\n\t\t} else if (is(encoder, PgTime)) {\n\t\t\treturn 'time';\n\t\t} else if (is(encoder, PgTimestamp) || is(encoder, PgTimestampString)) {\n\t\t\treturn 'timestamp';\n\t\t} else if (is(encoder, PgDate) || is(encoder, PgDateString)) {\n\t\t\treturn 'date';\n\t\t} else if (is(encoder, PgUUID)) {\n\t\t\treturn 'uuid';\n\t\t} else {\n\t\t\treturn 'none';\n\t\t}\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tprepareTyping: this.prepareTyping,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t// buildRelationalQueryWithPK({\n\t// \tfullSchema,\n\t// \tschema,\n\t// \ttableNamesMap,\n\t// \ttable,\n\t// \ttableConfig,\n\t// \tqueryConfig: config,\n\t// \ttableAlias,\n\t// \tisRoot = false,\n\t// \tjoinOn,\n\t// }: {\n\t// \tfullSchema: Record<string, unknown>;\n\t// \tschema: TablesRelationalConfig;\n\t// \ttableNamesMap: Record<string, string>;\n\t// \ttable: PgTable;\n\t// \ttableConfig: TableRelationalConfig;\n\t// \tqueryConfig: true | DBQueryConfig<'many', true>;\n\t// \ttableAlias: string;\n\t// \tisRoot?: boolean;\n\t// \tjoinOn?: SQL;\n\t// }): BuildRelationalQueryResult<PgTable, PgColumn> {\n\t// \t// For { \"<relation>\": true }, return a table with selection of all columns\n\t// \tif (config === true) {\n\t// \t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t// \t\tconst selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = selectionEntries.map((\n\t// \t\t\t[key, value],\n\t// \t\t) => ({\n\t// \t\t\tdbKey: value.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: value as PgColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection,\n\t// \t\t};\n\t// \t}\n\n\t// \t// let selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\t// \t// let selectionForBuild = selection;\n\n\t// \tconst aliasedColumns = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedRelations = Object.fromEntries(\n\t// \t\tObject.entries(tableConfig.relations).map(([key, value]) => [key, aliasedRelation(value, tableAlias)]),\n\t// \t);\n\n\t// \tconst aliasedFields = Object.assign({}, aliasedColumns, aliasedRelations);\n\n\t// \tlet where, hasUserDefinedWhere;\n\t// \tif (config.where) {\n\t// \t\tconst whereSql = typeof config.where === 'function' ? config.where(aliasedFields, operators) : config.where;\n\t// \t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t// \t\thasUserDefinedWhere = !!where;\n\t// \t}\n\t// \twhere = and(joinOn, where);\n\n\t// \t// const fieldsSelection: { tsKey: string; value: PgColumn | SQL.Aliased; isExtra?: boolean }[] = [];\n\t// \tlet joins: Join[] = [];\n\t// \tlet selectedColumns: string[] = [];\n\n\t// \t// Figure out which columns to select\n\t// \tif (config.columns) {\n\t// \t\tlet isIncludeMode = false;\n\n\t// \t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t// \t\t\tif (value === undefined) {\n\t// \t\t\t\tcontinue;\n\t// \t\t\t}\n\n\t// \t\t\tif (field in tableConfig.columns) {\n\t// \t\t\t\tif (!isIncludeMode && value === true) {\n\t// \t\t\t\t\tisIncludeMode = true;\n\t// \t\t\t\t}\n\t// \t\t\t\tselectedColumns.push(field);\n\t// \t\t\t}\n\t// \t\t}\n\n\t// \t\tif (selectedColumns.length > 0) {\n\t// \t\t\tselectedColumns = isIncludeMode\n\t// \t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t// \t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t// \t\t}\n\t// \t} else {\n\t// \t\t// Select all columns if selection is not specified\n\t// \t\tselectedColumns = Object.keys(tableConfig.columns);\n\t// \t}\n\n\t// \t// for (const field of selectedColumns) {\n\t// \t// \tconst column = tableConfig.columns[field]! as PgColumn;\n\t// \t// \tfieldsSelection.push({ tsKey: field, value: column });\n\t// \t// }\n\n\t// \tlet initiallySelectedRelations: {\n\t// \t\ttsKey: string;\n\t// \t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t// \t\trelation: Relation;\n\t// \t}[] = [];\n\n\t// \t// let selectedRelations: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\n\t// \t// Figure out which relations to select\n\t// \tif (config.with) {\n\t// \t\tinitiallySelectedRelations = Object.entries(config.with)\n\t// \t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t// \t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t// \t}\n\n\t// \tconst manyRelations = initiallySelectedRelations.filter((r) =>\n\t// \t\tis(r.relation, Many)\n\t// \t\t&& (schema[tableNamesMap[r.relation.referencedTable[Table.Symbol.Name]]!]?.primaryKey.length ?? 0) > 0\n\t// \t);\n\t// \t// If this is the last Many relation (or there are no Many relations), we are on the innermost subquery level\n\t// \tconst isInnermostQuery = manyRelations.length < 2;\n\n\t// \tconst selectedExtras: {\n\t// \t\ttsKey: string;\n\t// \t\tvalue: SQL.Aliased;\n\t// \t}[] = [];\n\n\t// \t// Figure out which extras to select\n\t// \tif (isInnermostQuery && config.extras) {\n\t// \t\tconst extras = typeof config.extras === 'function'\n\t// \t\t\t? config.extras(aliasedFields, { sql })\n\t// \t\t\t: config.extras;\n\t// \t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t// \t\t\tselectedExtras.push({\n\t// \t\t\t\ttsKey,\n\t// \t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t// \t\t\t});\n\t// \t\t}\n\t// \t}\n\n\t// \t// Transform `fieldsSelection` into `selection`\n\t// \t// `fieldsSelection` shouldn't be used after this point\n\t// \t// for (const { tsKey, value, isExtra } of fieldsSelection) {\n\t// \t// \tselection.push({\n\t// \t// \t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t// \t// \t\ttsKey,\n\t// \t// \t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t// \t// \t\trelationTableTsKey: undefined,\n\t// \t// \t\tisJson: false,\n\t// \t// \t\tisExtra,\n\t// \t// \t\tselection: [],\n\t// \t// \t});\n\t// \t// }\n\n\t// \tlet orderByOrig = typeof config.orderBy === 'function'\n\t// \t\t? config.orderBy(aliasedFields, orderByOperators)\n\t// \t\t: config.orderBy ?? [];\n\t// \tif (!Array.isArray(orderByOrig)) {\n\t// \t\torderByOrig = [orderByOrig];\n\t// \t}\n\t// \tconst orderBy = orderByOrig.map((orderByValue) => {\n\t// \t\tif (is(orderByValue, Column)) {\n\t// \t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as PgColumn;\n\t// \t\t}\n\t// \t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t// \t});\n\n\t// \tconst limit = isInnermostQuery ? config.limit : undefined;\n\t// \tconst offset = isInnermostQuery ? config.offset : undefined;\n\n\t// \t// For non-root queries without additional config except columns, return a table with selection\n\t// \tif (\n\t// \t\t!isRoot\n\t// \t\t&& initiallySelectedRelations.length === 0\n\t// \t\t&& selectedExtras.length === 0\n\t// \t\t&& !where\n\t// \t\t&& orderBy.length === 0\n\t// \t\t&& limit === undefined\n\t// \t\t&& offset === undefined\n\t// \t) {\n\t// \t\treturn {\n\t// \t\t\ttableTsKey: tableConfig.tsName,\n\t// \t\t\tsql: table,\n\t// \t\t\tselection: selectedColumns.map((key) => ({\n\t// \t\t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\t\ttsKey: key,\n\t// \t\t\t\tfield: tableConfig.columns[key] as PgColumn,\n\t// \t\t\t\trelationTableTsKey: undefined,\n\t// \t\t\t\tisJson: false,\n\t// \t\t\t\tselection: [],\n\t// \t\t\t})),\n\t// \t\t};\n\t// \t}\n\n\t// \tconst selectedRelationsWithoutPK:\n\n\t// \t// Process all relations without primary keys, because they need to be joined differently and will all be on the same query level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of initiallySelectedRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length > 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t\tnestedQueryRelation: relation,\n\t// \t\t});\n\t// \t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t// \t\tjoins.push({\n\t// \t\t\ton: sql`true`,\n\t// \t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: true,\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tconst oneRelations = initiallySelectedRelations.filter((r): r is typeof r & { relation: One } =>\n\t// \t\tis(r.relation, One)\n\t// \t);\n\n\t// \t// Process all One relations with PKs, because they can all be joined on the same level\n\t// \tfor (\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\trelation,\n\t// \t\t} of oneRelations\n\t// \t) {\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst relationTable = schema[relationTableTsName]!;\n\n\t// \t\tif (relationTable.primaryKey.length === 0) {\n\t// \t\t\tcontinue;\n\t// \t\t}\n\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\t// \t\tconst builtRelation = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationConfigValue,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\t// \t\tconst field = sql`case when ${sql.identifier(relationTableAlias)} is null then null else json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelation.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelation.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: is(builtRelation.sql, SQL)\n\t// \t\t\t\t? new Subquery(builtRelation.sql, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelation.sql, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: is(builtRelation.sql, SQL),\n\t// \t\t});\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelation.selection,\n\t// \t\t});\n\t// \t}\n\n\t// \tlet distinct: PgSelectConfig['distinct'];\n\t// \tlet tableFrom: PgTable | Subquery = table;\n\n\t// \t// Process first Many relation - each one requires a nested subquery\n\t// \tconst manyRelation = manyRelations[0];\n\t// \tif (manyRelation) {\n\t// \t\tconst {\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\trelation,\n\t// \t\t} = manyRelation;\n\n\t// \t\tdistinct = {\n\t// \t\t\ton: tableConfig.primaryKey.map((c) => aliasedTableColumn(c as PgColumn, tableAlias)),\n\t// \t\t};\n\n\t// \t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t// \t\tconst relationTableName = relation.referencedTable[Table.Symbol.Name];\n\t// \t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t// \t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t// \t\tconst joinOn = and(\n\t// \t\t\t...normalizedRelation.fields.map((field, i) =>\n\t// \t\t\t\teq(\n\t// \t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t// \t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t// \t\t\t\t)\n\t// \t\t\t),\n\t// \t\t);\n\n\t// \t\tconst builtRelationJoin = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t// \t\t\ttableConfig: schema[relationTableTsName]!,\n\t// \t\t\tqueryConfig: selectedRelationQueryConfig,\n\t// \t\t\ttableAlias: relationTableAlias,\n\t// \t\t\tjoinOn,\n\t// \t\t});\n\n\t// \t\tconst builtRelationSelectionField = sql`case when ${\n\t// \t\t\tsql.identifier(relationTableAlias)\n\t// \t\t} is null then '[]' else json_agg(json_build_array(${\n\t// \t\t\tsql.join(\n\t// \t\t\t\tbuiltRelationJoin.selection.map(({ field }) =>\n\t// \t\t\t\t\tis(field, SQL.Aliased)\n\t// \t\t\t\t\t\t? sql`${sql.identifier(relationTableAlias)}.${sql.identifier(field.fieldAlias)}`\n\t// \t\t\t\t\t\t: is(field, Column)\n\t// \t\t\t\t\t\t? aliasedTableColumn(field, relationTableAlias)\n\t// \t\t\t\t\t\t: field\n\t// \t\t\t\t),\n\t// \t\t\t\tsql`, `,\n\t// \t\t\t)\n\t// \t\t})) over (partition by ${sql.join(distinct.on, sql`, `)}) end`.as(selectedRelationTsKey);\n\t// \t\tconst isLateralJoin = is(builtRelationJoin.sql, SQL);\n\t// \t\tjoins.push({\n\t// \t\t\ton: isLateralJoin ? sql`true` : joinOn,\n\t// \t\t\ttable: isLateralJoin\n\t// \t\t\t\t? new Subquery(builtRelationJoin.sql as SQL, {}, relationTableAlias)\n\t// \t\t\t\t: aliasedTable(builtRelationJoin.sql as PgTable, relationTableAlias),\n\t// \t\t\talias: relationTableAlias,\n\t// \t\t\tjoinType: 'left',\n\t// \t\t\tlateral: isLateralJoin,\n\t// \t\t});\n\n\t// \t\t// Build the \"from\" subquery with the remaining Many relations\n\t// \t\tconst builtTableFrom = this.buildRelationalQueryWithPK({\n\t// \t\t\tfullSchema,\n\t// \t\t\tschema,\n\t// \t\t\ttableNamesMap,\n\t// \t\t\ttable,\n\t// \t\t\ttableConfig,\n\t// \t\t\tqueryConfig: {\n\t// \t\t\t\t...config,\n\t// \t\t\t\twhere: undefined,\n\t// \t\t\t\torderBy: undefined,\n\t// \t\t\t\tlimit: undefined,\n\t// \t\t\t\toffset: undefined,\n\t// \t\t\t\twith: manyRelations.slice(1).reduce<NonNullable<typeof config['with']>>(\n\t// \t\t\t\t\t(result, { tsKey, queryConfig: configValue }) => {\n\t// \t\t\t\t\t\tresult[tsKey] = configValue;\n\t// \t\t\t\t\t\treturn result;\n\t// \t\t\t\t\t},\n\t// \t\t\t\t\t{},\n\t// \t\t\t\t),\n\t// \t\t\t},\n\t// \t\t\ttableAlias,\n\t// \t\t});\n\n\t// \t\tselectedRelations.push({\n\t// \t\t\tdbKey: selectedRelationTsKey,\n\t// \t\t\ttsKey: selectedRelationTsKey,\n\t// \t\t\tfield: builtRelationSelectionField,\n\t// \t\t\trelationTableTsKey: relationTableTsName,\n\t// \t\t\tisJson: true,\n\t// \t\t\tselection: builtRelationJoin.selection,\n\t// \t\t});\n\n\t// \t\t// selection = builtTableFrom.selection.map((item) =>\n\t// \t\t// \tis(item.field, SQL.Aliased)\n\t// \t\t// \t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t// \t\t: item\n\t// \t\t// );\n\t// \t\t// selectionForBuild = [{\n\t// \t\t// \tdbKey: '*',\n\t// \t\t// \ttsKey: '*',\n\t// \t\t// \tfield: sql`${sql.identifier(tableAlias)}.*`,\n\t// \t\t// \tselection: [],\n\t// \t\t// \tisJson: false,\n\t// \t\t// \trelationTableTsKey: undefined,\n\t// \t\t// }];\n\t// \t\t// const newSelectionItem: (typeof selection)[number] = {\n\t// \t\t// \tdbKey: selectedRelationTsKey,\n\t// \t\t// \ttsKey: selectedRelationTsKey,\n\t// \t\t// \tfield,\n\t// \t\t// \trelationTableTsKey: relationTableTsName,\n\t// \t\t// \tisJson: true,\n\t// \t\t// \tselection: builtRelationJoin.selection,\n\t// \t\t// };\n\t// \t\t// selection.push(newSelectionItem);\n\t// \t\t// selectionForBuild.push(newSelectionItem);\n\n\t// \t\ttableFrom = is(builtTableFrom.sql, PgTable)\n\t// \t\t\t? builtTableFrom.sql\n\t// \t\t\t: new Subquery(builtTableFrom.sql, {}, tableAlias);\n\t// \t}\n\n\t// \tif (selectedColumns.length === 0 && selectedRelations.length === 0 && selectedExtras.length === 0) {\n\t// \t\tthrow new DrizzleError(`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")`);\n\t// \t}\n\n\t// \tlet selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'];\n\n\t// \tfunction prepareSelectedColumns() {\n\t// \t\treturn selectedColumns.map((key) => ({\n\t// \t\t\tdbKey: tableConfig.columns[key]!.name,\n\t// \t\t\ttsKey: key,\n\t// \t\t\tfield: tableConfig.columns[key] as PgColumn,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tfunction prepareSelectedExtras() {\n\t// \t\treturn selectedExtras.map((item) => ({\n\t// \t\t\tdbKey: item.value.fieldAlias,\n\t// \t\t\ttsKey: item.tsKey,\n\t// \t\t\tfield: item.value,\n\t// \t\t\trelationTableTsKey: undefined,\n\t// \t\t\tisJson: false,\n\t// \t\t\tselection: [],\n\t// \t\t}));\n\t// \t}\n\n\t// \tif (isRoot) {\n\t// \t\tselection = [\n\t// \t\t\t...prepareSelectedColumns(),\n\t// \t\t\t...prepareSelectedExtras(),\n\t// \t\t];\n\t// \t}\n\n\t// \tif (hasUserDefinedWhere || orderBy.length > 0) {\n\t// \t\ttableFrom = new Subquery(\n\t// \t\t\tthis.buildSelectQuery({\n\t// \t\t\t\ttable: is(tableFrom, PgTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\t\t\tfields: {},\n\t// \t\t\t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\t\t\tpath: [],\n\t// \t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t\t\t})),\n\t// \t\t\t\tjoins,\n\t// \t\t\t\tdistinct,\n\t// \t\t\t}),\n\t// \t\t\t{},\n\t// \t\t\ttableAlias,\n\t// \t\t);\n\t// \t\tselectionForBuild = selection.map((item) =>\n\t// \t\t\tis(item.field, SQL.Aliased)\n\t// \t\t\t\t? { ...item, field: sql`${sql.identifier(tableAlias)}.${sql.identifier(item.field.fieldAlias)}` }\n\t// \t\t\t\t: item\n\t// \t\t);\n\t// \t\tjoins = [];\n\t// \t\tdistinct = undefined;\n\t// \t}\n\n\t// \tconst result = this.buildSelectQuery({\n\t// \t\ttable: is(tableFrom, PgTable) ? aliasedTable(tableFrom, tableAlias) : tableFrom,\n\t// \t\tfields: {},\n\t// \t\tfieldsFlat: selectionForBuild.map(({ field }) => ({\n\t// \t\t\tpath: [],\n\t// \t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t// \t\t})),\n\t// \t\twhere,\n\t// \t\tlimit,\n\t// \t\toffset,\n\t// \t\tjoins,\n\t// \t\torderBy,\n\t// \t\tdistinct,\n\t// \t});\n\n\t// \treturn {\n\t// \t\ttableTsKey: tableConfig.tsName,\n\t// \t\tsql: result,\n\t// \t\tselection,\n\t// \t};\n\t// }\n\n\tbuildRelationalQueryWithoutPK({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: PgTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<PgTable, PgColumn> {\n\t\tlet selection: BuildRelationalQueryResult<PgTable, PgColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: NonNullable<PgSelectConfig['orderBy']> = [], where;\n\t\tconst joins: PgSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as PgColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map((\n\t\t\t\t\t[key, value],\n\t\t\t\t) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: PgColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as PgColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as PgColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQueryWithoutPK({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as PgTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier('data')}`.as(selectedRelationTsKey);\n\t\t\t\tjoins.push({\n\t\t\t\t\ton: sql`true`,\n\t\t\t\t\ttable: new Subquery(builtRelation.sql as SQL, {}, relationTableAlias),\n\t\t\t\t\talias: relationTableAlias,\n\t\t\t\t\tjoinType: 'left',\n\t\t\t\t\tlateral: true,\n\t\t\t\t});\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({ message: `No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\")` });\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_build_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field, tsKey, isJson }) =>\n\t\t\t\t\t\tisJson\n\t\t\t\t\t\t\t? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier('data')}`\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_agg(${field}${\n\t\t\t\t\torderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : undefined\n\t\t\t\t}), '[]'::json)`;\n\t\t\t\t// orderBy = [];\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [{\n\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t}],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = [];\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, PgTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown, TConfig = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t\tconfig?: TConfig;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n","import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgColumn } from '~/pg-core/columns/index.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type { PgSession, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport type { SubqueryWithSelection } from '~/pg-core/subquery.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport { PgViewBase } from '~/pg-core/view-base.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport {\n\tapplyMixins,\n\ttype DrizzleTypeError,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\ttype NeonAuthToken,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { orderSelectedFields } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type {\n\tAnyPgSelect,\n\tCreatePgSelectFromBuilderMode,\n\tGetPgSetOperators,\n\tLockConfig,\n\tLockStrength,\n\tPgCreateSetOperatorFn,\n\tPgSelectConfig,\n\tPgSelectCrossJoinFn,\n\tPgSelectDynamic,\n\tPgSelectHKT,\n\tPgSelectHKTBase,\n\tPgSelectJoinFn,\n\tPgSelectPrepare,\n\tPgSelectWithout,\n\tPgSetOperatorExcludedMethods,\n\tPgSetOperatorWithResult,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tTableLikeHasEmptySelection,\n} from './select.types.ts';\n\nexport class PgSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'PgSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: PgSession | undefined;\n\tprivate dialect: PgDialect;\n\tprivate withList: Subquery[] = [];\n\tprivate distinct: boolean | {\n\t\ton: (PgColumn | SQLWrapper)[];\n\t} | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: PgSession | undefined;\n\t\t\tdialect: PgDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean | {\n\t\t\t\ton: (PgColumn | SQLWrapper)[];\n\t\t\t};\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tif (config.withList) {\n\t\t\tthis.withList = config.withList;\n\t\t}\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Specify the table, subquery, or other target that you're\n\t * building a select query against.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FROM | Postgres from documentation}\n\t */\n\tfrom<TFrom extends PgTable | Subquery | PgViewBase | SQL>(\n\t\tsource: TableLikeHasEmptySelection<TFrom> extends true ? DrizzleTypeError<\n\t\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t\t>\n\t\t\t: TFrom,\n\t): CreatePgSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\t\tconst src = source as TFrom;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(src, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(src._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, src[key as unknown as keyof typeof src] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(src, PgViewBase)) {\n\t\t\tfields = src[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(src, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<PgTable>(src);\n\t\t}\n\n\t\treturn (new PgSelectBase({\n\t\t\ttable: src,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}).setToken(this.authToken)) as any;\n\t}\n}\n\nexport abstract class PgSelectQueryBuilderBase<\n\tTHKT extends PgSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'PgSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly config: PgSelectConfig;\n\t};\n\n\tprotected config: PgSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprotected tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: PgSession | undefined;\n\tprotected dialect: PgDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\n\tprotected usedTables: Set<string> = new Set();\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: PgSelectConfig['table'];\n\t\t\tfields: PgSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: PgSession | undefined;\n\t\t\tdialect: PgDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | {\n\t\t\t\ton: (PgColumn | SQLWrapper)[];\n\t\t\t} | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t\tconfig: this.config,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\n\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\t}\n\n\t/** @internal */\n\tgetUsedTables() {\n\t\treturn [...this.usedTables];\n\t}\n\n\tprivate createJoin<\n\t\tTJoinType extends JoinType,\n\t\tTIsLateral extends (TJoinType extends 'full' | 'right' ? false : boolean),\n\t>(\n\t\tjoinType: TJoinType,\n\t\tlateral: TIsLateral,\n\t): 'cross' extends TJoinType ? PgSelectCrossJoinFn<this, TDynamic, TIsLateral>\n\t\t: PgSelectJoinFn<this, TDynamic, TJoinType, TIsLateral>\n\t{\n\t\treturn ((\n\t\t\ttable: TIsLateral extends true ? Subquery | SQL : PgTable | Subquery | PgViewBase | SQL,\n\t\t\ton?: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\t// store all tables used in a query\n\t\t\tfor (const item of extractUsedTable(table)) this.usedTables.add(item);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName, lateral });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'cross':\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null; }[] = await db.select()\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left', false);\n\n\t/**\n\t * Executes a `left join lateral` operation by adding subquery to the current query.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tleftJoinLateral = this.createJoin('left', true);\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right', false);\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner', false);\n\n\t/**\n\t * Executes an `inner join lateral` operation, creating a new table by combining rows from two queries that have matching values.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join-lateral}\n\t *\n\t * @param table the subquery to join.\n\t * @param on the `on` clause.\n\t */\n\tinnerJoinLateral = this.createJoin('inner', true);\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null; }[] = await db.select()\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full', false);\n\n\t/**\n\t * Executes a `cross join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .crossJoin(pets)\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number; }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross', false);\n\n\t/**\n\t * Executes a `cross join lateral` operation by combining rows from two queries into a new table.\n\t *\n\t * A `lateral` join allows the right-hand expression to refer to columns from the left-hand side.\n\t *\n\t * Calling this method retrieves all rows from both main and joined queries, merging all rows from each query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join-lateral}\n\t *\n\t * @param table the query to join.\n\t */\n\tcrossJoinLateral = this.createJoin('cross', true);\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends PgSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetPgSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => PgSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tPgSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getPgSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t * .from(users)\n\t * .union(\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * // or\n\t * import { union } from 'drizzle-orm/pg-core'\n\t *\n\t * await union(\n\t * db.select({ name: users.name }).from(users),\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t * .from(onlineSales)\n\t * .unionAll(\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await unionAll(\n\t * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .intersect(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/pg-core'\n\t *\n\t * await intersect(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `intersect all` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products and quantities that are ordered by both regular and VIP customers\n\t * await db.select({\n\t * productId: regularCustomerOrders.productId,\n\t * quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .intersectAll(\n\t * db.select({\n\t * productId: vipCustomerOrders.productId,\n\t * quantityOrdered: vipCustomerOrders.quantityOrdered\n\t * })\n\t * .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { intersectAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await intersectAll(\n\t * db.select({\n\t * productId: regularCustomerOrders.productId,\n\t * quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders),\n\t * db.select({\n\t * productId: vipCustomerOrders.productId,\n\t * quantityOrdered: vipCustomerOrders.quantityOrdered\n\t * })\n\t * .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\tintersectAll = this.createSetOperator('intersect', true);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .except(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { except } from 'drizzle-orm/pg-core'\n\t *\n\t * await except(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/**\n\t * Adds `except all` set operator to the query.\n\t *\n\t * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all products that are ordered by regular customers but not by VIP customers\n\t * await db.select({\n\t * productId: regularCustomerOrders.productId,\n\t * quantityOrdered: regularCustomerOrders.quantityOrdered,\n\t * })\n\t * .from(regularCustomerOrders)\n\t * .exceptAll(\n\t * db.select({\n\t * productId: vipCustomerOrders.productId,\n\t * quantityOrdered: vipCustomerOrders.quantityOrdered,\n\t * })\n\t * .from(vipCustomerOrders)\n\t * );\n\t * // or\n\t * import { exceptAll } from 'drizzle-orm/pg-core'\n\t *\n\t * await exceptAll(\n\t * db.select({\n\t * productId: regularCustomerOrders.productId,\n\t * quantityOrdered: regularCustomerOrders.quantityOrdered\n\t * })\n\t * .from(regularCustomerOrders),\n\t * db.select({\n\t * productId: vipCustomerOrders.productId,\n\t * quantityOrdered: vipCustomerOrders.quantityOrdered\n\t * })\n\t * .from(vipCustomerOrders)\n\t * );\n\t * ```\n\t */\n\texceptAll = this.createSetOperator('except', true);\n\n\t/** @internal */\n\taddSetOperators(setOperators: PgSelectConfig['setOperators']): PgSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tPgSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): PgSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t * .from(cars)\n\t * .groupBy(cars.brand)\n\t * .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): PgSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t * lastName: people.lastName,\n\t * count: sql<number>`cast(count(*) as int)`\n\t * })\n\t * .from(people)\n\t * .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>,\n\t): PgSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (PgColumn | SQL | SQL.Aliased)[]): PgSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>]\n\t\t\t| (PgColumn | SQL | SQL.Aliased)[]\n\t): PgSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (PgColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>,\n\t): PgSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (PgColumn | SQL | SQL.Aliased)[]): PgSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<PgColumn | SQL | SQL.Aliased>]\n\t\t\t| (PgColumn | SQL | SQL.Aliased)[]\n\t): PgSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (PgColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): PgSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): PgSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `for` clause to the query.\n\t *\n\t * Calling this method will specify a lock strength for this query that controls how strictly it acquires exclusive access to the rows being queried.\n\t *\n\t * See docs: {@link https://www.postgresql.org/docs/current/sql-select.html#SQL-FOR-UPDATE-SHARE}\n\t *\n\t * @param strength the lock strength.\n\t * @param config the lock configuration.\n\t */\n\tfor(strength: LockStrength, config: LockConfig = {}): PgSelectWithout<this, TDynamic, 'for'> {\n\t\tthis.config.lockingClause = { strength, config };\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\tconst usedTables: string[] = [];\n\t\tusedTables.push(...extractUsedTable(this.config.table));\n\t\tif (this.config.joins) { for (const it of this.config.joins) usedTables.push(...extractUsedTable(it.table)); }\n\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias, false, [...new Set(usedTables)]),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgSelectDynamic<this> {\n\t\treturn this;\n\t}\n\n\t$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enable: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enable: false }\n\t\t\t: { enable: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n}\n\nexport interface PgSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tPgSelectQueryBuilderBase<\n\t\tPgSelectHKT,\n\t\tTTableName,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>,\n\tSQLWrapper\n{}\n\nexport class PgSelectBase<\n\tTTableName extends string | undefined,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends PgSelectQueryBuilderBase<\n\tPgSelectHKT,\n\tTTableName,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'pg'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'PgSelect';\n\n\t/** @internal */\n\t_prepare(name?: string): PgSelectPrepare<this> {\n\t\tconst { session, config, dialect, joinsNotNullableMap, authToken, cacheConfig, usedTables } = this;\n\t\tif (!session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\n\t\tconst { fields } = config;\n\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst fieldsList = orderSelectedFields<PgColumn>(fields);\n\t\t\tconst query = session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & { execute: TResult }\n\t\t\t>(dialect.sqlToQuery(this.getSQL()), fieldsList, name, true, undefined, {\n\t\t\t\ttype: 'select',\n\t\t\t\ttables: [...usedTables],\n\t\t\t}, cacheConfig);\n\t\t\tquery.joinsNotNullableMap = joinsNotNullableMap;\n\n\t\t\treturn query.setToken(authToken);\n\t\t});\n\t}\n\n\t/**\n\t * Create a prepared statement for this query. This allows\n\t * the database to remember this query for the given session\n\t * and call it by name, rather than specifying the full query.\n\t *\n\t * {@link https://www.postgresql.org/docs/current/sql-prepare.html | Postgres prepare documentation}\n\t */\n\tprepare(name: string): PgSelectPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n}\n\napplyMixins(PgSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): PgCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnyPgSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnyPgSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getPgSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\tintersectAll,\n\texcept,\n\texceptAll,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/pg-core'\n *\n * await union(\n * db.select({ name: users.name }).from(users),\n * db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n * .from(users)\n * .union(\n * db.select({ name: customers.name }).from(customers)\n * );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/pg-core'\n *\n * await unionAll(\n * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n * .from(onlineSales)\n * .unionAll(\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/pg-core'\n *\n * await intersect(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .intersect(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `intersect all` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets including all duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect-all}\n *\n * @example\n *\n * ```ts\n * // Select all products and quantities that are ordered by both regular and VIP customers\n * import { intersectAll } from 'drizzle-orm/pg-core'\n *\n * await intersectAll(\n * db.select({\n * productId: regularCustomerOrders.productId,\n * quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders),\n * db.select({\n * productId: vipCustomerOrders.productId,\n * quantityOrdered: vipCustomerOrders.quantityOrdered\n * })\n * .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n * productId: regularCustomerOrders.productId,\n * quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders)\n * .intersectAll(\n * db.select({\n * productId: vipCustomerOrders.productId,\n * quantityOrdered: vipCustomerOrders.quantityOrdered\n * })\n * .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const intersectAll = createSetOperator('intersect', true);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/pg-core'\n *\n * await except(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .except(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const except = createSetOperator('except', false);\n\n/**\n * Adds `except all` set operator to the query.\n *\n * Calling this method will retrieve all rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except-all}\n *\n * @example\n *\n * ```ts\n * // Select all products that are ordered by regular customers but not by VIP customers\n * import { exceptAll } from 'drizzle-orm/pg-core'\n *\n * await exceptAll(\n * db.select({\n * productId: regularCustomerOrders.productId,\n * quantityOrdered: regularCustomerOrders.quantityOrdered\n * })\n * .from(regularCustomerOrders),\n * db.select({\n * productId: vipCustomerOrders.productId,\n * quantityOrdered: vipCustomerOrders.quantityOrdered\n * })\n * .from(vipCustomerOrders)\n * );\n * // or\n * await db.select({\n * productId: regularCustomerOrders.productId,\n * quantityOrdered: regularCustomerOrders.quantityOrdered,\n * })\n * .from(regularCustomerOrders)\n * .exceptAll(\n * db.select({\n * productId: vipCustomerOrders.productId,\n * quantityOrdered: vipCustomerOrders.quantityOrdered,\n * })\n * .from(vipCustomerOrders)\n * );\n * ```\n */\nexport const exceptAll = createSetOperator('except', true);\n","import { entityKind, is } from '~/entity.ts';\nimport type { PgDialectConfig } from '~/pg-core/dialect.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { PgColumn } from '../columns/index.ts';\nimport type { WithBuilder } from '../subquery.ts';\nimport { PgSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'PgQueryBuilder';\n\n\tprivate dialect: PgDialect | undefined;\n\tprivate dialectConfig: PgDialectConfig | undefined;\n\n\tconstructor(dialect?: PgDialect | PgDialectConfig) {\n\t\tthis.dialect = is(dialect, PgDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, PgDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined, 'qb'>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): PgSelectBuilder<TSelection, 'qb'>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn };\n\t}\n\n\tselect(): PgSelectBuilder<undefined, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection, 'qb'>;\n\tselect<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined, 'qb'> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t});\n\t}\n\n\tselectDistinct(): PgSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselectDistinct<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\tselectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): PgSelectBuilder<TSelection>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields?: TSelection,\n\t): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new PgDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n","import { is } from '~/entity.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Schema, Table } from '~/table.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { type Check, CheckBuilder } from './checks.ts';\nimport type { AnyPgColumn } from './columns/index.ts';\nimport { type ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { Index } from './indexes.ts';\nimport { IndexBuilder } from './indexes.ts';\nimport { PgPolicy } from './policies.ts';\nimport { type PrimaryKey, PrimaryKeyBuilder } from './primary-keys.ts';\nimport { type UniqueConstraint, UniqueConstraintBuilder } from './unique-constraint.ts';\nimport type { PgViewBase } from './view-base.ts';\nimport { PgViewConfig } from './view-common.ts';\nimport { type PgMaterializedView, PgMaterializedViewConfig, type PgView } from './view.ts';\n\nexport function getTableConfig<TTable extends PgTable>(table: TTable) {\n\tconst columns = Object.values(table[Table.Symbol.Columns]);\n\tconst indexes: Index[] = [];\n\tconst checks: Check[] = [];\n\tconst primaryKeys: PrimaryKey[] = [];\n\tconst foreignKeys: ForeignKey[] = Object.values(table[PgTable.Symbol.InlineForeignKeys]);\n\tconst uniqueConstraints: UniqueConstraint[] = [];\n\tconst name = table[Table.Symbol.Name];\n\tconst schema = table[Table.Symbol.Schema];\n\tconst policies: PgPolicy[] = [];\n\tconst enableRLS: boolean = table[PgTable.Symbol.EnableRLS];\n\n\tconst extraConfigBuilder = table[PgTable.Symbol.ExtraConfigBuilder];\n\n\tif (extraConfigBuilder !== undefined) {\n\t\tconst extraConfig = extraConfigBuilder(table[Table.Symbol.ExtraConfigColumns]);\n\t\tconst extraValues = Array.isArray(extraConfig) ? extraConfig.flat(1) as any[] : Object.values(extraConfig);\n\t\tfor (const builder of extraValues) {\n\t\t\tif (is(builder, IndexBuilder)) {\n\t\t\t\tindexes.push(builder.build(table));\n\t\t\t} else if (is(builder, CheckBuilder)) {\n\t\t\t\tchecks.push(builder.build(table));\n\t\t\t} else if (is(builder, UniqueConstraintBuilder)) {\n\t\t\t\tuniqueConstraints.push(builder.build(table));\n\t\t\t} else if (is(builder, PrimaryKeyBuilder)) {\n\t\t\t\tprimaryKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, ForeignKeyBuilder)) {\n\t\t\t\tforeignKeys.push(builder.build(table));\n\t\t\t} else if (is(builder, PgPolicy)) {\n\t\t\t\tpolicies.push(builder);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\tindexes,\n\t\tforeignKeys,\n\t\tchecks,\n\t\tprimaryKeys,\n\t\tuniqueConstraints,\n\t\tname,\n\t\tschema,\n\t\tpolicies,\n\t\tenableRLS,\n\t};\n}\n\nexport function extractUsedTable(table: PgTable | Subquery | PgViewBase | SQL): string[] {\n\tif (is(table, PgTable)) {\n\t\treturn [table[Schema] ? `${table[Schema]}.${table[Table.Symbol.BaseName]}` : table[Table.Symbol.BaseName]];\n\t}\n\tif (is(table, Subquery)) {\n\t\treturn table._.usedTables ?? [];\n\t}\n\tif (is(table, SQL)) {\n\t\treturn table.usedTables ?? [];\n\t}\n\treturn [];\n}\n\nexport function getViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: PgView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[PgViewConfig],\n\t};\n}\n\nexport function getMaterializedViewConfig<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n>(view: PgMaterializedView<TName, TExisting>) {\n\treturn {\n\t\t...view[ViewBaseConfig],\n\t\t...view[PgMaterializedViewConfig],\n\t};\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TForeignTableName }> };\n","import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { getTableName, Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type NeonAuthToken, orderSelectedFields } from '~/utils.ts';\nimport type { PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type PgDeleteWithout<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tPgDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['queryResult'],\n\t\t\tT['_']['selectedFields'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type PgDelete<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = PgDeleteBase<TTable, TQueryResult, TSelectedFields, TReturning, true, never>;\n\nexport interface PgDeleteConfig {\n\twhere?: SQL | undefined;\n\ttable: PgTable;\n\treturningFields?: SelectedFieldsFlat;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type PgDeleteReturningAll<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n> = PgDeleteWithout<\n\tPgDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['table']['_']['columns'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgDeleteReturning<\n\tT extends AnyPgDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = PgDeleteWithout<\n\tPgDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tTSelectedFields,\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgDeletePrepare<T extends AnyPgDeleteBase> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgDeleteDynamic<T extends AnyPgDeleteBase> = PgDelete<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['selectedFields'],\n\tT['_']['returning']\n>;\n\nexport type AnyPgDeleteBase = PgDeleteBase<any, any, any, any, any, any>;\n\nexport interface PgDeleteBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgDeleteBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tTypedQueryBuilder<\n\t\t\tTSelectedFields,\n\t\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t\t>,\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgDelete';\n\n\tprivate config: PgDeleteConfig;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * await db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * await db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): PgDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): PgDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): PgDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): PgDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgDeletePrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t}, this.cacheConfig);\n\t\t});\n\t}\n\n\tprepare(name: string): PgDeletePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type { IndexColumn } from '~/pg-core/indexes.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable, TableConfig } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport type { InferInsertModel } from '~/table.ts';\nimport { Columns, getTableName, Table } from '~/table.ts';\nimport { tracer } from '~/tracing.ts';\nimport { haveSameKeys, mapUpdateSet, type NeonAuthToken, orderSelectedFields } from '~/utils.ts';\nimport type { AnyPgColumn, PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { PgUpdateSetSource } from './update.ts';\n\nexport interface PgInsertConfig<TTable extends PgTable = PgTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | PgInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL;\n\treturningFields?: SelectedFieldsFlat;\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\toverridingSystemValue_?: boolean;\n}\n\nexport type PgInsertValue<TTable extends PgTable<TableConfig>, OverrideT extends boolean = false> =\n\t& {\n\t\t[Key in keyof InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>]:\n\t\t\t| InferInsertModel<TTable, { dbColumnNames: false; override: OverrideT }>[Key]\n\t\t\t| SQL\n\t\t\t| Placeholder;\n\t}\n\t& {};\n\nexport type PgInsertSelectQueryBuilder<TTable extends PgTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnyPgColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class PgInsertBuilder<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tOverrideT extends boolean = false,\n> {\n\tstatic readonly [entityKind]: string = 'PgInsertBuilder';\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate overridingSystemValue_?: boolean,\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverridingSystemValue(): Omit<PgInsertBuilder<TTable, TQueryResult, true>, 'overridingSystemValue'> {\n\t\tthis.overridingSystemValue_ = true;\n\t\treturn this as any;\n\t}\n\n\tvalues(value: PgInsertValue<TTable, OverrideT>): PgInsertBase<TTable, TQueryResult>;\n\tvalues(values: PgInsertValue<TTable, OverrideT>[]): PgInsertBase<TTable, TQueryResult>;\n\tvalues(\n\t\tvalues: PgInsertValue<TTable, OverrideT> | PgInsertValue<TTable, OverrideT>[],\n\t): PgInsertBase<TTable, TQueryResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\treturn new PgInsertBase(\n\t\t\tthis.table,\n\t\t\tmappedValues,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t\tfalse,\n\t\t\tthis.overridingSystemValue_,\n\t\t).setToken(this.authToken) as any;\n\t}\n\n\tselect(selectQuery: (qb: QueryBuilder) => PgInsertSelectQueryBuilder<TTable>): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: SQL): PgInsertBase<TTable, TQueryResult>;\n\tselect(selectQuery: PgInsertSelectQueryBuilder<TTable>): PgInsertBase<TTable, TQueryResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| PgInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => PgInsertSelectQueryBuilder<TTable> | SQL),\n\t): PgInsertBase<TTable, TQueryResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new PgInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type PgInsertWithout<T extends AnyPgInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tPgInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['queryResult'],\n\t\t\t\tT['_']['selectedFields'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type PgInsertReturning<\n\tT extends AnyPgInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = PgInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tTSelectedFields,\n\tSelectResultFields<TSelectedFields>,\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport type PgInsertReturningAll<T extends AnyPgInsert, TDynamic extends boolean> = PgInsertBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['table']['_']['columns'],\n\tT['_']['table']['$inferSelect'],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\nexport interface PgInsertOnConflictDoUpdateConfig<T extends AnyPgInsert> {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: PgUpdateSetSource<T['_']['table']>;\n}\n\nexport type PgInsertPrepare<T extends AnyPgInsert> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgInsertDynamic<T extends AnyPgInsert> = PgInsert<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['returning']\n>;\n\nexport type AnyPgInsert = PgInsertBase<any, any, any, any, any, any>;\n\nexport type PgInsert<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = ColumnsSelection | undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = PgInsertBase<TTable, TQueryResult, TSelectedFields, TReturning, true, never>;\n\nexport interface PgInsertBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgInsertBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tTypedQueryBuilder<\n\t\t\tTSelectedFields,\n\t\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t\t>,\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgInsert';\n\n\tprivate config: PgInsertConfig<TTable>;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: PgInsertConfig['values'],\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t\toverridingSystemValue_?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select, overridingSystemValue_ };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): PgInsertWithout<PgInsertReturningAll<this, TDynamic>, TDynamic, 'returning'>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): PgInsertWithout<PgInsertReturning<this, TDynamic, TSelectedFields>, TDynamic, 'returning'>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[Table.Symbol.Columns],\n\t): PgInsertWithout<AnyPgInsert, TDynamic, 'returning'> {\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(\n\t\tconfig: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {},\n\t): PgInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict = sql`do nothing`;\n\t\t} else {\n\t\t\tlet targetColumn = '';\n\t\t\ttargetColumn = Array.isArray(config.target)\n\t\t\t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t\t\t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\t\tthis.config.onConflict = sql`(${sql.raw(targetColumn)})${whereSql} do nothing`;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'Porsche' }\n\t * });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'newBMW' },\n\t * targetWhere: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t * });\n\t * ```\n\t */\n\tonConflictDoUpdate(\n\t\tconfig: PgInsertOnConflictDoUpdateConfig<this>,\n\t): PgInsertWithout<this, TDynamic, 'onConflictDoNothing' | 'onConflictDoUpdate'> {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tlet targetColumn = '';\n\t\ttargetColumn = Array.isArray(config.target)\n\t\t\t? config.target.map((it) => this.dialect.escapeName(this.dialect.casing.getColumnCasing(it))).join(',')\n\t\t\t: this.dialect.escapeName(this.dialect.casing.getColumnCasing(config.target));\n\t\tthis.config.onConflict = sql`(${\n\t\t\tsql.raw(targetColumn)\n\t\t})${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`;\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgInsertPrepare<this> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery<\n\t\t\t\tPreparedQueryConfig & {\n\t\t\t\t\texecute: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t\t\t\t}\n\t\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: extractUsedTable(this.config.table),\n\t\t\t}, this.cacheConfig);\n\t\t});\n\t}\n\n\tprepare(name: string): PgInsertPrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgMaterializedView } from '~/pg-core/view.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PgRefreshMaterializedView<TQueryResult extends PgQueryResultHKT>\n\textends\n\t\tQueryPromise<PgQueryResultKind<TQueryResult, never>>,\n\t\tRunnableQuery<PgQueryResultKind<TQueryResult, never>, 'pg'>,\n\t\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: PgQueryResultKind<TQueryResult, never>;\n\t};\n}\n\nexport class PgRefreshMaterializedView<TQueryResult extends PgQueryResultHKT>\n\textends QueryPromise<PgQueryResultKind<TQueryResult, never>>\n\timplements RunnableQuery<PgQueryResultKind<TQueryResult, never>, 'pg'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgRefreshMaterializedView';\n\n\tprivate config: {\n\t\tview: PgMaterializedView;\n\t\tconcurrently?: boolean;\n\t\twithNoData?: boolean;\n\t};\n\n\tconstructor(\n\t\tview: PgMaterializedView,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t) {\n\t\tsuper();\n\t\tthis.config = { view };\n\t}\n\n\tconcurrently(): this {\n\t\tif (this.config.withNoData !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.concurrently = true;\n\t\treturn this;\n\t}\n\n\twithNoData(): this {\n\t\tif (this.config.concurrently !== undefined) {\n\t\t\tthrow new Error('Cannot use concurrently and withNoData together');\n\t\t}\n\t\tthis.config.withNoData = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRefreshMaterializedViewQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: PgQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\treturn this.session.prepareQuery(this.dialect.sqlToQuery(this.getSQL()), undefined, name, true);\n\t\t});\n\t}\n\n\tprepare(name: string): PgPreparedQuery<\n\t\tPreparedQueryConfig & {\n\t\t\texecute: PgQueryResultKind<TQueryResult, never>;\n\t\t}\n\t> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\texecute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t\t});\n\t};\n}\n","import type { WithCacheConfig } from '~/cache/core/types.ts';\nimport type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport type {\n\tPgPreparedQuery,\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tAppendToNullabilityMap,\n\tAppendToResult,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type Query, SQL, type SQLWrapper } from '~/sql/sql.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, Table } from '~/table.ts';\nimport {\n\ttype Assume,\n\ttype DrizzleTypeError,\n\ttype Equal,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\ttype NeonAuthToken,\n\torderSelectedFields,\n\ttype Simplify,\n\ttype UpdateSet,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { PgColumn } from '../columns/common.ts';\nimport { extractUsedTable } from '../utils.ts';\nimport type { PgViewBase } from '../view-base.ts';\nimport type {\n\tPgSelectJoinConfig,\n\tSelectedFields,\n\tSelectedFieldsOrdered,\n\tTableLikeHasEmptySelection,\n} from './select.types.ts';\n\nexport interface PgUpdateConfig {\n\twhere?: SQL | undefined;\n\tset: UpdateSet;\n\ttable: PgTable;\n\tfrom?: PgTable | Subquery | PgViewBase | SQL;\n\tjoins: PgSelectJoinConfig[];\n\treturningFields?: SelectedFields;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type PgUpdateSetSource<TTable extends PgTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key]>\n\t\t\t| SQL\n\t\t\t| PgColumn\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class PgUpdateBuilder<TTable extends PgTable, TQueryResult extends PgQueryResultHKT> {\n\tstatic readonly [entityKind]: string = 'PgUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tprivate authToken?: NeonAuthToken;\n\tsetToken(token: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tset(\n\t\tvalues: PgUpdateSetSource<TTable>,\n\t): PgUpdateWithout<PgUpdateBase<TTable, TQueryResult>, false, 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'> {\n\t\treturn new PgUpdateBase<TTable, TQueryResult>(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t).setToken(this.authToken);\n\t}\n}\n\nexport type PgUpdateWithout<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tT['_']['selectedFields'],\n\t\tT['_']['returning'],\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type PgUpdateWithJoins<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tTFrom,\n\t\tT['_']['selectedFields'],\n\t\tT['_']['returning'],\n\t\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TFrom>, 'inner'>,\n\t\t[...T['_']['joins'], {\n\t\t\tname: GetSelectTableName<TFrom>;\n\t\t\tjoinType: 'inner';\n\t\t\ttable: TFrom;\n\t\t}],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type PgUpdateJoinFn<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n> = <\n\tTJoinedTable extends PgTable | Subquery | PgViewBase | SQL,\n>(\n\ttable: TableLikeHasEmptySelection<TJoinedTable> extends true ? DrizzleTypeError<\n\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t>\n\t\t: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends PgTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | PgViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => PgUpdateJoin<T, TDynamic, TJoinType, TJoinedTable>;\n\nexport type PgUpdateJoin<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTJoinType extends JoinType,\n\tTJoinedTable extends PgTable | Subquery | PgViewBase | SQL,\n> = TDynamic extends true ? T : PgUpdateBase<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['selectedFields'],\n\tT['_']['returning'],\n\tAppendToNullabilityMap<T['_']['nullabilityMap'], GetSelectTableName<TJoinedTable>, TJoinType>,\n\t[...T['_']['joins'], {\n\t\tname: GetSelectTableName<TJoinedTable>;\n\t\tjoinType: TJoinType;\n\t\ttable: TJoinedTable;\n\t}],\n\tTDynamic,\n\tT['_']['excludedMethods']\n>;\n\ntype Join = {\n\tname: string | undefined;\n\tjoinType: JoinType;\n\ttable: PgTable | Subquery | PgViewBase | SQL;\n};\n\ntype AccumulateToResult<\n\tT extends AnyPgUpdate,\n\tTSelectMode extends SelectMode,\n\tTJoins extends Join[],\n\tTSelectedFields extends ColumnsSelection,\n> = TJoins extends [infer TJoin extends Join, ...infer TRest extends Join[]] ? AccumulateToResult<\n\t\tT,\n\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple',\n\t\tTRest,\n\t\tAppendToResult<\n\t\t\tT['_']['table']['_']['name'],\n\t\t\tTSelectedFields,\n\t\t\tTJoin['name'],\n\t\t\tTJoin['table'] extends Table ? TJoin['table']['_']['columns']\n\t\t\t\t: TJoin['table'] extends Subquery ? Assume<TJoin['table']['_']['selectedFields'], SelectedFields>\n\t\t\t\t: never,\n\t\t\tTSelectMode extends 'partial' ? TSelectMode : 'multiple'\n\t\t>\n\t>\n\t: TSelectedFields;\n\nexport type PgUpdateReturningAll<T extends AnyPgUpdate, TDynamic extends boolean> = PgUpdateWithout<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tEqual<T['_']['joins'], []> extends true ? T['_']['table']['_']['columns'] : Simplify<\n\t\t\t& Record<T['_']['table']['_']['name'], T['_']['table']['_']['columns']>\n\t\t\t& {\n\t\t\t\t[K in keyof T['_']['joins'] as T['_']['joins'][K]['table']['_']['name']]:\n\t\t\t\t\tT['_']['joins'][K]['table']['_']['columns'];\n\t\t\t}\n\t\t>,\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'single',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tGetSelectTableSelection<T['_']['table']>\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgUpdateReturning<\n\tT extends AnyPgUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = PgUpdateWithout<\n\tPgUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['queryResult'],\n\t\tT['_']['from'],\n\t\tTSelectedFields,\n\t\tSelectResult<\n\t\t\tAccumulateToResult<\n\t\t\t\tT,\n\t\t\t\t'partial',\n\t\t\t\tT['_']['joins'],\n\t\t\t\tTSelectedFields\n\t\t\t>,\n\t\t\t'partial',\n\t\t\tT['_']['nullabilityMap']\n\t\t>,\n\t\tT['_']['nullabilityMap'],\n\t\tT['_']['joins'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type PgUpdatePrepare<T extends AnyPgUpdate> = PgPreparedQuery<\n\tPreparedQueryConfig & {\n\t\texecute: T['_']['returning'] extends undefined ? PgQueryResultKind<T['_']['queryResult'], never>\n\t\t\t: T['_']['returning'][];\n\t}\n>;\n\nexport type PgUpdateDynamic<T extends AnyPgUpdate> = PgUpdate<\n\tT['_']['table'],\n\tT['_']['queryResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\tT['_']['nullabilityMap']\n>;\n\nexport type PgUpdate<\n\tTTable extends PgTable = PgTable,\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n> = PgUpdateBase<TTable, TQueryResult, TFrom, TSelectedFields, TReturning, TNullabilityMap, TJoins, true, never>;\n\nexport type AnyPgUpdate = PgUpdateBase<any, any, any, any, any, any, any, any, any>;\n\nexport interface PgUpdateBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\tTJoins extends Join[] = [],\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tTypedQueryBuilder<\n\t\tTSelectedFields,\n\t\tTReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]\n\t>,\n\tQueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly table: TTable;\n\t\treadonly joins: TJoins;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly queryResult: TQueryResult;\n\t\treadonly from: TFrom;\n\t\treadonly selectedFields: TSelectedFields;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[];\n\t};\n}\n\nexport class PgUpdateBase<\n\tTTable extends PgTable,\n\tTQueryResult extends PgQueryResultHKT,\n\tTFrom extends PgTable | Subquery | PgViewBase | SQL | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends ColumnsSelection | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<TTable['_']['name'], 'not-null'>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTJoins extends Join[] = [],\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[]>\n\timplements\n\t\tRunnableQuery<TReturning extends undefined ? PgQueryResultKind<TQueryResult, never> : TReturning[], 'pg'>,\n\t\tSQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgUpdate';\n\n\tprivate config: PgUpdateConfig;\n\tprivate tableName: string | undefined;\n\tprivate joinsNotNullableMap: Record<string, boolean>;\n\tprotected cacheConfig?: WithCacheConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: PgSession,\n\t\tprivate dialect: PgDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t}\n\n\tfrom<TFrom extends PgTable | Subquery | PgViewBase | SQL>(\n\t\tsource: TableLikeHasEmptySelection<TFrom> extends true ? DrizzleTypeError<\n\t\t\t\t\"Cannot reference a data-modifying statement subquery if it doesn't contain a `returning` clause\"\n\t\t\t>\n\t\t\t: TFrom,\n\t): PgUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tconst src = source as TFrom;\n\t\tconst tableName = getTableLikeName(src);\n\t\tif (typeof tableName === 'string') {\n\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t}\n\t\tthis.config.from = src;\n\t\treturn this as any;\n\t}\n\n\tprivate getTableLikeFields(table: PgTable | Subquery | PgViewBase): Record<string, unknown> {\n\t\tif (is(table, PgTable)) {\n\t\t\treturn table[Table.Symbol.Columns];\n\t\t} else if (is(table, Subquery)) {\n\t\t\treturn table._.selectedFields;\n\t\t}\n\t\treturn table[ViewBaseConfig].selectedFields;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): PgUpdateJoinFn<this, TDynamic, TJoinType> {\n\t\treturn ((\n\t\t\ttable: PgTable | Subquery | PgViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from && !is(this.config.from, SQL)\n\t\t\t\t\t? this.getTableLikeFields(this.config.from)\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * await db.update(cars).set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.update(cars).set({ color: 'red' })\n\t * .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * await db.update(cars).set({ color: 'red' })\n\t * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * await db.update(cars).set({ color: 'red' })\n\t * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): PgUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): PgUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): PgUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields?: SelectedFields,\n\t): PgUpdateWithout<AnyPgUpdate, TDynamic, 'returning'> {\n\t\tif (!fields) {\n\t\t\tfields = Object.assign({}, this.config.table[Table.Symbol.Columns]);\n\n\t\t\tif (this.config.from) {\n\t\t\t\tconst tableName = getTableLikeName(this.config.from);\n\n\t\t\t\tif (typeof tableName === 'string' && this.config.from && !is(this.config.from, SQL)) {\n\t\t\t\t\tconst fromFields = this.getTableLikeFields(this.config.from);\n\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t}\n\n\t\t\t\tfor (const join of this.config.joins) {\n\t\t\t\t\tconst tableName = getTableLikeName(join.table);\n\n\t\t\t\t\tif (typeof tableName === 'string' && !is(join.table, SQL)) {\n\t\t\t\t\t\tconst fromFields = this.getTableLikeFields(join.table);\n\t\t\t\t\t\tfields[tableName] = fromFields as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.config.returningFields = fields;\n\t\tthis.config.returning = orderSelectedFields<PgColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgUpdatePrepare<this> {\n\t\tconst query = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: TReturning[] }\n\t\t>(this.dialect.sqlToQuery(this.getSQL()), this.config.returning, name, true, undefined, {\n\t\t\ttype: 'insert',\n\t\t\ttables: extractUsedTable(this.config.table),\n\t\t}, this.cacheConfig);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query;\n\t}\n\n\tprepare(name: string): PgUpdatePrepare<this> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute: ReturnType<this['prepare']>['execute'] = (placeholderValues) => {\n\t\treturn this._prepare().execute(placeholderValues, this.authToken);\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): this['_']['selectedFields'] {\n\t\treturn (\n\t\t\tthis.config.returningFields\n\t\t\t\t? new Proxy(\n\t\t\t\t\tthis.config.returningFields,\n\t\t\t\t\tnew SelectionProxyHandler({\n\t\t\t\t\t\talias: getTableName(this.config.table),\n\t\t\t\t\t\tsqlAliasedBehavior: 'alias',\n\t\t\t\t\t\tsqlBehavior: 'error',\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t: undefined\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): PgUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport type { PgSession } from '../session.ts';\nimport type { PgTable } from '../table.ts';\n\nexport class PgCountBuilder<\n\tTSession extends PgSession<any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\tprivate token?: NeonAuthToken;\n\n\tstatic override readonly [entityKind] = 'PgCountBuilder';\n\t[Symbol.toStringTag] = 'PgCountBuilder';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: PgTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: PgTable | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) as count from ${source}${sql.raw(' where ').if(filters)}${filters};`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: PgTable | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(PgCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.mapWith(Number);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = PgCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\t/** @intrnal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.token = token;\n\t\treturn this;\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql, this.token))\n\t\t\t.then(\n\t\t\t\tonfulfilled,\n\t\t\t\tonrejected,\n\t\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => any) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { KnownKeysOnly, NeonAuthToken } from '~/utils.ts';\nimport type { PgDialect } from '../dialect.ts';\nimport type { PgPreparedQuery, PgSession, PreparedQueryConfig } from '../session.ts';\nimport type { PgTable } from '../table.ts';\n\nexport class RelationalQueryBuilder<TSchema extends TablesRelationalConfig, TFields extends TableRelationalConfig> {\n\tstatic readonly [entityKind]: string = 'PgRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TSchema,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: PgTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: PgDialect,\n\t\tprivate session: PgSession,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): PgRelationalQuery<BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new PgRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t'many',\n\t\t);\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): PgRelationalQuery<BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn new PgRelationalQuery(\n\t\t\tthis.fullSchema,\n\t\t\tthis.schema,\n\t\t\tthis.tableNamesMap,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t'first',\n\t\t);\n\t}\n}\n\nexport class PgRelationalQuery<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'pg'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'PgRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\tprivate table: PgTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: PgDialect,\n\t\tprivate session: PgSession,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tprivate mode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\t_prepare(name?: string): PgPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\t\treturn this.session.prepareQuery<PreparedQueryConfig & { execute: TResult }>(\n\t\t\t\tbuiltQuery,\n\t\t\t\tundefined,\n\t\t\t\tname,\n\t\t\t\ttrue,\n\t\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t\t);\n\t\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t\t}\n\t\t\t\t\treturn rows as TResult;\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tprepare(name: string): PgPreparedQuery<PreparedQueryConfig & { execute: TResult }> {\n\t\treturn this._prepare(name);\n\t}\n\n\tprivate _getQuery() {\n\t\treturn this.dialect.buildRelationalQueryWithoutPK({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql as SQL;\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this._getQuery();\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\tprivate authToken?: NeonAuthToken;\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\toverride execute(): Promise<TResult> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\treturn this._prepare().execute(undefined, this.authToken);\n\t\t});\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\n\nexport interface PgRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'pg'>, SQLWrapper {}\n\nexport class PgRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'pg'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'PgRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'pg';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\tprivate sql: SQL,\n\t\tprivate query: Query,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t}\n\n\t/** @internal */\n\tgetSQL() {\n\t\treturn this.sql;\n\t}\n\n\tgetQuery() {\n\t\treturn this.query;\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode() {\n\t\treturn false;\n\t}\n}\n","import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tPgDeleteBase,\n\tPgInsertBuilder,\n\tPgSelectBuilder,\n\tPgUpdateBuilder,\n\tQueryBuilder,\n} from '~/pg-core/query-builders/index.ts';\nimport type {\n\tPgQueryResultHKT,\n\tPgQueryResultKind,\n\tPgSession,\n\tPgTransaction,\n\tPgTransactionConfig,\n\tPreparedQueryConfig,\n} from '~/pg-core/session.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError, NeonAuthToken } from '~/utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport { PgCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { PgRaw } from './query-builders/raw.ts';\nimport { PgRefreshMaterializedView } from './query-builders/refresh-materialized-view.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { PgViewBase } from './view-base.ts';\nimport type { PgMaterializedView } from './view.ts';\n\nexport class PgDatabase<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'PgDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t\treadonly session: PgSession<TQueryResult, TFullSchema, TSchema>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: PgDialect,\n\t\t/** @internal */\n\t\treadonly session: PgSession<any, any, any>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t\tsession,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t\tsession,\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\t(this.query as PgDatabase<TQueryResult, Record<string, any>>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as PgTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t * name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: PgTable | PgViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new PgCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * brand: cars.brand\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): PgSelectBuilder<undefined>;\n\t\tfunction select<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\t\tfunction select<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t * .from(cars)\n\t\t * .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): PgSelectBuilder<undefined>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct on` expression to the select query.\n\t\t *\n\t\t * Calling this method will specify how the unique rows are determined.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param on The expression defining uniqueness.\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select the first row for each unique brand from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand])\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand);\n\t\t *\n\t\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand, cars.color);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): PgSelectBuilder<TSelection>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields?: TSelection,\n\t\t): PgSelectBuilder<TSelection | undefined> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: { on },\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t * .set({ color: 'red' })\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends PgTable>(table: TTable): PgUpdateBuilder<TTable, TQueryResult> {\n\t\t\treturn new PgUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t * .values({ brand: 'BMW' })\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends PgTable>(table: TTable): PgInsertBuilder<TTable, TQueryResult> {\n\t\t\treturn new PgInsertBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {\n\t\t\treturn new PgDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t * id: cars.id,\n\t * brand: cars.brand\n\t * })\n\t * .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t * id: cars.id,\n\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t * .from(cars);\n\t * ```\n\t */\n\tselect(): PgSelectBuilder<undefined>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselect<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t * .from(cars)\n\t * .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t * .from(cars)\n\t * .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): PgSelectBuilder<undefined>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgSelectBuilder<TSelection>;\n\tselectDistinct<TSelection extends SelectedFields>(fields?: TSelection): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Adds `distinct on` expression to the select query.\n\t *\n\t * Calling this method will specify how the unique rows are determined.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param on The expression defining uniqueness.\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select the first row for each unique brand from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand])\n\t * .from(cars)\n\t * .orderBy(cars.brand);\n\t *\n\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t * await db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t * .from(cars)\n\t * .orderBy(cars.brand, cars.color);\n\t * ```\n\t */\n\tselectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgSelectBuilder<undefined>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): PgSelectBuilder<TSelection>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields?: TSelection,\n\t): PgSelectBuilder<TSelection | undefined> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: { on },\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tupdate<TTable extends PgTable>(table: TTable): PgUpdateBuilder<TTable, TQueryResult> {\n\t\treturn new PgUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t * ```\n\t */\n\tinsert<TTable extends PgTable>(table: TTable): PgInsertBuilder<TTable, TQueryResult> {\n\t\treturn new PgInsertBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tdelete<TTable extends PgTable>(table: TTable): PgDeleteBase<TTable, TQueryResult> {\n\t\treturn new PgDeleteBase(table, this.session, this.dialect);\n\t}\n\n\trefreshMaterializedView<TView extends PgMaterializedView>(view: TView): PgRefreshMaterializedView<TQueryResult> {\n\t\treturn new PgRefreshMaterializedView(view, this.session, this.dialect);\n\t}\n\n\tprotected authToken?: NeonAuthToken;\n\n\texecute<TRow extends Record<string, unknown> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t): PgRaw<PgQueryResultKind<TQueryResult, TRow>> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: PgQueryResultKind<TQueryResult, TRow> }\n\t\t>(\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t);\n\t\treturn new PgRaw(\n\t\t\t() => prepared.execute(undefined, this.authToken),\n\t\t\tsequel,\n\t\t\tbuiltQuery,\n\t\t\t(result) => prepared.mapResult(result, true),\n\t\t);\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type PgWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tHKT extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends PgDatabase<\n\t\tHKT,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): PgWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst selectDistinctOn: Q['selectDistinctOn'] = (...args: [any]) => getReplica(replicas).selectDistinctOn(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst _with: Q['with'] = (...args: any) => getReplica(replicas).with(...args);\n\tconst $with: Q['$with'] = (arg: any) => getReplica(replicas).$with(arg) as any;\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = (...args: [any]) => primary.execute(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\tconst refreshMaterializedView: Q['refreshMaterializedView'] = (...args: [any]) =>\n\t\tprimary.refreshMaterializedView(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\trefreshMaterializedView,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\tselectDistinctOn,\n\t\t$count,\n\t\t$with,\n\t\twith: _with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Table } from '~/index.ts';\nimport type { CacheConfig } from './types.ts';\n\nexport abstract class Cache {\n\tstatic readonly [entityKind]: string = 'Cache';\n\n\tabstract strategy(): 'explicit' | 'all';\n\n\t/**\n\t * Invoked if we should check cache for cached response\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract get(\n\t\tkey: string,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tisAutoInvalidate?: boolean,\n\t): Promise<any[] | undefined>;\n\n\t/**\n\t * Invoked if new query should be inserted to cache\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract put(\n\t\thashedQuery: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void>;\n\n\t/**\n\t * Invoked if insert, update, delete was invoked\n\t * @param tables\n\t */\n\tabstract onMutate(\n\t\tparams: MutationOption,\n\t): Promise<void>;\n}\n\nexport class NoopCache extends Cache {\n\toverride strategy() {\n\t\treturn 'all' as const;\n\t}\n\n\tstatic override readonly [entityKind]: string = 'NoopCache';\n\n\toverride async get(_key: string): Promise<any[] | undefined> {\n\t\treturn undefined;\n\t}\n\toverride async put(\n\t\t_hashedQuery: string,\n\t\t_response: any,\n\t\t_tables: string[],\n\t\t_config?: any,\n\t): Promise<void> {\n\t\t// noop\n\t}\n\toverride async onMutate(_params: MutationOption): Promise<void> {\n\t\t// noop\n\t}\n}\n\nexport type MutationOption = { tags?: string | string[]; tables?: Table<any> | Table<any>[] | string | string[] };\n\nexport async function hashQuery(sql: string, params?: any[]) {\n\tconst dataToHash = `${sql}-${JSON.stringify(params)}`;\n\tconst encoder = new TextEncoder();\n\tconst data = encoder.encode(dataToHash);\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', data);\n\tconst hashArray = [...new Uint8Array(hashBuffer)];\n\tconst hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n\n\treturn hashHex;\n}\n","import { type Cache, hashQuery, NoopCache } from '~/cache/core/cache.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport { type Query, type SQL, sql } from '~/sql/index.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { NeonAuthToken } from '~/utils.ts';\nimport { PgDatabase } from './db.ts';\nimport type { PgDialect } from './dialect.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\texecute: unknown;\n\tall: unknown;\n\tvalues: unknown;\n}\n\nexport abstract class PgPreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tconstructor(\n\t\tprotected query: Query,\n\t\t// cache instance\n\t\tprivate cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprivate queryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\t// config that was passed through $withCache\n\t\tprivate cacheConfig?: WithCacheConfig,\n\t) {\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enable: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enable) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\t}\n\n\tprotected authToken?: NeonAuthToken;\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tmapResult(response: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn response;\n\t}\n\n\t/** @internal */\n\tsetToken(token?: NeonAuthToken) {\n\t\tthis.authToken = token;\n\t\treturn this;\n\t}\n\n\tstatic readonly [entityKind]: string = 'PgPreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tif (this.cache === undefined || is(this.cache, NoopCache) || this.queryMetadata === undefined) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any mutations, if globally is false\n\t\tif (this.cacheConfig && !this.cacheConfig.enable) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// For mutate queries, we should query the database, wait for a response, and then perform invalidation\n\t\tif (\n\t\t\t(\n\t\t\t\tthis.queryMetadata.type === 'insert' || this.queryMetadata.type === 'update'\n\t\t\t\t|| this.queryMetadata.type === 'delete'\n\t\t\t) && this.queryMetadata.tables.length > 0\n\t\t) {\n\t\t\ttry {\n\t\t\t\tconst [res] = await Promise.all([\n\t\t\t\t\tquery(),\n\t\t\t\t\tthis.cache.onMutate({ tables: this.queryMetadata.tables }),\n\t\t\t\t]);\n\t\t\t\treturn res;\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\t// don't do any reads if globally disabled\n\t\tif (!this.cacheConfig) {\n\t\t\ttry {\n\t\t\t\treturn await query();\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.queryMetadata.type === 'select') {\n\t\t\tconst fromCache = await this.cache.get(\n\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\tthis.queryMetadata.tables,\n\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\tthis.cacheConfig.autoInvalidate,\n\t\t\t);\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tlet result;\n\t\t\t\ttry {\n\t\t\t\t\tresult = await query();\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t\t\t}\n\t\t\t\t// put actual key\n\t\t\t\tawait this.cache.put(\n\t\t\t\t\tthis.cacheConfig.tag ?? await hashQuery(queryString, params),\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tthis.cacheConfig.autoInvalidate ? this.queryMetadata.tables : [],\n\t\t\t\t\tthis.cacheConfig.tag !== undefined,\n\t\t\t\t\tthis.cacheConfig.config,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\t\ttry {\n\t\t\treturn await query();\n\t\t} catch (e) {\n\t\t\tthrow new DrizzleQueryError(queryString, params, e as Error);\n\t\t}\n\t}\n\n\tabstract execute(placeholderValues?: Record<string, unknown>): Promise<T['execute']>;\n\t/** @internal */\n\tabstract execute(placeholderValues?: Record<string, unknown>, token?: NeonAuthToken): Promise<T['execute']>;\n\t/** @internal */\n\tabstract execute(placeholderValues?: Record<string, unknown>, token?: NeonAuthToken): Promise<T['execute']>;\n\n\t/** @internal */\n\tabstract all(placeholderValues?: Record<string, unknown>): Promise<T['all']>;\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface PgTransactionConfig {\n\tisolationLevel?: 'read uncommitted' | 'read committed' | 'repeatable read' | 'serializable';\n\taccessMode?: 'read only' | 'read write';\n\tdeferrable?: boolean;\n}\n\nexport abstract class PgSession<\n\tTQueryResult extends PgQueryResultHKT = PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> {\n\tstatic readonly [entityKind]: string = 'PgSession';\n\n\tconstructor(protected dialect: PgDialect) {}\n\n\tabstract prepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T>;\n\n\texecute<T>(query: SQL): Promise<T>;\n\t/** @internal */\n\texecute<T>(query: SQL, token?: NeonAuthToken): Promise<T>;\n\t/** @internal */\n\texecute<T>(query: SQL, token?: NeonAuthToken): Promise<T> {\n\t\treturn tracer.startActiveSpan('drizzle.operation', () => {\n\t\t\tconst prepared = tracer.startActiveSpan('drizzle.prepareQuery', () => {\n\t\t\t\treturn this.prepareQuery<PreparedQueryConfig & { execute: T }>(\n\t\t\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn prepared.setToken(token).execute(undefined, token);\n\t\t});\n\t}\n\n\tall<T = unknown>(query: SQL): Promise<T[]> {\n\t\treturn this.prepareQuery<PreparedQueryConfig & { all: T[] }>(\n\t\t\tthis.dialect.sqlToQuery(query),\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfalse,\n\t\t).all();\n\t}\n\n\tasync count(sql: SQL): Promise<number>;\n\t/** @internal */\n\tasync count(sql: SQL, token?: NeonAuthToken): Promise<number>;\n\t/** @internal */\n\tasync count(sql: SQL, token?: NeonAuthToken): Promise<number> {\n\t\tconst res = await this.execute<[{ count: string }]>(sql, token);\n\n\t\treturn Number(\n\t\t\tres[0]['count'],\n\t\t);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T>;\n}\n\nexport abstract class PgTransaction<\n\tTQueryResult extends PgQueryResultHKT,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = Record<string, never>,\n> extends PgDatabase<TQueryResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PgTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\tsession: PgSession<any, any, any>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n\n\t/** @internal */\n\tgetTransactionConfigSQL(config: PgTransactionConfig): SQL {\n\t\tconst chunks: string[] = [];\n\t\tif (config.isolationLevel) {\n\t\t\tchunks.push(`isolation level ${config.isolationLevel}`);\n\t\t}\n\t\tif (config.accessMode) {\n\t\t\tchunks.push(config.accessMode);\n\t\t}\n\t\tif (typeof config.deferrable === 'boolean') {\n\t\t\tchunks.push(config.deferrable ? 'deferrable' : 'not deferrable');\n\t\t}\n\t\treturn sql.raw(chunks.join(' '));\n\t}\n\n\tsetTransaction(config: PgTransactionConfig): Promise<void> {\n\t\treturn this.session.execute(sql`set transaction ${this.getTransactionConfigSQL(config)}`);\n\t}\n\n\tabstract override transaction<T>(\n\t\ttransaction: (tx: PgTransaction<TQueryResult, TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T>;\n}\n\nexport interface PgQueryResultHKT {\n\treadonly $brand: 'PgQueryResultHKT';\n\treadonly row: unknown;\n\treadonly type: unknown;\n}\n\nexport type PgQueryResultKind<TKind extends PgQueryResultHKT, TRow> = (TKind & {\n\treadonly row: TRow;\n})['type'];\n","import type { Row, RowList, Sql, TransactionSql } from 'postgres';\nimport { type Cache, NoopCache } from '~/cache/core/index.ts';\nimport type { WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgTransaction } from '~/pg-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/pg-core/query-builders/select.types.ts';\nimport type { PgQueryResultHKT, PgTransactionConfig, PreparedQueryConfig } from '~/pg-core/session.ts';\nimport { PgPreparedQuery, PgSession } from '~/pg-core/session.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query } from '~/sql/sql.ts';\nimport { tracer } from '~/tracing.ts';\nimport { type Assume, mapResultRow } from '~/utils.ts';\n\nexport class PostgresJsPreparedQuery<T extends PreparedQueryConfig> extends PgPreparedQuery<T> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsPreparedQuery';\n\n\tconstructor(\n\t\tprivate client: Sql,\n\t\tprivate queryString: string,\n\t\tprivate params: unknown[],\n\t\tprivate logger: Logger,\n\t\tcache: Cache,\n\t\tqueryMetadata: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t} | undefined,\n\t\tcacheConfig: WithCacheConfig | undefined,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => T['execute'],\n\t) {\n\t\tsuper({ sql: queryString, params }, cache, queryMetadata, cacheConfig);\n\t}\n\n\tasync execute(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['execute']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\n\t\t\tconst { fields, queryString: query, client, joinsNotNullableMap, customResultMapper } = this;\n\t\t\tif (!fields && !customResultMapper) {\n\t\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\t\treturn this.queryWithCache(query, params, async () => {\n\t\t\t\t\t\treturn await client.unsafe(query, params as any[]);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst rows = await tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': query,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(query, params, async () => {\n\t\t\t\t\treturn await client.unsafe(query, params as any[]).values();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn tracer.startActiveSpan('drizzle.mapResponse', () => {\n\t\t\t\treturn customResultMapper\n\t\t\t\t\t? customResultMapper(rows)\n\t\t\t\t\t: rows.map((row) => mapResultRow<T['execute']>(fields!, row, joinsNotNullableMap));\n\t\t\t});\n\t\t});\n\t}\n\n\tall(placeholderValues: Record<string, unknown> | undefined = {}): Promise<T['all']> {\n\t\treturn tracer.startActiveSpan('drizzle.execute', async (span) => {\n\t\t\tconst params = fillPlaceholders(this.params, placeholderValues);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t});\n\t\t\tthis.logger.logQuery(this.queryString, params);\n\t\t\treturn tracer.startActiveSpan('drizzle.driver.execute', () => {\n\t\t\t\tspan?.setAttributes({\n\t\t\t\t\t'drizzle.query.text': this.queryString,\n\t\t\t\t\t'drizzle.query.params': JSON.stringify(params),\n\t\t\t\t});\n\t\t\t\treturn this.queryWithCache(this.queryString, params, async () => {\n\t\t\t\t\treturn this.client.unsafe(this.queryString, params as any[]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n\nexport interface PostgresJsSessionOptions {\n\tlogger?: Logger;\n\tcache?: Cache;\n}\n\nexport class PostgresJsSession<\n\tTSQL extends Sql,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgSession<PostgresJsQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsSession';\n\n\tlogger: Logger;\n\tprivate cache: Cache;\n\n\tconstructor(\n\t\tpublic client: TSQL,\n\t\tdialect: PgDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\t/** @internal */\n\t\treadonly options: PostgresJsSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t\tthis.cache = options.cache ?? new NoopCache();\n\t}\n\n\tprepareQuery<T extends PreparedQueryConfig = PreparedQueryConfig>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\tname: string | undefined,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => T['execute'],\n\t\tqueryMetadata?: {\n\t\t\ttype: 'select' | 'update' | 'delete' | 'insert';\n\t\t\ttables: string[];\n\t\t},\n\t\tcacheConfig?: WithCacheConfig,\n\t): PgPreparedQuery<T> {\n\t\treturn new PostgresJsPreparedQuery(\n\t\t\tthis.client,\n\t\t\tquery.sql,\n\t\t\tquery.params,\n\t\t\tthis.logger,\n\t\t\tthis.cache,\n\t\t\tqueryMetadata,\n\t\t\tcacheConfig,\n\t\t\tfields,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\tquery(query: string, params: unknown[]): Promise<RowList<Row[]>> {\n\t\tthis.logger.logQuery(query, params);\n\t\treturn this.client.unsafe(query, params as any[]).values();\n\t}\n\n\tqueryObjects<T extends Row>(\n\t\tquery: string,\n\t\tparams: unknown[],\n\t): Promise<RowList<T[]>> {\n\t\treturn this.client.unsafe(query, params as any[]);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: PostgresJsTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t\tconfig?: PgTransactionConfig,\n\t): Promise<T> {\n\t\treturn this.client.begin(async (client) => {\n\t\t\tconst session = new PostgresJsSession<TransactionSql, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.options,\n\t\t\t);\n\t\t\tconst tx = new PostgresJsTransaction(this.dialect, session, this.schema);\n\t\t\tif (config) {\n\t\t\t\tawait tx.setTransaction(config);\n\t\t\t}\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport class PostgresJsTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends PgTransaction<PostgresJsQueryResultHKT, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsTransaction';\n\n\tconstructor(\n\t\tdialect: PgDialect,\n\t\t/** @internal */\n\t\toverride readonly session: PostgresJsSession<TransactionSql, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t\tnestedIndex = 0,\n\t) {\n\t\tsuper(dialect, session, schema, nestedIndex);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: PostgresJsTransaction<TFullSchema, TSchema>) => Promise<T>,\n\t): Promise<T> {\n\t\treturn this.session.client.savepoint((client) => {\n\t\t\tconst session = new PostgresJsSession<TransactionSql, TFullSchema, TSchema>(\n\t\t\t\tclient,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.session.options,\n\t\t\t);\n\t\t\tconst tx = new PostgresJsTransaction<TFullSchema, TSchema>(this.dialect, session, this.schema);\n\t\t\treturn transaction(tx);\n\t\t}) as Promise<T>;\n\t}\n}\n\nexport interface PostgresJsQueryResultHKT extends PgQueryResultHKT {\n\ttype: RowList<Assume<this['row'], Row>[]>;\n}\n","import pgClient, { type Options, type PostgresType, type Sql } from 'postgres';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport { PgDatabase } from '~/pg-core/db.ts';\nimport { PgDialect } from '~/pg-core/dialect.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport type { PostgresJsQueryResultHKT } from './session.ts';\nimport { PostgresJsSession } from './session.ts';\n\nexport class PostgresJsDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends PgDatabase<PostgresJsQueryResultHKT, TSchema> {\n\tstatic override readonly [entityKind]: string = 'PostgresJsDatabase';\n}\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Sql,\n\tconfig: DrizzleConfig<TSchema> = {},\n): PostgresJsDatabase<TSchema> & {\n\t$client: Sql;\n} {\n\tconst transparentParser = (val: any) => val;\n\n\t// Override postgres.js default date parsers: https://github.com/porsager/postgres/discussions/761\n\tfor (const type of ['1184', '1082', '1083', '1114', '1182', '1185', '1115', '1231']) {\n\t\tclient.options.parsers[type as any] = transparentParser;\n\t\tclient.options.serializers[type as any] = transparentParser;\n\t}\n\tclient.options.serializers['114'] = transparentParser;\n\tclient.options.serializers['3802'] = transparentParser;\n\n\tconst dialect = new PgDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new PostgresJsSession(client, dialect, schema, { logger, cache: config.cache });\n\tconst db = new PostgresJsDatabase(dialect, session, schema as any) as PostgresJsDatabase<TSchema>;\n\t(<any> db).$client = client;\n\t(<any> db).$cache = config.cache;\n\tif ((<any> db).$cache) {\n\t\t(<any> db).$cache['invalidate'] = config.cache?.onMutate;\n\t}\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Sql = Sql,\n>(\n\t...params: [\n\t\tTClient | string,\n\t] | [\n\t\tTClient | string,\n\t\tDrizzleConfig<TSchema>,\n\t] | [\n\t\t(\n\t\t\t& DrizzleConfig<TSchema>\n\t\t\t& ({\n\t\t\t\tconnection: string | ({ url?: string } & Options<Record<string, PostgresType>>);\n\t\t\t} | {\n\t\t\t\tclient: TClient;\n\t\t\t})\n\t\t),\n\t]\n): PostgresJsDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (typeof params[0] === 'string') {\n\t\tconst instance = pgClient(params[0] as string);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as {\n\t\t\tconnection?: { url?: string } & Options<Record<string, PostgresType>>;\n\t\t\tclient?: TClient;\n\t\t} & DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object' && connection.url !== undefined) {\n\t\t\tconst { url, ...config } = connection;\n\n\t\t\tconst instance = pgClient(url, config);\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = pgClient(connection);\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as TClient, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): PostgresJsDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({\n\t\t\toptions: {\n\t\t\t\tparsers: {},\n\t\t\t\tserializers: {},\n\t\t\t},\n\t\t} as any, config) as any;\n\t}\n}\n","export * from \"./alert-history.js\";\nexport * from \"./alert-rules.js\";\nexport * from \"./api-keys.js\";\nexport * from \"./audit-logs.js\";\nexport * from \"./auth.js\";\nexport * from \"./bucket-configs.js\";\nexport * from \"./bucket-memberships.js\";\nexport * from \"./campaigns.js\";\nexport * from \"./contact-aliases.js\";\nexport * from \"./contacts.js\";\nexport * from \"./dead-letter-queue.js\";\nexport * from \"./email-preferences.js\";\nexport * from \"./email-sends.js\";\nexport * from \"./enums.js\";\nexport * from \"./import-jobs.js\";\nexport * from \"./journey-configs.js\";\nexport * from \"./journey-logs.js\";\nexport * from \"./journey-states.js\";\nexport * from \"./link-clicks.js\";\nexport * from \"./relations.js\";\nexport * from \"./tracked-links.js\";\nexport * from \"./user-events.js\";\nexport * from \"./webhook-deliveries.js\";\nexport * from \"./webhook-endpoints.js\";\n","import { timestamp } from \"drizzle-orm/pg-core\";\n\nexport const timestamps = {\n createdAt: timestamp(\"created_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n};\n","import { pgEnum } from \"drizzle-orm/pg-core\";\n\nexport const journeyStatusEnum = pgEnum(\"journey_status\", [\n \"active\",\n \"waiting\",\n \"completed\",\n \"failed\",\n \"exited\",\n]);\n\nexport const emailSendStatusEnum = pgEnum(\"email_send_status\", [\n \"queued\",\n \"rendered\",\n \"sent\",\n \"delivered\",\n \"opened\",\n \"clicked\",\n \"bounced\",\n \"complained\",\n \"failed\",\n]);\n\nexport const importJobStatusEnum = pgEnum(\"import_job_status\", [\n \"pending\",\n \"processing\",\n \"completed\",\n \"failed\",\n]);\n\nexport const alertRuleTypeEnum = pgEnum(\"alert_rule_type\", [\n \"bounce_rate_exceeded\",\n \"journey_failure_spike\",\n \"delivery_issue\",\n \"high_complaint_rate\",\n]);\n\nexport const alertChannelEnum = pgEnum(\"alert_channel\", [\n \"webhook\",\n \"slack\",\n \"email\",\n]);\n\nexport const dlqStatusEnum = pgEnum(\"dlq_status\", [\n \"pending\",\n \"retried\",\n \"discarded\",\n]);\n\nexport const bucketMembershipStatusEnum = pgEnum(\"bucket_membership_status\", [\n \"active\",\n \"left\",\n]);\n\nexport const webhookDeliveryStatusEnum = pgEnum(\"webhook_delivery_status\", [\n \"pending\", // enqueued, awaiting first attempt OR a scheduled retry (nextRetryAt)\n \"sending\", // a delivery run CAS'd the row and is mid-POST (orphan-recovery sentinel)\n \"delivered\", // 2xx received — TERMINAL\n \"failed\", // attempts exhausted — TERMINAL, mirrored to dead_letter_queue\n \"discarded\", // endpoint disabled/deleted mid-flight — TERMINAL, NOT an error, NOT dead-lettered\n]);\n","import {\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { alertChannelEnum, alertRuleTypeEnum } from \"./enums.js\";\n\nexport const alertRules = pgTable(\n \"alert_rules\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n name: text(\"name\").notNull(),\n type: alertRuleTypeEnum(\"type\").notNull(),\n threshold: jsonb(\"threshold\").$type<Record<string, number>>().notNull(),\n channel: alertChannelEnum(\"channel\").notNull(),\n channelConfig: jsonb(\"channel_config\")\n .$type<Record<string, string>>()\n .notNull(),\n enabled: boolean(\"enabled\").notNull().default(true),\n cooldownMinutes: integer(\"cooldown_minutes\").notNull().default(60),\n lastFiredAt: timestamp(\"last_fired_at\", {\n withTimezone: true,\n }),\n ...timestamps,\n },\n (table) => [\n index(\"alert_rules_type_idx\").on(table.type),\n index(\"alert_rules_enabled_idx\").on(table.enabled),\n ],\n);\n","import { index, jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { alertRules } from \"./alert-rules.js\";\n\nexport const alertHistory = pgTable(\n \"alert_history\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n alertRuleId: uuid(\"alert_rule_id\")\n .notNull()\n .references(() => alertRules.id),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>(),\n deliveryStatus: text(\"delivery_status\").notNull(),\n error: text(\"error\"),\n ...timestamps,\n },\n (table) => [\n index(\"alert_history_rule_id_idx\").on(table.alertRuleId),\n index(\"alert_history_created_at_idx\").on(table.createdAt),\n ],\n);\n","import {\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const apiKeys = pgTable(\n \"api_keys\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n name: text(\"name\").notNull(),\n keyPrefix: text(\"key_prefix\").notNull(),\n keyHash: text(\"key_hash\").notNull().unique(),\n scopes: jsonb(\"scopes\").$type<string[]>().notNull().default([\"read\"]),\n createdBy: text(\"created_by\"),\n lastUsedAt: timestamp(\"last_used_at\", { withTimezone: true }),\n revokedAt: timestamp(\"revoked_at\", { withTimezone: true }),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n index(\"api_keys_key_hash_idx\").on(table.keyHash),\n index(\"api_keys_revoked_at_idx\").on(table.revokedAt),\n ],\n);\n","import { index, jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const auditLogs = pgTable(\n \"audit_logs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n actor: text(\"actor\").notNull(),\n actorKeyId: uuid(\"actor_key_id\"),\n action: text(\"action\").notNull(),\n resource: text(\"resource\").notNull(),\n resourceId: text(\"resource_id\"),\n detail: jsonb(\"detail\").$type<Record<string, unknown>>(),\n ipAddress: text(\"ip_address\"),\n ...timestamps,\n },\n (table) => [\n index(\"audit_logs_actor_idx\").on(table.actor),\n index(\"audit_logs_resource_idx\").on(table.resource, table.resourceId),\n index(\"audit_logs_created_at_idx\").on(table.createdAt),\n ],\n);\n","import { boolean, pgTable, text, timestamp } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const user = pgTable(\"user\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n email: text(\"email\").notNull().unique(),\n emailVerified: boolean(\"email_verified\").notNull().default(false),\n image: text(\"image\"),\n ...timestamps,\n});\n\nexport const session = pgTable(\"session\", {\n id: text(\"id\").primaryKey(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n token: text(\"token\").notNull().unique(),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n activeOrganizationId: text(\"active_organization_id\"),\n ...timestamps,\n});\n\nexport const account = pgTable(\"account\", {\n id: text(\"id\").primaryKey(),\n accountId: text(\"account_id\").notNull(),\n providerId: text(\"provider_id\").notNull(),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n accessToken: text(\"access_token\"),\n refreshToken: text(\"refresh_token\"),\n idToken: text(\"id_token\"),\n accessTokenExpiresAt: timestamp(\"access_token_expires_at\", {\n withTimezone: true,\n }),\n refreshTokenExpiresAt: timestamp(\"refresh_token_expires_at\", {\n withTimezone: true,\n }),\n scope: text(\"scope\"),\n password: text(\"password\"),\n ...timestamps,\n});\n\nexport const verification = pgTable(\"verification\", {\n id: text(\"id\").primaryKey(),\n identifier: text(\"identifier\").notNull(),\n value: text(\"value\").notNull(),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n ...timestamps,\n});\n\nexport const organization = pgTable(\"organization\", {\n id: text(\"id\").primaryKey(),\n name: text(\"name\").notNull(),\n slug: text(\"slug\").unique(),\n logo: text(\"logo\"),\n metadata: text(\"metadata\"),\n ...timestamps,\n});\n\nexport const member = pgTable(\"member\", {\n id: text(\"id\").primaryKey(),\n organizationId: text(\"organization_id\")\n .notNull()\n .references(() => organization.id, { onDelete: \"cascade\" }),\n userId: text(\"user_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n role: text(\"role\").notNull().default(\"member\"),\n ...timestamps,\n});\n\nexport const invitation = pgTable(\"invitation\", {\n id: text(\"id\").primaryKey(),\n organizationId: text(\"organization_id\")\n .notNull()\n .references(() => organization.id, { onDelete: \"cascade\" }),\n email: text(\"email\").notNull(),\n role: text(\"role\"),\n status: text(\"status\").notNull().default(\"pending\"),\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }).notNull(),\n inviterId: text(\"inviter_id\")\n .notNull()\n .references(() => user.id, { onDelete: \"cascade\" }),\n ...timestamps,\n});\n","import { boolean, pgTable, text, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const bucketConfigs = pgTable(\n \"bucket_configs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n bucketId: text(\"bucket_id\").notNull(),\n enabled: boolean(\"enabled\").notNull().default(true),\n // Stable hash of the normalized ConditionEval, written at boot. Diffed on the\n // next boot to detect a CRITERIA CHANGE and enqueue the re-evaluation job\n // (Section 6.6 B). Nullable until the first registration.\n criteriaHash: text(\"criteria_hash\"),\n ...timestamps,\n },\n (table) => [uniqueIndex(\"bucket_configs_bucket_id_idx\").on(table.bucketId)],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { bucketMembershipStatusEnum } from \"./enums.js\";\n\nexport const bucketMemberships = pgTable(\n \"bucket_memberships\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n // multi-tenant insurance (nullable today, NOT in the unique key — see note)\n organizationId: text(\"organization_id\"),\n // logical join to contacts.externalId — NO FK (matches userEvents /\n // journeyStates; membership rows can predate a contacts row).\n userId: text(\"user_id\").notNull(),\n userEmail: text(\"user_email\"), // denormalized so emitted events carry it\n bucketId: text(\"bucket_id\").notNull(),\n status: bucketMembershipStatusEnum(\"status\").notNull().default(\"active\"),\n enteredAt: timestamp(\"entered_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n leftAt: timestamp(\"left_at\", { withTimezone: true }),\n // membership epoch / armed deadline for time-based + fastExpiry buckets\n expiresAt: timestamp(\"expires_at\", { withTimezone: true }),\n // unconditional membership TTL deadline (enteredAt + meta.maxDwell). Set once\n // on join, never mutated. The reconcile cron force-leaves rows past it\n // REGARDLESS of criteria — kept separate from expiresAt, which is the\n // criteria-window / minDwell-defer arming epoch (overloaded meaning).\n maxDwellAt: timestamp(\"max_dwell_at\", { withTimezone: true }),\n lastEvaluatedAt: timestamp(\"last_evaluated_at\", { withTimezone: true }),\n entryCount: integer(\"entry_count\").notNull().default(1),\n source: text(\"source\"), // \"event\" | \"reconcile\" | \"backfill\" | \"manual\"\n context: jsonb(\"context\").$type<Record<string, unknown>>().default({}),\n // Per-membership dwell bookkeeping. JSON map keyed by dwellLabel → ISO of\n // last dwell fire for THIS continuous membership. A re-join is a NEW row\n // (empty map). NULL/{} = never fired.\n dwellState: jsonb(\"dwell_state\")\n .$type<Record<string, string>>()\n .default({}),\n // Historical dwell anchor for backfilled members (NULL for live joins → use\n // enteredAt). The dwell gate reads coalesce(dwellAnchorAt, enteredAt) so the\n // dwell clock starts at the derived historical instant, not the backfill\n // instant. Kept separate from enteredAt (which minDwell/maxDwellAt/criteria\n // cron key on) — strictly additive.\n dwellAnchorAt: timestamp(\"dwell_anchor_at\", { withTimezone: true }),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n // EXACTLY ONE ACTIVE membership per (user, bucket), with any number of\n // historical \"left\" rows coexisting. This is a PARTIAL unique index scoped\n // to active, non-deleted rows — NOT a plain (userId,bucketId,status) unique\n // index. Buckets are re-entrant: a user oscillates join → leave → join →\n // leave forever, so a plain unique key on (userId,bucketId,status) would\n // throw on the SECOND \"left\" row (two rows share (user,bucket,'left')). The\n // journeyStates model does NOT transfer here because journey terminal states\n // are reached once; bucket \"left\" is reached repeatedly. The generated SQL\n // is `CREATE UNIQUE INDEX uq_user_bucket_active ON bucket_memberships\n // (user_id, bucket_id) WHERE status = 'active' AND deleted_at IS NULL`.\n // organizationId deliberately OMITTED — same NULLS-DISTINCT caveat as\n // uq_user_journey_active (journey-states.ts:34-40). Add it to the predicate\n // only when multi-tenancy lands and the column is non-null.\n uniqueIndex(\"uq_user_bucket_active\")\n .on(table.userId, table.bucketId)\n .where(sql`status = 'active' AND deleted_at IS NULL`),\n index(\"bucket_memberships_bucket_id_status_idx\").on(\n table.bucketId,\n table.status,\n ), // list members / size metrics\n index(\"bucket_memberships_user_id_idx\").on(table.userId), // a user's buckets\n index(\"bucket_memberships_last_evaluated_idx\").on(table.lastEvaluatedAt),\n index(\"bucket_memberships_expires_at_idx\").on(table.expiresAt),\n // the cron TTL sweep: active rows past their max_dwell_at\n index(\"bucket_memberships_max_dwell_at_idx\").on(table.maxDwellAt),\n // dwell continuous-member scan anchor\n index(\"bucket_memberships_dwell_idx\").on(\n table.bucketId,\n table.status,\n table.enteredAt,\n ),\n // keyset member-access pagination (ordered by id)\n index(\"bucket_memberships_bucket_id_status_id_idx\").on(\n table.bucketId,\n table.status,\n table.id,\n ),\n // every-dwell oldest-served-first ordering (§6.5)\n index(\"bucket_memberships_dwell_lastfired_idx\").on(\n table.bucketId,\n table.status,\n table.lastEvaluatedAt,\n ),\n ],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\n/**\n * One-shot campaign / broadcast (Loops \"campaign\" parity): a single email\n * template sent to every subscribed member of a LIST (or every active member of\n * a BUCKET). A row is created in `queued` by `POST /v1/campaigns`, then the\n * durable `send-campaign` Hatchet task transitions it `sending → sent`/`failed`\n * and tallies the final counts.\n *\n * `status` is a plain text column (not an enum) so adding a future state needs\n * no migration; the app constrains it to `queued|sending|sent|failed`.\n *\n * `audienceKind` + `audienceId` reference a code-defined list (ListRegistry) or\n * bucket (BucketRegistry) by string id — NOT a contacts FK, so there is no\n * relation to wire.\n */\nexport const campaigns = pgTable(\n \"campaigns\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n name: text(\"name\").notNull(),\n // queued | sending | sent | failed\n status: text(\"status\").notNull().default(\"queued\"),\n // \"list\" | \"bucket\"\n audienceKind: text(\"audience_kind\").notNull(),\n // the list id (ListRegistry) or bucket id (BucketRegistry)\n audienceId: text(\"audience_id\").notNull(),\n templateKey: text(\"template_key\").notNull(),\n props: jsonb(\"props\").$type<Record<string, unknown>>().default({}),\n fromEmail: text(\"from_email\"),\n subject: text(\"subject\"),\n /**\n * Optional client-supplied idempotency key (POST /v1/campaigns\n * `Idempotency-Key` header / body field). A retried create with the same key\n * resolves to the EXISTING campaign instead of spawning a second broadcast\n * (a distinct campaignId would give the same recipient a different per-send\n * idempotency key, double-sending the blast). Uniqueness is enforced by the\n * partial-unique index below (NULL keys are unconstrained).\n */\n idempotencyKey: text(\"idempotency_key\"),\n totalRecipients: integer(\"total_recipients\").notNull().default(0),\n sentCount: integer(\"sent_count\").notNull().default(0),\n skippedCount: integer(\"skipped_count\").notNull().default(0),\n failedCount: integer(\"failed_count\").notNull().default(0),\n startedAt: timestamp(\"started_at\", { withTimezone: true }),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n index(\"campaigns_status_idx\").on(table.status),\n index(\"campaigns_created_at_idx\").on(table.createdAt),\n // Partial-unique on the client idempotency key (scoped to non-NULL keys so\n // the common keyless create is unconstrained). A retried create with the\n // same key collides here and resolves to the existing campaign.\n uniqueIndex(\"campaigns_idempotency_key_idx\")\n .on(table.idempotencyKey)\n .where(sql`idempotency_key IS NOT NULL`),\n ],\n);\n","import { sql } from \"drizzle-orm\";\nimport {\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const contacts = pgTable(\n \"contacts\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n /**\n * Stable external/distinct id (= the `user_id` text key joined by every\n * contact-referencing table). NULLABLE since D1: contacts can be email-only\n * or anonymous-only. Uniqueness is enforced by the partial-unique index\n * below (scoped to live, non-deleted rows) rather than an inline `.unique()`\n * — a soft-deleted loser row must be able to keep its stale external_id\n * until a merge re-points it.\n */\n externalId: text(\"external_id\"),\n email: text(\"email\"),\n /**\n * Stable anonymous/distinct id for the future anonymous→identified path.\n * NULLABLE. Like external_id, uniqueness is enforced by a partial-unique\n * index scoped to live, non-deleted rows.\n */\n anonymousId: text(\"anonymous_id\"),\n /**\n * Opportunistic IANA-timezone cache (e.g. \"America/New_York\"). Populated\n * best-effort when a tz is resolved from PostHog person props. PostHog and\n * `properties` jsonb remain authoritative sources — this column sits below\n * them in the resolution precedence, so nothing is blocked on it.\n */\n timezone: text(\"timezone\"),\n properties: jsonb(\"properties\")\n .$type<Record<string, unknown>>()\n .default({}),\n firstSeenAt: timestamp(\"first_seen_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n lastSeenAt: timestamp(\"last_seen_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n // Plain (non-unique) lookup index on email — kept for the email-search path.\n index(\"contacts_email_idx\").on(table.email),\n // D1 partial-unique identity indexes. Each is scoped to live rows\n // (`WHERE col IS NOT NULL AND deleted_at IS NULL`) so a soft-deleted loser\n // row can retain its stale key until a merge re-points it (merge soft-\n // deletes the loser FIRST, then copies keys onto the survivor — risk 4).\n uniqueIndex(\"contacts_external_id_unique_idx\")\n .on(table.externalId)\n .where(sql`external_id IS NOT NULL AND deleted_at IS NULL`),\n // Functional partial-unique on lower(email) — email is a case-insensitive\n // resolvable identity key. Emails are stored already-normalized (trim +\n // toLowerCase), so lower() here is belt-and-suspenders.\n uniqueIndex(\"contacts_email_unique_idx\")\n .on(sql`lower(email)`)\n .where(sql`email IS NOT NULL AND deleted_at IS NULL`),\n uniqueIndex(\"contacts_anonymous_id_unique_idx\")\n .on(table.anonymousId)\n .where(sql`anonymous_id IS NOT NULL AND deleted_at IS NULL`),\n ],\n);\n","import { index, pgTable, text, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { contacts } from \"./contacts.js\";\n\n/**\n * Alias table for identity resolution. After a merge (or a fill-in-link\n * \"promote\"), a stale identity key — the loser's old external_id / email /\n * anonymous_id — sits on a soft-deleted row, so the `deleted_at IS NULL`\n * lookups in `findByExternalId`/`findByEmail` miss it. This table lets a stale\n * key resolve to the SURVIVOR contact instead of minting a fresh row and\n * re-splitting history (risk 5). Each `findByX` falls back to it on a miss.\n */\nexport const contactAliases = pgTable(\n \"contact_aliases\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n // The SURVIVOR a stale key resolves TO.\n contactId: uuid(\"contact_id\")\n .notNull()\n .references(() => contacts.id, { onDelete: \"cascade\" }),\n // 'email' | 'external' | 'anonymous'\n aliasKind: text(\"alias_kind\").notNull(),\n // The stale key value (the loser's old external_id / normalized email /\n // anonymous_id).\n aliasValue: text(\"alias_value\").notNull(),\n // Provenance: the loser contact id this alias came from (nullable — a\n // 'promote' alias may have no distinct loser row).\n fromContactId: uuid(\"from_contact_id\"),\n // 'merge' | 'promote'\n reason: text(\"reason\").notNull(),\n ...timestamps,\n },\n (table) => [\n // One alias per (kind, value): a stale key resolves to exactly one survivor.\n uniqueIndex(\"contact_aliases_kind_value_idx\").on(\n table.aliasKind,\n table.aliasValue,\n ),\n index(\"contact_aliases_contact_id_idx\").on(table.contactId),\n ],\n);\n","import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { dlqStatusEnum } from \"./enums.js\";\n\nexport const deadLetterQueue = pgTable(\n \"dead_letter_queue\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n source: text(\"source\").notNull(),\n sourceId: text(\"source_id\"),\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n error: text(\"error\").notNull(),\n retryCount: integer(\"retry_count\").notNull().default(0),\n status: dlqStatusEnum(\"status\").notNull().default(\"pending\"),\n retriedAt: timestamp(\"retried_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n index(\"dlq_source_idx\").on(table.source),\n index(\"dlq_status_idx\").on(table.status),\n index(\"dlq_created_at_idx\").on(table.createdAt),\n ],\n);\n","import {\n boolean,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const emailPreferences = pgTable(\n \"email_preferences\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n userId: text(\"user_id\").notNull(),\n email: text(\"email\").notNull(),\n unsubscribedAll: boolean(\"unsubscribed_all\").notNull().default(false),\n suppressed: boolean(\"suppressed\").notNull().default(false),\n bounceCount: integer(\"bounce_count\").notNull().default(0),\n categories: jsonb(\"categories\")\n .$type<Record<string, boolean>>()\n .default({}),\n suppressedAt: timestamp(\"suppressed_at\", { withTimezone: true }),\n lastBounceAt: timestamp(\"last_bounce_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n uniqueIndex(\"email_preferences_user_email_idx\").on(\n table.userId,\n table.email,\n ),\n ],\n);\n","import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { journeyStatusEnum } from \"./enums.js\";\n\nexport const journeyStates = pgTable(\n \"journey_states\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n userId: text(\"user_id\").notNull(),\n userEmail: text(\"user_email\").notNull(),\n journeyId: text(\"journey_id\").notNull(),\n currentNodeId: text(\"current_node_id\").notNull(),\n status: journeyStatusEnum(\"status\").notNull().default(\"active\"),\n hatchetRunId: text(\"hatchet_run_id\"),\n context: jsonb(\"context\").$type<Record<string, unknown>>().default({}),\n errorMessage: text(\"error_message\"),\n entryCount: integer(\"entry_count\").notNull().default(1),\n completedAt: timestamp(\"completed_at\", { withTimezone: true }),\n exitedAt: timestamp(\"exited_at\", { withTimezone: true }),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n // NOTE: organizationId is intentionally NOT in this unique index yet. It is\n // nullable (single-tenant today), and Postgres treats NULLs as DISTINCT in a\n // unique index by default — so adding it now would silently stop enforcing\n // one-active-journey-per-user for all existing rows. drizzle 0.45.2's\n // uniqueIndex() can't express NULLS NOT DISTINCT. When multi-tenancy lands and\n // organizationId is non-null, add it to this key (a cheap rebuild on this\n // modest table). The nullable column is added now (the real cheap insurance).\n uniqueIndex(\"uq_user_journey_active\").on(\n table.userId,\n table.journeyId,\n table.status,\n ),\n index(\"journey_states_status_idx\").on(table.status),\n index(\"journey_states_hatchet_run_idx\").on(table.hatchetRunId),\n index(\"journey_states_user_id_idx\").on(table.userId),\n index(\"journey_states_journey_id_status_idx\").on(\n table.journeyId,\n table.status,\n ),\n ],\n);\n","import {\n index,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { emailSendStatusEnum } from \"./enums.js\";\nimport { journeyStates } from \"./journey-states.js\";\n\nexport const emailSends = pgTable(\n \"email_sends\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n journeyStateId: uuid(\"journey_state_id\").references(() => journeyStates.id),\n // Denormalized recipient identity, set at send time. Lets reporting attribute\n // a send to a contact without joining journey_states, and captures journeyless\n // (raw/batch) sends that have no journey linkage. Both nullable.\n userId: text(\"user_id\"),\n userEmail: text(\"user_email\"),\n templateKey: text(\"template_key\"),\n messageId: text(\"message_id\"),\n fromEmail: text(\"from_email\").notNull(),\n toEmail: text(\"to_email\").notNull(),\n subject: text(\"subject\").notNull(),\n category: text(\"category\"),\n status: emailSendStatusEnum(\"status\").notNull().default(\"queued\"),\n sentAt: timestamp(\"sent_at\", { withTimezone: true }),\n deliveredAt: timestamp(\"delivered_at\", { withTimezone: true }),\n openedAt: timestamp(\"opened_at\", { withTimezone: true }),\n clickedAt: timestamp(\"clicked_at\", { withTimezone: true }),\n bouncedAt: timestamp(\"bounced_at\", { withTimezone: true }),\n complainedAt: timestamp(\"complained_at\", { withTimezone: true }),\n // Bounce classification from the Resend webhook (hard/soft/transient + reason).\n bounceType: text(\"bounce_type\"),\n bounceReason: text(\"bounce_reason\"),\n // Caller-supplied idempotency key (POST /v1/emails). A retry with the same\n // key short-circuits to the prior send instead of dispatching a duplicate —\n // mirrors the user_events idempotency pattern. Nullable: journey/system sends\n // don't set it.\n idempotencyKey: text(\"idempotency_key\"),\n ...timestamps,\n },\n (table) => [\n index(\"email_sends_to_email_idx\").on(table.toEmail),\n index(\"email_sends_template_key_idx\").on(table.templateKey),\n index(\"email_sends_status_idx\").on(table.status),\n index(\"email_sends_created_at_idx\").on(table.createdAt),\n index(\"email_sends_journey_state_id_idx\").on(table.journeyStateId),\n index(\"email_sends_user_id_idx\").on(table.userId),\n // Serves the provider-webhook by-message resolver\n // (resolveEmailSendContextByMessageId) — previously a seq-scan.\n index(\"email_sends_message_id_idx\").on(table.messageId),\n // Serves the frequency-cap COUNT (recipient + recency, optionally category).\n index(\"email_sends_freq_cap_idx\").on(\n table.toEmail,\n table.createdAt,\n table.category,\n ),\n // Idempotency dedup for POST /v1/emails (NULLs are distinct in Postgres, so\n // unkeyed journey/system sends never collide).\n uniqueIndex(\"email_sends_idempotency_key_idx\").on(table.idempotencyKey),\n ],\n);\n","import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { importJobStatusEnum } from \"./enums.js\";\n\nexport const importJobs = pgTable(\n \"import_jobs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n fileName: text(\"file_name\"),\n format: text(\"format\").notNull(),\n status: importJobStatusEnum(\"status\").notNull().default(\"pending\"),\n totalRows: integer(\"total_rows\"),\n processedRows: integer(\"processed_rows\").notNull().default(0),\n failedRows: integer(\"failed_rows\").notNull().default(0),\n errors: jsonb(\"errors\").$type<Array<{ row: number; error: string }>>(),\n ...timestamps,\n },\n (table) => [index(\"import_jobs_status_idx\").on(table.status)],\n);\n","import { boolean, pgTable, text, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\nexport const journeyConfigs = pgTable(\n \"journey_configs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n journeyId: text(\"journey_id\").notNull(),\n enabled: boolean(\"enabled\").notNull().default(true),\n ...timestamps,\n },\n (table) => [\n uniqueIndex(\"journey_configs_journey_id_idx\").on(table.journeyId),\n ],\n);\n","import { index, jsonb, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { journeyStates } from \"./journey-states.js\";\n\nexport const journeyLogs = pgTable(\n \"journey_logs\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n journeyStateId: uuid(\"journey_state_id\")\n .notNull()\n .references(() => journeyStates.id, { onDelete: \"cascade\" }),\n fromNodeId: text(\"from_node_id\"),\n toNodeId: text(\"to_node_id\"),\n action: text(\"action\").notNull(),\n detail: jsonb(\"detail\").$type<Record<string, unknown>>(),\n ...timestamps,\n },\n (table) => [\n index(\"journey_logs_journey_state_id_idx\").on(table.journeyStateId),\n ],\n);\n","import { index, integer, pgTable, text, uuid } from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { emailSends } from \"./email-sends.js\";\n\nexport const trackedLinks = pgTable(\n \"tracked_links\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n emailSendId: uuid(\"email_send_id\")\n .notNull()\n .references(() => emailSends.id, { onDelete: \"cascade\" }),\n originalUrl: text(\"original_url\").notNull(),\n clickCount: integer(\"click_count\").notNull().default(0),\n ...timestamps,\n },\n (table) => [index(\"tracked_links_email_send_id_idx\").on(table.emailSendId)],\n);\n","import { index, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { trackedLinks } from \"./tracked-links.js\";\n\nexport const linkClicks = pgTable(\n \"link_clicks\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n trackedLinkId: uuid(\"tracked_link_id\")\n .notNull()\n .references(() => trackedLinks.id, { onDelete: \"cascade\" }),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n clickedAt: timestamp(\"clicked_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index(\"link_clicks_tracked_link_id_idx\").on(table.trackedLinkId),\n index(\"link_clicks_clicked_at_idx\").on(table.clickedAt),\n ],\n);\n","import {\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\n\nexport const userEvents = pgTable(\n \"user_events\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n userId: text(\"user_id\").notNull(),\n event: text(\"event\").notNull(),\n properties: jsonb(\"properties\").$type<Record<string, unknown>>(),\n idempotencyKey: text(\"idempotency_key\"),\n occurredAt: timestamp(\"occurred_at\", { withTimezone: true })\n .defaultNow()\n .notNull(),\n },\n (table) => [\n index(\"user_events_user_id_idx\").on(table.userId),\n index(\"user_events_event_idx\").on(table.event),\n index(\"user_events_occurred_at_idx\").on(table.occurredAt),\n index(\"user_events_user_event_occurred_idx\").on(\n table.userId,\n table.event,\n table.occurredAt,\n ),\n uniqueIndex(\"user_events_idempotency_key_idx\").on(table.idempotencyKey),\n ],\n);\n","import {\n boolean,\n index,\n jsonb,\n pgTable,\n text,\n timestamp,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\n\n// Locally declared to avoid an engine→db dependency cycle: the engine's\n// `webhook-signing.ts` owns the authoritative `WEBHOOK_EVENT_TYPES` tuple +\n// `WebhookEventType` union. This schema keeps a structural string alias so the\n// jsonb column is typed without importing the engine.\nexport type WebhookEventType = string;\n\nexport const webhookEndpoints = pgTable(\n \"webhook_endpoints\",\n {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n organizationId: text(\"organization_id\"),\n url: text(\"url\").notNull(),\n description: text(\"description\"),\n // The delivery adapter selector. \"webhook\" (the default) is the signed\n // Standard-Webhooks POST that existing subscribers receive — byte-identical\n // to before this column existed. Any other value (e.g. \"posthog\") selects a\n // delivery-time TRANSFORM adapter that reuses the same durable delivery\n // machinery but rewrites url/headers/body for a vendor destination.\n kind: text(\"kind\").notNull().default(\"webhook\"),\n // Per-destination configuration for keyed adapters (e.g. PostHog's\n // `{ apiKey, host }`). Null for `kind=\"webhook\"` (it reads `secret` instead).\n // Keyed destinations keep their credentials HERE, not in a fake `whsec_`.\n config: jsonb(\"config\").$type<Record<string, unknown>>(),\n // whsec_<base64url> PLAINTEXT (recoverable; re-signed every delivery).\n // Nullable: only `kind=\"webhook\"` carries a signing secret; keyed\n // destinations authenticate via `config` and the webhook adapter is the only\n // reader of this column.\n secret: text(\"secret\"),\n // e.g. \"whsec_AbCd\" — safe to show on list/get. Nullable alongside `secret`.\n secretPrefix: text(\"secret_prefix\"),\n eventTypes: jsonb(\"event_types\")\n .$type<WebhookEventType[]>()\n .notNull()\n .default([]),\n disabled: boolean(\"disabled\").notNull().default(false),\n // written by the delivery task on a successful (2xx) delivery.\n lastDeliveryAt: timestamp(\"last_delivery_at\", { withTimezone: true }),\n ...timestamps,\n },\n (table) => [\n index(\"webhook_endpoints_org_idx\").on(table.organizationId),\n index(\"webhook_endpoints_disabled_idx\").on(table.disabled),\n ],\n);\n","import {\n index,\n integer,\n jsonb,\n pgTable,\n text,\n timestamp,\n uniqueIndex,\n uuid,\n} from \"drizzle-orm/pg-core\";\nimport { timestamps } from \"./_shared.js\";\nimport { webhookDeliveryStatusEnum } from \"./enums.js\";\nimport { webhookEndpoints } from \"./webhook-endpoints.js\";\n\nexport const webhookDeliveries = pgTable(\n \"webhook_deliveries\",\n {\n // internal PK ONLY — NOT the Webhook-Id header.\n id: uuid(\"id\").defaultRandom().primaryKey(),\n endpointId: uuid(\"endpoint_id\")\n .notNull()\n .references(() => webhookEndpoints.id, { onDelete: \"cascade\" }),\n // denormalized, nullable (MT deferred).\n organizationId: text(\"organization_id\"),\n // == Webhook-Id header; ONE per logical event, shared across endpoints +\n // reused across retries.\n webhookId: text(\"webhook_id\").notNull(),\n eventType: text(\"event_type\").notNull(),\n // producer-side dedup (idempotencyKey/stateId/emailSendId/...).\n dedupeKey: text(\"dedupe_key\"),\n // the EXACT signed envelope { id, type, timestamp, data }.\n payload: jsonb(\"payload\").$type<Record<string, unknown>>().notNull(),\n status: webhookDeliveryStatusEnum(\"status\").notNull().default(\"pending\"),\n attemptCount: integer(\"attempt_count\").notNull().default(0),\n nextRetryAt: timestamp(\"next_retry_at\", { withTimezone: true }),\n lastAttemptAt: timestamp(\"last_attempt_at\", { withTimezone: true }),\n responseStatus: integer(\"response_status\"),\n // truncated to ≤1KB in app.\n responseBodySnippet: text(\"response_body_snippet\"),\n deliveredAt: timestamp(\"delivered_at\", { withTimezone: true }),\n lastError: text(\"last_error\"),\n ...timestamps,\n },\n (table) => [\n index(\"webhook_deliveries_endpoint_idx\").on(table.endpointId),\n // reaper sweep: due-pending + stale-sending recovery.\n index(\"webhook_deliveries_status_next_retry_idx\").on(\n table.status,\n table.nextRetryAt,\n ),\n // producer-side fan-out idempotency. PARTIAL-effective: Postgres treats\n // multiple NULL dedupeKey as distinct, so undeduped events are never blocked.\n uniqueIndex(\"webhook_deliveries_endpoint_dedupe_idx\").on(\n table.endpointId,\n table.dedupeKey,\n ),\n ],\n);\n","import { relations } from \"drizzle-orm\";\nimport { alertHistory } from \"./alert-history.js\";\nimport { alertRules } from \"./alert-rules.js\";\nimport { apiKeys } from \"./api-keys.js\";\nimport { auditLogs } from \"./audit-logs.js\";\nimport {\n account,\n invitation,\n member,\n organization,\n session,\n user,\n} from \"./auth.js\";\nimport { bucketConfigs } from \"./bucket-configs.js\";\nimport { bucketMemberships } from \"./bucket-memberships.js\";\nimport { contactAliases } from \"./contact-aliases.js\";\nimport { contacts } from \"./contacts.js\";\nimport { deadLetterQueue } from \"./dead-letter-queue.js\";\nimport { emailPreferences } from \"./email-preferences.js\";\nimport { emailSends } from \"./email-sends.js\";\nimport { importJobs } from \"./import-jobs.js\";\nimport { journeyConfigs } from \"./journey-configs.js\";\nimport { journeyLogs } from \"./journey-logs.js\";\nimport { journeyStates } from \"./journey-states.js\";\nimport { linkClicks } from \"./link-clicks.js\";\nimport { trackedLinks } from \"./tracked-links.js\";\nimport { userEvents } from \"./user-events.js\";\nimport { webhookDeliveries } from \"./webhook-deliveries.js\";\nimport { webhookEndpoints } from \"./webhook-endpoints.js\";\n\nexport const alertRulesRelations = relations(alertRules, ({ many }) => ({\n history: many(alertHistory),\n}));\n\nexport const alertHistoryRelations = relations(alertHistory, ({ one }) => ({\n rule: one(alertRules, {\n fields: [alertHistory.alertRuleId],\n references: [alertRules.id],\n }),\n}));\n\nexport const apiKeysRelations = relations(apiKeys, () => ({}));\n\nexport const auditLogsRelations = relations(auditLogs, () => ({}));\n\nexport const deadLetterQueueRelations = relations(deadLetterQueue, () => ({}));\n\nexport const importJobsRelations = relations(importJobs, () => ({}));\n\nexport const journeyConfigsRelations = relations(journeyConfigs, () => ({}));\n\nexport const bucketConfigsRelations = relations(bucketConfigs, () => ({}));\n\nexport const contactsRelations = relations(contacts, ({ many }) => ({\n // NOTE: the logical joins below (emailPreferences/userEvents/journeyStates/\n // bucketMemberships) reference contacts.externalId — anonymous-only contacts\n // (external_id NULL) won't resolve through Drizzle relational queries until\n // identified. Acceptable (anon contacts have no prefs/journeys yet); see\n // risk 22. contacts.id is NOT the relational key for those tables.\n emailPreferences: many(emailPreferences),\n userEvents: many(userEvents),\n journeyStates: many(journeyStates),\n bucketMemberships: many(bucketMemberships),\n // contact_aliases joins on the contacts.id UUID (real FK).\n aliases: many(contactAliases),\n}));\n\nexport const contactAliasesRelations = relations(contactAliases, ({ one }) => ({\n contact: one(contacts, {\n fields: [contactAliases.contactId],\n references: [contacts.id],\n }),\n}));\n\nexport const bucketMembershipsRelations = relations(\n bucketMemberships,\n ({ one }) => ({\n contact: one(contacts, {\n fields: [bucketMemberships.userId],\n references: [contacts.externalId],\n }),\n }),\n);\n\nexport const emailPreferencesRelations = relations(\n emailPreferences,\n ({ one }) => ({\n contact: one(contacts, {\n fields: [emailPreferences.userId],\n references: [contacts.externalId],\n }),\n }),\n);\n\nexport const userEventsRelations = relations(userEvents, ({ one }) => ({\n contact: one(contacts, {\n fields: [userEvents.userId],\n references: [contacts.externalId],\n }),\n}));\n\nexport const journeyStatesRelations = relations(\n journeyStates,\n ({ one, many }) => ({\n contact: one(contacts, {\n fields: [journeyStates.userId],\n references: [contacts.externalId],\n }),\n logs: many(journeyLogs),\n emailSends: many(emailSends),\n }),\n);\n\nexport const journeyLogsRelations = relations(journeyLogs, ({ one }) => ({\n journeyState: one(journeyStates, {\n fields: [journeyLogs.journeyStateId],\n references: [journeyStates.id],\n }),\n}));\n\nexport const emailSendsRelations = relations(emailSends, ({ one, many }) => ({\n journeyState: one(journeyStates, {\n fields: [emailSends.journeyStateId],\n references: [journeyStates.id],\n }),\n trackedLinks: many(trackedLinks),\n}));\n\nexport const trackedLinksRelations = relations(\n trackedLinks,\n ({ one, many }) => ({\n emailSend: one(emailSends, {\n fields: [trackedLinks.emailSendId],\n references: [emailSends.id],\n }),\n clicks: many(linkClicks),\n }),\n);\n\nexport const linkClicksRelations = relations(linkClicks, ({ one }) => ({\n trackedLink: one(trackedLinks, {\n fields: [linkClicks.trackedLinkId],\n references: [trackedLinks.id],\n }),\n}));\n\nexport const webhookEndpointsRelations = relations(\n webhookEndpoints,\n ({ many }) => ({\n deliveries: many(webhookDeliveries),\n }),\n);\n\nexport const webhookDeliveriesRelations = relations(\n webhookDeliveries,\n ({ one }) => ({\n endpoint: one(webhookEndpoints, {\n fields: [webhookDeliveries.endpointId],\n references: [webhookEndpoints.id],\n }),\n }),\n);\n\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n memberships: many(member),\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n\nexport const organizationRelations = relations(organization, ({ many }) => ({\n members: many(member),\n invitations: many(invitation),\n}));\n\nexport const memberRelations = relations(member, ({ one }) => ({\n organization: one(organization, {\n fields: [member.organizationId],\n references: [organization.id],\n }),\n user: one(user, {\n fields: [member.userId],\n references: [user.id],\n }),\n}));\n\nexport const invitationRelations = relations(invitation, ({ one }) => ({\n organization: one(organization, {\n fields: [invitation.organizationId],\n references: [organization.id],\n }),\n inviter: one(user, {\n fields: [invitation.inviterId],\n references: [user.id],\n }),\n}));\n","import { drizzle } from \"drizzle-orm/postgres-js\";\nimport postgres from \"postgres\";\nimport * as schema from \"./schema/index.js\";\n\nexport function createDatabase(opts: { url: string }) {\n const client = postgres(opts.url, {\n max: 10,\n idle_timeout: 20,\n connect_timeout: 10,\n });\n\n const db = drizzle(client, { schema });\n\n return { db, client };\n}\n\nexport type Database = ReturnType<typeof createDatabase>[\"db\"];\nexport type DatabaseClient = ReturnType<typeof postgres>;\n\nexport { migrateClient, migrateEngine, migrateTrack } from \"./migrate.js\";\nexport * from \"./schema/index.js\";\nexport {\n CLIENT_MIGRATIONS_SCHEMA,\n CLIENT_MIGRATIONS_TABLE,\n ENGINE_MIGRATIONS_SCHEMA,\n ENGINE_MIGRATIONS_TABLE,\n getBundledMigrations,\n getClientSchemaVersion,\n getEngineSchemaVersion,\n getSchemaVersion,\n type JournalShape,\n type MigrationEntry,\n type SchemaVersion,\n} from \"./version.js\";\nexport { schema };\n","import type { Database } from \"@hogsend/db\";\nimport * as schema from \"@hogsend/db/schema\";\nimport { betterAuth } from \"better-auth\";\nimport { drizzleAdapter } from \"better-auth/adapters/drizzle\";\nimport { organization } from \"better-auth/plugins/organization\";\nimport type { AuthSecondaryStorage } from \"./redis.js\";\n\n/**\n * Delivers the password-reset link. Injected by `createHogsendClient` (wired to\n * the engine mailer) so the auth-construction layer stays decoupled from the\n * email pipeline, and so tests can pass a spy and assert the callback fires\n * without sending. Defaults to a no-op so a bare `createAuth({ db, secret,\n * baseURL })` (e.g. the CLI's headless instance) doesn't try to send mail.\n *\n * Receives better-auth's `{ user, url, token }`: `url` is the\n * `${baseURL}/api/auth/reset-password/:token?callbackURL=…` link that, when\n * clicked, redirects the browser to the Studio reset route with `?token=`. NEVER\n * log `url`/`token`.\n */\nexport type SendResetPasswordFn = (args: {\n user: { email: string; id: string };\n url: string;\n token: string;\n}) => Promise<void>;\n\nexport function createAuth(opts: {\n db: Database;\n secret: string;\n baseURL: string;\n /**\n * Extra origins allowed to call auth endpoints, beyond `baseURL` (which is\n * always trusted). Needed when the Studio is served from a different origin\n * than the API (e.g. the `hogsend studio` CLI against a remote instance).\n */\n trustedOrigins?: string[];\n /**\n * Self-service password-reset delivery. When provided, better-auth's\n * `/request-password-reset` + `/reset-password` endpoints are live (without a\n * `sendResetPassword` callback better-auth hard-errors `RESET_PASSWORD_DISABLED`).\n * `createHogsendClient` wires this to the engine mailer; omit it (the default)\n * for a headless instance that should not send mail (the CLI). The reset token\n * is single-use, short-TTL (15 min), constant-time compared — all better-auth\n * internals we inherit; we never re-implement them.\n */\n sendResetPassword?: SendResetPasswordFn;\n /**\n * Shared cross-replica store for better-auth's session AND rate-limit data.\n * When provided, better-auth resolves `rateLimit.storage` to \"secondary-storage\"\n * instead of the in-memory default — so the sign-in / request-password-reset\n * limiters are enforced GLOBALLY across Railway replicas and survive restarts,\n * not per-instance (security finding #2). `createHogsendClient` wires this to\n * the engine's shared Redis when available; omit it (the default) to keep\n * better-auth's in-memory store on a bare instance with no Redis.\n */\n secondaryStorage?: AuthSecondaryStorage;\n}) {\n const { db, secret, baseURL, trustedOrigins, sendResetPassword } = opts;\n return betterAuth({\n basePath: \"/api/auth\",\n secret,\n baseURL,\n ...(trustedOrigins && trustedOrigins.length > 0 ? { trustedOrigins } : {}),\n // Passing `secondaryStorage` flips better-auth's rate-limit storage from the\n // per-instance in-memory default to this shared store (see option doc).\n ...(opts.secondaryStorage\n ? { secondaryStorage: opts.secondaryStorage }\n : {}),\n // Tighten the brute-force budget on the credential paths — better-auth's\n // global default is a coarse 100 req / 10s per IP. Rate limiting is enabled\n // in production by default; with `secondaryStorage` above these counters are\n // shared across replicas rather than per-instance.\n rateLimit: {\n customRules: {\n \"/sign-in/email\": { window: 60, max: 10 },\n \"/request-password-reset\": { window: 60, max: 5 },\n },\n },\n database: drizzleAdapter(db, {\n provider: \"pg\",\n schema,\n }),\n emailAndPassword: {\n enabled: true,\n // 🔒 Public sign-up is closed: there is NO unauthenticated network path\n // that creates a user. In better-auth 1.6.11 this guard lives INSIDE the\n // sign-up endpoint handler, so it blocks BOTH POST /api/auth/sign-up/email\n // (→ 400 EMAIL_PASSWORD_SIGN_UP_DISABLED) AND the in-process\n // `auth.api.signUpEmail`. Admins are minted only by the CLI (DB-direct)\n // and the boot env bootstrap, both via the internal adapter. Login + the\n // self-service forgot/reset endpoints are untouched (disableSignUp only\n // gates sign-up).\n disableSignUp: true,\n minPasswordLength: 8,\n maxPasswordLength: 128,\n // Self-service reset is enabled ONLY when a sender is injected (otherwise\n // the endpoints stay disabled rather than 500 on a missing callback).\n ...(sendResetPassword\n ? {\n // Short TTL (overrides better-auth's 3600s default). The token is\n // also single-use (deleted on consume) and constant-time compared —\n // better-auth internals we inherit.\n resetPasswordTokenExpiresIn: 60 * 15,\n // A reset kills existing sessions, so a recovered account can't be\n // ridden by a stale/leaked session.\n revokeSessionsOnPasswordReset: true,\n sendResetPassword,\n }\n : {}),\n },\n session: {\n expiresIn: 60 * 60 * 24 * 7,\n updateAge: 60 * 60 * 24,\n },\n plugins: [\n organization({\n organizationLimit: 5,\n membershipLimit: 100,\n }),\n ],\n });\n}\n\nexport type Auth = ReturnType<typeof createAuth>;\n","import type { Auth } from \"./auth.js\";\n\n/**\n * Shared admin-minting primitive used by BOTH the CLI's `admin create` and the\n * engine's env bootstrap. Mints a credential admin via better-auth's\n * INTERNAL ADAPTER (scrypt-identical to the running app) rather than the public\n * sign-up endpoint — which is now blocked by `disableSignUp` (see lib/auth.ts).\n *\n * Why the internal adapter (not `auth.api.signUpEmail`): in better-auth 1.6.11\n * the `disableSignUp` check lives INSIDE the sign-up endpoint handler, and\n * `auth.api.signUpEmail` dispatches through that SAME handler — so with sign-up\n * disabled it throws `EMAIL_PASSWORD_SIGN_UP_DISABLED` for the in-process API\n * too. The internal adapter is NOT subject to that guard. This mirrors exactly\n * what admin-recovery's `reset()` already does for its no-credential branch\n * (`ctx.password.hash` + `ctx.internalAdapter.createAccount({ providerId:\n * \"credential\" })`).\n *\n * Security invariants (acceptance gates, not preferences):\n * - The password is hashed via `ctx.password.hash` (scrypt, identical to the\n * app). There is NO raw SQL password write.\n * - The password is never logged and never returned in any result object.\n * - `emailVerified: true` because this is an operator-minted admin (CLI or\n * boot env), not a self-service signup.\n *\n * Lives in `lib/` (reachable via the `@hogsend/engine/create-admin` subpath)\n * with a module graph that touches ONLY better-auth — it never pulls `env.ts`,\n * Hatchet, or Resend — so the CLI can import it the same way it imports\n * `createAuth` from `@hogsend/engine/auth`.\n */\n\n/** A single admin row, no secrets. Shared with the CLI's `AdminSummary`. */\nexport interface CreatedAdmin {\n id: string;\n email: string;\n name: string;\n createdAt: string;\n}\n\n/** Thrown when an admin with the given email already exists. */\nexport class AdminAlreadyExistsError extends Error {\n constructor(public readonly email: string) {\n super(\n `An admin with email \"${email}\" already exists. ` +\n \"Use `hogsend studio admin reset` to set a new password.\",\n );\n this.name = \"AdminAlreadyExistsError\";\n }\n}\n\n/**\n * Create a credential admin user against a built better-auth instance. Throws\n * {@link AdminAlreadyExistsError} if the email already exists (so callers can\n * point the operator at `reset`). The unique constraint on `user.email` is the\n * backstop: a concurrent racer that slips past the pre-check throws on\n * `createUser` — callers that need idempotency should catch that.\n */\nexport async function createAdminUser(opts: {\n auth: Auth;\n email: string;\n name?: string;\n password: string;\n}): Promise<CreatedAdmin> {\n const { auth, email, password } = opts;\n const displayName = opts.name ?? email.split(\"@\")[0] ?? email;\n\n const ctx = await auth.$context;\n\n // Pre-check for a clear error (better-auth lowercases on lookup + create).\n const existing = await ctx.internalAdapter.findUserByEmail(email);\n if (existing) {\n throw new AdminAlreadyExistsError(email);\n }\n\n // scrypt hash — identical to the running app (admin-recovery.reset uses the\n // same call). NO raw SQL password write.\n const hashed = await ctx.password.hash(password);\n\n // `createUser` returns the bare user row (createWithHooks → the created user),\n // NOT `{ user }` — verified against better-auth@1.6.11 internal-adapter.mjs:75.\n const created = await ctx.internalAdapter.createUser({\n email,\n name: displayName,\n emailVerified: true,\n });\n\n await ctx.internalAdapter.createAccount({\n userId: created.id,\n providerId: \"credential\",\n accountId: created.id,\n password: hashed,\n });\n\n const createdAt =\n created.createdAt instanceof Date\n ? created.createdAt.toISOString()\n : String(created.createdAt ?? new Date().toISOString());\n\n return {\n id: created.id,\n email: created.email,\n name: created.name,\n createdAt,\n };\n}\n","import { createDatabase, user } from \"@hogsend/db\";\n// Narrow subpath imports: `@hogsend/engine/auth` re-exports only `createAuth`\n// (lib/auth.ts) and `@hogsend/engine/create-admin` only `createAdminUser`\n// (lib/create-admin.ts) — both module graphs touch just better-auth +\n// @hogsend/db. Importing from the engine barrel (`@hogsend/engine`) would\n// eagerly run the env validation in env.ts (requires BETTER_AUTH_SECRET /\n// HATCHET_CLIENT_TOKEN at module-eval time) and pull Hatchet/Resend/PostHog —\n// heavy and wrong here.\nimport { createAuth } from \"@hogsend/engine/auth\";\nimport {\n AdminAlreadyExistsError,\n createAdminUser,\n} from \"@hogsend/engine/create-admin\";\n\n/**\n * Shell-gated Studio admin recovery primitive (PostHog/GitLab/Rails-style\n * management command). Constructs its own better-auth instance against the DB\n * and uses better-auth's SERVER API so password hashing is identical to the\n * running app. NO HTTP, no running API required.\n *\n * Security invariants (these are acceptance gates, not preferences):\n * - Every password write goes through better-auth's server API (scrypt via\n * `ctx.password.hash` + the internal adapter). Public sign-up is closed\n * (`disableSignUp`), so create() uses the internal adapter too, NOT\n * `auth.api.signUpEmail`. There are NO raw SQL password writes here, ever.\n * - Passwords are never logged and never returned in any result object.\n * - `list` selects only non-secret columns (id/email/name/createdAt) — never\n * the account password/hash.\n * - Gated by holding both `DATABASE_URL` and `BETTER_AUTH_SECRET` (i.e. DB\n * reach + the app secret). There is no HTTP fallback.\n */\n\n/** A single admin row, as surfaced by `list` (no secrets). */\nexport interface AdminSummary {\n id: string;\n email: string;\n name: string;\n createdAt: string;\n}\n\nexport interface AdminRecovery {\n /**\n * Create a new admin user via better-auth's INTERNAL ADAPTER (scrypt-hashes,\n * writes the `user` + `account` rows). NOT via public sign-up — that is now\n * blocked by `disableSignUp`; the internal-adapter path is not subject to that\n * guard and is correct for the trusted CLI. Throws a clear, non-secret error\n * if the email already exists (points at `reset`).\n */\n create(input: {\n email: string;\n password: string;\n name?: string;\n }): Promise<AdminSummary>;\n /**\n * Set the password for an existing admin. Mirrors better-auth's own\n * `resetPassword` route: hash via `ctx.password.hash`, then either\n * `updatePassword` (if a credential account exists) or `createAccount` a\n * credential account. Optionally revokes existing sessions so an old leaked\n * session cannot survive a recovery reset. Throws if no user matches.\n */\n reset(input: {\n email: string;\n password: string;\n revokeSessions?: boolean;\n }): Promise<AdminSummary>;\n /** List existing admins (no secret columns selected, ever). */\n list(): Promise<AdminSummary[]>;\n /** Close the pg pool so the CLI process exits cleanly. */\n close(): Promise<void>;\n}\n\n/** Thrown when required env (DB URL / app secret) is missing. */\nexport class AdminRecoveryConfigError extends Error {}\n\n/**\n * Resolve a single admin row from a better-auth `User`-shaped object into the\n * non-secret summary shape.\n */\nfunction toSummary(u: {\n id: string;\n email: string;\n name: string;\n createdAt: Date | string;\n}): AdminSummary {\n const created =\n u.createdAt instanceof Date ? u.createdAt.toISOString() : u.createdAt;\n return { id: u.id, email: u.email, name: u.name, createdAt: created };\n}\n\n/**\n * Build an {@link AdminRecovery} bound to a DB + app secret. Constructs a\n * minimal better-auth instance directly (NOT `createHogsendClient`, which boots\n * Hatchet/Resend/PostHog and is heavy + irrelevant here).\n *\n * `baseURL` is only used by better-auth for cookie/URL config and is irrelevant\n * to these headless server calls; it defaults to localhost.\n */\nexport function createAdminRecovery(opts: {\n databaseUrl: string;\n secret: string;\n baseURL?: string;\n}): AdminRecovery {\n if (!opts.databaseUrl) {\n throw new AdminRecoveryConfigError(\"DATABASE_URL is required.\");\n }\n if (!opts.secret) {\n throw new AdminRecoveryConfigError(\"BETTER_AUTH_SECRET is required.\");\n }\n\n const { db, client } = createDatabase({ url: opts.databaseUrl });\n const auth = createAuth({\n db,\n secret: opts.secret,\n baseURL: opts.baseURL ?? \"http://localhost:3002\",\n });\n\n return {\n async create({ email, password, name }) {\n try {\n // Shared scrypt-correct minting via the internal adapter (NOT public\n // sign-up, which `disableSignUp` now blocks). `CreatedAdmin` is the same\n // non-secret shape as `AdminSummary` (id/email/name/createdAt string).\n return await createAdminUser({ auth, email, name, password });\n } catch (err) {\n // Re-message a duplicate without leaking internals; never echo the\n // password. `createAdminUser` throws AdminAlreadyExistsError with a\n // message that already points at `reset`.\n if (err instanceof AdminAlreadyExistsError) {\n throw new Error(err.message);\n }\n if (err instanceof Error) {\n throw new Error(`Failed to create admin: ${err.message}`);\n }\n throw err;\n }\n },\n\n async reset({ email, password, revokeSessions }) {\n const ctx = await auth.$context;\n const found = await ctx.internalAdapter.findUserByEmail(email, {\n includeAccounts: true,\n });\n if (!found) {\n throw new Error(\n `No admin with email \"${email}\". ` +\n \"Use `hogsend studio admin create` to create one.\",\n );\n }\n\n // Hash via better-auth's server API — scrypt, identical to the running\n // app. NO raw SQL password write.\n const hashed = await ctx.password.hash(password);\n const hasCredential = found.accounts?.some(\n (a) => a.providerId === \"credential\",\n );\n if (hasCredential) {\n await ctx.internalAdapter.updatePassword(found.user.id, hashed);\n } else {\n await ctx.internalAdapter.createAccount({\n userId: found.user.id,\n providerId: \"credential\",\n accountId: found.user.id,\n password: hashed,\n });\n }\n\n // A recovery reset should not leave old (possibly leaked) sessions alive.\n if (revokeSessions) {\n await ctx.internalAdapter.deleteSessions(found.user.id);\n }\n\n return toSummary(found.user);\n },\n\n async list() {\n // Plain Drizzle read — only non-secret columns. The password/hash column\n // lives on `account` and is never selected here.\n const rows = await db\n .select({\n id: user.id,\n email: user.email,\n name: user.name,\n createdAt: user.createdAt,\n })\n .from(user);\n return rows.map((r) => toSummary(r));\n },\n\n async close() {\n await client.end();\n },\n };\n}\n","import { spawnSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { confirm } from \"@clack/prompts\";\nimport { color } from \"../lib/output.js\";\nimport { bail } from \"../lib/prompt.js\";\nimport {\n copySkill,\n installDir,\n listBundledSkills,\n writeSkillsStamp,\n} from \"../lib/skills.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\nconst usage = `hogsend upgrade [--cwd <dir>] [--pm <pnpm|npm|yarn|bun>] [options]\n\nUpgrade a scaffolded Hogsend app in one step:\n 1. bump every @hogsend/* dependency to latest (or --to <version>), then\n 2. refresh the vendored Claude Code skills in ./.claude/skills to match.\n\nRun this after a new engine release so your app AND the agent guidance move\ntogether. Skills are version-stamped so \\`hogsend doctor\\` can warn when they\nfall behind.\n\nOptions:\n --cwd <dir> Project root to upgrade (defaults to the current directory).\n --pm <manager> Package manager (default: detected from the lockfile, else pnpm).\n --to <version> Target version for @hogsend/* deps (default: latest).\n --deps-only Bump dependencies only; don't touch skills.\n --skills-only Refresh skills only; don't touch dependencies.\n --yes, -y Skip the confirmation prompt. Implied by --json.\n --json Run non-interactively and emit a single JSON result.\n -h, --help Show this help.`;\n\ntype Pm = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\nconst VALID_PMS: Pm[] = [\"pnpm\", \"npm\", \"yarn\", \"bun\"];\n\n/** Detect the package manager from a lockfile, defaulting to pnpm. */\nfunction detectPm(cwd: string): Pm {\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(cwd, \"bun.lockb\")) || existsSync(join(cwd, \"bun.lock\")))\n return \"bun\";\n if (existsSync(join(cwd, \"package-lock.json\"))) return \"npm\";\n return \"pnpm\";\n}\n\n/** The @hogsend/* deps declared in the app's package.json. */\nfunction hogsendDeps(cwd: string): string[] {\n const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf8\")) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n const all = { ...pkg.dependencies, ...pkg.devDependencies };\n return Object.keys(all)\n .filter((n) => n.startsWith(\"@hogsend/\"))\n .sort();\n}\n\n/** Build the install verb + args for the given pm (all but npm use `add`). */\nfunction addArgs(pm: Pm, specs: string[]): string[] {\n return [pm === \"npm\" ? \"install\" : \"add\", ...specs];\n}\n\ninterface StepResult {\n step: string;\n status: \"ok\" | \"skipped\" | \"failed\";\n detail: string;\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const { values } = parseArgs({\n args: ctx.argv,\n allowPositionals: true,\n options: {\n cwd: { type: \"string\" },\n pm: { type: \"string\" },\n to: { type: \"string\" },\n \"deps-only\": { type: \"boolean\", default: false },\n \"skills-only\": { type: \"boolean\", default: false },\n yes: { type: \"boolean\", short: \"y\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n if (values[\"deps-only\"] && values[\"skills-only\"]) {\n ctx.out.fail(\"--deps-only and --skills-only are mutually exclusive.\");\n }\n\n const cwd = values.cwd ?? process.cwd();\n if (!existsSync(join(cwd, \"package.json\"))) {\n ctx.out.fail(\n `no package.json in ${cwd} — run upgrade from a scaffolded Hogsend app (or pass --cwd).`,\n );\n }\n\n let pm: Pm;\n if (values.pm !== undefined) {\n if (!(VALID_PMS as string[]).includes(values.pm)) {\n ctx.out.fail(\n `invalid --pm \"${values.pm}\". Expected one of: ${VALID_PMS.join(\", \")}.`,\n );\n }\n pm = values.pm as Pm;\n } else {\n pm = detectPm(cwd);\n }\n\n const target = values.to ?? \"latest\";\n const doDeps = !values[\"skills-only\"];\n const doSkills = !values[\"deps-only\"];\n const deps = doDeps ? hogsendDeps(cwd) : [];\n\n if (doDeps && deps.length === 0) {\n ctx.out.fail(\n `no @hogsend/* dependencies found in ${join(cwd, \"package.json\")}.`,\n );\n }\n\n const skipConfirm = ctx.json || values.yes;\n if (!ctx.json) {\n ctx.out.intro(\n `${color.bgMagenta(color.black(\" hogsend \"))} ${color.dim(\"upgrade\")}`,\n );\n }\n if (ctx.out.interactive && !skipConfirm) {\n const plan = [\n doDeps\n ? `bump ${deps.length} @hogsend/* dep(s) to ${target} (${pm})`\n : null,\n doSkills ? \"refresh .claude/skills\" : null,\n ]\n .filter(Boolean)\n .join(\" + \");\n const proceed = bail(\n await confirm({ message: `Upgrade ${color.cyan(cwd)}: ${plan}?` }),\n );\n if (!proceed) {\n ctx.out.outro(color.dim(\"Nothing changed.\"));\n return;\n }\n }\n\n const results: StepResult[] = [];\n\n // 1. bump @hogsend/* deps via the package manager.\n if (doDeps) {\n const specs = deps.map((n) => `${n}@${target}`);\n const dep = await ctx.out.step(\n `Bumping @hogsend/* -> ${target} (${pm})`,\n async () =>\n spawnSync(pm, addArgs(pm, specs), {\n cwd,\n stdio: ctx.json ? \"ignore\" : \"inherit\",\n shell: process.platform === \"win32\",\n }),\n );\n results.push({\n step: \"deps\",\n status: dep.status === 0 ? \"ok\" : \"failed\",\n detail:\n dep.status === 0\n ? `${deps.join(\", \")} -> ${target}`\n : `${pm} exited with code ${dep.status ?? \"?\"}`,\n });\n } else {\n results.push({ step: \"deps\", status: \"skipped\", detail: \"--skills-only\" });\n }\n\n // 2. refresh vendored skills + re-stamp (only if deps didn't hard-fail).\n const depsFailed = results.some(\n (r) => r.step === \"deps\" && r.status === \"failed\",\n );\n if (!doSkills) {\n results.push({\n step: \"skills\",\n status: \"skipped\",\n detail: \"--deps-only\",\n });\n } else if (depsFailed) {\n results.push({\n step: \"skills\",\n status: \"skipped\",\n detail: \"skipped — dependency bump failed; fix it then re-run\",\n });\n } else {\n const bundled = listBundledSkills(cwd);\n const copied = bundled.map((s) => copySkill(s.name, cwd, true));\n writeSkillsStamp(\n cwd,\n bundled.map((s) => s.name),\n );\n results.push({\n step: \"skills\",\n status: \"ok\",\n detail: `refreshed ${copied.length} skill(s) -> ${installDir(cwd)}`,\n });\n }\n\n const failed = results.filter((r) => r.status === \"failed\");\n const ok = failed.length === 0;\n\n if (ctx.json) {\n ctx.out.json({ ok, cwd, pm, target, steps: results });\n if (!ok) process.exit(1);\n return;\n }\n\n ctx.out.table(\n results.map((r) => ({\n step: r.step,\n status:\n r.status === \"ok\"\n ? color.green(\"ok\")\n : r.status === \"skipped\"\n ? color.dim(\"skipped\")\n : color.red(\"failed\"),\n detail: r.detail,\n })),\n [\"step\", \"status\", \"detail\"],\n );\n\n if (!ok) {\n ctx.out.fail(\n `${failed.length} step(s) failed — see the table above. Fix and re-run hogsend upgrade.`,\n );\n }\n\n ctx.out.outro(\n `${color.green(\"Upgraded.\")} ${color.dim(\"Engine + agent skills are on the latest line.\")}`,\n );\n}\n\nexport const upgradeCommand: Command = {\n name: \"upgrade\",\n summary: \"Bump @hogsend/* deps to latest + refresh vendored skills\",\n usage,\n run,\n};\n","import { parseArgs } from \"node:util\";\nimport { isHttpError } from \"../lib/http.js\";\nimport { color } from \"../lib/output.js\";\nimport type { Command, CommandContext } from \"./types.js\";\n\n/**\n * The 13-event outbound catalog, VENDORED from the engine's\n * `WEBHOOK_EVENT_TYPES` (lib/webhook-signing.ts). The CLI cannot import the\n * engine, so the tuple is re-declared here and MUST be kept in sync BY HAND when\n * the engine catalog changes. The `webhook.test` sentinel is NOT a member.\n */\nconst WEBHOOK_EVENT_TYPES = [\n \"contact.created\",\n \"contact.updated\",\n \"contact.deleted\",\n \"contact.unsubscribed\",\n \"email.sent\",\n \"email.delivered\",\n \"email.opened\",\n \"email.clicked\",\n \"email.bounced\",\n \"email.complained\",\n \"journey.completed\",\n \"bucket.entered\",\n \"bucket.left\",\n] as const;\n\ntype OutboundEventType = (typeof WEBHOOK_EVENT_TYPES)[number];\n\nconst usage = `hogsend webhooks <subcommand> [options]\n\nManage outbound webhook endpoints — the Svix-style signed event stream Hogsend\nemits to your URLs. Wraps the admin routes (/v1/admin/webhooks), so this command\nREQUIRES an admin key (--admin-key / HOGSEND_ADMIN_KEY), not the data key.\n\nSubcommands:\n list List endpoints.\n get <id> Show one endpoint.\n create Register an endpoint (prints the secret ONCE).\n update <id> Patch an endpoint.\n delete <id> Hard-delete an endpoint (drops its deliveries).\n rotate-secret <id> Issue a new signing secret (prints it ONCE).\n test <id> Enqueue an out-of-band webhook.test delivery.\n\nlist options:\n --include-disabled Include disabled endpoints.\n --limit <n> Page size.\n --offset <n> Page offset.\n\ncreate options (--url required, plus at least one event):\n --url <url> Destination URL (required).\n --event <type> Subscribe to an event; repeatable.\n --all-events Subscribe to all 13 event types.\n --description <text> Human label.\n --disabled Create the endpoint disabled.\n\nupdate options (only the provided fields change):\n --url <url> New destination URL.\n --event <type> Replace the subscribed events (repeatable).\n --all-events Subscribe to all 13 event types.\n --description <text> New description.\n --disabled / --enabled Disable or enable the endpoint.\n\nEvent types:\n ${WEBHOOK_EVENT_TYPES.join(\", \")}\n\nGlobal options (handled by the router): --url, --admin-key, --data-key, --json,\n-h/--help.\n\nExamples:\n hogsend webhooks create --url https://x.com/hook --event contact.created --event email.sent\n hogsend webhooks create --url https://x.com/hook --all-events --json\n hogsend webhooks list --include-disabled\n hogsend webhooks rotate-secret we_123\n hogsend webhooks test we_123`;\n\nconst badge = `${color.bgMagenta(color.black(\" hogsend \"))} webhooks`;\n\ninterface WebhookEndpoint {\n id: string;\n url: string;\n description: string | null;\n eventTypes: OutboundEventType[];\n // null for keyed destinations (kind !== \"webhook\"), which carry no signing\n // secret — their credentials live in the endpoint config, not a whsec_.\n secretPrefix: string | null;\n status: \"enabled\" | \"disabled\";\n organizationId: string | null;\n lastDeliveryAt: string | null;\n createdAt: string;\n updatedAt: string;\n}\n\ntype CreatedWebhookEndpoint = WebhookEndpoint & { secret: string };\n\ninterface ListResponse {\n endpoints: WebhookEndpoint[];\n total: number;\n limit: number;\n offset: number;\n}\n\ninterface RotateResponse {\n id: string;\n secret: string;\n secretPrefix: string;\n}\n\n/** Run an admin HTTP call, mapping HttpError to a clean ctx.out.fail message. */\nasync function fetchOrFail<T>(\n ctx: CommandContext,\n label: string,\n fn: () => Promise<T>,\n): Promise<T> {\n try {\n return await ctx.out.step(label, fn);\n } catch (err) {\n if (isHttpError(err)) {\n if (err.status === 404) {\n ctx.out.fail(err.message || \"webhook endpoint not found\");\n }\n ctx.out.fail(err.message);\n }\n throw err;\n }\n}\n\n/**\n * Resolve the subscribed event set from `--all-events` and/or repeatable\n * `--event <type>` flags, validating each against the vendored catalog. Returns\n * undefined when neither was passed (so `update` can leave events unchanged).\n */\nfunction resolveEvents(\n ctx: CommandContext,\n allEvents: boolean | undefined,\n events: string[] | undefined,\n): OutboundEventType[] | undefined {\n if (allEvents) {\n return [...WEBHOOK_EVENT_TYPES];\n }\n if (!events || events.length === 0) {\n return undefined;\n }\n const valid = new Set<string>(WEBHOOK_EVENT_TYPES);\n const out: OutboundEventType[] = [];\n for (const ev of events) {\n if (!valid.has(ev)) {\n ctx.out.fail(\n `unknown event type \"${ev}\" — expected one of: ${WEBHOOK_EVENT_TYPES.join(\", \")}`,\n );\n }\n if (!out.includes(ev as OutboundEventType)) {\n out.push(ev as OutboundEventType);\n }\n }\n return out;\n}\n\n/** Print a created/rotated secret once, with a loud yellow warning. */\nfunction printSecretOnce(ctx: CommandContext, secret: string): void {\n ctx.out.note(\n `${color.yellow(\"Store this signing secret now — it is shown only once and cannot be recovered.\")}\\n\\n${color.bold(secret)}`,\n color.yellow(\"Signing secret\"),\n );\n}\n\nasync function runList(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n \"include-disabled\": { type: \"boolean\", default: false },\n limit: { type: \"string\" },\n offset: { type: \"string\" },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const query = {\n includeDisabled: values[\"include-disabled\"] ? \"true\" : undefined,\n limit: values.limit,\n offset: values.offset,\n };\n\n if (!ctx.json) ctx.out.intro(`${badge} list`);\n\n const res = await fetchOrFail<ListResponse>(ctx, \"Fetching webhooks\", () =>\n ctx.http.get<ListResponse>(\"/v1/admin/webhooks\", query),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.table(\n res.endpoints.map((ep) => ({\n id: ep.id,\n url: ep.url,\n status:\n ep.status === \"enabled\"\n ? color.green(ep.status)\n : color.yellow(ep.status),\n events: ep.eventTypes.length,\n lastDeliveryAt: ep.lastDeliveryAt ?? color.dim(\"(never)\"),\n })),\n [\"id\", \"url\", \"status\", \"events\", \"lastDeliveryAt\"],\n );\n ctx.out.outro(\n `${res.endpoints.length} of ${res.total} endpoint(s) — offset ${res.offset}, limit ${res.limit}`,\n );\n}\n\nfunction renderEndpoint(\n ctx: CommandContext,\n ep: WebhookEndpoint,\n title: string,\n): void {\n ctx.out.kv(\n {\n id: ep.id,\n url: ep.url,\n description: ep.description ?? color.dim(\"(none)\"),\n status:\n ep.status === \"enabled\"\n ? color.green(ep.status)\n : color.yellow(ep.status),\n eventTypes: ep.eventTypes,\n secretPrefix: ep.secretPrefix ?? color.dim(\"(none — keyed destination)\"),\n lastDeliveryAt: ep.lastDeliveryAt ?? color.dim(\"(never)\"),\n createdAt: ep.createdAt,\n updatedAt: ep.updatedAt,\n },\n title,\n );\n}\n\nasync function runGet(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks get requires an endpoint id, e.g. hogsend webhooks get we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} get`);\n\n const res = await fetchOrFail<WebhookEndpoint>(ctx, \"Fetching webhook\", () =>\n ctx.http.get<WebhookEndpoint>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n renderEndpoint(ctx, res, \"Endpoint\");\n ctx.out.outro(`${res.url} → ${res.status}`);\n}\n\nasync function runCreate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n url: { type: \"string\" },\n event: { type: \"string\", multiple: true },\n \"all-events\": { type: \"boolean\", default: false },\n description: { type: \"string\" },\n disabled: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const url = values.url;\n if (!url) {\n ctx.out.fail(\n \"webhooks create requires --url, e.g. hogsend webhooks create --url https://x.com/hook --all-events\",\n );\n }\n\n const eventTypes = resolveEvents(ctx, values[\"all-events\"], values.event);\n if (!eventTypes || eventTypes.length === 0) {\n ctx.out.fail(\n \"webhooks create requires at least one --event <type> (or --all-events)\",\n );\n }\n\n const body: {\n url: string;\n eventTypes: OutboundEventType[];\n description?: string;\n disabled?: boolean;\n } = { url, eventTypes };\n if (values.description !== undefined) body.description = values.description;\n if (values.disabled) body.disabled = true;\n\n if (!ctx.json) ctx.out.intro(`${badge} create`);\n\n const res = await fetchOrFail<CreatedWebhookEndpoint>(\n ctx,\n \"Creating webhook\",\n () => ctx.http.post<CreatedWebhookEndpoint>(\"/v1/admin/webhooks\", body),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n const { secret, ...endpoint } = res;\n renderEndpoint(ctx, endpoint, \"Endpoint created\");\n printSecretOnce(ctx, secret);\n ctx.out.outro(`${color.green(\"Created\")} ${res.id} → ${res.url}`);\n}\n\nasync function runUpdate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: {\n url: { type: \"string\" },\n event: { type: \"string\", multiple: true },\n \"all-events\": { type: \"boolean\", default: false },\n description: { type: \"string\" },\n disabled: { type: \"boolean\", default: false },\n enabled: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks update requires an endpoint id, e.g. hogsend webhooks update we_123 --enabled\",\n );\n }\n\n if (values.disabled && values.enabled) {\n ctx.out.fail(\"webhooks update: pass at most one of --disabled / --enabled\");\n }\n\n const eventTypes = resolveEvents(ctx, values[\"all-events\"], values.event);\n\n const body: {\n url?: string;\n eventTypes?: OutboundEventType[];\n description?: string;\n disabled?: boolean;\n } = {};\n if (values.url !== undefined) body.url = values.url;\n if (eventTypes !== undefined) body.eventTypes = eventTypes;\n if (values.description !== undefined) body.description = values.description;\n if (values.disabled) body.disabled = true;\n if (values.enabled) body.disabled = false;\n\n if (Object.keys(body).length === 0) {\n ctx.out.fail(\n \"webhooks update: nothing to change — pass --url / --event / --description / --disabled / --enabled\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} update`);\n\n const res = await fetchOrFail<WebhookEndpoint>(ctx, \"Updating webhook\", () =>\n ctx.http.patch<WebhookEndpoint>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n body,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n renderEndpoint(ctx, res, \"Endpoint updated\");\n ctx.out.outro(`${color.green(\"Updated\")} ${res.id} → ${res.status}`);\n}\n\nasync function runDelete(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks delete requires an endpoint id, e.g. hogsend webhooks delete we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} delete`);\n\n const res = await fetchOrFail<{ deleted: boolean }>(\n ctx,\n \"Deleting webhook\",\n () =>\n ctx.http.del<{ deleted: boolean }>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}`,\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.outro(`${color.green(\"Deleted\")} ${id}`);\n}\n\nasync function runRotate(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks rotate-secret requires an endpoint id, e.g. hogsend webhooks rotate-secret we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} rotate-secret`);\n\n const res = await fetchOrFail<RotateResponse>(\n ctx,\n \"Rotating signing secret\",\n () =>\n ctx.http.post<RotateResponse>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}/rotate-secret`,\n {},\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.kv({ id: res.id, secretPrefix: res.secretPrefix }, \"Secret rotated\");\n printSecretOnce(ctx, res.secret);\n ctx.out.outro(\n `${color.green(\"Rotated\")} — the old secret is now invalid. Update every subscriber.`,\n );\n}\n\nasync function runTest(ctx: CommandContext, argv: string[]): Promise<void> {\n const { values, positionals } = parseArgs({\n args: argv,\n allowPositionals: true,\n options: { help: { type: \"boolean\", short: \"h\", default: false } },\n });\n\n if (values.help) {\n ctx.out.log(usage);\n return;\n }\n\n const id = positionals[0];\n if (!id) {\n ctx.out.fail(\n \"webhooks test requires an endpoint id, e.g. hogsend webhooks test we_123\",\n );\n }\n\n if (!ctx.json) ctx.out.intro(`${badge} test`);\n\n const res = await fetchOrFail<{\n enqueued: boolean;\n eventType: \"webhook.test\";\n }>(ctx, \"Enqueuing test delivery\", () =>\n ctx.http.post<{ enqueued: boolean; eventType: \"webhook.test\" }>(\n `/v1/admin/webhooks/${encodeURIComponent(id)}/test`,\n {},\n ),\n );\n\n if (ctx.json) {\n ctx.out.json(res);\n return;\n }\n\n ctx.out.outro(\n `${color.green(\"Enqueued\")} a ${color.cyan(res.eventType)} delivery to ${id}.`,\n );\n}\n\nasync function run(ctx: CommandContext): Promise<void> {\n const sub = ctx.argv[0];\n\n switch (sub) {\n case \"list\":\n return runList(ctx, ctx.argv.slice(1));\n case \"get\":\n return runGet(ctx, ctx.argv.slice(1));\n case \"create\":\n return runCreate(ctx, ctx.argv.slice(1));\n case \"update\":\n return runUpdate(ctx, ctx.argv.slice(1));\n case \"delete\":\n return runDelete(ctx, ctx.argv.slice(1));\n case \"rotate-secret\":\n return runRotate(ctx, ctx.argv.slice(1));\n case \"test\":\n return runTest(ctx, ctx.argv.slice(1));\n case undefined:\n ctx.out.fail(\n \"webhooks requires a subcommand: list | get | create | update | delete | rotate-secret | test (see hogsend webhooks --help)\",\n );\n break;\n default:\n ctx.out.fail(\n `unknown webhooks subcommand \"${sub}\" — expected one of list | get | create | update | delete | rotate-secret | test`,\n );\n }\n}\n\nexport const webhooksCommand: Command = {\n name: \"webhooks\",\n summary: \"Manage outbound webhook endpoints (create, rotate, test)\",\n usage,\n run,\n};\n","import { campaignsCommand } from \"./campaigns.js\";\nimport { contactsCommand } from \"./contacts.js\";\nimport { doctorCommand } from \"./doctor.js\";\nimport { ejectCommand } from \"./eject.js\";\nimport { emailsCommand } from \"./emails.js\";\nimport { eventsCommand } from \"./events.js\";\nimport { journeysCommand } from \"./journeys.js\";\nimport { patchCommand } from \"./patch.js\";\nimport { setupCommand } from \"./setup.js\";\nimport { skillsCommand } from \"./skills.js\";\nimport { statsCommand } from \"./stats.js\";\nimport { studioCommand } from \"./studio.js\";\nimport type { Command } from \"./types.js\";\nimport { upgradeCommand } from \"./upgrade.js\";\nimport { webhooksCommand } from \"./webhooks.js\";\n\n/**\n * The command registry. The router (src/bin.ts) matches the leading argv token\n * against each `command.name` and dispatches to `run()`.\n *\n * Order here is the order shown in root help. Data commands (agent-native,\n * wrapping the engine's /v1/admin/* routes) come first, then the local\n * scaffolding/maintenance commands (setup, skills, eject, patch).\n */\nexport const commands: Command[] = [\n doctorCommand,\n journeysCommand,\n contactsCommand,\n statsCommand,\n eventsCommand,\n emailsCommand,\n campaignsCommand,\n webhooksCommand,\n studioCommand,\n setupCommand,\n skillsCommand,\n upgradeCommand,\n ejectCommand,\n patchCommand,\n];\n\nexport type { Command, CommandContext } from \"./types.js\";\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\n/** Resolved target for the admin HTTP client. */\nexport interface ResolvedConfig {\n /** Base URL of the target instance, no trailing slash. */\n baseUrl: string;\n /** Admin bearer token, if resolvable. `doctor`/health works without it. */\n adminKey: string | undefined;\n /**\n * Data-plane bearer token (an `ingest`-scoped key), if resolvable. Used by the\n * write commands (`contacts upsert`, `events send`, `emails send`). Falls back\n * to the admin key since `full-admin` implies `ingest`.\n */\n dataKey: string | undefined;\n}\n\n/** Global flags parsed off the front of any command's argv. */\nexport interface GlobalFlags {\n url?: string;\n adminKey?: string;\n dataKey?: string;\n json: boolean;\n help: boolean;\n /** The remaining args after global flags are stripped. */\n rest: string[];\n}\n\nconst DEFAULT_BASE_URL = \"http://localhost:3002\";\n\n/**\n * Parse the global flags that every command honours (`--url`, `--admin-key`,\n * `--json`, `-h`/`--help`) off an argv slice, returning the parsed values plus\n * the leftover `rest` (positionals + unknown flags) for the command to handle.\n *\n * `strict: false` so command-specific flags (e.g. `--enabled`, `--limit`) pass\n * through untouched in `rest` rather than throwing here.\n */\nexport function parseGlobalFlags(argv: string[]): GlobalFlags {\n const { values, tokens } = parseArgs({\n args: argv,\n allowPositionals: true,\n strict: false,\n tokens: true,\n options: {\n url: { type: \"string\" },\n \"admin-key\": { type: \"string\" },\n \"data-key\": { type: \"string\" },\n json: { type: \"boolean\", default: false },\n help: { type: \"boolean\", short: \"h\", default: false },\n },\n });\n\n // Rebuild `rest` from the token stream, dropping only the global flags we\n // own (and their values). Everything else — positionals and unknown option\n // tokens — is preserved verbatim for the command's own parser.\n const owned = new Set([\"url\", \"admin-key\", \"data-key\", \"json\", \"help\", \"h\"]);\n const rest: string[] = [];\n for (const token of tokens) {\n if (token.kind === \"positional\") {\n rest.push(token.value);\n } else if (token.kind === \"option\") {\n if (owned.has(token.name)) continue;\n rest.push(token.rawName);\n if (token.value !== undefined && !token.inlineValue) {\n rest.push(token.value);\n } else if (token.inlineValue && token.value !== undefined) {\n // already captured in rawName? no — rebuild as --name=value\n rest[rest.length - 1] = `${token.rawName}=${token.value}`;\n }\n }\n }\n\n return {\n url: typeof values.url === \"string\" ? values.url : undefined,\n adminKey:\n typeof values[\"admin-key\"] === \"string\" ? values[\"admin-key\"] : undefined,\n dataKey:\n typeof values[\"data-key\"] === \"string\" ? values[\"data-key\"] : undefined,\n json: values.json === true,\n help: values.help === true,\n rest,\n };\n}\n\n/**\n * Manually parse a `.env` file into a flat record. No dotenv dependency: a\n * small, forgiving parser (KEY=VALUE per line, `#` comments, optional quotes,\n * `export ` prefix tolerated). Never throws — a missing/unreadable file yields\n * an empty record so config resolution stays robust in any cwd.\n */\nexport function loadDotEnv(\n cwd: string = process.cwd(),\n): Record<string, string> {\n const out: Record<string, string> = {};\n const file = join(cwd, \".env\");\n if (!existsSync(file)) return out;\n let raw: string;\n try {\n raw = readFileSync(file, \"utf8\");\n } catch {\n return out;\n }\n for (const rawLine of raw.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line === \"\" || line.startsWith(\"#\")) continue;\n const withoutExport = line.startsWith(\"export \")\n ? line.slice(\"export \".length)\n : line;\n const eq = withoutExport.indexOf(\"=\");\n if (eq === -1) continue;\n const key = withoutExport.slice(0, eq).trim();\n if (key === \"\") continue;\n let value = withoutExport.slice(eq + 1).trim();\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1);\n }\n out[key] = value;\n }\n return out;\n}\n\n/**\n * Resolve the target config with precedence flags > process.env > .env, falling\n * back to the local-dev default base URL.\n *\n * baseUrl: --url > HOGSEND_API_URL (env) > HOGSEND_API_URL (.env) > localhost:3002\n * adminKey: --admin-key > HOGSEND_ADMIN_KEY|ADMIN_API_KEY (env) > (.env equiv)\n * dataKey: --data-key > HOGSEND_DATA_KEY > HOGSEND_API_KEY (env then .env)\n */\nexport function resolveConfig(\n flags: GlobalFlags,\n cwd: string = process.cwd(),\n): ResolvedConfig {\n const dotenv = loadDotEnv(cwd);\n\n const baseUrlRaw =\n flags.url ??\n process.env.HOGSEND_API_URL ??\n dotenv.HOGSEND_API_URL ??\n DEFAULT_BASE_URL;\n\n const adminKey =\n flags.adminKey ??\n process.env.HOGSEND_ADMIN_KEY ??\n process.env.ADMIN_API_KEY ??\n dotenv.HOGSEND_ADMIN_KEY ??\n dotenv.ADMIN_API_KEY;\n\n // Data-plane (ingest-scoped) key. Precedence is independent of adminKey:\n // explicit data key first, then a dedicated env/.env var, then the generic\n // HOGSEND_API_KEY (which a fresh scaffold mints as an ingest key).\n const dataKey =\n flags.dataKey ??\n process.env.HOGSEND_DATA_KEY ??\n process.env.HOGSEND_API_KEY ??\n dotenv.HOGSEND_DATA_KEY ??\n dotenv.HOGSEND_API_KEY;\n\n return {\n baseUrl: baseUrlRaw.replace(/\\/+$/, \"\"),\n adminKey: adminKey && adminKey.length > 0 ? adminKey : undefined,\n dataKey: dataKey && dataKey.length > 0 ? dataKey : undefined,\n };\n}\n"],"mappings":"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","names":["createRequire","text","text","sep","eq","values","parseArgs","usage","badge","parseProps","eq","coerceValue","values","parseArgs","run","parseArgs","require","line","exists","b","parse","usage","run","values","parseArgs","verdict","badge","existsSync","createRequire","join","sep","parseArgs","existsSync","join","usage","join","existsSync","require","createRequire","sep","run","values","parseArgs","parseArgs","usage","badge","parseProps","eq","coerceValue","statusColor","runSend","values","parseArgs","run","parseArgs","usage","run","runSend","values","parseArgs","parseProps","parseLists","json","eq","coerceValue","parseArgs","usage","badge","statusColor","runList","values","parseArgs","runGet","run","parseArgs","usage","run","values","parseArgs","spawnSync","existsSync","readFileSync","writeFileSync","join","parseArgs","cancel","usage","join","existsSync","readFileSync","writeFileSync","json","spawnSync","run","values","parseArgs","existsSync","join","parseArgs","usage","runList","values","parseArgs","existsSync","join","run","parseArgs","usage","run","values","parseArgs","existsSync","readFileSync","statSync","join","sep","fileURLToPath","parseArgs","parseArgs","text","resolve","b","types","b","types","user","inferType","arraySerializer","arrayParser","x","crypto","index","user","parsers","backoff","connection","query","cancel","resolve","error","types","options","index","length","crypto","x","b","chunk","rows","buffer","timer","noop","postgres","connection","sql","slot","stream","state","x","b","parsers","char","Stream","sql","resolve","size","b","sql","handler","json","cancel","options","query","name","exists","result","resolve","queries","connection","fn","timer","a","user","char","value","startFrom","size","ref","actions","values","sql","otel","rawTracer","param","sql","join","placeholder","name","SQL","values","name","result","index","values","b","b","b","b","b","b","b","b","b","b","buffer","b","b","b","b","b","b","b","b","b","name","values","relations","session","index","table","select","values","sql","joinOn","field","session","join","select","select","session","session","values","select","session","session","values","join","tableName","session","sql","session","select","sql","b","sql","session","session","session","connection","instance","drizzle","organization","values","parseArgs","text","runList","usage","fileURLToPath","existsSync","join","readFileSync","run","values","parseArgs","index","sep","statSync","spawnSync","existsSync","readFileSync","join","parseArgs","confirm","usage","existsSync","join","readFileSync","run","values","parseArgs","confirm","spawnSync","parseArgs","usage","badge","fetchOrFail","runList","values","parseArgs","runGet","runCreate","run","existsSync","readFileSync","join","parseArgs","values","line","eq","version","require","createRequire","token"]}