@parsrun/core 0.1.13 → 0.1.15
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/env.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.js.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/transports/index.js.map +1 -1
- package/package.json +1 -1
package/dist/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime.ts","../src/env.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process.versions.node}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/env.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process?.versions?.node ?? \"unknown\"}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -57,7 +57,7 @@ function isServer() {
|
|
|
57
57
|
function getRuntimeVersion() {
|
|
58
58
|
switch (runtime) {
|
|
59
59
|
case "node":
|
|
60
|
-
return `Node.js ${process
|
|
60
|
+
return `Node.js ${process?.versions?.node ?? "unknown"}`;
|
|
61
61
|
case "bun":
|
|
62
62
|
return `Bun ${globalThis.Bun.version}`;
|
|
63
63
|
case "deno":
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime.ts","../src/env.ts","../src/transports/console.ts","../src/logger.ts","../src/decimal.ts","../src/types.ts","../src/errors.ts","../src/error-codes.ts","../src/transports/axiom.ts","../src/transports/sentry.ts","../src/transports/logtape.ts","../src/index.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process.versions.node}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Logger\n * Lightweight, edge-compatible structured logging\n * Can be used standalone or as abstraction over pino/winston in Node.js\n */\n\nimport { getEnv } from \"./env.js\";\nimport { ConsoleTransport } from \"./transports/console.js\";\nimport type { LogTransport } from \"./transports/types.js\";\n\n// Re-export ConsoleTransport for backward compatibility\nexport { ConsoleTransport, type ConsoleTransportOptions } from \"./transports/console.js\";\n\n// Re-export transport types\nexport type { LogTransport } from \"./transports/types.js\";\n\n/**\n * Log levels\n */\nexport const LogLevel = {\n TRACE: 10,\n DEBUG: 20,\n INFO: 30,\n WARN: 40,\n ERROR: 50,\n FATAL: 60,\n SILENT: 100,\n} as const;\n\nexport type LogLevelName = keyof typeof LogLevel;\nexport type LogLevelValue = (typeof LogLevel)[LogLevelName];\n\n/**\n * Error info structure\n */\nexport interface ErrorInfo {\n name: string;\n message: string;\n stack: string | undefined;\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n level: LogLevelName;\n levelValue: LogLevelValue;\n message: string;\n timestamp: string;\n context: Record<string, unknown> | undefined;\n error: ErrorInfo | undefined;\n}\n\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Minimum log level */\n level: LogLevelName | undefined;\n /** Logger name/module */\n name: string | undefined;\n /** Base context added to all logs */\n context: Record<string, unknown> | undefined;\n /** Custom transports */\n transports: LogTransport[] | undefined;\n /** Pretty print in development */\n pretty: boolean | undefined;\n /** Redact sensitive fields */\n redact: string[] | undefined;\n /** Timestamp format */\n timestamp: boolean | (() => string) | undefined;\n}\n\n\n/**\n * Redact sensitive fields from context\n */\nfunction redactFields(\n obj: Record<string, unknown>,\n fields: string[]\n): Record<string, unknown> {\n const result = { ...obj };\n for (const field of fields) {\n if (field in result) {\n result[field] = \"[REDACTED]\";\n }\n // Handle nested fields like \"user.password\"\n const parts = field.split(\".\");\n if (parts.length > 1) {\n let current: Record<string, unknown> | undefined = result;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part && current && typeof current === \"object\" && part in current) {\n const val = current[part];\n if (val && typeof val === \"object\") {\n current = val as Record<string, unknown>;\n } else {\n current = undefined;\n break;\n }\n } else {\n current = undefined;\n break;\n }\n }\n const lastPart = parts[parts.length - 1];\n if (lastPart && current && typeof current === \"object\" && lastPart in current) {\n current[lastPart] = \"[REDACTED]\";\n }\n }\n }\n return result;\n}\n\n/**\n * Default redact fields\n */\nconst DEFAULT_REDACT_FIELDS = [\n \"password\",\n \"secret\",\n \"token\",\n \"accessToken\",\n \"refreshToken\",\n \"apiKey\",\n \"authorization\",\n \"cookie\",\n \"creditCard\",\n \"ssn\",\n];\n\n/**\n * Logger class\n */\nexport class Logger {\n private level: LogLevelValue;\n private name: string | undefined;\n private context: Record<string, unknown>;\n private transports: LogTransport[];\n private redactFields: string[];\n private timestampFn: () => string;\n\n constructor(config: Partial<LoggerConfig> = {}) {\n const levelName = config.level ?? (getEnv(\"LOG_LEVEL\") as LogLevelName | undefined) ?? \"INFO\";\n this.level = LogLevel[levelName] ?? LogLevel.INFO;\n this.name = config.name;\n this.context = config.context ?? {};\n this.transports = config.transports ?? [\n new ConsoleTransport(\n config.pretty !== undefined ? { pretty: config.pretty } : {}\n ),\n ];\n this.redactFields = [...DEFAULT_REDACT_FIELDS, ...(config.redact ?? [])];\n\n if (config.timestamp === false) {\n this.timestampFn = () => \"\";\n } else if (typeof config.timestamp === \"function\") {\n this.timestampFn = config.timestamp;\n } else {\n this.timestampFn = () => new Date().toISOString();\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(context: Record<string, unknown>): Logger {\n const levelEntry = Object.entries(LogLevel).find(([_, v]) => v === this.level);\n const levelName = levelEntry ? (levelEntry[0] as LogLevelName) : \"INFO\";\n\n const child = new Logger({\n level: levelName,\n name: this.name,\n context: { ...this.context, ...context },\n transports: this.transports,\n redact: this.redactFields,\n });\n return child;\n }\n\n /**\n * Log a message\n */\n private log(\n level: LogLevelName,\n message: string,\n context?: Record<string, unknown>,\n error?: Error\n ): void {\n const levelValue = LogLevel[level];\n if (levelValue < this.level) return;\n\n let finalContext = { ...this.context };\n if (this.name) {\n finalContext[\"module\"] = this.name;\n }\n if (context) {\n finalContext = { ...finalContext, ...context };\n }\n\n // Redact sensitive fields\n finalContext = redactFields(finalContext, this.redactFields);\n\n const entry: LogEntry = {\n level,\n levelValue,\n message,\n timestamp: this.timestampFn(),\n context: Object.keys(finalContext).length > 0 ? finalContext : undefined,\n error: error\n ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n : undefined,\n };\n\n for (const transport of this.transports) {\n transport.log(entry);\n }\n }\n\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(\"TRACE\", message, context);\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log(\"INFO\", message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"ERROR\", message, ctx, err);\n }\n\n fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"FATAL\", message, ctx, err);\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config?: Partial<LoggerConfig>): Logger {\n return new Logger(config);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger();\n\n/**\n * Utility: Log error with proper formatting\n */\nexport function logError(\n log: Logger,\n error: unknown,\n message: string,\n context?: Record<string, unknown>\n): void {\n if (error instanceof Error) {\n log.error(message, error, context);\n } else {\n log.error(message, { error: String(error), ...context });\n }\n}\n\n/**\n * Utility: Measure execution time\n */\nexport async function measureTime<T>(\n log: Logger,\n operation: string,\n fn: () => Promise<T>\n): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n const duration = Date.now() - start;\n log.info(`${operation} completed`, { operation, durationMs: duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n logError(log, error, `${operation} failed`, { operation, durationMs: duration });\n throw error;\n }\n}\n\n/**\n * Utility: Create request logger middleware context\n */\nexport function createRequestLogger(\n baseLogger: Logger,\n request: {\n method?: string;\n url?: string;\n requestId?: string;\n userId?: string;\n tenantId?: string;\n }\n): Logger {\n const pathname = request.url ? new URL(request.url).pathname : undefined;\n return baseLogger.child({\n requestId: request.requestId,\n method: request.method,\n path: pathname,\n userId: request.userId,\n tenantId: request.tenantId,\n });\n}\n","/**\n * @parsrun/core - Decimal Utilities\n * Precise decimal calculations for financial and quantity operations\n * Edge-compatible - no external dependencies\n */\n\n/**\n * Internal precision for calculations\n */\nconst PRECISION = 20;\n\n/**\n * Decimal class for precise arithmetic\n * Uses string-based arithmetic to avoid floating point issues\n */\nexport class Decimal {\n private value: string;\n\n constructor(value: number | string | Decimal) {\n if (value instanceof Decimal) {\n this.value = value.value;\n } else if (typeof value === \"number\") {\n this.value = this.normalizeNumber(value);\n } else {\n this.value = this.normalizeString(value);\n }\n }\n\n private normalizeNumber(n: number): string {\n if (!isFinite(n)) {\n throw new Error(`Invalid number: ${n}`);\n }\n return n.toFixed(PRECISION).replace(/\\.?0+$/, \"\") || \"0\";\n }\n\n private normalizeString(s: string): string {\n const trimmed = s.trim();\n if (!/^-?\\d*\\.?\\d+$/.test(trimmed)) {\n throw new Error(`Invalid decimal string: ${s}`);\n }\n return trimmed.replace(/^(-?)0+(?=\\d)/, \"$1\").replace(/\\.?0+$/, \"\") || \"0\";\n }\n\n /**\n * Add two decimals\n */\n add(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a + b);\n }\n\n /**\n * Subtract\n */\n sub(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a - b);\n }\n\n /**\n * Multiply\n */\n mul(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a * b);\n }\n\n /**\n * Divide\n */\n div(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n if (b === 0) {\n throw new Error(\"Division by zero\");\n }\n return new Decimal(a / b);\n }\n\n /**\n * Modulo\n */\n mod(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a % b);\n }\n\n /**\n * Power\n */\n pow(exp: number): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(Math.pow(a, exp));\n }\n\n /**\n * Square root\n */\n sqrt(): Decimal {\n const a = parseFloat(this.value);\n if (a < 0) {\n throw new Error(\"Square root of negative number\");\n }\n return new Decimal(Math.sqrt(a));\n }\n\n /**\n * Absolute value\n */\n abs(): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(Math.abs(a));\n }\n\n /**\n * Negate\n */\n neg(): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(-a);\n }\n\n /**\n * Round to decimal places\n */\n round(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.round(a * factor) / factor);\n }\n\n /**\n * Floor to decimal places\n */\n floor(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.floor(a * factor) / factor);\n }\n\n /**\n * Ceiling to decimal places\n */\n ceil(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.ceil(a * factor) / factor);\n }\n\n /**\n * Compare: returns -1, 0, or 1\n */\n cmp(other: number | string | Decimal): -1 | 0 | 1 {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n\n /**\n * Equality check\n */\n eq(other: number | string | Decimal): boolean {\n return this.cmp(other) === 0;\n }\n\n /**\n * Greater than\n */\n gt(other: number | string | Decimal): boolean {\n return this.cmp(other) === 1;\n }\n\n /**\n * Greater than or equal\n */\n gte(other: number | string | Decimal): boolean {\n return this.cmp(other) >= 0;\n }\n\n /**\n * Less than\n */\n lt(other: number | string | Decimal): boolean {\n return this.cmp(other) === -1;\n }\n\n /**\n * Less than or equal\n */\n lte(other: number | string | Decimal): boolean {\n return this.cmp(other) <= 0;\n }\n\n /**\n * Check if zero\n */\n isZero(): boolean {\n return parseFloat(this.value) === 0;\n }\n\n /**\n * Check if positive\n */\n isPositive(): boolean {\n return parseFloat(this.value) > 0;\n }\n\n /**\n * Check if negative\n */\n isNegative(): boolean {\n return parseFloat(this.value) < 0;\n }\n\n /**\n * Convert to number\n */\n toNumber(): number {\n return parseFloat(this.value);\n }\n\n /**\n * Convert to string\n */\n toString(): string {\n return this.value;\n }\n\n /**\n * Format with fixed decimal places\n */\n toFixed(decimals: number = 2): string {\n return parseFloat(this.value).toFixed(decimals);\n }\n\n /**\n * Convert to JSON (string representation)\n */\n toJSON(): string {\n return this.value;\n }\n\n /**\n * Static: Create from value\n */\n static from(value: number | string | Decimal): Decimal {\n return new Decimal(value);\n }\n\n /**\n * Static: Sum array of values\n */\n static sum(values: (number | string | Decimal)[]): Decimal {\n return values.reduce<Decimal>(\n (acc, val) => acc.add(val),\n new Decimal(0)\n );\n }\n\n /**\n * Static: Average of array\n */\n static avg(values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) return new Decimal(0);\n return Decimal.sum(values).div(values.length);\n }\n\n /**\n * Static: Min of array\n */\n static min(...values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) throw new Error(\"No values provided\");\n return values.reduce<Decimal>((min, val) => {\n const d = new Decimal(val);\n return d.lt(min) ? d : min;\n }, new Decimal(values[0]!));\n }\n\n /**\n * Static: Max of array\n */\n static max(...values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) throw new Error(\"No values provided\");\n return values.reduce<Decimal>((max, val) => {\n const d = new Decimal(val);\n return d.gt(max) ? d : max;\n }, new Decimal(values[0]!));\n }\n}\n\n/**\n * Decimal utilities for database operations\n */\nexport const DecimalUtils = {\n /**\n * Convert number to database decimal string\n */\n toDecimalString(value: number | string | null | undefined): string | null {\n if (value === null || value === undefined) return null;\n return new Decimal(value).toString();\n },\n\n /**\n * Convert database decimal string to number\n */\n fromDecimalString(value: string | null | undefined): number {\n if (!value) return 0;\n return new Decimal(value).toNumber();\n },\n\n /**\n * Perform precise decimal multiplication\n */\n multiply(a: number | string, b: number | string): string {\n return new Decimal(a).mul(b).toString();\n },\n\n /**\n * Perform precise decimal addition\n */\n add(a: number | string, b: number | string): string {\n return new Decimal(a).add(b).toString();\n },\n\n /**\n * Perform precise decimal subtraction\n */\n subtract(a: number | string, b: number | string): string {\n return new Decimal(a).sub(b).toString();\n },\n\n /**\n * Perform precise decimal division\n */\n divide(a: number | string, b: number | string): string {\n return new Decimal(a).div(b).toString();\n },\n\n /**\n * Format decimal for display\n */\n format(value: string | number, decimalPlaces: number = 2): string {\n return new Decimal(value).toFixed(decimalPlaces);\n },\n\n /**\n * Format as currency\n */\n formatCurrency(\n value: string | number,\n options: {\n currency?: string;\n locale?: string;\n decimals?: number;\n } = {}\n ): string {\n const { currency = \"USD\", locale = \"en-US\", decimals = 2 } = options;\n const num = new Decimal(value).toNumber();\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(num);\n },\n\n /**\n * Convert object with decimal fields for database insert/update\n */\n prepareForDatabase<T extends Record<string, unknown>>(\n data: T,\n decimalFields: string[]\n ): T {\n const result = { ...data };\n for (const field of decimalFields) {\n if (field in result && result[field] !== undefined && result[field] !== null) {\n const value = result[field];\n if (typeof value === \"number\") {\n (result as Record<string, unknown>)[field] = DecimalUtils.toDecimalString(value);\n }\n }\n }\n return result;\n },\n\n /**\n * Convert object with decimal fields from database\n */\n parseFromDatabase<T extends Record<string, unknown>>(\n data: T,\n decimalFields: string[]\n ): T {\n const result = { ...data };\n for (const field of decimalFields) {\n if (field in result && result[field] !== undefined && result[field] !== null) {\n const value = result[field];\n if (typeof value === \"string\") {\n (result as Record<string, unknown>)[field] = DecimalUtils.fromDecimalString(value);\n }\n }\n }\n return result;\n },\n};\n\n/**\n * Shorthand for creating Decimal\n */\nexport function decimal(value: number | string): Decimal {\n return new Decimal(value);\n}\n","/**\n * @parsrun/core - Type Definitions\n */\n\n// ============================================\n// TENANT TYPES\n// ============================================\n\nexport interface Tenant {\n id: string;\n name: string;\n slug: string;\n status: TenantStatus;\n plan?: string;\n settings?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type TenantStatus = \"active\" | \"suspended\" | \"pending\" | \"deleted\";\n\n// ============================================\n// USER TYPES\n// ============================================\n\nexport interface User {\n id: string;\n email: string;\n emailVerified: boolean;\n name?: string;\n avatarUrl?: string;\n twoFactorEnabled: boolean;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Session {\n id: string;\n userId: string;\n tenantId: string;\n expiresAt: Date;\n ipAddress?: string;\n userAgent?: string;\n createdAt: Date;\n}\n\n// ============================================\n// MEMBERSHIP TYPES\n// ============================================\n\nexport interface TenantMembership {\n id: string;\n userId: string;\n tenantId: string;\n roleId?: string;\n permissions: MembershipPermissions;\n accessLevel: AccessLevel;\n resourceRestrictions: ResourceRestrictions;\n ipRestrictions?: IpRestrictions;\n timeRestrictions?: TimeRestrictions;\n status: MembershipStatus;\n expiresAt?: Date;\n invitedBy?: string;\n invitedAt?: Date;\n joinedAt?: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type MembershipStatus = \"pending\" | \"active\" | \"suspended\" | \"expired\" | \"revoked\";\n\nexport type AccessLevel = \"full\" | \"limited\" | \"readonly\" | \"custom\";\n\nexport interface MembershipPermissions {\n [resource: string]: string[];\n}\n\nexport interface ResourceRestrictions {\n locations?: string[];\n departments?: string[];\n projects?: string[];\n [key: string]: string[] | undefined;\n}\n\nexport interface IpRestrictions {\n allowedIps?: string[];\n allowedCidrs?: string[];\n deniedIps?: string[];\n}\n\nexport interface TimeRestrictions {\n timezone?: string;\n allowedDays?: number[]; // 0-6, Sunday = 0\n allowedHoursStart?: number; // 0-23\n allowedHoursEnd?: number; // 0-23\n}\n\n// ============================================\n// AUTH CONTEXT\n// ============================================\n\nexport interface AuthContext {\n user: User;\n session: Session;\n tenant: Tenant;\n membership: TenantMembership;\n}\n\n// ============================================\n// PAGINATION\n// ============================================\n\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n cursor?: string;\n}\n\nexport interface PaginatedResult<T> {\n data: T[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext: boolean;\n hasPrev: boolean;\n nextCursor?: string;\n };\n}\n\n// ============================================\n// RESULT TYPES\n// ============================================\n\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n// ============================================\n// UTILITY TYPES\n// ============================================\n\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<\n T,\n Exclude<keyof T, Keys>\n> &\n {\n [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;\n }[Keys];\n","/**\n * @parsrun/core - Error Classes\n */\n\nexport class ParsError extends Error {\n public readonly code: string;\n public readonly statusCode: number;\n public readonly details: Record<string, unknown> | undefined;\n\n constructor(\n message: string,\n code: string,\n statusCode: number = 500,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"ParsError\";\n this.code = code;\n this.statusCode = statusCode;\n this.details = details ?? undefined;\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n };\n }\n}\n\n// ============================================\n// AUTH ERRORS\n// ============================================\n\nexport class AuthError extends ParsError {\n constructor(\n message: string,\n code: string = \"AUTH_ERROR\",\n statusCode: number = 401,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"AuthError\";\n }\n}\n\nexport class UnauthorizedError extends AuthError {\n constructor(message: string = \"Unauthorized\", details?: Record<string, unknown>) {\n super(message, \"UNAUTHORIZED\", 401, details);\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ForbiddenError extends AuthError {\n constructor(message: string = \"Forbidden\", details?: Record<string, unknown>) {\n super(message, \"FORBIDDEN\", 403, details);\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class InvalidCredentialsError extends AuthError {\n constructor(message: string = \"Invalid credentials\", details?: Record<string, unknown>) {\n super(message, \"INVALID_CREDENTIALS\", 401, details);\n this.name = \"InvalidCredentialsError\";\n }\n}\n\nexport class SessionExpiredError extends AuthError {\n constructor(message: string = \"Session expired\", details?: Record<string, unknown>) {\n super(message, \"SESSION_EXPIRED\", 401, details);\n this.name = \"SessionExpiredError\";\n }\n}\n\nexport class TwoFactorRequiredError extends AuthError {\n constructor(\n message: string = \"Two-factor authentication required\",\n public readonly challengeId: string,\n details?: Record<string, unknown>\n ) {\n super(message, \"TWO_FACTOR_REQUIRED\", 403, { ...details, challengeId });\n this.name = \"TwoFactorRequiredError\";\n }\n}\n\nexport class AccountLockedError extends AuthError {\n constructor(\n message: string = \"Account locked\",\n public readonly lockedUntil?: Date,\n details?: Record<string, unknown>\n ) {\n super(message, \"ACCOUNT_LOCKED\", 423, { ...details, lockedUntil });\n this.name = \"AccountLockedError\";\n }\n}\n\n// ============================================\n// TENANT ERRORS\n// ============================================\n\nexport class TenantError extends ParsError {\n constructor(\n message: string,\n code: string = \"TENANT_ERROR\",\n statusCode: number = 400,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"TenantError\";\n }\n}\n\nexport class TenantNotFoundError extends TenantError {\n constructor(message: string = \"Tenant not found\", details?: Record<string, unknown>) {\n super(message, \"TENANT_NOT_FOUND\", 404, details);\n this.name = \"TenantNotFoundError\";\n }\n}\n\nexport class TenantSuspendedError extends TenantError {\n constructor(message: string = \"Tenant suspended\", details?: Record<string, unknown>) {\n super(message, \"TENANT_SUSPENDED\", 403, details);\n this.name = \"TenantSuspendedError\";\n }\n}\n\nexport class MembershipError extends TenantError {\n constructor(\n message: string = \"Membership error\",\n code: string = \"MEMBERSHIP_ERROR\",\n statusCode: number = 400,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"MembershipError\";\n }\n}\n\nexport class MembershipNotFoundError extends MembershipError {\n constructor(message: string = \"Membership not found\", details?: Record<string, unknown>) {\n super(message, \"MEMBERSHIP_NOT_FOUND\", 404, details);\n this.name = \"MembershipNotFoundError\";\n }\n}\n\nexport class MembershipExpiredError extends MembershipError {\n constructor(message: string = \"Membership expired\", details?: Record<string, unknown>) {\n super(message, \"MEMBERSHIP_EXPIRED\", 403, details);\n this.name = \"MembershipExpiredError\";\n }\n}\n\n// ============================================\n// VALIDATION ERRORS\n// ============================================\n\nexport class ValidationError extends ParsError {\n constructor(\n message: string = \"Validation failed\",\n public readonly errors: ValidationErrorDetail[],\n details?: Record<string, unknown>\n ) {\n super(message, \"VALIDATION_ERROR\", 400, { ...details, errors });\n this.name = \"ValidationError\";\n }\n}\n\nexport interface ValidationErrorDetail {\n field: string;\n message: string;\n code?: string;\n}\n\n// ============================================\n// RATE LIMIT ERRORS\n// ============================================\n\nexport class RateLimitError extends ParsError {\n constructor(\n message: string = \"Rate limit exceeded\",\n public readonly retryAfter?: number,\n details?: Record<string, unknown>\n ) {\n super(message, \"RATE_LIMIT_EXCEEDED\", 429, { ...details, retryAfter });\n this.name = \"RateLimitError\";\n }\n}\n\n// ============================================\n// NOT FOUND ERRORS\n// ============================================\n\nexport class NotFoundError extends ParsError {\n constructor(\n resource: string = \"Resource\",\n message?: string,\n details?: Record<string, unknown>\n ) {\n super(message ?? `${resource} not found`, \"NOT_FOUND\", 404, { ...details, resource });\n this.name = \"NotFoundError\";\n }\n}\n\n// ============================================\n// CONFLICT ERRORS\n// ============================================\n\nexport class ConflictError extends ParsError {\n constructor(message: string = \"Conflict\", details?: Record<string, unknown>) {\n super(message, \"CONFLICT\", 409, details);\n this.name = \"ConflictError\";\n }\n}\n\nexport class DuplicateError extends ConflictError {\n constructor(\n resource: string = \"Resource\",\n field?: string,\n details?: Record<string, unknown>\n ) {\n super(`${resource} already exists${field ? ` with this ${field}` : \"\"}`, {\n ...details,\n resource,\n field,\n });\n this.name = \"DuplicateError\";\n }\n}\n","/**\n * @parsrun/core - Error Code Catalog\n * Centralized error code definitions for the entire framework\n */\n\n/**\n * Error category for grouping and filtering\n */\nexport type ErrorCategory =\n | \"auth\"\n | \"tenant\"\n | \"validation\"\n | \"resource\"\n | \"rate_limit\"\n | \"server\"\n | \"database\"\n | \"external\";\n\n/**\n * Error code definition\n */\nexport interface ErrorCodeDefinition {\n readonly code: string;\n readonly status: number;\n readonly category: ErrorCategory;\n readonly retryable?: boolean;\n}\n\n/**\n * Centralized error code catalog\n * All error codes used throughout the framework are defined here\n */\nexport const ErrorCodes = {\n // ============================================================================\n // Authentication Errors (401, 403, 423)\n // ============================================================================\n AUTH_ERROR: {\n code: \"AUTH_ERROR\",\n status: 401,\n category: \"auth\",\n },\n UNAUTHORIZED: {\n code: \"UNAUTHORIZED\",\n status: 401,\n category: \"auth\",\n },\n FORBIDDEN: {\n code: \"FORBIDDEN\",\n status: 403,\n category: \"auth\",\n },\n INVALID_CREDENTIALS: {\n code: \"INVALID_CREDENTIALS\",\n status: 401,\n category: \"auth\",\n },\n SESSION_EXPIRED: {\n code: \"SESSION_EXPIRED\",\n status: 401,\n category: \"auth\",\n },\n TOKEN_EXPIRED: {\n code: \"TOKEN_EXPIRED\",\n status: 401,\n category: \"auth\",\n },\n TOKEN_INVALID: {\n code: \"TOKEN_INVALID\",\n status: 401,\n category: \"auth\",\n },\n TWO_FACTOR_REQUIRED: {\n code: \"TWO_FACTOR_REQUIRED\",\n status: 403,\n category: \"auth\",\n },\n TWO_FACTOR_INVALID: {\n code: \"TWO_FACTOR_INVALID\",\n status: 401,\n category: \"auth\",\n },\n ACCOUNT_LOCKED: {\n code: \"ACCOUNT_LOCKED\",\n status: 423,\n category: \"auth\",\n },\n ACCOUNT_DISABLED: {\n code: \"ACCOUNT_DISABLED\",\n status: 403,\n category: \"auth\",\n },\n PASSWORD_RESET_REQUIRED: {\n code: \"PASSWORD_RESET_REQUIRED\",\n status: 403,\n category: \"auth\",\n },\n\n // ============================================================================\n // Tenant Errors (400, 403, 404)\n // ============================================================================\n TENANT_ERROR: {\n code: \"TENANT_ERROR\",\n status: 400,\n category: \"tenant\",\n },\n TENANT_NOT_FOUND: {\n code: \"TENANT_NOT_FOUND\",\n status: 404,\n category: \"tenant\",\n },\n TENANT_SUSPENDED: {\n code: \"TENANT_SUSPENDED\",\n status: 403,\n category: \"tenant\",\n },\n TENANT_LIMIT_EXCEEDED: {\n code: \"TENANT_LIMIT_EXCEEDED\",\n status: 403,\n category: \"tenant\",\n },\n MEMBERSHIP_ERROR: {\n code: \"MEMBERSHIP_ERROR\",\n status: 400,\n category: \"tenant\",\n },\n MEMBERSHIP_NOT_FOUND: {\n code: \"MEMBERSHIP_NOT_FOUND\",\n status: 404,\n category: \"tenant\",\n },\n MEMBERSHIP_EXPIRED: {\n code: \"MEMBERSHIP_EXPIRED\",\n status: 403,\n category: \"tenant\",\n },\n\n // ============================================================================\n // Validation Errors (400, 422)\n // ============================================================================\n VALIDATION_ERROR: {\n code: \"VALIDATION_ERROR\",\n status: 400,\n category: \"validation\",\n },\n BAD_REQUEST: {\n code: \"BAD_REQUEST\",\n status: 400,\n category: \"validation\",\n },\n INVALID_INPUT: {\n code: \"INVALID_INPUT\",\n status: 422,\n category: \"validation\",\n },\n MISSING_REQUIRED_FIELD: {\n code: \"MISSING_REQUIRED_FIELD\",\n status: 400,\n category: \"validation\",\n },\n INVALID_FORMAT: {\n code: \"INVALID_FORMAT\",\n status: 400,\n category: \"validation\",\n },\n\n // ============================================================================\n // Resource Errors (404, 409, 410)\n // ============================================================================\n NOT_FOUND: {\n code: \"NOT_FOUND\",\n status: 404,\n category: \"resource\",\n },\n CONFLICT: {\n code: \"CONFLICT\",\n status: 409,\n category: \"resource\",\n },\n DUPLICATE: {\n code: \"DUPLICATE\",\n status: 409,\n category: \"resource\",\n },\n GONE: {\n code: \"GONE\",\n status: 410,\n category: \"resource\",\n },\n RESOURCE_LOCKED: {\n code: \"RESOURCE_LOCKED\",\n status: 423,\n category: \"resource\",\n },\n\n // ============================================================================\n // Rate Limiting (429)\n // ============================================================================\n RATE_LIMIT_EXCEEDED: {\n code: \"RATE_LIMIT_EXCEEDED\",\n status: 429,\n category: \"rate_limit\",\n retryable: true,\n },\n QUOTA_EXCEEDED: {\n code: \"QUOTA_EXCEEDED\",\n status: 429,\n category: \"rate_limit\",\n },\n\n // ============================================================================\n // Server Errors (500, 502, 503, 504)\n // ============================================================================\n INTERNAL_ERROR: {\n code: \"INTERNAL_ERROR\",\n status: 500,\n category: \"server\",\n },\n BAD_GATEWAY: {\n code: \"BAD_GATEWAY\",\n status: 502,\n category: \"server\",\n retryable: true,\n },\n SERVICE_UNAVAILABLE: {\n code: \"SERVICE_UNAVAILABLE\",\n status: 503,\n category: \"server\",\n retryable: true,\n },\n GATEWAY_TIMEOUT: {\n code: \"GATEWAY_TIMEOUT\",\n status: 504,\n category: \"server\",\n retryable: true,\n },\n\n // ============================================================================\n // Database Errors (500)\n // ============================================================================\n DATABASE_ERROR: {\n code: \"DATABASE_ERROR\",\n status: 500,\n category: \"database\",\n },\n CONNECTION_ERROR: {\n code: \"CONNECTION_ERROR\",\n status: 503,\n category: \"database\",\n retryable: true,\n },\n TRANSACTION_ERROR: {\n code: \"TRANSACTION_ERROR\",\n status: 500,\n category: \"database\",\n },\n RLS_ERROR: {\n code: \"RLS_ERROR\",\n status: 500,\n category: \"database\",\n },\n\n // ============================================================================\n // External Service Errors (502, 503)\n // ============================================================================\n EXTERNAL_SERVICE_ERROR: {\n code: \"EXTERNAL_SERVICE_ERROR\",\n status: 502,\n category: \"external\",\n retryable: true,\n },\n EXTERNAL_TIMEOUT: {\n code: \"EXTERNAL_TIMEOUT\",\n status: 504,\n category: \"external\",\n retryable: true,\n },\n} as const;\n\n/**\n * Error code type (union of all error code keys)\n */\nexport type ErrorCode = keyof typeof ErrorCodes;\n\n/**\n * Get error code definition by code string\n */\nexport function getErrorCode(code: string): ErrorCodeDefinition | undefined {\n return (ErrorCodes as Record<string, ErrorCodeDefinition>)[code];\n}\n\n/**\n * Get all error codes by category\n */\nexport function getErrorCodesByCategory(\n category: ErrorCategory\n): ErrorCodeDefinition[] {\n return Object.values(ErrorCodes).filter((e) => e.category === category);\n}\n\n/**\n * Check if an error code is retryable\n */\nexport function isRetryableError(code: string): boolean {\n const errorCode = getErrorCode(code);\n return errorCode?.retryable === true;\n}\n\n/**\n * Get HTTP status for an error code\n */\nexport function getStatusForCode(code: string): number {\n const errorCode = getErrorCode(code);\n return errorCode?.status ?? 500;\n}\n","/**\n * @parsrun/core - Axiom Transport\n * Log ingestion transport for Axiom (axiom.co)\n * Uses native fetch - works on all runtimes (Node, Deno, Bun, Workers)\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type { LogTransport, BatchTransportOptions } from \"./types.js\";\n\n/**\n * Axiom transport options\n */\nexport interface AxiomTransportOptions extends BatchTransportOptions {\n /** Axiom API token */\n token: string;\n /** Dataset name to ingest logs into */\n dataset: string;\n /** Organization ID (optional, for personal tokens) */\n orgId?: string;\n /** Custom Axiom API URL (default: https://api.axiom.co) */\n apiUrl?: string;\n /** Callback for errors during ingestion */\n onError?: (error: Error, droppedCount: number) => void;\n}\n\n/**\n * Axiom log event structure\n */\ninterface AxiomEvent {\n _time: string;\n level: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Axiom Transport\n * Batches logs and sends them to Axiom's ingest API\n */\nexport class AxiomTransport implements LogTransport {\n readonly name = \"axiom\";\n\n private buffer: AxiomEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private readonly options: Required<\n Pick<AxiomTransportOptions, \"batchSize\" | \"flushInterval\" | \"apiUrl\">\n > &\n AxiomTransportOptions;\n\n constructor(options: AxiomTransportOptions) {\n this.options = {\n batchSize: 100,\n flushInterval: 5000,\n apiUrl: \"https://api.axiom.co\",\n ...options,\n };\n\n // Start flush interval if enabled\n if (this.options.flushInterval > 0) {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.options.flushInterval\n );\n }\n }\n\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n const event: AxiomEvent = {\n _time: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add context fields\n if (entry.context) {\n Object.assign(event, entry.context);\n }\n\n // Add error fields\n if (entry.error) {\n event[\"error.name\"] = entry.error.name;\n event[\"error.message\"] = entry.error.message;\n event[\"error.stack\"] = entry.error.stack;\n }\n\n this.buffer.push(event);\n\n // Flush if buffer is full\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing || this.buffer.length === 0) return;\n\n this.isFlushing = true;\n const events = this.buffer;\n this.buffer = [];\n\n try {\n const response = await fetch(\n `${this.options.apiUrl}/v1/datasets/${this.options.dataset}/ingest`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n ...(this.options.orgId && {\n \"X-Axiom-Org-Id\": this.options.orgId,\n }),\n },\n body: JSON.stringify(events),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Axiom ingest failed: ${response.status} ${errorText}`);\n }\n } catch (error) {\n // Call error handler if provided\n if (this.options.onError) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error)),\n events.length\n );\n } else {\n // Silent fail by default - don't crash the app for logging failures\n console.error(\"[Axiom] Failed to send logs:\", error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n async close(): Promise<void> {\n // Stop flush timer\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Final flush\n await this.flush();\n }\n}\n\n/**\n * Create Axiom transport\n */\nexport function createAxiomTransport(\n options: AxiomTransportOptions\n): AxiomTransport {\n return new AxiomTransport(options);\n}\n","/**\n * @parsrun/core - Sentry Transport\n * Error tracking transport for Sentry\n *\n * Supports two modes:\n * 1. HTTP API mode (default) - Zero dependency, works on all runtimes\n * 2. SDK mode (BYOS) - Full features with user-provided Sentry SDK\n *\n * @example HTTP API mode (simple, universal)\n * ```typescript\n * const sentry = new SentryTransport({\n * dsn: 'https://xxx@sentry.io/123',\n * environment: 'production',\n * });\n * ```\n *\n * @example SDK mode (full features)\n * ```typescript\n * import * as Sentry from '@sentry/cloudflare'; // or @sentry/node\n *\n * Sentry.init({ dsn: '...' });\n *\n * const sentry = new SentryTransport({\n * client: Sentry,\n * });\n * ```\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type {\n LogTransport,\n ErrorTransport,\n ErrorContext,\n ErrorUser,\n Breadcrumb,\n BaseTransportOptions,\n} from \"./types.js\";\n\n/**\n * Sentry SDK interface (minimal interface for BYOS)\n * Compatible with @sentry/node, @sentry/cloudflare, @sentry/browser, etc.\n */\nexport interface SentryClient {\n captureException(error: Error, hint?: unknown): string;\n captureMessage(message: string, level?: string): string;\n withScope(callback: (scope: SentryScope) => void): void;\n flush?(timeout?: number): Promise<boolean>;\n}\n\nexport interface SentryScope {\n setTag(key: string, value: string): void;\n setUser(user: { id: string; email?: string; [key: string]: unknown } | null): void;\n setExtra(key: string, value: unknown): void;\n setExtras(extras: Record<string, unknown>): void;\n setLevel(level: string): void;\n addBreadcrumb(breadcrumb: unknown): void;\n}\n\n/**\n * Parsed DSN components\n */\ninterface ParsedDSN {\n protocol: string;\n publicKey: string;\n host: string;\n projectId: string;\n}\n\n/**\n * Sentry transport options\n */\nexport interface SentryTransportOptions extends BaseTransportOptions {\n /**\n * Sentry DSN (required for HTTP mode)\n * Format: https://{publicKey}@{host}/{projectId}\n */\n dsn?: string;\n\n /**\n * Sentry SDK client (for BYOS mode)\n * Pass your initialized Sentry client for full SDK features\n */\n client?: SentryClient;\n\n /** Environment name (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Release version */\n release?: string;\n\n /** Server name */\n serverName?: string;\n\n /** Sample rate for error events (0.0 to 1.0) */\n sampleRate?: number;\n\n /** Additional tags to add to all events */\n tags?: Record<string, string>;\n\n /** Callback before sending (return null to drop event) */\n beforeSend?: (event: SentryEvent) => SentryEvent | null;\n\n /** Callback for transport errors */\n onError?: (error: Error) => void;\n}\n\n/**\n * Sentry event structure (simplified)\n */\nexport interface SentryEvent {\n event_id: string;\n timestamp: string;\n platform: string;\n level: \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n logger?: string;\n transaction?: string;\n server_name?: string;\n release?: string;\n environment?: string;\n message?: { formatted: string };\n exception?: {\n values: Array<{\n type: string;\n value: string;\n stacktrace?: {\n frames: Array<{\n filename?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n in_app?: boolean;\n }>;\n };\n }>;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n user?: {\n id?: string;\n email?: string;\n username?: string;\n [key: string]: unknown;\n };\n breadcrumbs?: Array<{\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n }>;\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Sentry Transport\n * Implements both LogTransport and ErrorTransport\n */\nexport class SentryTransport implements LogTransport, ErrorTransport {\n readonly name = \"sentry\";\n\n private readonly client?: SentryClient;\n private readonly dsn?: ParsedDSN;\n private readonly options: SentryTransportOptions;\n private user: ErrorUser | null = null;\n private contexts: Map<string, Record<string, unknown>> = new Map();\n private breadcrumbs: Breadcrumb[] = [];\n private readonly maxBreadcrumbs = 100;\n\n constructor(options: SentryTransportOptions) {\n this.options = {\n sampleRate: 1.0,\n ...options,\n };\n\n if (options.client) {\n this.client = options.client;\n } else if (options.dsn) {\n this.dsn = this.parseDSN(options.dsn);\n } else {\n throw new Error(\"SentryTransport requires either 'dsn' or 'client' option\");\n }\n }\n\n /**\n * Parse Sentry DSN\n */\n private parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(/^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/);\n if (!match || !match[1] || !match[2] || !match[3] || !match[4]) {\n throw new Error(`Invalid Sentry DSN: ${dsn}`);\n }\n return {\n protocol: match[1],\n publicKey: match[2],\n host: match[3],\n projectId: match[4],\n };\n }\n\n /**\n * LogTransport implementation\n * Only sends ERROR and FATAL level logs\n */\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n // Only capture errors\n if (entry.levelValue < 50) return; // ERROR = 50, FATAL = 60\n\n if (entry.error) {\n const error = new Error(entry.error.message);\n error.name = entry.error.name;\n if (entry.error.stack) {\n error.stack = entry.error.stack;\n }\n\n this.captureException(\n error,\n entry.context ? { extra: entry.context } : undefined\n );\n } else {\n this.captureMessage(\n entry.message,\n entry.level === \"FATAL\" ? \"error\" : \"warning\",\n entry.context ? { extra: entry.context } : undefined\n );\n }\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: ErrorContext): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.captureWithSdk(error, context);\n } else {\n this.captureWithHttp(error, context);\n }\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: \"info\" | \"warning\" | \"error\",\n context?: ErrorContext\n ): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.client.withScope((scope) => {\n this.applyContext(scope, context);\n scope.setLevel(level);\n this.client!.captureMessage(message, level);\n });\n } else {\n this.sendHttpEvent({\n level: level === \"warning\" ? \"warning\" : level === \"info\" ? \"info\" : \"error\",\n message: { formatted: message },\n ...this.buildEventContext(context),\n });\n }\n }\n\n /**\n * Set user context\n */\n setUser(user: ErrorUser | null): void {\n this.user = user;\n }\n\n /**\n * Set custom context\n */\n setContext(name: string, context: Record<string, unknown>): void {\n this.contexts.set(name, context);\n }\n\n /**\n * Add breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: breadcrumb.timestamp ?? Date.now() / 1000,\n });\n\n // Keep only last N breadcrumbs\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n\n /**\n * Flush pending events\n */\n async flush(): Promise<void> {\n if (this.client?.flush) {\n await this.client.flush(2000);\n }\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private shouldSample(): boolean {\n const rate = this.options.sampleRate ?? 1.0;\n return Math.random() < rate;\n }\n\n /**\n * Capture with SDK (BYOS mode)\n */\n private captureWithSdk(error: Error, context?: ErrorContext): void {\n this.client!.withScope((scope) => {\n this.applyContext(scope, context);\n this.client!.captureException(error);\n });\n }\n\n /**\n * Apply context to SDK scope\n */\n private applyContext(scope: SentryScope, context?: ErrorContext): void {\n // User\n if (this.user) {\n scope.setUser(this.user);\n } else if (context?.userId) {\n scope.setUser({ id: context.userId });\n }\n\n // Tags\n if (this.options.tags) {\n for (const [key, value] of Object.entries(this.options.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.tags) {\n for (const [key, value] of Object.entries(context.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.requestId) {\n scope.setTag(\"requestId\", context.requestId);\n }\n if (context?.tenantId) {\n scope.setTag(\"tenantId\", context.tenantId);\n }\n\n // Extra\n if (context?.extra) {\n scope.setExtras(context.extra);\n }\n\n // Breadcrumbs\n for (const bc of this.breadcrumbs) {\n scope.addBreadcrumb(bc);\n }\n }\n\n /**\n * Capture with HTTP API (default mode)\n */\n private captureWithHttp(error: Error, context?: ErrorContext): void {\n const stacktrace = this.parseStackTrace(error.stack);\n const exceptionValue: {\n type: string;\n value: string;\n stacktrace?: { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> };\n } = {\n type: error.name,\n value: error.message,\n };\n\n if (stacktrace) {\n exceptionValue.stacktrace = stacktrace;\n }\n\n const event: Partial<SentryEvent> = {\n level: \"error\",\n exception: {\n values: [exceptionValue],\n },\n ...this.buildEventContext(context),\n };\n\n this.sendHttpEvent(event);\n }\n\n /**\n * Build event context for HTTP API\n */\n private buildEventContext(context?: ErrorContext): Partial<SentryEvent> {\n const event: Partial<SentryEvent> = {};\n\n // Environment & Release\n if (this.options.environment) {\n event.environment = this.options.environment;\n }\n if (this.options.release) {\n event.release = this.options.release;\n }\n if (this.options.serverName) {\n event.server_name = this.options.serverName;\n }\n\n // Tags\n const tags: Record<string, string> = { ...this.options.tags };\n if (context?.tags) {\n Object.assign(tags, context.tags);\n }\n if (context?.requestId) {\n tags[\"requestId\"] = context.requestId;\n }\n if (context?.tenantId) {\n tags[\"tenantId\"] = context.tenantId;\n }\n if (Object.keys(tags).length > 0) {\n event.tags = tags;\n }\n\n // Extra\n if (context?.extra) {\n event.extra = context.extra;\n }\n\n // User\n if (this.user) {\n event.user = this.user;\n } else if (context?.userId) {\n event.user = { id: context.userId };\n }\n\n // Breadcrumbs\n if (this.breadcrumbs.length > 0) {\n event.breadcrumbs = this.breadcrumbs.map((bc) => {\n const crumb: {\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n } = {};\n if (bc.type) crumb.type = bc.type;\n if (bc.category) crumb.category = bc.category;\n if (bc.message) crumb.message = bc.message;\n if (bc.data) crumb.data = bc.data;\n if (bc.level) crumb.level = bc.level;\n if (bc.timestamp !== undefined) crumb.timestamp = bc.timestamp;\n return crumb;\n });\n }\n\n // Contexts\n if (this.contexts.size > 0) {\n event.contexts = Object.fromEntries(this.contexts);\n }\n\n return event;\n }\n\n /**\n * Parse error stack trace into Sentry format\n */\n private parseStackTrace(\n stack?: string\n ): { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> } | undefined {\n if (!stack) return undefined;\n\n const lines = stack.split(\"\\n\").slice(1); // Skip first line (error message)\n const frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> = [];\n\n for (const line of lines) {\n // Parse V8 stack trace format\n const match = line.match(/^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (match && match[3] && match[4]) {\n const frame: { filename?: string; function?: string; lineno?: number; colno?: number } = {\n function: match[1] || \"<anonymous>\",\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n };\n if (match[2]) {\n frame.filename = match[2];\n }\n frames.push(frame);\n }\n }\n\n // Sentry expects oldest frame first\n frames.reverse();\n\n return frames.length > 0 ? { frames } : undefined;\n }\n\n /**\n * Generate event ID\n */\n private generateEventId(): string {\n // 32 character hex string\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Send event via HTTP API\n */\n private async sendHttpEvent(eventData: Partial<SentryEvent>): Promise<void> {\n if (!this.dsn) return;\n\n const event: SentryEvent = {\n event_id: this.generateEventId(),\n timestamp: new Date().toISOString(),\n platform: \"javascript\",\n level: \"error\",\n ...eventData,\n };\n\n // Apply beforeSend hook\n if (this.options.beforeSend) {\n const result = this.options.beforeSend(event);\n if (result === null) return;\n }\n\n const url = `${this.dsn.protocol}://${this.dsn.host}/api/${this.dsn.projectId}/store/`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Sentry-Auth\": [\n \"Sentry sentry_version=7\",\n `sentry_client=pars-sentry/1.0.0`,\n `sentry_key=${this.dsn.publicKey}`,\n ].join(\", \"),\n },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n throw new Error(`Sentry API error: ${response.status}`);\n }\n } catch (error) {\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n // Silent fail - don't crash the app for logging failures\n }\n }\n}\n\n/**\n * Create Sentry transport\n */\nexport function createSentryTransport(options: SentryTransportOptions): SentryTransport {\n return new SentryTransport(options);\n}\n","/**\n * @parsrun/core - Logtape Transport\n * Structured logging transport for Logtape (@logtape/logtape)\n *\n * Logtape is a TypeScript-first structured logging library.\n * This transport bridges Pars Logger to Logtape for advanced logging scenarios.\n *\n * @example BYOS (Bring Your Own SDK)\n * ```typescript\n * import { getLogger, configure } from '@logtape/logtape';\n *\n * // Configure Logtape\n * await configure({\n * sinks: { console: consoleSink() },\n * loggers: [{ category: 'pars', sinks: ['console'], level: 'info' }],\n * });\n *\n * const logtapeLogger = getLogger('pars');\n * const transport = new LogtapeTransport({ logger: logtapeLogger });\n * ```\n *\n * @example Simple mode (creates internal logger)\n * ```typescript\n * const transport = new LogtapeTransport({\n * category: 'my-app',\n * });\n * ```\n */\n\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport, BaseTransportOptions } from \"./types.js\";\n\n/**\n * Logtape Logger interface (minimal interface for BYOS)\n * Compatible with @logtape/logtape getLogger() return type\n */\nexport interface LogtapeLogger {\n debug(message: string, properties?: Record<string, unknown>): void;\n info(message: string, properties?: Record<string, unknown>): void;\n warn(message: string, properties?: Record<string, unknown>): void;\n warning(message: string, properties?: Record<string, unknown>): void;\n error(message: string, properties?: Record<string, unknown>): void;\n fatal(message: string, properties?: Record<string, unknown>): void;\n}\n\n/**\n * Level mapping from Pars to Logtape\n */\ntype LogtapeLevel = \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\n/**\n * Logtape transport options\n */\nexport interface LogtapeTransportOptions extends BaseTransportOptions {\n /**\n * Logtape logger instance (for BYOS mode)\n * Get this from @logtape/logtape's getLogger()\n */\n logger?: LogtapeLogger;\n\n /**\n * Category name for the logger\n * Only used if logger is not provided (creates a simple fallback logger)\n */\n category?: string;\n\n /**\n * Include timestamp in properties\n * @default true\n */\n includeTimestamp?: boolean;\n\n /**\n * Include level value in properties\n * @default false\n */\n includeLevelValue?: boolean;\n}\n\n/**\n * Simple fallback logger when no Logtape instance is provided\n * Just outputs structured JSON - users should use BYOS for full features\n */\nclass FallbackLogger implements LogtapeLogger {\n constructor(private category: string) {}\n\n private log(level: string, message: string, properties?: Record<string, unknown>): void {\n const entry = {\n level,\n category: this.category,\n msg: message,\n time: new Date().toISOString(),\n ...properties,\n };\n console.log(JSON.stringify(entry));\n }\n\n debug(message: string, properties?: Record<string, unknown>): void {\n this.log(\"debug\", message, properties);\n }\n\n info(message: string, properties?: Record<string, unknown>): void {\n this.log(\"info\", message, properties);\n }\n\n warn(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warn\", message, properties);\n }\n\n warning(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warning\", message, properties);\n }\n\n error(message: string, properties?: Record<string, unknown>): void {\n this.log(\"error\", message, properties);\n }\n\n fatal(message: string, properties?: Record<string, unknown>): void {\n this.log(\"fatal\", message, properties);\n }\n}\n\n/**\n * Logtape Transport\n * Bridges Pars Logger to Logtape\n */\nexport class LogtapeTransport implements LogTransport {\n readonly name = \"logtape\";\n\n private readonly logger: LogtapeLogger;\n private readonly includeTimestamp: boolean;\n private readonly includeLevelValue: boolean;\n private readonly enabled: boolean;\n\n constructor(options: LogtapeTransportOptions = {}) {\n this.enabled = options.enabled !== false;\n this.includeTimestamp = options.includeTimestamp !== false;\n this.includeLevelValue = options.includeLevelValue ?? false;\n\n if (options.logger) {\n this.logger = options.logger;\n } else {\n // Create fallback logger\n this.logger = new FallbackLogger(options.category ?? \"pars\");\n }\n }\n\n log(entry: LogEntry): void {\n if (!this.enabled) return;\n\n const level = this.mapLevel(entry.level);\n const properties = this.buildProperties(entry);\n\n // Call the appropriate log method\n this.logger[level](entry.message, properties);\n }\n\n /**\n * Map Pars log level to Logtape level\n */\n private mapLevel(level: LogLevelName): LogtapeLevel {\n const mapping: Record<LogLevelName, LogtapeLevel> = {\n TRACE: \"debug\",\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warning\",\n ERROR: \"error\",\n FATAL: \"fatal\",\n SILENT: \"debug\", // Should never be logged\n };\n return mapping[level];\n }\n\n /**\n * Build properties object for Logtape\n */\n private buildProperties(entry: LogEntry): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Add timestamp if enabled\n if (this.includeTimestamp) {\n properties[\"timestamp\"] = entry.timestamp;\n }\n\n // Add level value if enabled\n if (this.includeLevelValue) {\n properties[\"levelValue\"] = entry.levelValue;\n }\n\n // Add context\n if (entry.context) {\n Object.assign(properties, entry.context);\n }\n\n // Add error info\n if (entry.error) {\n properties[\"error\"] = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return properties;\n }\n}\n\n/**\n * Create Logtape transport\n */\nexport function createLogtapeTransport(\n options?: LogtapeTransportOptions\n): LogtapeTransport {\n return new LogtapeTransport(options);\n}\n","/**\n * @parsrun/core\n * Core utilities and types for Pars framework\n * Edge-compatible, zero dependencies\n */\n\n// ============================================\n// RUNTIME & ENVIRONMENT\n// ============================================\n\nexport {\n detectRuntime,\n runtime,\n runtimeInfo,\n isNode,\n isDeno,\n isBun,\n isCloudflare,\n isEdge,\n isBrowser,\n isServer,\n getRuntimeVersion,\n type Runtime,\n} from \"./runtime.js\";\n\nexport {\n getEnv,\n requireEnv,\n getEnvNumber,\n getEnvFloat,\n getEnvBoolean,\n getEnvArray,\n getEnvJson,\n setEdgeEnv,\n clearEdgeEnv,\n isDevelopment,\n isProduction,\n isTest,\n getEnvMode,\n createEnvConfig,\n type EnvMode,\n} from \"./env.js\";\n\n// ============================================\n// LOGGING\n// ============================================\n\nexport {\n Logger,\n ConsoleTransport,\n LogLevel,\n createLogger,\n logger,\n logError,\n measureTime,\n createRequestLogger,\n type LogLevelName,\n type LogLevelValue,\n type LogEntry,\n type LogTransport,\n type LoggerConfig,\n} from \"./logger.js\";\n\n// ============================================\n// DECIMAL / MATH\n// ============================================\n\nexport {\n Decimal,\n DecimalUtils,\n decimal,\n} from \"./decimal.js\";\n\n// ============================================\n// TYPES\n// ============================================\n\nexport * from \"./types.js\";\n\n// ============================================\n// ERRORS\n// ============================================\n\nexport * from \"./errors.js\";\n\n// ============================================\n// ERROR CODES\n// ============================================\n\nexport {\n ErrorCodes,\n getErrorCode,\n getErrorCodesByCategory,\n isRetryableError,\n getStatusForCode,\n type ErrorCode,\n type ErrorCategory,\n type ErrorCodeDefinition,\n} from \"./error-codes.js\";\n\n// ============================================\n// TRANSPORTS (additional - ConsoleTransport already in logger.js)\n// ============================================\n\nexport {\n // Error transport types (LogTransport is in logger.js)\n type ErrorTransport,\n type CombinedTransport,\n type ErrorContext,\n type ErrorUser,\n type Breadcrumb,\n type BaseTransportOptions,\n type BatchTransportOptions,\n // Axiom\n AxiomTransport,\n createAxiomTransport,\n type AxiomTransportOptions,\n // Sentry\n SentryTransport,\n createSentryTransport,\n type SentryTransportOptions,\n type SentryClient,\n type SentryEvent,\n // Logtape\n LogtapeTransport,\n createLogtapeTransport,\n type LogtapeTransportOptions,\n type LogtapeLogger,\n} from \"./transports/index.js\";\n\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n\n/**\n * Generate a cryptographically secure random string (hex)\n */\nexport async function generateRandomString(length: number): Promise<string> {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Hash a string using SHA-256\n */\nexport async function sha256(input: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hash = await crypto.subtle.digest(\"SHA-256\", data);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Hash a string using SHA-256 and return as ArrayBuffer\n */\nexport async function sha256Bytes(input: string): Promise<ArrayBuffer> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n return crypto.subtle.digest(\"SHA-256\", data);\n}\n\n/**\n * Constant-time string comparison (timing-safe)\n */\nexport function constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n const aBytes = new TextEncoder().encode(a);\n const bBytes = new TextEncoder().encode(b);\n\n let result = 0;\n for (let i = 0; i < aBytes.length; i++) {\n result |= aBytes[i]! ^ bBytes[i]!;\n }\n\n return result === 0;\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n shouldRetry?: (error: unknown) => boolean;\n onRetry?: (error: unknown, attempt: number) => void;\n } = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelayMs = 1000,\n maxDelayMs = 30000,\n backoffMultiplier = 2,\n shouldRetry = () => true,\n onRetry,\n } = options;\n\n let lastError: unknown;\n let delay = initialDelayMs;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxRetries || !shouldRetry(error)) {\n throw error;\n }\n\n onRetry?.(error, attempt + 1);\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelayMs);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Omit keys from an object\n */\nexport function omit<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n\n/**\n * Pick keys from an object\n */\nexport function pick<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== undefined &&\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as object,\n sourceValue as object\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n const cloned = {} as T;\n for (const key of Object.keys(obj) as (keyof T)[]) {\n cloned[key] = deepClone(obj[key]);\n }\n return cloned;\n}\n\n/**\n * Check if a value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.toString.call(value) === \"[object Object]\"\n );\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Check if value is empty (null, undefined, empty string, empty array, empty object)\n */\nexport function isEmpty(value: unknown): boolean {\n if (isNil(value)) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (isPlainObject(value)) return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * Normalize email address\n */\nexport function normalizeEmail(email: string): string {\n return email.toLowerCase().trim();\n}\n\n/**\n * Validate email format\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Generate a URL-friendly slug from a string\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n/**\n * Truncate string to a maximum length\n */\nexport function truncate(str: string, maxLength: number, suffix: string = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, wait);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastTime = 0;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastTime >= wait) {\n lastTime = now;\n fn(...args);\n }\n };\n}\n\n/**\n * Create a deferred promise\n */\nexport function createDeferred<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Run promises with concurrency limit\n */\nexport async function pLimit<T>(\n tasks: (() => Promise<T>)[],\n concurrency: number\n): Promise<T[]> {\n const results: T[] = [];\n const executing: Promise<void>[] = [];\n\n for (const [index, task] of tasks.entries()) {\n const p = Promise.resolve().then(async () => {\n results[index] = await task();\n });\n\n executing.push(p);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(\n executing.findIndex((e) => e === p),\n 1\n );\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n"],"mappings":"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","names":["err"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/env.ts","../src/transports/console.ts","../src/logger.ts","../src/decimal.ts","../src/types.ts","../src/errors.ts","../src/error-codes.ts","../src/transports/axiom.ts","../src/transports/sentry.ts","../src/transports/logtape.ts","../src/index.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process?.versions?.node ?? \"unknown\"}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Logger\n * Lightweight, edge-compatible structured logging\n * Can be used standalone or as abstraction over pino/winston in Node.js\n */\n\nimport { getEnv } from \"./env.js\";\nimport { ConsoleTransport } from \"./transports/console.js\";\nimport type { LogTransport } from \"./transports/types.js\";\n\n// Re-export ConsoleTransport for backward compatibility\nexport { ConsoleTransport, type ConsoleTransportOptions } from \"./transports/console.js\";\n\n// Re-export transport types\nexport type { LogTransport } from \"./transports/types.js\";\n\n/**\n * Log levels\n */\nexport const LogLevel = {\n TRACE: 10,\n DEBUG: 20,\n INFO: 30,\n WARN: 40,\n ERROR: 50,\n FATAL: 60,\n SILENT: 100,\n} as const;\n\nexport type LogLevelName = keyof typeof LogLevel;\nexport type LogLevelValue = (typeof LogLevel)[LogLevelName];\n\n/**\n * Error info structure\n */\nexport interface ErrorInfo {\n name: string;\n message: string;\n stack: string | undefined;\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n level: LogLevelName;\n levelValue: LogLevelValue;\n message: string;\n timestamp: string;\n context: Record<string, unknown> | undefined;\n error: ErrorInfo | undefined;\n}\n\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Minimum log level */\n level: LogLevelName | undefined;\n /** Logger name/module */\n name: string | undefined;\n /** Base context added to all logs */\n context: Record<string, unknown> | undefined;\n /** Custom transports */\n transports: LogTransport[] | undefined;\n /** Pretty print in development */\n pretty: boolean | undefined;\n /** Redact sensitive fields */\n redact: string[] | undefined;\n /** Timestamp format */\n timestamp: boolean | (() => string) | undefined;\n}\n\n\n/**\n * Redact sensitive fields from context\n */\nfunction redactFields(\n obj: Record<string, unknown>,\n fields: string[]\n): Record<string, unknown> {\n const result = { ...obj };\n for (const field of fields) {\n if (field in result) {\n result[field] = \"[REDACTED]\";\n }\n // Handle nested fields like \"user.password\"\n const parts = field.split(\".\");\n if (parts.length > 1) {\n let current: Record<string, unknown> | undefined = result;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part && current && typeof current === \"object\" && part in current) {\n const val = current[part];\n if (val && typeof val === \"object\") {\n current = val as Record<string, unknown>;\n } else {\n current = undefined;\n break;\n }\n } else {\n current = undefined;\n break;\n }\n }\n const lastPart = parts[parts.length - 1];\n if (lastPart && current && typeof current === \"object\" && lastPart in current) {\n current[lastPart] = \"[REDACTED]\";\n }\n }\n }\n return result;\n}\n\n/**\n * Default redact fields\n */\nconst DEFAULT_REDACT_FIELDS = [\n \"password\",\n \"secret\",\n \"token\",\n \"accessToken\",\n \"refreshToken\",\n \"apiKey\",\n \"authorization\",\n \"cookie\",\n \"creditCard\",\n \"ssn\",\n];\n\n/**\n * Logger class\n */\nexport class Logger {\n private level: LogLevelValue;\n private name: string | undefined;\n private context: Record<string, unknown>;\n private transports: LogTransport[];\n private redactFields: string[];\n private timestampFn: () => string;\n\n constructor(config: Partial<LoggerConfig> = {}) {\n const levelName = config.level ?? (getEnv(\"LOG_LEVEL\") as LogLevelName | undefined) ?? \"INFO\";\n this.level = LogLevel[levelName] ?? LogLevel.INFO;\n this.name = config.name;\n this.context = config.context ?? {};\n this.transports = config.transports ?? [\n new ConsoleTransport(\n config.pretty !== undefined ? { pretty: config.pretty } : {}\n ),\n ];\n this.redactFields = [...DEFAULT_REDACT_FIELDS, ...(config.redact ?? [])];\n\n if (config.timestamp === false) {\n this.timestampFn = () => \"\";\n } else if (typeof config.timestamp === \"function\") {\n this.timestampFn = config.timestamp;\n } else {\n this.timestampFn = () => new Date().toISOString();\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(context: Record<string, unknown>): Logger {\n const levelEntry = Object.entries(LogLevel).find(([_, v]) => v === this.level);\n const levelName = levelEntry ? (levelEntry[0] as LogLevelName) : \"INFO\";\n\n const child = new Logger({\n level: levelName,\n name: this.name,\n context: { ...this.context, ...context },\n transports: this.transports,\n redact: this.redactFields,\n });\n return child;\n }\n\n /**\n * Log a message\n */\n private log(\n level: LogLevelName,\n message: string,\n context?: Record<string, unknown>,\n error?: Error\n ): void {\n const levelValue = LogLevel[level];\n if (levelValue < this.level) return;\n\n let finalContext = { ...this.context };\n if (this.name) {\n finalContext[\"module\"] = this.name;\n }\n if (context) {\n finalContext = { ...finalContext, ...context };\n }\n\n // Redact sensitive fields\n finalContext = redactFields(finalContext, this.redactFields);\n\n const entry: LogEntry = {\n level,\n levelValue,\n message,\n timestamp: this.timestampFn(),\n context: Object.keys(finalContext).length > 0 ? finalContext : undefined,\n error: error\n ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n : undefined,\n };\n\n for (const transport of this.transports) {\n transport.log(entry);\n }\n }\n\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(\"TRACE\", message, context);\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log(\"INFO\", message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"ERROR\", message, ctx, err);\n }\n\n fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"FATAL\", message, ctx, err);\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config?: Partial<LoggerConfig>): Logger {\n return new Logger(config);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger();\n\n/**\n * Utility: Log error with proper formatting\n */\nexport function logError(\n log: Logger,\n error: unknown,\n message: string,\n context?: Record<string, unknown>\n): void {\n if (error instanceof Error) {\n log.error(message, error, context);\n } else {\n log.error(message, { error: String(error), ...context });\n }\n}\n\n/**\n * Utility: Measure execution time\n */\nexport async function measureTime<T>(\n log: Logger,\n operation: string,\n fn: () => Promise<T>\n): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n const duration = Date.now() - start;\n log.info(`${operation} completed`, { operation, durationMs: duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n logError(log, error, `${operation} failed`, { operation, durationMs: duration });\n throw error;\n }\n}\n\n/**\n * Utility: Create request logger middleware context\n */\nexport function createRequestLogger(\n baseLogger: Logger,\n request: {\n method?: string;\n url?: string;\n requestId?: string;\n userId?: string;\n tenantId?: string;\n }\n): Logger {\n const pathname = request.url ? new URL(request.url).pathname : undefined;\n return baseLogger.child({\n requestId: request.requestId,\n method: request.method,\n path: pathname,\n userId: request.userId,\n tenantId: request.tenantId,\n });\n}\n","/**\n * @parsrun/core - Decimal Utilities\n * Precise decimal calculations for financial and quantity operations\n * Edge-compatible - no external dependencies\n */\n\n/**\n * Internal precision for calculations\n */\nconst PRECISION = 20;\n\n/**\n * Decimal class for precise arithmetic\n * Uses string-based arithmetic to avoid floating point issues\n */\nexport class Decimal {\n private value: string;\n\n constructor(value: number | string | Decimal) {\n if (value instanceof Decimal) {\n this.value = value.value;\n } else if (typeof value === \"number\") {\n this.value = this.normalizeNumber(value);\n } else {\n this.value = this.normalizeString(value);\n }\n }\n\n private normalizeNumber(n: number): string {\n if (!isFinite(n)) {\n throw new Error(`Invalid number: ${n}`);\n }\n return n.toFixed(PRECISION).replace(/\\.?0+$/, \"\") || \"0\";\n }\n\n private normalizeString(s: string): string {\n const trimmed = s.trim();\n if (!/^-?\\d*\\.?\\d+$/.test(trimmed)) {\n throw new Error(`Invalid decimal string: ${s}`);\n }\n return trimmed.replace(/^(-?)0+(?=\\d)/, \"$1\").replace(/\\.?0+$/, \"\") || \"0\";\n }\n\n /**\n * Add two decimals\n */\n add(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a + b);\n }\n\n /**\n * Subtract\n */\n sub(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a - b);\n }\n\n /**\n * Multiply\n */\n mul(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a * b);\n }\n\n /**\n * Divide\n */\n div(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n if (b === 0) {\n throw new Error(\"Division by zero\");\n }\n return new Decimal(a / b);\n }\n\n /**\n * Modulo\n */\n mod(other: number | string | Decimal): Decimal {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n return new Decimal(a % b);\n }\n\n /**\n * Power\n */\n pow(exp: number): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(Math.pow(a, exp));\n }\n\n /**\n * Square root\n */\n sqrt(): Decimal {\n const a = parseFloat(this.value);\n if (a < 0) {\n throw new Error(\"Square root of negative number\");\n }\n return new Decimal(Math.sqrt(a));\n }\n\n /**\n * Absolute value\n */\n abs(): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(Math.abs(a));\n }\n\n /**\n * Negate\n */\n neg(): Decimal {\n const a = parseFloat(this.value);\n return new Decimal(-a);\n }\n\n /**\n * Round to decimal places\n */\n round(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.round(a * factor) / factor);\n }\n\n /**\n * Floor to decimal places\n */\n floor(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.floor(a * factor) / factor);\n }\n\n /**\n * Ceiling to decimal places\n */\n ceil(decimals: number = 0): Decimal {\n const a = parseFloat(this.value);\n const factor = Math.pow(10, decimals);\n return new Decimal(Math.ceil(a * factor) / factor);\n }\n\n /**\n * Compare: returns -1, 0, or 1\n */\n cmp(other: number | string | Decimal): -1 | 0 | 1 {\n const a = parseFloat(this.value);\n const b = parseFloat(other instanceof Decimal ? other.value : String(other));\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n }\n\n /**\n * Equality check\n */\n eq(other: number | string | Decimal): boolean {\n return this.cmp(other) === 0;\n }\n\n /**\n * Greater than\n */\n gt(other: number | string | Decimal): boolean {\n return this.cmp(other) === 1;\n }\n\n /**\n * Greater than or equal\n */\n gte(other: number | string | Decimal): boolean {\n return this.cmp(other) >= 0;\n }\n\n /**\n * Less than\n */\n lt(other: number | string | Decimal): boolean {\n return this.cmp(other) === -1;\n }\n\n /**\n * Less than or equal\n */\n lte(other: number | string | Decimal): boolean {\n return this.cmp(other) <= 0;\n }\n\n /**\n * Check if zero\n */\n isZero(): boolean {\n return parseFloat(this.value) === 0;\n }\n\n /**\n * Check if positive\n */\n isPositive(): boolean {\n return parseFloat(this.value) > 0;\n }\n\n /**\n * Check if negative\n */\n isNegative(): boolean {\n return parseFloat(this.value) < 0;\n }\n\n /**\n * Convert to number\n */\n toNumber(): number {\n return parseFloat(this.value);\n }\n\n /**\n * Convert to string\n */\n toString(): string {\n return this.value;\n }\n\n /**\n * Format with fixed decimal places\n */\n toFixed(decimals: number = 2): string {\n return parseFloat(this.value).toFixed(decimals);\n }\n\n /**\n * Convert to JSON (string representation)\n */\n toJSON(): string {\n return this.value;\n }\n\n /**\n * Static: Create from value\n */\n static from(value: number | string | Decimal): Decimal {\n return new Decimal(value);\n }\n\n /**\n * Static: Sum array of values\n */\n static sum(values: (number | string | Decimal)[]): Decimal {\n return values.reduce<Decimal>(\n (acc, val) => acc.add(val),\n new Decimal(0)\n );\n }\n\n /**\n * Static: Average of array\n */\n static avg(values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) return new Decimal(0);\n return Decimal.sum(values).div(values.length);\n }\n\n /**\n * Static: Min of array\n */\n static min(...values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) throw new Error(\"No values provided\");\n return values.reduce<Decimal>((min, val) => {\n const d = new Decimal(val);\n return d.lt(min) ? d : min;\n }, new Decimal(values[0]!));\n }\n\n /**\n * Static: Max of array\n */\n static max(...values: (number | string | Decimal)[]): Decimal {\n if (values.length === 0) throw new Error(\"No values provided\");\n return values.reduce<Decimal>((max, val) => {\n const d = new Decimal(val);\n return d.gt(max) ? d : max;\n }, new Decimal(values[0]!));\n }\n}\n\n/**\n * Decimal utilities for database operations\n */\nexport const DecimalUtils = {\n /**\n * Convert number to database decimal string\n */\n toDecimalString(value: number | string | null | undefined): string | null {\n if (value === null || value === undefined) return null;\n return new Decimal(value).toString();\n },\n\n /**\n * Convert database decimal string to number\n */\n fromDecimalString(value: string | null | undefined): number {\n if (!value) return 0;\n return new Decimal(value).toNumber();\n },\n\n /**\n * Perform precise decimal multiplication\n */\n multiply(a: number | string, b: number | string): string {\n return new Decimal(a).mul(b).toString();\n },\n\n /**\n * Perform precise decimal addition\n */\n add(a: number | string, b: number | string): string {\n return new Decimal(a).add(b).toString();\n },\n\n /**\n * Perform precise decimal subtraction\n */\n subtract(a: number | string, b: number | string): string {\n return new Decimal(a).sub(b).toString();\n },\n\n /**\n * Perform precise decimal division\n */\n divide(a: number | string, b: number | string): string {\n return new Decimal(a).div(b).toString();\n },\n\n /**\n * Format decimal for display\n */\n format(value: string | number, decimalPlaces: number = 2): string {\n return new Decimal(value).toFixed(decimalPlaces);\n },\n\n /**\n * Format as currency\n */\n formatCurrency(\n value: string | number,\n options: {\n currency?: string;\n locale?: string;\n decimals?: number;\n } = {}\n ): string {\n const { currency = \"USD\", locale = \"en-US\", decimals = 2 } = options;\n const num = new Decimal(value).toNumber();\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n }).format(num);\n },\n\n /**\n * Convert object with decimal fields for database insert/update\n */\n prepareForDatabase<T extends Record<string, unknown>>(\n data: T,\n decimalFields: string[]\n ): T {\n const result = { ...data };\n for (const field of decimalFields) {\n if (field in result && result[field] !== undefined && result[field] !== null) {\n const value = result[field];\n if (typeof value === \"number\") {\n (result as Record<string, unknown>)[field] = DecimalUtils.toDecimalString(value);\n }\n }\n }\n return result;\n },\n\n /**\n * Convert object with decimal fields from database\n */\n parseFromDatabase<T extends Record<string, unknown>>(\n data: T,\n decimalFields: string[]\n ): T {\n const result = { ...data };\n for (const field of decimalFields) {\n if (field in result && result[field] !== undefined && result[field] !== null) {\n const value = result[field];\n if (typeof value === \"string\") {\n (result as Record<string, unknown>)[field] = DecimalUtils.fromDecimalString(value);\n }\n }\n }\n return result;\n },\n};\n\n/**\n * Shorthand for creating Decimal\n */\nexport function decimal(value: number | string): Decimal {\n return new Decimal(value);\n}\n","/**\n * @parsrun/core - Type Definitions\n */\n\n// ============================================\n// TENANT TYPES\n// ============================================\n\nexport interface Tenant {\n id: string;\n name: string;\n slug: string;\n status: TenantStatus;\n plan?: string;\n settings?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type TenantStatus = \"active\" | \"suspended\" | \"pending\" | \"deleted\";\n\n// ============================================\n// USER TYPES\n// ============================================\n\nexport interface User {\n id: string;\n email: string;\n emailVerified: boolean;\n name?: string;\n avatarUrl?: string;\n twoFactorEnabled: boolean;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport interface Session {\n id: string;\n userId: string;\n tenantId: string;\n expiresAt: Date;\n ipAddress?: string;\n userAgent?: string;\n createdAt: Date;\n}\n\n// ============================================\n// MEMBERSHIP TYPES\n// ============================================\n\nexport interface TenantMembership {\n id: string;\n userId: string;\n tenantId: string;\n roleId?: string;\n permissions: MembershipPermissions;\n accessLevel: AccessLevel;\n resourceRestrictions: ResourceRestrictions;\n ipRestrictions?: IpRestrictions;\n timeRestrictions?: TimeRestrictions;\n status: MembershipStatus;\n expiresAt?: Date;\n invitedBy?: string;\n invitedAt?: Date;\n joinedAt?: Date;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type MembershipStatus = \"pending\" | \"active\" | \"suspended\" | \"expired\" | \"revoked\";\n\nexport type AccessLevel = \"full\" | \"limited\" | \"readonly\" | \"custom\";\n\nexport interface MembershipPermissions {\n [resource: string]: string[];\n}\n\nexport interface ResourceRestrictions {\n locations?: string[];\n departments?: string[];\n projects?: string[];\n [key: string]: string[] | undefined;\n}\n\nexport interface IpRestrictions {\n allowedIps?: string[];\n allowedCidrs?: string[];\n deniedIps?: string[];\n}\n\nexport interface TimeRestrictions {\n timezone?: string;\n allowedDays?: number[]; // 0-6, Sunday = 0\n allowedHoursStart?: number; // 0-23\n allowedHoursEnd?: number; // 0-23\n}\n\n// ============================================\n// AUTH CONTEXT\n// ============================================\n\nexport interface AuthContext {\n user: User;\n session: Session;\n tenant: Tenant;\n membership: TenantMembership;\n}\n\n// ============================================\n// PAGINATION\n// ============================================\n\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n cursor?: string;\n}\n\nexport interface PaginatedResult<T> {\n data: T[];\n pagination: {\n total: number;\n page: number;\n limit: number;\n totalPages: number;\n hasNext: boolean;\n hasPrev: boolean;\n nextCursor?: string;\n };\n}\n\n// ============================================\n// RESULT TYPES\n// ============================================\n\nexport type Result<T, E = Error> =\n | { success: true; data: T }\n | { success: false; error: E };\n\nexport function ok<T>(data: T): Result<T, never> {\n return { success: true, data };\n}\n\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n// ============================================\n// UTILITY TYPES\n// ============================================\n\nexport type Prettify<T> = {\n [K in keyof T]: T[K];\n} & {};\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<\n T,\n Exclude<keyof T, Keys>\n> &\n {\n [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;\n }[Keys];\n","/**\n * @parsrun/core - Error Classes\n */\n\nexport class ParsError extends Error {\n public readonly code: string;\n public readonly statusCode: number;\n public readonly details: Record<string, unknown> | undefined;\n\n constructor(\n message: string,\n code: string,\n statusCode: number = 500,\n details?: Record<string, unknown>\n ) {\n super(message);\n this.name = \"ParsError\";\n this.code = code;\n this.statusCode = statusCode;\n this.details = details ?? undefined;\n Error.captureStackTrace?.(this, this.constructor);\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n details: this.details,\n };\n }\n}\n\n// ============================================\n// AUTH ERRORS\n// ============================================\n\nexport class AuthError extends ParsError {\n constructor(\n message: string,\n code: string = \"AUTH_ERROR\",\n statusCode: number = 401,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"AuthError\";\n }\n}\n\nexport class UnauthorizedError extends AuthError {\n constructor(message: string = \"Unauthorized\", details?: Record<string, unknown>) {\n super(message, \"UNAUTHORIZED\", 401, details);\n this.name = \"UnauthorizedError\";\n }\n}\n\nexport class ForbiddenError extends AuthError {\n constructor(message: string = \"Forbidden\", details?: Record<string, unknown>) {\n super(message, \"FORBIDDEN\", 403, details);\n this.name = \"ForbiddenError\";\n }\n}\n\nexport class InvalidCredentialsError extends AuthError {\n constructor(message: string = \"Invalid credentials\", details?: Record<string, unknown>) {\n super(message, \"INVALID_CREDENTIALS\", 401, details);\n this.name = \"InvalidCredentialsError\";\n }\n}\n\nexport class SessionExpiredError extends AuthError {\n constructor(message: string = \"Session expired\", details?: Record<string, unknown>) {\n super(message, \"SESSION_EXPIRED\", 401, details);\n this.name = \"SessionExpiredError\";\n }\n}\n\nexport class TwoFactorRequiredError extends AuthError {\n constructor(\n message: string = \"Two-factor authentication required\",\n public readonly challengeId: string,\n details?: Record<string, unknown>\n ) {\n super(message, \"TWO_FACTOR_REQUIRED\", 403, { ...details, challengeId });\n this.name = \"TwoFactorRequiredError\";\n }\n}\n\nexport class AccountLockedError extends AuthError {\n constructor(\n message: string = \"Account locked\",\n public readonly lockedUntil?: Date,\n details?: Record<string, unknown>\n ) {\n super(message, \"ACCOUNT_LOCKED\", 423, { ...details, lockedUntil });\n this.name = \"AccountLockedError\";\n }\n}\n\n// ============================================\n// TENANT ERRORS\n// ============================================\n\nexport class TenantError extends ParsError {\n constructor(\n message: string,\n code: string = \"TENANT_ERROR\",\n statusCode: number = 400,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"TenantError\";\n }\n}\n\nexport class TenantNotFoundError extends TenantError {\n constructor(message: string = \"Tenant not found\", details?: Record<string, unknown>) {\n super(message, \"TENANT_NOT_FOUND\", 404, details);\n this.name = \"TenantNotFoundError\";\n }\n}\n\nexport class TenantSuspendedError extends TenantError {\n constructor(message: string = \"Tenant suspended\", details?: Record<string, unknown>) {\n super(message, \"TENANT_SUSPENDED\", 403, details);\n this.name = \"TenantSuspendedError\";\n }\n}\n\nexport class MembershipError extends TenantError {\n constructor(\n message: string = \"Membership error\",\n code: string = \"MEMBERSHIP_ERROR\",\n statusCode: number = 400,\n details?: Record<string, unknown>\n ) {\n super(message, code, statusCode, details);\n this.name = \"MembershipError\";\n }\n}\n\nexport class MembershipNotFoundError extends MembershipError {\n constructor(message: string = \"Membership not found\", details?: Record<string, unknown>) {\n super(message, \"MEMBERSHIP_NOT_FOUND\", 404, details);\n this.name = \"MembershipNotFoundError\";\n }\n}\n\nexport class MembershipExpiredError extends MembershipError {\n constructor(message: string = \"Membership expired\", details?: Record<string, unknown>) {\n super(message, \"MEMBERSHIP_EXPIRED\", 403, details);\n this.name = \"MembershipExpiredError\";\n }\n}\n\n// ============================================\n// VALIDATION ERRORS\n// ============================================\n\nexport class ValidationError extends ParsError {\n constructor(\n message: string = \"Validation failed\",\n public readonly errors: ValidationErrorDetail[],\n details?: Record<string, unknown>\n ) {\n super(message, \"VALIDATION_ERROR\", 400, { ...details, errors });\n this.name = \"ValidationError\";\n }\n}\n\nexport interface ValidationErrorDetail {\n field: string;\n message: string;\n code?: string;\n}\n\n// ============================================\n// RATE LIMIT ERRORS\n// ============================================\n\nexport class RateLimitError extends ParsError {\n constructor(\n message: string = \"Rate limit exceeded\",\n public readonly retryAfter?: number,\n details?: Record<string, unknown>\n ) {\n super(message, \"RATE_LIMIT_EXCEEDED\", 429, { ...details, retryAfter });\n this.name = \"RateLimitError\";\n }\n}\n\n// ============================================\n// NOT FOUND ERRORS\n// ============================================\n\nexport class NotFoundError extends ParsError {\n constructor(\n resource: string = \"Resource\",\n message?: string,\n details?: Record<string, unknown>\n ) {\n super(message ?? `${resource} not found`, \"NOT_FOUND\", 404, { ...details, resource });\n this.name = \"NotFoundError\";\n }\n}\n\n// ============================================\n// CONFLICT ERRORS\n// ============================================\n\nexport class ConflictError extends ParsError {\n constructor(message: string = \"Conflict\", details?: Record<string, unknown>) {\n super(message, \"CONFLICT\", 409, details);\n this.name = \"ConflictError\";\n }\n}\n\nexport class DuplicateError extends ConflictError {\n constructor(\n resource: string = \"Resource\",\n field?: string,\n details?: Record<string, unknown>\n ) {\n super(`${resource} already exists${field ? ` with this ${field}` : \"\"}`, {\n ...details,\n resource,\n field,\n });\n this.name = \"DuplicateError\";\n }\n}\n","/**\n * @parsrun/core - Error Code Catalog\n * Centralized error code definitions for the entire framework\n */\n\n/**\n * Error category for grouping and filtering\n */\nexport type ErrorCategory =\n | \"auth\"\n | \"tenant\"\n | \"validation\"\n | \"resource\"\n | \"rate_limit\"\n | \"server\"\n | \"database\"\n | \"external\";\n\n/**\n * Error code definition\n */\nexport interface ErrorCodeDefinition {\n readonly code: string;\n readonly status: number;\n readonly category: ErrorCategory;\n readonly retryable?: boolean;\n}\n\n/**\n * Centralized error code catalog\n * All error codes used throughout the framework are defined here\n */\nexport const ErrorCodes = {\n // ============================================================================\n // Authentication Errors (401, 403, 423)\n // ============================================================================\n AUTH_ERROR: {\n code: \"AUTH_ERROR\",\n status: 401,\n category: \"auth\",\n },\n UNAUTHORIZED: {\n code: \"UNAUTHORIZED\",\n status: 401,\n category: \"auth\",\n },\n FORBIDDEN: {\n code: \"FORBIDDEN\",\n status: 403,\n category: \"auth\",\n },\n INVALID_CREDENTIALS: {\n code: \"INVALID_CREDENTIALS\",\n status: 401,\n category: \"auth\",\n },\n SESSION_EXPIRED: {\n code: \"SESSION_EXPIRED\",\n status: 401,\n category: \"auth\",\n },\n TOKEN_EXPIRED: {\n code: \"TOKEN_EXPIRED\",\n status: 401,\n category: \"auth\",\n },\n TOKEN_INVALID: {\n code: \"TOKEN_INVALID\",\n status: 401,\n category: \"auth\",\n },\n TWO_FACTOR_REQUIRED: {\n code: \"TWO_FACTOR_REQUIRED\",\n status: 403,\n category: \"auth\",\n },\n TWO_FACTOR_INVALID: {\n code: \"TWO_FACTOR_INVALID\",\n status: 401,\n category: \"auth\",\n },\n ACCOUNT_LOCKED: {\n code: \"ACCOUNT_LOCKED\",\n status: 423,\n category: \"auth\",\n },\n ACCOUNT_DISABLED: {\n code: \"ACCOUNT_DISABLED\",\n status: 403,\n category: \"auth\",\n },\n PASSWORD_RESET_REQUIRED: {\n code: \"PASSWORD_RESET_REQUIRED\",\n status: 403,\n category: \"auth\",\n },\n\n // ============================================================================\n // Tenant Errors (400, 403, 404)\n // ============================================================================\n TENANT_ERROR: {\n code: \"TENANT_ERROR\",\n status: 400,\n category: \"tenant\",\n },\n TENANT_NOT_FOUND: {\n code: \"TENANT_NOT_FOUND\",\n status: 404,\n category: \"tenant\",\n },\n TENANT_SUSPENDED: {\n code: \"TENANT_SUSPENDED\",\n status: 403,\n category: \"tenant\",\n },\n TENANT_LIMIT_EXCEEDED: {\n code: \"TENANT_LIMIT_EXCEEDED\",\n status: 403,\n category: \"tenant\",\n },\n MEMBERSHIP_ERROR: {\n code: \"MEMBERSHIP_ERROR\",\n status: 400,\n category: \"tenant\",\n },\n MEMBERSHIP_NOT_FOUND: {\n code: \"MEMBERSHIP_NOT_FOUND\",\n status: 404,\n category: \"tenant\",\n },\n MEMBERSHIP_EXPIRED: {\n code: \"MEMBERSHIP_EXPIRED\",\n status: 403,\n category: \"tenant\",\n },\n\n // ============================================================================\n // Validation Errors (400, 422)\n // ============================================================================\n VALIDATION_ERROR: {\n code: \"VALIDATION_ERROR\",\n status: 400,\n category: \"validation\",\n },\n BAD_REQUEST: {\n code: \"BAD_REQUEST\",\n status: 400,\n category: \"validation\",\n },\n INVALID_INPUT: {\n code: \"INVALID_INPUT\",\n status: 422,\n category: \"validation\",\n },\n MISSING_REQUIRED_FIELD: {\n code: \"MISSING_REQUIRED_FIELD\",\n status: 400,\n category: \"validation\",\n },\n INVALID_FORMAT: {\n code: \"INVALID_FORMAT\",\n status: 400,\n category: \"validation\",\n },\n\n // ============================================================================\n // Resource Errors (404, 409, 410)\n // ============================================================================\n NOT_FOUND: {\n code: \"NOT_FOUND\",\n status: 404,\n category: \"resource\",\n },\n CONFLICT: {\n code: \"CONFLICT\",\n status: 409,\n category: \"resource\",\n },\n DUPLICATE: {\n code: \"DUPLICATE\",\n status: 409,\n category: \"resource\",\n },\n GONE: {\n code: \"GONE\",\n status: 410,\n category: \"resource\",\n },\n RESOURCE_LOCKED: {\n code: \"RESOURCE_LOCKED\",\n status: 423,\n category: \"resource\",\n },\n\n // ============================================================================\n // Rate Limiting (429)\n // ============================================================================\n RATE_LIMIT_EXCEEDED: {\n code: \"RATE_LIMIT_EXCEEDED\",\n status: 429,\n category: \"rate_limit\",\n retryable: true,\n },\n QUOTA_EXCEEDED: {\n code: \"QUOTA_EXCEEDED\",\n status: 429,\n category: \"rate_limit\",\n },\n\n // ============================================================================\n // Server Errors (500, 502, 503, 504)\n // ============================================================================\n INTERNAL_ERROR: {\n code: \"INTERNAL_ERROR\",\n status: 500,\n category: \"server\",\n },\n BAD_GATEWAY: {\n code: \"BAD_GATEWAY\",\n status: 502,\n category: \"server\",\n retryable: true,\n },\n SERVICE_UNAVAILABLE: {\n code: \"SERVICE_UNAVAILABLE\",\n status: 503,\n category: \"server\",\n retryable: true,\n },\n GATEWAY_TIMEOUT: {\n code: \"GATEWAY_TIMEOUT\",\n status: 504,\n category: \"server\",\n retryable: true,\n },\n\n // ============================================================================\n // Database Errors (500)\n // ============================================================================\n DATABASE_ERROR: {\n code: \"DATABASE_ERROR\",\n status: 500,\n category: \"database\",\n },\n CONNECTION_ERROR: {\n code: \"CONNECTION_ERROR\",\n status: 503,\n category: \"database\",\n retryable: true,\n },\n TRANSACTION_ERROR: {\n code: \"TRANSACTION_ERROR\",\n status: 500,\n category: \"database\",\n },\n RLS_ERROR: {\n code: \"RLS_ERROR\",\n status: 500,\n category: \"database\",\n },\n\n // ============================================================================\n // External Service Errors (502, 503)\n // ============================================================================\n EXTERNAL_SERVICE_ERROR: {\n code: \"EXTERNAL_SERVICE_ERROR\",\n status: 502,\n category: \"external\",\n retryable: true,\n },\n EXTERNAL_TIMEOUT: {\n code: \"EXTERNAL_TIMEOUT\",\n status: 504,\n category: \"external\",\n retryable: true,\n },\n} as const;\n\n/**\n * Error code type (union of all error code keys)\n */\nexport type ErrorCode = keyof typeof ErrorCodes;\n\n/**\n * Get error code definition by code string\n */\nexport function getErrorCode(code: string): ErrorCodeDefinition | undefined {\n return (ErrorCodes as Record<string, ErrorCodeDefinition>)[code];\n}\n\n/**\n * Get all error codes by category\n */\nexport function getErrorCodesByCategory(\n category: ErrorCategory\n): ErrorCodeDefinition[] {\n return Object.values(ErrorCodes).filter((e) => e.category === category);\n}\n\n/**\n * Check if an error code is retryable\n */\nexport function isRetryableError(code: string): boolean {\n const errorCode = getErrorCode(code);\n return errorCode?.retryable === true;\n}\n\n/**\n * Get HTTP status for an error code\n */\nexport function getStatusForCode(code: string): number {\n const errorCode = getErrorCode(code);\n return errorCode?.status ?? 500;\n}\n","/**\n * @parsrun/core - Axiom Transport\n * Log ingestion transport for Axiom (axiom.co)\n * Uses native fetch - works on all runtimes (Node, Deno, Bun, Workers)\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type { LogTransport, BatchTransportOptions } from \"./types.js\";\n\n/**\n * Axiom transport options\n */\nexport interface AxiomTransportOptions extends BatchTransportOptions {\n /** Axiom API token */\n token: string;\n /** Dataset name to ingest logs into */\n dataset: string;\n /** Organization ID (optional, for personal tokens) */\n orgId?: string;\n /** Custom Axiom API URL (default: https://api.axiom.co) */\n apiUrl?: string;\n /** Callback for errors during ingestion */\n onError?: (error: Error, droppedCount: number) => void;\n}\n\n/**\n * Axiom log event structure\n */\ninterface AxiomEvent {\n _time: string;\n level: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Axiom Transport\n * Batches logs and sends them to Axiom's ingest API\n */\nexport class AxiomTransport implements LogTransport {\n readonly name = \"axiom\";\n\n private buffer: AxiomEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private readonly options: Required<\n Pick<AxiomTransportOptions, \"batchSize\" | \"flushInterval\" | \"apiUrl\">\n > &\n AxiomTransportOptions;\n\n constructor(options: AxiomTransportOptions) {\n this.options = {\n batchSize: 100,\n flushInterval: 5000,\n apiUrl: \"https://api.axiom.co\",\n ...options,\n };\n\n // Start flush interval if enabled\n if (this.options.flushInterval > 0) {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.options.flushInterval\n );\n }\n }\n\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n const event: AxiomEvent = {\n _time: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add context fields\n if (entry.context) {\n Object.assign(event, entry.context);\n }\n\n // Add error fields\n if (entry.error) {\n event[\"error.name\"] = entry.error.name;\n event[\"error.message\"] = entry.error.message;\n event[\"error.stack\"] = entry.error.stack;\n }\n\n this.buffer.push(event);\n\n // Flush if buffer is full\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing || this.buffer.length === 0) return;\n\n this.isFlushing = true;\n const events = this.buffer;\n this.buffer = [];\n\n try {\n const response = await fetch(\n `${this.options.apiUrl}/v1/datasets/${this.options.dataset}/ingest`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n ...(this.options.orgId && {\n \"X-Axiom-Org-Id\": this.options.orgId,\n }),\n },\n body: JSON.stringify(events),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Axiom ingest failed: ${response.status} ${errorText}`);\n }\n } catch (error) {\n // Call error handler if provided\n if (this.options.onError) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error)),\n events.length\n );\n } else {\n // Silent fail by default - don't crash the app for logging failures\n console.error(\"[Axiom] Failed to send logs:\", error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n async close(): Promise<void> {\n // Stop flush timer\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Final flush\n await this.flush();\n }\n}\n\n/**\n * Create Axiom transport\n */\nexport function createAxiomTransport(\n options: AxiomTransportOptions\n): AxiomTransport {\n return new AxiomTransport(options);\n}\n","/**\n * @parsrun/core - Sentry Transport\n * Error tracking transport for Sentry\n *\n * Supports two modes:\n * 1. HTTP API mode (default) - Zero dependency, works on all runtimes\n * 2. SDK mode (BYOS) - Full features with user-provided Sentry SDK\n *\n * @example HTTP API mode (simple, universal)\n * ```typescript\n * const sentry = new SentryTransport({\n * dsn: 'https://xxx@sentry.io/123',\n * environment: 'production',\n * });\n * ```\n *\n * @example SDK mode (full features)\n * ```typescript\n * import * as Sentry from '@sentry/cloudflare'; // or @sentry/node\n *\n * Sentry.init({ dsn: '...' });\n *\n * const sentry = new SentryTransport({\n * client: Sentry,\n * });\n * ```\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type {\n LogTransport,\n ErrorTransport,\n ErrorContext,\n ErrorUser,\n Breadcrumb,\n BaseTransportOptions,\n} from \"./types.js\";\n\n/**\n * Sentry SDK interface (minimal interface for BYOS)\n * Compatible with @sentry/node, @sentry/cloudflare, @sentry/browser, etc.\n */\nexport interface SentryClient {\n captureException(error: Error, hint?: unknown): string;\n captureMessage(message: string, level?: string): string;\n withScope(callback: (scope: SentryScope) => void): void;\n flush?(timeout?: number): Promise<boolean>;\n}\n\nexport interface SentryScope {\n setTag(key: string, value: string): void;\n setUser(user: { id: string; email?: string; [key: string]: unknown } | null): void;\n setExtra(key: string, value: unknown): void;\n setExtras(extras: Record<string, unknown>): void;\n setLevel(level: string): void;\n addBreadcrumb(breadcrumb: unknown): void;\n}\n\n/**\n * Parsed DSN components\n */\ninterface ParsedDSN {\n protocol: string;\n publicKey: string;\n host: string;\n projectId: string;\n}\n\n/**\n * Sentry transport options\n */\nexport interface SentryTransportOptions extends BaseTransportOptions {\n /**\n * Sentry DSN (required for HTTP mode)\n * Format: https://{publicKey}@{host}/{projectId}\n */\n dsn?: string;\n\n /**\n * Sentry SDK client (for BYOS mode)\n * Pass your initialized Sentry client for full SDK features\n */\n client?: SentryClient;\n\n /** Environment name (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Release version */\n release?: string;\n\n /** Server name */\n serverName?: string;\n\n /** Sample rate for error events (0.0 to 1.0) */\n sampleRate?: number;\n\n /** Additional tags to add to all events */\n tags?: Record<string, string>;\n\n /** Callback before sending (return null to drop event) */\n beforeSend?: (event: SentryEvent) => SentryEvent | null;\n\n /** Callback for transport errors */\n onError?: (error: Error) => void;\n}\n\n/**\n * Sentry event structure (simplified)\n */\nexport interface SentryEvent {\n event_id: string;\n timestamp: string;\n platform: string;\n level: \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n logger?: string;\n transaction?: string;\n server_name?: string;\n release?: string;\n environment?: string;\n message?: { formatted: string };\n exception?: {\n values: Array<{\n type: string;\n value: string;\n stacktrace?: {\n frames: Array<{\n filename?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n in_app?: boolean;\n }>;\n };\n }>;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n user?: {\n id?: string;\n email?: string;\n username?: string;\n [key: string]: unknown;\n };\n breadcrumbs?: Array<{\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n }>;\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Sentry Transport\n * Implements both LogTransport and ErrorTransport\n */\nexport class SentryTransport implements LogTransport, ErrorTransport {\n readonly name = \"sentry\";\n\n private readonly client?: SentryClient;\n private readonly dsn?: ParsedDSN;\n private readonly options: SentryTransportOptions;\n private user: ErrorUser | null = null;\n private contexts: Map<string, Record<string, unknown>> = new Map();\n private breadcrumbs: Breadcrumb[] = [];\n private readonly maxBreadcrumbs = 100;\n\n constructor(options: SentryTransportOptions) {\n this.options = {\n sampleRate: 1.0,\n ...options,\n };\n\n if (options.client) {\n this.client = options.client;\n } else if (options.dsn) {\n this.dsn = this.parseDSN(options.dsn);\n } else {\n throw new Error(\"SentryTransport requires either 'dsn' or 'client' option\");\n }\n }\n\n /**\n * Parse Sentry DSN\n */\n private parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(/^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/);\n if (!match || !match[1] || !match[2] || !match[3] || !match[4]) {\n throw new Error(`Invalid Sentry DSN: ${dsn}`);\n }\n return {\n protocol: match[1],\n publicKey: match[2],\n host: match[3],\n projectId: match[4],\n };\n }\n\n /**\n * LogTransport implementation\n * Only sends ERROR and FATAL level logs\n */\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n // Only capture errors\n if (entry.levelValue < 50) return; // ERROR = 50, FATAL = 60\n\n if (entry.error) {\n const error = new Error(entry.error.message);\n error.name = entry.error.name;\n if (entry.error.stack) {\n error.stack = entry.error.stack;\n }\n\n this.captureException(\n error,\n entry.context ? { extra: entry.context } : undefined\n );\n } else {\n this.captureMessage(\n entry.message,\n entry.level === \"FATAL\" ? \"error\" : \"warning\",\n entry.context ? { extra: entry.context } : undefined\n );\n }\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: ErrorContext): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.captureWithSdk(error, context);\n } else {\n this.captureWithHttp(error, context);\n }\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: \"info\" | \"warning\" | \"error\",\n context?: ErrorContext\n ): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.client.withScope((scope) => {\n this.applyContext(scope, context);\n scope.setLevel(level);\n this.client!.captureMessage(message, level);\n });\n } else {\n this.sendHttpEvent({\n level: level === \"warning\" ? \"warning\" : level === \"info\" ? \"info\" : \"error\",\n message: { formatted: message },\n ...this.buildEventContext(context),\n });\n }\n }\n\n /**\n * Set user context\n */\n setUser(user: ErrorUser | null): void {\n this.user = user;\n }\n\n /**\n * Set custom context\n */\n setContext(name: string, context: Record<string, unknown>): void {\n this.contexts.set(name, context);\n }\n\n /**\n * Add breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: breadcrumb.timestamp ?? Date.now() / 1000,\n });\n\n // Keep only last N breadcrumbs\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n\n /**\n * Flush pending events\n */\n async flush(): Promise<void> {\n if (this.client?.flush) {\n await this.client.flush(2000);\n }\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private shouldSample(): boolean {\n const rate = this.options.sampleRate ?? 1.0;\n return Math.random() < rate;\n }\n\n /**\n * Capture with SDK (BYOS mode)\n */\n private captureWithSdk(error: Error, context?: ErrorContext): void {\n this.client!.withScope((scope) => {\n this.applyContext(scope, context);\n this.client!.captureException(error);\n });\n }\n\n /**\n * Apply context to SDK scope\n */\n private applyContext(scope: SentryScope, context?: ErrorContext): void {\n // User\n if (this.user) {\n scope.setUser(this.user);\n } else if (context?.userId) {\n scope.setUser({ id: context.userId });\n }\n\n // Tags\n if (this.options.tags) {\n for (const [key, value] of Object.entries(this.options.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.tags) {\n for (const [key, value] of Object.entries(context.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.requestId) {\n scope.setTag(\"requestId\", context.requestId);\n }\n if (context?.tenantId) {\n scope.setTag(\"tenantId\", context.tenantId);\n }\n\n // Extra\n if (context?.extra) {\n scope.setExtras(context.extra);\n }\n\n // Breadcrumbs\n for (const bc of this.breadcrumbs) {\n scope.addBreadcrumb(bc);\n }\n }\n\n /**\n * Capture with HTTP API (default mode)\n */\n private captureWithHttp(error: Error, context?: ErrorContext): void {\n const stacktrace = this.parseStackTrace(error.stack);\n const exceptionValue: {\n type: string;\n value: string;\n stacktrace?: { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> };\n } = {\n type: error.name,\n value: error.message,\n };\n\n if (stacktrace) {\n exceptionValue.stacktrace = stacktrace;\n }\n\n const event: Partial<SentryEvent> = {\n level: \"error\",\n exception: {\n values: [exceptionValue],\n },\n ...this.buildEventContext(context),\n };\n\n this.sendHttpEvent(event);\n }\n\n /**\n * Build event context for HTTP API\n */\n private buildEventContext(context?: ErrorContext): Partial<SentryEvent> {\n const event: Partial<SentryEvent> = {};\n\n // Environment & Release\n if (this.options.environment) {\n event.environment = this.options.environment;\n }\n if (this.options.release) {\n event.release = this.options.release;\n }\n if (this.options.serverName) {\n event.server_name = this.options.serverName;\n }\n\n // Tags\n const tags: Record<string, string> = { ...this.options.tags };\n if (context?.tags) {\n Object.assign(tags, context.tags);\n }\n if (context?.requestId) {\n tags[\"requestId\"] = context.requestId;\n }\n if (context?.tenantId) {\n tags[\"tenantId\"] = context.tenantId;\n }\n if (Object.keys(tags).length > 0) {\n event.tags = tags;\n }\n\n // Extra\n if (context?.extra) {\n event.extra = context.extra;\n }\n\n // User\n if (this.user) {\n event.user = this.user;\n } else if (context?.userId) {\n event.user = { id: context.userId };\n }\n\n // Breadcrumbs\n if (this.breadcrumbs.length > 0) {\n event.breadcrumbs = this.breadcrumbs.map((bc) => {\n const crumb: {\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n } = {};\n if (bc.type) crumb.type = bc.type;\n if (bc.category) crumb.category = bc.category;\n if (bc.message) crumb.message = bc.message;\n if (bc.data) crumb.data = bc.data;\n if (bc.level) crumb.level = bc.level;\n if (bc.timestamp !== undefined) crumb.timestamp = bc.timestamp;\n return crumb;\n });\n }\n\n // Contexts\n if (this.contexts.size > 0) {\n event.contexts = Object.fromEntries(this.contexts);\n }\n\n return event;\n }\n\n /**\n * Parse error stack trace into Sentry format\n */\n private parseStackTrace(\n stack?: string\n ): { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> } | undefined {\n if (!stack) return undefined;\n\n const lines = stack.split(\"\\n\").slice(1); // Skip first line (error message)\n const frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> = [];\n\n for (const line of lines) {\n // Parse V8 stack trace format\n const match = line.match(/^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (match && match[3] && match[4]) {\n const frame: { filename?: string; function?: string; lineno?: number; colno?: number } = {\n function: match[1] || \"<anonymous>\",\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n };\n if (match[2]) {\n frame.filename = match[2];\n }\n frames.push(frame);\n }\n }\n\n // Sentry expects oldest frame first\n frames.reverse();\n\n return frames.length > 0 ? { frames } : undefined;\n }\n\n /**\n * Generate event ID\n */\n private generateEventId(): string {\n // 32 character hex string\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Send event via HTTP API\n */\n private async sendHttpEvent(eventData: Partial<SentryEvent>): Promise<void> {\n if (!this.dsn) return;\n\n const event: SentryEvent = {\n event_id: this.generateEventId(),\n timestamp: new Date().toISOString(),\n platform: \"javascript\",\n level: \"error\",\n ...eventData,\n };\n\n // Apply beforeSend hook\n if (this.options.beforeSend) {\n const result = this.options.beforeSend(event);\n if (result === null) return;\n }\n\n const url = `${this.dsn.protocol}://${this.dsn.host}/api/${this.dsn.projectId}/store/`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Sentry-Auth\": [\n \"Sentry sentry_version=7\",\n `sentry_client=pars-sentry/1.0.0`,\n `sentry_key=${this.dsn.publicKey}`,\n ].join(\", \"),\n },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n throw new Error(`Sentry API error: ${response.status}`);\n }\n } catch (error) {\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n // Silent fail - don't crash the app for logging failures\n }\n }\n}\n\n/**\n * Create Sentry transport\n */\nexport function createSentryTransport(options: SentryTransportOptions): SentryTransport {\n return new SentryTransport(options);\n}\n","/**\n * @parsrun/core - Logtape Transport\n * Structured logging transport for Logtape (@logtape/logtape)\n *\n * Logtape is a TypeScript-first structured logging library.\n * This transport bridges Pars Logger to Logtape for advanced logging scenarios.\n *\n * @example BYOS (Bring Your Own SDK)\n * ```typescript\n * import { getLogger, configure } from '@logtape/logtape';\n *\n * // Configure Logtape\n * await configure({\n * sinks: { console: consoleSink() },\n * loggers: [{ category: 'pars', sinks: ['console'], level: 'info' }],\n * });\n *\n * const logtapeLogger = getLogger('pars');\n * const transport = new LogtapeTransport({ logger: logtapeLogger });\n * ```\n *\n * @example Simple mode (creates internal logger)\n * ```typescript\n * const transport = new LogtapeTransport({\n * category: 'my-app',\n * });\n * ```\n */\n\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport, BaseTransportOptions } from \"./types.js\";\n\n/**\n * Logtape Logger interface (minimal interface for BYOS)\n * Compatible with @logtape/logtape getLogger() return type\n */\nexport interface LogtapeLogger {\n debug(message: string, properties?: Record<string, unknown>): void;\n info(message: string, properties?: Record<string, unknown>): void;\n warn(message: string, properties?: Record<string, unknown>): void;\n warning(message: string, properties?: Record<string, unknown>): void;\n error(message: string, properties?: Record<string, unknown>): void;\n fatal(message: string, properties?: Record<string, unknown>): void;\n}\n\n/**\n * Level mapping from Pars to Logtape\n */\ntype LogtapeLevel = \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\n/**\n * Logtape transport options\n */\nexport interface LogtapeTransportOptions extends BaseTransportOptions {\n /**\n * Logtape logger instance (for BYOS mode)\n * Get this from @logtape/logtape's getLogger()\n */\n logger?: LogtapeLogger;\n\n /**\n * Category name for the logger\n * Only used if logger is not provided (creates a simple fallback logger)\n */\n category?: string;\n\n /**\n * Include timestamp in properties\n * @default true\n */\n includeTimestamp?: boolean;\n\n /**\n * Include level value in properties\n * @default false\n */\n includeLevelValue?: boolean;\n}\n\n/**\n * Simple fallback logger when no Logtape instance is provided\n * Just outputs structured JSON - users should use BYOS for full features\n */\nclass FallbackLogger implements LogtapeLogger {\n constructor(private category: string) {}\n\n private log(level: string, message: string, properties?: Record<string, unknown>): void {\n const entry = {\n level,\n category: this.category,\n msg: message,\n time: new Date().toISOString(),\n ...properties,\n };\n console.log(JSON.stringify(entry));\n }\n\n debug(message: string, properties?: Record<string, unknown>): void {\n this.log(\"debug\", message, properties);\n }\n\n info(message: string, properties?: Record<string, unknown>): void {\n this.log(\"info\", message, properties);\n }\n\n warn(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warn\", message, properties);\n }\n\n warning(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warning\", message, properties);\n }\n\n error(message: string, properties?: Record<string, unknown>): void {\n this.log(\"error\", message, properties);\n }\n\n fatal(message: string, properties?: Record<string, unknown>): void {\n this.log(\"fatal\", message, properties);\n }\n}\n\n/**\n * Logtape Transport\n * Bridges Pars Logger to Logtape\n */\nexport class LogtapeTransport implements LogTransport {\n readonly name = \"logtape\";\n\n private readonly logger: LogtapeLogger;\n private readonly includeTimestamp: boolean;\n private readonly includeLevelValue: boolean;\n private readonly enabled: boolean;\n\n constructor(options: LogtapeTransportOptions = {}) {\n this.enabled = options.enabled !== false;\n this.includeTimestamp = options.includeTimestamp !== false;\n this.includeLevelValue = options.includeLevelValue ?? false;\n\n if (options.logger) {\n this.logger = options.logger;\n } else {\n // Create fallback logger\n this.logger = new FallbackLogger(options.category ?? \"pars\");\n }\n }\n\n log(entry: LogEntry): void {\n if (!this.enabled) return;\n\n const level = this.mapLevel(entry.level);\n const properties = this.buildProperties(entry);\n\n // Call the appropriate log method\n this.logger[level](entry.message, properties);\n }\n\n /**\n * Map Pars log level to Logtape level\n */\n private mapLevel(level: LogLevelName): LogtapeLevel {\n const mapping: Record<LogLevelName, LogtapeLevel> = {\n TRACE: \"debug\",\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warning\",\n ERROR: \"error\",\n FATAL: \"fatal\",\n SILENT: \"debug\", // Should never be logged\n };\n return mapping[level];\n }\n\n /**\n * Build properties object for Logtape\n */\n private buildProperties(entry: LogEntry): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Add timestamp if enabled\n if (this.includeTimestamp) {\n properties[\"timestamp\"] = entry.timestamp;\n }\n\n // Add level value if enabled\n if (this.includeLevelValue) {\n properties[\"levelValue\"] = entry.levelValue;\n }\n\n // Add context\n if (entry.context) {\n Object.assign(properties, entry.context);\n }\n\n // Add error info\n if (entry.error) {\n properties[\"error\"] = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return properties;\n }\n}\n\n/**\n * Create Logtape transport\n */\nexport function createLogtapeTransport(\n options?: LogtapeTransportOptions\n): LogtapeTransport {\n return new LogtapeTransport(options);\n}\n","/**\n * @parsrun/core\n * Core utilities and types for Pars framework\n * Edge-compatible, zero dependencies\n */\n\n// ============================================\n// RUNTIME & ENVIRONMENT\n// ============================================\n\nexport {\n detectRuntime,\n runtime,\n runtimeInfo,\n isNode,\n isDeno,\n isBun,\n isCloudflare,\n isEdge,\n isBrowser,\n isServer,\n getRuntimeVersion,\n type Runtime,\n} from \"./runtime.js\";\n\nexport {\n getEnv,\n requireEnv,\n getEnvNumber,\n getEnvFloat,\n getEnvBoolean,\n getEnvArray,\n getEnvJson,\n setEdgeEnv,\n clearEdgeEnv,\n isDevelopment,\n isProduction,\n isTest,\n getEnvMode,\n createEnvConfig,\n type EnvMode,\n} from \"./env.js\";\n\n// ============================================\n// LOGGING\n// ============================================\n\nexport {\n Logger,\n ConsoleTransport,\n LogLevel,\n createLogger,\n logger,\n logError,\n measureTime,\n createRequestLogger,\n type LogLevelName,\n type LogLevelValue,\n type LogEntry,\n type LogTransport,\n type LoggerConfig,\n} from \"./logger.js\";\n\n// ============================================\n// DECIMAL / MATH\n// ============================================\n\nexport {\n Decimal,\n DecimalUtils,\n decimal,\n} from \"./decimal.js\";\n\n// ============================================\n// TYPES\n// ============================================\n\nexport * from \"./types.js\";\n\n// ============================================\n// ERRORS\n// ============================================\n\nexport * from \"./errors.js\";\n\n// ============================================\n// ERROR CODES\n// ============================================\n\nexport {\n ErrorCodes,\n getErrorCode,\n getErrorCodesByCategory,\n isRetryableError,\n getStatusForCode,\n type ErrorCode,\n type ErrorCategory,\n type ErrorCodeDefinition,\n} from \"./error-codes.js\";\n\n// ============================================\n// TRANSPORTS (additional - ConsoleTransport already in logger.js)\n// ============================================\n\nexport {\n // Error transport types (LogTransport is in logger.js)\n type ErrorTransport,\n type CombinedTransport,\n type ErrorContext,\n type ErrorUser,\n type Breadcrumb,\n type BaseTransportOptions,\n type BatchTransportOptions,\n // Axiom\n AxiomTransport,\n createAxiomTransport,\n type AxiomTransportOptions,\n // Sentry\n SentryTransport,\n createSentryTransport,\n type SentryTransportOptions,\n type SentryClient,\n type SentryEvent,\n // Logtape\n LogtapeTransport,\n createLogtapeTransport,\n type LogtapeTransportOptions,\n type LogtapeLogger,\n} from \"./transports/index.js\";\n\n// ============================================\n// UTILITY FUNCTIONS\n// ============================================\n\n/**\n * Generate a cryptographically secure random string (hex)\n */\nexport async function generateRandomString(length: number): Promise<string> {\n const bytes = new Uint8Array(length);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Generate a UUID v4\n */\nexport function generateId(): string {\n return crypto.randomUUID();\n}\n\n/**\n * Hash a string using SHA-256\n */\nexport async function sha256(input: string): Promise<string> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n const hash = await crypto.subtle.digest(\"SHA-256\", data);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n/**\n * Hash a string using SHA-256 and return as ArrayBuffer\n */\nexport async function sha256Bytes(input: string): Promise<ArrayBuffer> {\n const encoder = new TextEncoder();\n const data = encoder.encode(input);\n return crypto.subtle.digest(\"SHA-256\", data);\n}\n\n/**\n * Constant-time string comparison (timing-safe)\n */\nexport function constantTimeEquals(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n\n const aBytes = new TextEncoder().encode(a);\n const bBytes = new TextEncoder().encode(b);\n\n let result = 0;\n for (let i = 0; i < aBytes.length; i++) {\n result |= aBytes[i]! ^ bBytes[i]!;\n }\n\n return result === 0;\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Retry a function with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxRetries?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n backoffMultiplier?: number;\n shouldRetry?: (error: unknown) => boolean;\n onRetry?: (error: unknown, attempt: number) => void;\n } = {}\n): Promise<T> {\n const {\n maxRetries = 3,\n initialDelayMs = 1000,\n maxDelayMs = 30000,\n backoffMultiplier = 2,\n shouldRetry = () => true,\n onRetry,\n } = options;\n\n let lastError: unknown;\n let delay = initialDelayMs;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxRetries || !shouldRetry(error)) {\n throw error;\n }\n\n onRetry?.(error, attempt + 1);\n await sleep(delay);\n delay = Math.min(delay * backoffMultiplier, maxDelayMs);\n }\n }\n\n throw lastError;\n}\n\n/**\n * Omit keys from an object\n */\nexport function omit<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n\n/**\n * Pick keys from an object\n */\nexport function pick<T extends object, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (key in obj) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Deep merge two objects\n */\nexport function deepMerge<T extends object>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key of Object.keys(source) as (keyof T)[]) {\n const sourceValue = source[key];\n const targetValue = target[key];\n\n if (\n sourceValue !== undefined &&\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof targetValue === \"object\" &&\n targetValue !== null &&\n !Array.isArray(targetValue)\n ) {\n result[key] = deepMerge(\n targetValue as object,\n sourceValue as object\n ) as T[keyof T];\n } else if (sourceValue !== undefined) {\n result[key] = sourceValue as T[keyof T];\n }\n }\n\n return result;\n}\n\n/**\n * Deep clone an object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n const cloned = {} as T;\n for (const key of Object.keys(obj) as (keyof T)[]) {\n cloned[key] = deepClone(obj[key]);\n }\n return cloned;\n}\n\n/**\n * Check if a value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Object.prototype.toString.call(value) === \"[object Object]\"\n );\n}\n\n/**\n * Check if value is null or undefined\n */\nexport function isNil(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/**\n * Check if value is empty (null, undefined, empty string, empty array, empty object)\n */\nexport function isEmpty(value: unknown): boolean {\n if (isNil(value)) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n if (isPlainObject(value)) return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * Normalize email address\n */\nexport function normalizeEmail(email: string): string {\n return email.toLowerCase().trim();\n}\n\n/**\n * Validate email format\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Generate a URL-friendly slug from a string\n */\nexport function slugify(str: string): string {\n return str\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n/**\n * Truncate string to a maximum length\n */\nexport function truncate(str: string, maxLength: number, suffix: string = \"...\"): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - suffix.length) + suffix;\n}\n\n/**\n * Debounce a function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n fn: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n fn(...args);\n timeoutId = null;\n }, wait);\n };\n}\n\n/**\n * Throttle a function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n fn: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastTime = 0;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastTime >= wait) {\n lastTime = now;\n fn(...args);\n }\n };\n}\n\n/**\n * Create a deferred promise\n */\nexport function createDeferred<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (reason?: unknown) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Run promises with concurrency limit\n */\nexport async function pLimit<T>(\n tasks: (() => Promise<T>)[],\n concurrency: number\n): Promise<T[]> {\n const results: T[] = [];\n const executing: Promise<void>[] = [];\n\n for (const [index, task] of tasks.entries()) {\n const p = Promise.resolve().then(async () => {\n results[index] = await task();\n });\n\n executing.push(p);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(\n executing.findIndex((e) => e === p),\n 1\n );\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n"],"mappings":";AAUO,SAAS,gBAAyB;AAEvC,MAAI,OAAO,eAAe,eAAe,SAAS,YAAY;AAC5D,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,eAAe,eAAe,UAAU,YAAY;AAC7D,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,WAAW,eACtC,OAAQ,WAAmB,YAAY,aACvC;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,gBAAgB,aAC3C;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,WAAW,eACtC,OAAQ,WAAmB,aAAa,aACxC;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,SAAS,MACjB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,IAAM,UAAU,cAAc;AAK9B,IAAM,cAAc;AAAA,EACzB;AAAA,EACA,QAAQ,YAAY;AAAA,EACpB,QAAQ,YAAY;AAAA,EACpB,OAAO,YAAY;AAAA,EACnB,cAAc,YAAY;AAAA,EAC1B,QAAQ,YAAY,gBAAgB,YAAY,UAAU,YAAY;AAAA,EACtE,WAAW,YAAY;AAAA,EACvB,UAAU,YAAY;AAAA,EACtB,mBAAmB,OAAO,WAAW,QAAQ,WAAW;AAAA,EACxD,iBAAiB,OAAO,WAAW,mBAAmB;AACxD;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,QAAiB;AAC/B,SAAO,YAAY;AACrB;AAKO,SAAS,eAAwB;AACtC,SAAO,YAAY;AACrB;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,YAAqB;AACnC,SAAO,YAAY;AACrB;AAKO,SAAS,WAAoB;AAClC,SAAO,YAAY;AACrB;AAKO,SAAS,oBAA4B;AAC1C,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,WAAW,SAAS,UAAU,QAAQ,SAAS;AAAA,IACxD,KAAK;AACH,aAAO,OAAQ,WAAmB,IAAI,OAAO;AAAA,IAC/C,KAAK;AACH,aAAO,QAAS,WAAmB,KAAK,QAAQ,IAAI;AAAA,IACtD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,IAClE;AACE,aAAO;AAAA,EACX;AACF;;;ACzIA,IAAI,eAAmD,CAAC;AAgBjD,SAAS,WAAW,KAA+C;AACxE,iBAAe,EAAE,GAAG,cAAc,GAAG,IAAI;AAC3C;AAKO,SAAS,eAAqB;AACnC,iBAAe,CAAC;AAClB;AAMO,SAAS,OAAO,KAAa,cAA2C;AAE7E,MAAI,YAAY,gBAAgB,YAAY,QAAQ;AAClD,WAAO,aAAa,GAAG,KAAK;AAAA,EAC9B;AAGA,MAAI,YAAY,QAAQ;AACtB,QAAI;AACF,aAAQ,WAAmB,KAAK,IAAI,IAAI,GAAG,KAAK;AAAA,IAClD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAGA,MAAI,OAAO,YAAY,eAAe,QAAQ,KAAK;AACjD,WAAO,QAAQ,IAAI,GAAG,KAAK;AAAA,EAC7B;AAGA,MAAI,YAAY,aAAa,OAAQ,WAAmB,YAAY,aAAa;AAC/E,WAAQ,WAAmB,QAAQ,GAAG,KAAK;AAAA,EAC7C;AAEA,SAAO;AACT;AAKO,SAAS,WAAW,KAAqB;AAC9C,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,UAAM,IAAI,MAAM,kCAAkC,GAAG,cAAc;AAAA,EACrE;AACA,SAAO;AACT;AAKO,SAAS,aAAa,KAAa,cAA2C;AACnF,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,SAAS,OAAO,EAAE;AACjC,SAAO,MAAM,MAAM,IAAI,eAAe;AACxC;AAKO,SAAS,YAAY,KAAa,cAA2C;AAClF,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,WAAO;AAAA,EACT;AACA,QAAM,SAAS,WAAW,KAAK;AAC/B,SAAO,MAAM,MAAM,IAAI,eAAe;AACxC;AAKO,SAAS,cAAc,KAAa,eAAwB,OAAgB;AACjF,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,WAAO;AAAA,EACT;AACA,SAAO,UAAU,UAAU,UAAU,OAAO,UAAU;AACxD;AAKO,SAAS,YAAY,KAAa,eAAyB,CAAC,GAAa;AAC9E,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,WAAO;AAAA,EACT;AACA,SAAO,MAAM,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC7D;AAKO,SAAS,WAAc,KAAa,cAAiC;AAC1E,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,UAAU,UAAa,UAAU,IAAI;AACvC,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,gBAAyB;AACvC,QAAM,MAAM,OAAO,UAAU;AAC7B,SAAO,QAAQ,iBAAiB,QAAQ;AAC1C;AAKO,SAAS,eAAwB;AACtC,SAAO,OAAO,UAAU,MAAM;AAChC;AAKO,SAAS,SAAkB;AAChC,SAAO,OAAO,UAAU,MAAM;AAChC;AAUO,SAAS,aAAsB;AACpC,QAAM,MAAM,OAAO,UAAU;AAC7B,MAAI,QAAQ,aAAc,QAAO;AACjC,MAAI,QAAQ,OAAQ,QAAO;AAC3B,SAAO;AACT;AAkBO,SAAS,gBAAqC,QAAyB;AAC5E,QAAM,SAAkC,CAAC;AAEzC,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,UAAM,YAAY;AAClB,QAAI;AAEJ,YAAQ,UAAU,MAAM;AAAA,MACtB,KAAK;AACH,gBAAQ,aAAa,KAAK,UAAU,OAA6B;AACjE;AAAA,MACF,KAAK;AACH,gBAAQ,cAAc,KAAK,UAAU,OAA8B;AACnE;AAAA,MACF,KAAK;AACH,gBAAQ,YAAY,KAAK,UAAU,OAA+B;AAClE;AAAA,MACF,KAAK;AACH,gBAAQ,WAAW,KAAK,UAAU,OAAO;AACzC;AAAA,MACF;AACE,gBAAQ,OAAO,KAAK,UAAU,OAA6B;AAAA,IAC/D;AAEA,QAAI,UAAU,aAAa,UAAU,UAAa,UAAU,KAAK;AAC/D,YAAM,IAAI,MAAM,kCAAkC,GAAG,cAAc;AAAA,IACrE;AAEA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AACT;;;AC5MO,IAAM,mBAAN,MAA+C;AAAA,EAC3C,OAAO;AAAA,EAER;AAAA,EACA;AAAA,EAER,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,SAAS,QAAQ,UAAU,cAAc;AAC9C,SAAK,SAAS,QAAQ,WAAW,YAAY,UAAU,YAAY;AAAA,EACrE;AAAA,EAEA,IAAI,OAAuB;AACzB,QAAI,KAAK,QAAQ;AACf,WAAK,UAAU,KAAK;AAAA,IACtB,OAAO;AACL,WAAK,QAAQ,KAAK;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAuB;AACrC,UAAM,EAAE,OAAO,SAAS,WAAW,SAAS,MAAM,IAAI;AAEtD,UAAM,SAAkC;AAAA,MACtC;AAAA,MACA,MAAM;AAAA,MACN,KAAK;AAAA,IACP;AAEA,QAAI,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AAC9C,aAAO,OAAO,QAAQ,OAAO;AAAA,IAC/B;AAEA,QAAI,OAAO;AACT,aAAO,KAAK,IAAI;AAAA,IAClB;AAEA,YAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AAAA,EACpC;AAAA,EAEQ,UAAU,OAAuB;AACvC,UAAM,EAAE,OAAO,SAAS,WAAW,SAAS,MAAM,IAAI;AAEtD,UAAM,cAA4C;AAAA,MAChD,OAAO;AAAA;AAAA,MACP,OAAO;AAAA;AAAA,MACP,MAAM;AAAA;AAAA,MACN,MAAM;AAAA;AAAA,MACN,OAAO;AAAA;AAAA,MACP,OAAO;AAAA;AAAA,MACP,QAAQ;AAAA,IACV;AAEA,UAAM,QAAQ;AACd,UAAM,QAAQ,KAAK,SAAS,YAAY,KAAK,IAAI;AACjD,UAAM,YAAY,KAAK,SAAS,QAAQ;AAGxC,UAAM,WAAW,UAAU,MAAM,GAAG,EAAE,CAAC;AACvC,UAAM,OAAO,WAAW,SAAS,MAAM,GAAG,CAAC,IAAI;AAE/C,QAAI,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO;AAExE,QAAI,WAAW,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG;AAC9C,gBAAU,IAAI,KAAK,UAAU,OAAO,CAAC;AAAA,IACvC;AAGA,QAAI,UAAU,WAAW,UAAU,SAAS;AAC1C,cAAQ,MAAM,MAAM;AACpB,UAAI,OAAO,OAAO;AAChB,gBAAQ,MAAM,MAAM,KAAK;AAAA,MAC3B;AAAA,IACF,WAAW,UAAU,QAAQ;AAC3B,cAAQ,KAAK,MAAM;AAAA,IACrB,WAAW,UAAU,WAAW,UAAU,SAAS;AACjD,cAAQ,MAAM,MAAM;AAAA,IACtB,OAAO;AACL,cAAQ,IAAI,MAAM;AAAA,IACpB;AAAA,EACF;AACF;;;ACrFO,IAAM,WAAW;AAAA,EACtB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AACV;AAmDA,SAAS,aACP,KACA,QACyB;AACzB,QAAM,SAAS,EAAE,GAAG,IAAI;AACxB,aAAW,SAAS,QAAQ;AAC1B,QAAI,SAAS,QAAQ;AACnB,aAAO,KAAK,IAAI;AAAA,IAClB;AAEA,UAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,QAAI,MAAM,SAAS,GAAG;AACpB,UAAI,UAA+C;AACnD,eAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,QAAQ,WAAW,OAAO,YAAY,YAAY,QAAQ,SAAS;AACrE,gBAAM,MAAM,QAAQ,IAAI;AACxB,cAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,sBAAU;AAAA,UACZ,OAAO;AACL,sBAAU;AACV;AAAA,UACF;AAAA,QACF,OAAO;AACL,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,YAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,UAAI,YAAY,WAAW,OAAO,YAAY,YAAY,YAAY,SAAS;AAC7E,gBAAQ,QAAQ,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,SAAN,MAAM,QAAO;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAgC,CAAC,GAAG;AAC9C,UAAM,YAAY,OAAO,SAAU,OAAO,WAAW,KAAkC;AACvF,SAAK,QAAQ,SAAS,SAAS,KAAK,SAAS;AAC7C,SAAK,OAAO,OAAO;AACnB,SAAK,UAAU,OAAO,WAAW,CAAC;AAClC,SAAK,aAAa,OAAO,cAAc;AAAA,MACrC,IAAI;AAAA,QACF,OAAO,WAAW,SAAY,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,SAAK,eAAe,CAAC,GAAG,uBAAuB,GAAI,OAAO,UAAU,CAAC,CAAE;AAEvE,QAAI,OAAO,cAAc,OAAO;AAC9B,WAAK,cAAc,MAAM;AAAA,IAC3B,WAAW,OAAO,OAAO,cAAc,YAAY;AACjD,WAAK,cAAc,OAAO;AAAA,IAC5B,OAAO;AACL,WAAK,cAAc,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAA0C;AAC9C,UAAM,aAAa,OAAO,QAAQ,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,MAAM,KAAK,KAAK;AAC7E,UAAM,YAAY,aAAc,WAAW,CAAC,IAAqB;AAEjE,UAAM,QAAQ,IAAI,QAAO;AAAA,MACvB,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,SAAS,EAAE,GAAG,KAAK,SAAS,GAAG,QAAQ;AAAA,MACvC,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,IACN,OACA,SACA,SACA,OACM;AACN,UAAM,aAAa,SAAS,KAAK;AACjC,QAAI,aAAa,KAAK,MAAO;AAE7B,QAAI,eAAe,EAAE,GAAG,KAAK,QAAQ;AACrC,QAAI,KAAK,MAAM;AACb,mBAAa,QAAQ,IAAI,KAAK;AAAA,IAChC;AACA,QAAI,SAAS;AACX,qBAAe,EAAE,GAAG,cAAc,GAAG,QAAQ;AAAA,IAC/C;AAGA,mBAAe,aAAa,cAAc,KAAK,YAAY;AAE3D,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,YAAY;AAAA,MAC5B,SAAS,OAAO,KAAK,YAAY,EAAE,SAAS,IAAI,eAAe;AAAA,MAC/D,OAAO,QACH;AAAA,QACE,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,OAAO,MAAM;AAAA,MACf,IACA;AAAA,IACN;AAEA,eAAW,aAAa,KAAK,YAAY;AACvC,gBAAU,IAAI,KAAK;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,SAAiB,SAAyC;AAC9D,SAAK,IAAI,SAAS,SAAS,OAAO;AAAA,EACpC;AAAA,EAEA,MAAM,SAAiB,SAAyC;AAC9D,SAAK,IAAI,SAAS,SAAS,OAAO;AAAA,EACpC;AAAA,EAEA,KAAK,SAAiB,SAAyC;AAC7D,SAAK,IAAI,QAAQ,SAAS,OAAO;AAAA,EACnC;AAAA,EAEA,KAAK,SAAiB,SAAyC;AAC7D,SAAK,IAAI,QAAQ,SAAS,OAAO;AAAA,EACnC;AAAA,EAEA,MAAM,SAAiB,OAAyB,SAAyC;AACvF,UAAMA,OAAM,iBAAiB,QAAQ,QAAQ;AAC7C,UAAM,MAAM,iBAAiB,QAAQ,UAAW;AAChD,SAAK,IAAI,SAAS,SAAS,KAAKA,IAAG;AAAA,EACrC;AAAA,EAEA,MAAM,SAAiB,OAAyB,SAAyC;AACvF,UAAMA,OAAM,iBAAiB,QAAQ,QAAQ;AAC7C,UAAM,MAAM,iBAAiB,QAAQ,UAAW;AAChD,SAAK,IAAI,SAAS,SAAS,KAAKA,IAAG;AAAA,EACrC;AACF;AAKO,SAAS,aAAa,QAAwC;AACnE,SAAO,IAAI,OAAO,MAAM;AAC1B;AAKO,IAAM,SAAS,aAAa;AAK5B,SAAS,SACd,KACA,OACA,SACA,SACM;AACN,MAAI,iBAAiB,OAAO;AAC1B,QAAI,MAAM,SAAS,OAAO,OAAO;AAAA,EACnC,OAAO;AACL,QAAI,MAAM,SAAS,EAAE,OAAO,OAAO,KAAK,GAAG,GAAG,QAAQ,CAAC;AAAA,EACzD;AACF;AAKA,eAAsB,YACpB,KACA,WACA,IACY;AACZ,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI;AACF,UAAM,SAAS,MAAM,GAAG;AACxB,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,QAAI,KAAK,GAAG,SAAS,cAAc,EAAE,WAAW,YAAY,SAAS,CAAC;AACtE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,aAAS,KAAK,OAAO,GAAG,SAAS,WAAW,EAAE,WAAW,YAAY,SAAS,CAAC;AAC/E,UAAM;AAAA,EACR;AACF;AAKO,SAAS,oBACd,YACA,SAOQ;AACR,QAAM,WAAW,QAAQ,MAAM,IAAI,IAAI,QAAQ,GAAG,EAAE,WAAW;AAC/D,SAAO,WAAW,MAAM;AAAA,IACtB,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ,QAAQ;AAAA,IAChB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACH;;;ACzTA,IAAM,YAAY;AAMX,IAAM,UAAN,MAAM,SAAQ;AAAA,EACX;AAAA,EAER,YAAY,OAAkC;AAC5C,QAAI,iBAAiB,UAAS;AAC5B,WAAK,QAAQ,MAAM;AAAA,IACrB,WAAW,OAAO,UAAU,UAAU;AACpC,WAAK,QAAQ,KAAK,gBAAgB,KAAK;AAAA,IACzC,OAAO;AACL,WAAK,QAAQ,KAAK,gBAAgB,KAAK;AAAA,IACzC;AAAA,EACF;AAAA,EAEQ,gBAAgB,GAAmB;AACzC,QAAI,CAAC,SAAS,CAAC,GAAG;AAChB,YAAM,IAAI,MAAM,mBAAmB,CAAC,EAAE;AAAA,IACxC;AACA,WAAO,EAAE,QAAQ,SAAS,EAAE,QAAQ,UAAU,EAAE,KAAK;AAAA,EACvD;AAAA,EAEQ,gBAAgB,GAAmB;AACzC,UAAM,UAAU,EAAE,KAAK;AACvB,QAAI,CAAC,gBAAgB,KAAK,OAAO,GAAG;AAClC,YAAM,IAAI,MAAM,2BAA2B,CAAC,EAAE;AAAA,IAChD;AACA,WAAO,QAAQ,QAAQ,iBAAiB,IAAI,EAAE,QAAQ,UAAU,EAAE,KAAK;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,QAAI,MAAM,GAAG;AACX,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,WAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,WAAO,IAAI,SAAQ,IAAI,CAAC;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,KAAsB;AACxB,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,WAAO,IAAI,SAAQ,KAAK,IAAI,GAAG,GAAG,CAAC;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAgB;AACd,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,QAAI,IAAI,GAAG;AACT,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AACA,WAAO,IAAI,SAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe;AACb,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,WAAO,IAAI,SAAQ,KAAK,IAAI,CAAC,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAe;AACb,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,WAAO,IAAI,SAAQ,CAAC,CAAC;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAmB,GAAY;AACnC,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,SAAS,KAAK,IAAI,IAAI,QAAQ;AACpC,WAAO,IAAI,SAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAmB,GAAY;AACnC,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,SAAS,KAAK,IAAI,IAAI,QAAQ;AACpC,WAAO,IAAI,SAAQ,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,WAAmB,GAAY;AAClC,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,SAAS,KAAK,IAAI,IAAI,QAAQ;AACpC,WAAO,IAAI,SAAQ,KAAK,KAAK,IAAI,MAAM,IAAI,MAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA8C;AAChD,UAAM,IAAI,WAAW,KAAK,KAAK;AAC/B,UAAM,IAAI,WAAW,iBAAiB,WAAU,MAAM,QAAQ,OAAO,KAAK,CAAC;AAC3E,QAAI,IAAI,EAAG,QAAO;AAClB,QAAI,IAAI,EAAG,QAAO;AAClB,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,OAA2C;AAC5C,WAAO,KAAK,IAAI,KAAK,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,OAA2C;AAC5C,WAAO,KAAK,IAAI,KAAK,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,WAAO,KAAK,IAAI,KAAK,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,GAAG,OAA2C;AAC5C,WAAO,KAAK,IAAI,KAAK,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAA2C;AAC7C,WAAO,KAAK,IAAI,KAAK,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAkB;AAChB,WAAO,WAAW,KAAK,KAAK,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,WAAO,WAAW,KAAK,KAAK,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,WAAO,WAAW,KAAK,KAAK,IAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,WAAO,WAAW,KAAK,KAAK;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAmB;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,WAAmB,GAAW;AACpC,WAAO,WAAW,KAAK,KAAK,EAAE,QAAQ,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAK,OAA2C;AACrD,WAAO,IAAI,SAAQ,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAI,QAAgD;AACzD,WAAO,OAAO;AAAA,MACZ,CAAC,KAAK,QAAQ,IAAI,IAAI,GAAG;AAAA,MACzB,IAAI,SAAQ,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAI,QAAgD;AACzD,QAAI,OAAO,WAAW,EAAG,QAAO,IAAI,SAAQ,CAAC;AAC7C,WAAO,SAAQ,IAAI,MAAM,EAAE,IAAI,OAAO,MAAM;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,QAAgD;AAC5D,QAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAC7D,WAAO,OAAO,OAAgB,CAAC,KAAK,QAAQ;AAC1C,YAAM,IAAI,IAAI,SAAQ,GAAG;AACzB,aAAO,EAAE,GAAG,GAAG,IAAI,IAAI;AAAA,IACzB,GAAG,IAAI,SAAQ,OAAO,CAAC,CAAE,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAO,QAAgD;AAC5D,QAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAC7D,WAAO,OAAO,OAAgB,CAAC,KAAK,QAAQ;AAC1C,YAAM,IAAI,IAAI,SAAQ,GAAG;AACzB,aAAO,EAAE,GAAG,GAAG,IAAI,IAAI;AAAA,IACzB,GAAG,IAAI,SAAQ,OAAO,CAAC,CAAE,CAAC;AAAA,EAC5B;AACF;AAKO,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA,EAI1B,gBAAgB,OAA0D;AACxE,QAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,WAAO,IAAI,QAAQ,KAAK,EAAE,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAA0C;AAC1D,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,IAAI,QAAQ,KAAK,EAAE,SAAS;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,GAAoB,GAA4B;AACvD,WAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,GAAoB,GAA4B;AAClD,WAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,GAAoB,GAA4B;AACvD,WAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAoB,GAA4B;AACrD,WAAO,IAAI,QAAQ,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAwB,gBAAwB,GAAW;AAChE,WAAO,IAAI,QAAQ,KAAK,EAAE,QAAQ,aAAa;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,OACA,UAII,CAAC,GACG;AACR,UAAM,EAAE,WAAW,OAAO,SAAS,SAAS,WAAW,EAAE,IAAI;AAC7D,UAAM,MAAM,IAAI,QAAQ,KAAK,EAAE,SAAS;AACxC,WAAO,IAAI,KAAK,aAAa,QAAQ;AAAA,MACnC,OAAO;AAAA,MACP;AAAA,MACA,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,IACzB,CAAC,EAAE,OAAO,GAAG;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,mBACE,MACA,eACG;AACH,UAAM,SAAS,EAAE,GAAG,KAAK;AACzB,eAAW,SAAS,eAAe;AACjC,UAAI,SAAS,UAAU,OAAO,KAAK,MAAM,UAAa,OAAO,KAAK,MAAM,MAAM;AAC5E,cAAM,QAAQ,OAAO,KAAK;AAC1B,YAAI,OAAO,UAAU,UAAU;AAC7B,UAAC,OAAmC,KAAK,IAAI,aAAa,gBAAgB,KAAK;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBACE,MACA,eACG;AACH,UAAM,SAAS,EAAE,GAAG,KAAK;AACzB,eAAW,SAAS,eAAe;AACjC,UAAI,SAAS,UAAU,OAAO,KAAK,MAAM,UAAa,OAAO,KAAK,MAAM,MAAM;AAC5E,cAAM,QAAQ,OAAO,KAAK;AAC1B,YAAI,OAAO,UAAU,UAAU;AAC7B,UAAC,OAAmC,KAAK,IAAI,aAAa,kBAAkB,KAAK;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,QAAQ,OAAiC;AACvD,SAAO,IAAI,QAAQ,KAAK;AAC1B;;;ACrRO,SAAS,GAAM,MAA2B;AAC/C,SAAO,EAAE,SAAS,MAAM,KAAK;AAC/B;AAEO,SAAS,IAAO,OAA4B;AACjD,SAAO,EAAE,SAAS,OAAO,MAAM;AACjC;;;AC7IO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAEhB,YACE,SACA,MACA,aAAqB,KACrB,SACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,UAAU,WAAW;AAC1B,UAAM,oBAAoB,MAAM,KAAK,WAAW;AAAA,EAClD;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,SAAS,KAAK;AAAA,IAChB;AAAA,EACF;AACF;AAMO,IAAM,YAAN,cAAwB,UAAU;AAAA,EACvC,YACE,SACA,OAAe,cACf,aAAqB,KACrB,SACA;AACA,UAAM,SAAS,MAAM,YAAY,OAAO;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,oBAAN,cAAgC,UAAU;AAAA,EAC/C,YAAY,UAAkB,gBAAgB,SAAmC;AAC/E,UAAM,SAAS,gBAAgB,KAAK,OAAO;AAC3C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC5C,YAAY,UAAkB,aAAa,SAAmC;AAC5E,UAAM,SAAS,aAAa,KAAK,OAAO;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,0BAAN,cAAsC,UAAU;AAAA,EACrD,YAAY,UAAkB,uBAAuB,SAAmC;AACtF,UAAM,SAAS,uBAAuB,KAAK,OAAO;AAClD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,UAAU;AAAA,EACjD,YAAY,UAAkB,mBAAmB,SAAmC;AAClF,UAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,yBAAN,cAAqC,UAAU;AAAA,EACpD,YACE,UAAkB,sCACF,aAChB,SACA;AACA,UAAM,SAAS,uBAAuB,KAAK,EAAE,GAAG,SAAS,YAAY,CAAC;AAHtD;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,UAAU;AAAA,EAChD,YACE,UAAkB,kBACF,aAChB,SACA;AACA,UAAM,SAAS,kBAAkB,KAAK,EAAE,GAAG,SAAS,YAAY,CAAC;AAHjD;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,cAAN,cAA0B,UAAU;AAAA,EACzC,YACE,SACA,OAAe,gBACf,aAAqB,KACrB,SACA;AACA,UAAM,SAAS,MAAM,YAAY,OAAO;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,YAAY;AAAA,EACnD,YAAY,UAAkB,oBAAoB,SAAmC;AACnF,UAAM,SAAS,oBAAoB,KAAK,OAAO;AAC/C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,uBAAN,cAAmC,YAAY;AAAA,EACpD,YAAY,UAAkB,oBAAoB,SAAmC;AACnF,UAAM,SAAS,oBAAoB,KAAK,OAAO;AAC/C,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,kBAAN,cAA8B,YAAY;AAAA,EAC/C,YACE,UAAkB,oBAClB,OAAe,oBACf,aAAqB,KACrB,SACA;AACA,UAAM,SAAS,MAAM,YAAY,OAAO;AACxC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,0BAAN,cAAsC,gBAAgB;AAAA,EAC3D,YAAY,UAAkB,wBAAwB,SAAmC;AACvF,UAAM,SAAS,wBAAwB,KAAK,OAAO;AACnD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,yBAAN,cAAqC,gBAAgB;AAAA,EAC1D,YAAY,UAAkB,sBAAsB,SAAmC;AACrF,UAAM,SAAS,sBAAsB,KAAK,OAAO;AACjD,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,kBAAN,cAA8B,UAAU;AAAA,EAC7C,YACE,UAAkB,qBACF,QAChB,SACA;AACA,UAAM,SAAS,oBAAoB,KAAK,EAAE,GAAG,SAAS,OAAO,CAAC;AAH9C;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAYO,IAAM,iBAAN,cAA6B,UAAU;AAAA,EAC5C,YACE,UAAkB,uBACF,YAChB,SACA;AACA,UAAM,SAAS,uBAAuB,KAAK,EAAE,GAAG,SAAS,WAAW,CAAC;AAHrD;AAIhB,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAC3C,YACE,WAAmB,YACnB,SACA,SACA;AACA,UAAM,WAAW,GAAG,QAAQ,cAAc,aAAa,KAAK,EAAE,GAAG,SAAS,SAAS,CAAC;AACpF,SAAK,OAAO;AAAA,EACd;AACF;AAMO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAC3C,YAAY,UAAkB,YAAY,SAAmC;AAC3E,UAAM,SAAS,YAAY,KAAK,OAAO;AACvC,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,iBAAN,cAA6B,cAAc;AAAA,EAChD,YACE,WAAmB,YACnB,OACA,SACA;AACA,UAAM,GAAG,QAAQ,kBAAkB,QAAQ,cAAc,KAAK,KAAK,EAAE,IAAI;AAAA,MACvE,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;;;ACvMO,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxB,YAAY;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,yBAAyB;AAAA,IACvB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,uBAAuB;AAAA,IACrB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAUO,SAAS,aAAa,MAA+C;AAC1E,SAAQ,WAAmD,IAAI;AACjE;AAKO,SAAS,wBACd,UACuB;AACvB,SAAO,OAAO,OAAO,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACxE;AAKO,SAAS,iBAAiB,MAAuB;AACtD,QAAM,YAAY,aAAa,IAAI;AACnC,SAAO,WAAW,cAAc;AAClC;AAKO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,YAAY,aAAa,IAAI;AACnC,SAAO,WAAW,UAAU;AAC9B;;;AClRO,IAAM,iBAAN,MAA6C;AAAA,EACzC,OAAO;AAAA,EAER,SAAuB,CAAC;AAAA,EACxB,aAAoD;AAAA,EACpD,aAAa;AAAA,EACJ;AAAA,EAKjB,YAAY,SAAgC;AAC1C,SAAK,UAAU;AAAA,MACb,WAAW;AAAA,MACX,eAAe;AAAA,MACf,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAGA,QAAI,KAAK,QAAQ,gBAAgB,GAAG;AAClC,WAAK,aAAa;AAAA,QAChB,MAAM,KAAK,MAAM;AAAA,QACjB,KAAK,QAAQ;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,OAAuB;AACzB,QAAI,KAAK,QAAQ,YAAY,MAAO;AAEpC,UAAM,QAAoB;AAAA,MACxB,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,SAAS,MAAM;AAAA,IACjB;AAGA,QAAI,MAAM,SAAS;AACjB,aAAO,OAAO,OAAO,MAAM,OAAO;AAAA,IACpC;AAGA,QAAI,MAAM,OAAO;AACf,YAAM,YAAY,IAAI,MAAM,MAAM;AAClC,YAAM,eAAe,IAAI,MAAM,MAAM;AACrC,YAAM,aAAa,IAAI,MAAM,MAAM;AAAA,IACrC;AAEA,SAAK,OAAO,KAAK,KAAK;AAGtB,QAAI,KAAK,OAAO,UAAU,KAAK,QAAQ,WAAW;AAChD,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAE3B,QAAI,KAAK,cAAc,KAAK,OAAO,WAAW,EAAG;AAEjD,SAAK,aAAa;AAClB,UAAM,SAAS,KAAK;AACpB,SAAK,SAAS,CAAC;AAEf,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,KAAK,QAAQ,MAAM,gBAAgB,KAAK,QAAQ,OAAO;AAAA,QAC1D;AAAA,UACE,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,eAAe,UAAU,KAAK,QAAQ,KAAK;AAAA,YAC3C,gBAAgB;AAAA,YAChB,GAAI,KAAK,QAAQ,SAAS;AAAA,cACxB,kBAAkB,KAAK,QAAQ;AAAA,YACjC;AAAA,UACF;AAAA,UACA,MAAM,KAAK,UAAU,MAAM;AAAA,QAC7B;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAM,IAAI,MAAM,wBAAwB,SAAS,MAAM,IAAI,SAAS,EAAE;AAAA,MACxE;AAAA,IACF,SAAS,OAAO;AAEd,UAAI,KAAK,QAAQ,SAAS;AACxB,aAAK,QAAQ;AAAA,UACX,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,UACxD,OAAO;AAAA,QACT;AAAA,MACF,OAAO;AAEL,gBAAQ,MAAM,gCAAgC,KAAK;AAAA,MACrD;AAAA,IACF,UAAE;AACA,WAAK,aAAa;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAE3B,QAAI,KAAK,YAAY;AACnB,oBAAc,KAAK,UAAU;AAC7B,WAAK,aAAa;AAAA,IACpB;AAGA,UAAM,KAAK,MAAM;AAAA,EACnB;AACF;AAKO,SAAS,qBACd,SACgB;AAChB,SAAO,IAAI,eAAe,OAAO;AACnC;;;ACDO,IAAM,kBAAN,MAA8D;AAAA,EAC1D,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACT,OAAyB;AAAA,EACzB,WAAiD,oBAAI,IAAI;AAAA,EACzD,cAA4B,CAAC;AAAA,EACpB,iBAAiB;AAAA,EAElC,YAAY,SAAiC;AAC3C,SAAK,UAAU;AAAA,MACb,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAEA,QAAI,QAAQ,QAAQ;AAClB,WAAK,SAAS,QAAQ;AAAA,IACxB,WAAW,QAAQ,KAAK;AACtB,WAAK,MAAM,KAAK,SAAS,QAAQ,GAAG;AAAA,IACtC,OAAO;AACL,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAwB;AACvC,UAAM,QAAQ,IAAI,MAAM,sCAAsC;AAC9D,QAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;AAC9D,YAAM,IAAI,MAAM,uBAAuB,GAAG,EAAE;AAAA,IAC9C;AACA,WAAO;AAAA,MACL,UAAU,MAAM,CAAC;AAAA,MACjB,WAAW,MAAM,CAAC;AAAA,MAClB,MAAM,MAAM,CAAC;AAAA,MACb,WAAW,MAAM,CAAC;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,OAAuB;AACzB,QAAI,KAAK,QAAQ,YAAY,MAAO;AAGpC,QAAI,MAAM,aAAa,GAAI;AAE3B,QAAI,MAAM,OAAO;AACf,YAAM,QAAQ,IAAI,MAAM,MAAM,MAAM,OAAO;AAC3C,YAAM,OAAO,MAAM,MAAM;AACzB,UAAI,MAAM,MAAM,OAAO;AACrB,cAAM,QAAQ,MAAM,MAAM;AAAA,MAC5B;AAEA,WAAK;AAAA,QACH;AAAA,QACA,MAAM,UAAU,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,WAAK;AAAA,QACH,MAAM;AAAA,QACN,MAAM,UAAU,UAAU,UAAU;AAAA,QACpC,MAAM,UAAU,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,OAAc,SAA8B;AAC3D,QAAI,KAAK,QAAQ,YAAY,MAAO;AACpC,QAAI,CAAC,KAAK,aAAa,EAAG;AAE1B,QAAI,KAAK,QAAQ;AACf,WAAK,eAAe,OAAO,OAAO;AAAA,IACpC,OAAO;AACL,WAAK,gBAAgB,OAAO,OAAO;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,SACA,OACA,SACM;AACN,QAAI,KAAK,QAAQ,YAAY,MAAO;AACpC,QAAI,CAAC,KAAK,aAAa,EAAG;AAE1B,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,UAAU,CAAC,UAAU;AAC/B,aAAK,aAAa,OAAO,OAAO;AAChC,cAAM,SAAS,KAAK;AACpB,aAAK,OAAQ,eAAe,SAAS,KAAK;AAAA,MAC5C,CAAC;AAAA,IACH,OAAO;AACL,WAAK,cAAc;AAAA,QACjB,OAAO,UAAU,YAAY,YAAY,UAAU,SAAS,SAAS;AAAA,QACrE,SAAS,EAAE,WAAW,QAAQ;AAAA,QAC9B,GAAG,KAAK,kBAAkB,OAAO;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,MAA8B;AACpC,SAAK,OAAO;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAc,SAAwC;AAC/D,SAAK,SAAS,IAAI,MAAM,OAAO;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,YAA8B;AAC1C,SAAK,YAAY,KAAK;AAAA,MACpB,GAAG;AAAA,MACH,WAAW,WAAW,aAAa,KAAK,IAAI,IAAI;AAAA,IAClD,CAAC;AAGD,QAAI,KAAK,YAAY,SAAS,KAAK,gBAAgB;AACjD,WAAK,cAAc,KAAK,YAAY,MAAM,CAAC,KAAK,cAAc;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ,OAAO;AACtB,YAAM,KAAK,OAAO,MAAM,GAAI;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAwB;AAC9B,UAAM,OAAO,KAAK,QAAQ,cAAc;AACxC,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,OAAc,SAA8B;AACjE,SAAK,OAAQ,UAAU,CAAC,UAAU;AAChC,WAAK,aAAa,OAAO,OAAO;AAChC,WAAK,OAAQ,iBAAiB,KAAK;AAAA,IACrC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAoB,SAA8B;AAErE,QAAI,KAAK,MAAM;AACb,YAAM,QAAQ,KAAK,IAAI;AAAA,IACzB,WAAW,SAAS,QAAQ;AAC1B,YAAM,QAAQ,EAAE,IAAI,QAAQ,OAAO,CAAC;AAAA,IACtC;AAGA,QAAI,KAAK,QAAQ,MAAM;AACrB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,QAAQ,IAAI,GAAG;AAC5D,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF;AACA,QAAI,SAAS,MAAM;AACjB,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,IAAI,GAAG;AACvD,cAAM,OAAO,KAAK,KAAK;AAAA,MACzB;AAAA,IACF;AACA,QAAI,SAAS,WAAW;AACtB,YAAM,OAAO,aAAa,QAAQ,SAAS;AAAA,IAC7C;AACA,QAAI,SAAS,UAAU;AACrB,YAAM,OAAO,YAAY,QAAQ,QAAQ;AAAA,IAC3C;AAGA,QAAI,SAAS,OAAO;AAClB,YAAM,UAAU,QAAQ,KAAK;AAAA,IAC/B;AAGA,eAAW,MAAM,KAAK,aAAa;AACjC,YAAM,cAAc,EAAE;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAc,SAA8B;AAClE,UAAM,aAAa,KAAK,gBAAgB,MAAM,KAAK;AACnD,UAAM,iBAIF;AAAA,MACF,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf;AAEA,QAAI,YAAY;AACd,qBAAe,aAAa;AAAA,IAC9B;AAEA,UAAM,QAA8B;AAAA,MAClC,OAAO;AAAA,MACP,WAAW;AAAA,QACT,QAAQ,CAAC,cAAc;AAAA,MACzB;AAAA,MACA,GAAG,KAAK,kBAAkB,OAAO;AAAA,IACnC;AAEA,SAAK,cAAc,KAAK;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAA8C;AACtE,UAAM,QAA8B,CAAC;AAGrC,QAAI,KAAK,QAAQ,aAAa;AAC5B,YAAM,cAAc,KAAK,QAAQ;AAAA,IACnC;AACA,QAAI,KAAK,QAAQ,SAAS;AACxB,YAAM,UAAU,KAAK,QAAQ;AAAA,IAC/B;AACA,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,cAAc,KAAK,QAAQ;AAAA,IACnC;AAGA,UAAM,OAA+B,EAAE,GAAG,KAAK,QAAQ,KAAK;AAC5D,QAAI,SAAS,MAAM;AACjB,aAAO,OAAO,MAAM,QAAQ,IAAI;AAAA,IAClC;AACA,QAAI,SAAS,WAAW;AACtB,WAAK,WAAW,IAAI,QAAQ;AAAA,IAC9B;AACA,QAAI,SAAS,UAAU;AACrB,WAAK,UAAU,IAAI,QAAQ;AAAA,IAC7B;AACA,QAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG;AAChC,YAAM,OAAO;AAAA,IACf;AAGA,QAAI,SAAS,OAAO;AAClB,YAAM,QAAQ,QAAQ;AAAA,IACxB;AAGA,QAAI,KAAK,MAAM;AACb,YAAM,OAAO,KAAK;AAAA,IACpB,WAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,EAAE,IAAI,QAAQ,OAAO;AAAA,IACpC;AAGA,QAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,YAAM,cAAc,KAAK,YAAY,IAAI,CAAC,OAAO;AAC/C,cAAM,QAOF,CAAC;AACL,YAAI,GAAG,KAAM,OAAM,OAAO,GAAG;AAC7B,YAAI,GAAG,SAAU,OAAM,WAAW,GAAG;AACrC,YAAI,GAAG,QAAS,OAAM,UAAU,GAAG;AACnC,YAAI,GAAG,KAAM,OAAM,OAAO,GAAG;AAC7B,YAAI,GAAG,MAAO,OAAM,QAAQ,GAAG;AAC/B,YAAI,GAAG,cAAc,OAAW,OAAM,YAAY,GAAG;AACrD,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,YAAM,WAAW,OAAO,YAAY,KAAK,QAAQ;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,OAC0G;AAC1G,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,MAAM,CAAC;AACvC,UAAM,SAA2F,CAAC;AAElG,eAAW,QAAQ,OAAO;AAExB,YAAM,QAAQ,KAAK,MAAM,+CAA+C;AACxE,UAAI,SAAS,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACjC,cAAM,QAAmF;AAAA,UACvF,UAAU,MAAM,CAAC,KAAK;AAAA,UACtB,QAAQ,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,UAC7B,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,QAC9B;AACA,YAAI,MAAM,CAAC,GAAG;AACZ,gBAAM,WAAW,MAAM,CAAC;AAAA,QAC1B;AACA,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAGA,WAAO,QAAQ;AAEf,WAAO,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAA0B;AAEhC,UAAM,QAAQ,IAAI,WAAW,EAAE;AAC/B,WAAO,gBAAgB,KAAK;AAC5B,WAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,WAAgD;AAC1E,QAAI,CAAC,KAAK,IAAK;AAEf,UAAM,QAAqB;AAAA,MACzB,UAAU,KAAK,gBAAgB;AAAA,MAC/B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,GAAG;AAAA,IACL;AAGA,QAAI,KAAK,QAAQ,YAAY;AAC3B,YAAM,SAAS,KAAK,QAAQ,WAAW,KAAK;AAC5C,UAAI,WAAW,KAAM;AAAA,IACvB;AAEA,UAAM,MAAM,GAAG,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,SAAS;AAE7E,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,YACf;AAAA,YACA;AAAA,YACA,cAAc,KAAK,IAAI,SAAS;AAAA,UAClC,EAAE,KAAK,IAAI;AAAA,QACb;AAAA,QACA,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,qBAAqB,SAAS,MAAM,EAAE;AAAA,MACxD;AAAA,IACF,SAAS,OAAO;AACd,UAAI,KAAK,QAAQ,SAAS;AACxB,aAAK,QAAQ,QAAQ,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MAChF;AAAA,IAEF;AAAA,EACF;AACF;AAKO,SAAS,sBAAsB,SAAkD;AACtF,SAAO,IAAI,gBAAgB,OAAO;AACpC;;;ACpeA,IAAM,iBAAN,MAA8C;AAAA,EAC5C,YAAoB,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAE/B,IAAI,OAAe,SAAiB,YAA4C;AACtF,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,UAAU,KAAK;AAAA,MACf,KAAK;AAAA,MACL,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B,GAAG;AAAA,IACL;AACA,YAAQ,IAAI,KAAK,UAAU,KAAK,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,SAAiB,YAA4C;AACjE,SAAK,IAAI,SAAS,SAAS,UAAU;AAAA,EACvC;AAAA,EAEA,KAAK,SAAiB,YAA4C;AAChE,SAAK,IAAI,QAAQ,SAAS,UAAU;AAAA,EACtC;AAAA,EAEA,KAAK,SAAiB,YAA4C;AAChE,SAAK,IAAI,QAAQ,SAAS,UAAU;AAAA,EACtC;AAAA,EAEA,QAAQ,SAAiB,YAA4C;AACnE,SAAK,IAAI,WAAW,SAAS,UAAU;AAAA,EACzC;AAAA,EAEA,MAAM,SAAiB,YAA4C;AACjE,SAAK,IAAI,SAAS,SAAS,UAAU;AAAA,EACvC;AAAA,EAEA,MAAM,SAAiB,YAA4C;AACjE,SAAK,IAAI,SAAS,SAAS,UAAU;AAAA,EACvC;AACF;AAMO,IAAM,mBAAN,MAA+C;AAAA,EAC3C,OAAO;AAAA,EAEC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,UAAmC,CAAC,GAAG;AACjD,SAAK,UAAU,QAAQ,YAAY;AACnC,SAAK,mBAAmB,QAAQ,qBAAqB;AACrD,SAAK,oBAAoB,QAAQ,qBAAqB;AAEtD,QAAI,QAAQ,QAAQ;AAClB,WAAK,SAAS,QAAQ;AAAA,IACxB,OAAO;AAEL,WAAK,SAAS,IAAI,eAAe,QAAQ,YAAY,MAAM;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,IAAI,OAAuB;AACzB,QAAI,CAAC,KAAK,QAAS;AAEnB,UAAM,QAAQ,KAAK,SAAS,MAAM,KAAK;AACvC,UAAM,aAAa,KAAK,gBAAgB,KAAK;AAG7C,SAAK,OAAO,KAAK,EAAE,MAAM,SAAS,UAAU;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,OAAmC;AAClD,UAAM,UAA8C;AAAA,MAClD,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA;AAAA,IACV;AACA,WAAO,QAAQ,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAA0C;AAChE,UAAM,aAAsC,CAAC;AAG7C,QAAI,KAAK,kBAAkB;AACzB,iBAAW,WAAW,IAAI,MAAM;AAAA,IAClC;AAGA,QAAI,KAAK,mBAAmB;AAC1B,iBAAW,YAAY,IAAI,MAAM;AAAA,IACnC;AAGA,QAAI,MAAM,SAAS;AACjB,aAAO,OAAO,YAAY,MAAM,OAAO;AAAA,IACzC;AAGA,QAAI,MAAM,OAAO;AACf,iBAAW,OAAO,IAAI;AAAA,QACpB,MAAM,MAAM,MAAM;AAAA,QAClB,SAAS,MAAM,MAAM;AAAA,QACrB,OAAO,MAAM,MAAM;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAKO,SAAS,uBACd,SACkB;AAClB,SAAO,IAAI,iBAAiB,OAAO;AACrC;;;AC7EA,eAAsB,qBAAqB,QAAiC;AAC1E,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,SAAO,gBAAgB,KAAK;AAC5B,SAAO,MAAM,KAAK,KAAK,EACpB,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAKO,SAAS,aAAqB;AACnC,SAAO,OAAO,WAAW;AAC3B;AAKA,eAAsB,OAAO,OAAgC;AAC3D,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AACvD,SAAO,MAAM,KAAK,IAAI,WAAW,IAAI,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAC1C,KAAK,EAAE;AACZ;AAKA,eAAsB,YAAY,OAAqC;AACrE,QAAM,UAAU,IAAI,YAAY;AAChC,QAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,SAAO,OAAO,OAAO,OAAO,WAAW,IAAI;AAC7C;AAKO,SAAS,mBAAmB,GAAW,GAAoB;AAChE,MAAI,EAAE,WAAW,EAAE,QAAQ;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,CAAC;AACzC,QAAM,SAAS,IAAI,YAAY,EAAE,OAAO,CAAC;AAEzC,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAU,OAAO,CAAC,IAAK,OAAO,CAAC;AAAA,EACjC;AAEA,SAAO,WAAW;AACpB;AAKO,SAAS,MAAM,IAA2B;AAC/C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAKA,eAAsB,MACpB,IACA,UAOI,CAAC,GACO;AACZ,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,oBAAoB;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB;AAAA,EACF,IAAI;AAEJ,MAAI;AACJ,MAAI,QAAQ;AAEZ,WAAS,UAAU,GAAG,WAAW,YAAY,WAAW;AACtD,QAAI;AACF,aAAO,MAAM,GAAG;AAAA,IAClB,SAAS,OAAO;AACd,kBAAY;AAEZ,UAAI,YAAY,cAAc,CAAC,YAAY,KAAK,GAAG;AACjD,cAAM;AAAA,MACR;AAEA,gBAAU,OAAO,UAAU,CAAC;AAC5B,YAAM,MAAM,KAAK;AACjB,cAAQ,KAAK,IAAI,QAAQ,mBAAmB,UAAU;AAAA,IACxD;AAAA,EACF;AAEA,QAAM;AACR;AAKO,SAAS,KACd,KACA,MACY;AACZ,QAAM,SAAS,EAAE,GAAG,IAAI;AACxB,aAAW,OAAO,MAAM;AACtB,WAAO,OAAO,GAAG;AAAA,EACnB;AACA,SAAO;AACT;AAKO,SAAS,KACd,KACA,MACY;AACZ,QAAM,SAAS,CAAC;AAChB,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,KAAK;AACd,aAAO,GAAG,IAAI,IAAI,GAAG;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAKO,SAAS,UAA4B,QAAW,QAAuB;AAC5E,QAAM,SAAS,EAAE,GAAG,OAAO;AAE3B,aAAW,OAAO,OAAO,KAAK,MAAM,GAAkB;AACpD,UAAM,cAAc,OAAO,GAAG;AAC9B,UAAM,cAAc,OAAO,GAAG;AAE9B,QACE,gBAAgB,UAChB,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,WAAW,KAC1B,OAAO,gBAAgB,YACvB,gBAAgB,QAChB,CAAC,MAAM,QAAQ,WAAW,GAC1B;AACA,aAAO,GAAG,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF,WAAW,gBAAgB,QAAW;AACpC,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,UAAa,KAAW;AACtC,MAAI,QAAQ,QAAQ,OAAO,QAAQ,UAAU;AAC3C,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,SAAS;AAAA,EAC1B;AACA,MAAI,eAAe,MAAM;AACvB,WAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AAAA,EAC/B;AACA,QAAM,SAAS,CAAC;AAChB,aAAW,OAAO,OAAO,KAAK,GAAG,GAAkB;AACjD,WAAO,GAAG,IAAI,UAAU,IAAI,GAAG,CAAC;AAAA,EAClC;AACA,SAAO;AACT;AAKO,SAAS,cAAc,OAAkD;AAC9E,SACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAE9C;AAKO,SAAS,MAAM,OAA2C;AAC/D,SAAO,UAAU,QAAQ,UAAU;AACrC;AAKO,SAAS,QAAQ,OAAyB;AAC/C,MAAI,MAAM,KAAK,EAAG,QAAO;AACzB,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,KAAK,MAAM;AACvD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,WAAW;AAClD,MAAI,cAAc,KAAK,EAAG,QAAO,OAAO,KAAK,KAAK,EAAE,WAAW;AAC/D,SAAO;AACT;AAKO,SAAS,eAAe,OAAuB;AACpD,SAAO,MAAM,YAAY,EAAE,KAAK;AAClC;AAKO,SAAS,aAAa,OAAwB;AACnD,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,KAAK;AAC9B;AAKO,SAAS,QAAQ,KAAqB;AAC3C,SAAO,IACJ,YAAY,EACZ,KAAK,EACL,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAKO,SAAS,SAAS,KAAa,WAAmB,SAAiB,OAAe;AACvF,MAAI,IAAI,UAAU,UAAW,QAAO;AACpC,SAAO,IAAI,MAAM,GAAG,YAAY,OAAO,MAAM,IAAI;AACnD;AAKO,SAAS,SACd,IACA,MACkC;AAClC,MAAI,YAAkD;AAEtD,SAAO,IAAI,SAAwB;AACjC,QAAI,WAAW;AACb,mBAAa,SAAS;AAAA,IACxB;AACA,gBAAY,WAAW,MAAM;AAC3B,SAAG,GAAG,IAAI;AACV,kBAAY;AAAA,IACd,GAAG,IAAI;AAAA,EACT;AACF;AAKO,SAAS,SACd,IACA,MACkC;AAClC,MAAI,WAAW;AAEf,SAAO,IAAI,SAAwB;AACjC,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,YAAY,MAAM;AAC1B,iBAAW;AACX,SAAG,GAAG,IAAI;AAAA,IACZ;AAAA,EACF;AACF;AAKO,SAAS,iBAId;AACA,MAAI;AACJ,MAAI;AAEJ,QAAM,UAAU,IAAI,QAAW,CAAC,KAAK,QAAQ;AAC3C,cAAU;AACV,aAAS;AAAA,EACX,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,OAAO;AACpC;AAKA,eAAsB,OACpB,OACA,aACc;AACd,QAAM,UAAe,CAAC;AACtB,QAAM,YAA6B,CAAC;AAEpC,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,UAAM,IAAI,QAAQ,QAAQ,EAAE,KAAK,YAAY;AAC3C,cAAQ,KAAK,IAAI,MAAM,KAAK;AAAA,IAC9B,CAAC;AAED,cAAU,KAAK,CAAC;AAEhB,QAAI,UAAU,UAAU,aAAa;AACnC,YAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAU;AAAA,QACR,UAAU,UAAU,CAAC,MAAM,MAAM,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,SAAS;AAC3B,SAAO;AACT;","names":["err"]}
|
package/dist/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime.ts","../src/env.ts","../src/transports/console.ts","../src/logger.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process.versions.node}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Logger\n * Lightweight, edge-compatible structured logging\n * Can be used standalone or as abstraction over pino/winston in Node.js\n */\n\nimport { getEnv } from \"./env.js\";\nimport { ConsoleTransport } from \"./transports/console.js\";\nimport type { LogTransport } from \"./transports/types.js\";\n\n// Re-export ConsoleTransport for backward compatibility\nexport { ConsoleTransport, type ConsoleTransportOptions } from \"./transports/console.js\";\n\n// Re-export transport types\nexport type { LogTransport } from \"./transports/types.js\";\n\n/**\n * Log levels\n */\nexport const LogLevel = {\n TRACE: 10,\n DEBUG: 20,\n INFO: 30,\n WARN: 40,\n ERROR: 50,\n FATAL: 60,\n SILENT: 100,\n} as const;\n\nexport type LogLevelName = keyof typeof LogLevel;\nexport type LogLevelValue = (typeof LogLevel)[LogLevelName];\n\n/**\n * Error info structure\n */\nexport interface ErrorInfo {\n name: string;\n message: string;\n stack: string | undefined;\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n level: LogLevelName;\n levelValue: LogLevelValue;\n message: string;\n timestamp: string;\n context: Record<string, unknown> | undefined;\n error: ErrorInfo | undefined;\n}\n\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Minimum log level */\n level: LogLevelName | undefined;\n /** Logger name/module */\n name: string | undefined;\n /** Base context added to all logs */\n context: Record<string, unknown> | undefined;\n /** Custom transports */\n transports: LogTransport[] | undefined;\n /** Pretty print in development */\n pretty: boolean | undefined;\n /** Redact sensitive fields */\n redact: string[] | undefined;\n /** Timestamp format */\n timestamp: boolean | (() => string) | undefined;\n}\n\n\n/**\n * Redact sensitive fields from context\n */\nfunction redactFields(\n obj: Record<string, unknown>,\n fields: string[]\n): Record<string, unknown> {\n const result = { ...obj };\n for (const field of fields) {\n if (field in result) {\n result[field] = \"[REDACTED]\";\n }\n // Handle nested fields like \"user.password\"\n const parts = field.split(\".\");\n if (parts.length > 1) {\n let current: Record<string, unknown> | undefined = result;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part && current && typeof current === \"object\" && part in current) {\n const val = current[part];\n if (val && typeof val === \"object\") {\n current = val as Record<string, unknown>;\n } else {\n current = undefined;\n break;\n }\n } else {\n current = undefined;\n break;\n }\n }\n const lastPart = parts[parts.length - 1];\n if (lastPart && current && typeof current === \"object\" && lastPart in current) {\n current[lastPart] = \"[REDACTED]\";\n }\n }\n }\n return result;\n}\n\n/**\n * Default redact fields\n */\nconst DEFAULT_REDACT_FIELDS = [\n \"password\",\n \"secret\",\n \"token\",\n \"accessToken\",\n \"refreshToken\",\n \"apiKey\",\n \"authorization\",\n \"cookie\",\n \"creditCard\",\n \"ssn\",\n];\n\n/**\n * Logger class\n */\nexport class Logger {\n private level: LogLevelValue;\n private name: string | undefined;\n private context: Record<string, unknown>;\n private transports: LogTransport[];\n private redactFields: string[];\n private timestampFn: () => string;\n\n constructor(config: Partial<LoggerConfig> = {}) {\n const levelName = config.level ?? (getEnv(\"LOG_LEVEL\") as LogLevelName | undefined) ?? \"INFO\";\n this.level = LogLevel[levelName] ?? LogLevel.INFO;\n this.name = config.name;\n this.context = config.context ?? {};\n this.transports = config.transports ?? [\n new ConsoleTransport(\n config.pretty !== undefined ? { pretty: config.pretty } : {}\n ),\n ];\n this.redactFields = [...DEFAULT_REDACT_FIELDS, ...(config.redact ?? [])];\n\n if (config.timestamp === false) {\n this.timestampFn = () => \"\";\n } else if (typeof config.timestamp === \"function\") {\n this.timestampFn = config.timestamp;\n } else {\n this.timestampFn = () => new Date().toISOString();\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(context: Record<string, unknown>): Logger {\n const levelEntry = Object.entries(LogLevel).find(([_, v]) => v === this.level);\n const levelName = levelEntry ? (levelEntry[0] as LogLevelName) : \"INFO\";\n\n const child = new Logger({\n level: levelName,\n name: this.name,\n context: { ...this.context, ...context },\n transports: this.transports,\n redact: this.redactFields,\n });\n return child;\n }\n\n /**\n * Log a message\n */\n private log(\n level: LogLevelName,\n message: string,\n context?: Record<string, unknown>,\n error?: Error\n ): void {\n const levelValue = LogLevel[level];\n if (levelValue < this.level) return;\n\n let finalContext = { ...this.context };\n if (this.name) {\n finalContext[\"module\"] = this.name;\n }\n if (context) {\n finalContext = { ...finalContext, ...context };\n }\n\n // Redact sensitive fields\n finalContext = redactFields(finalContext, this.redactFields);\n\n const entry: LogEntry = {\n level,\n levelValue,\n message,\n timestamp: this.timestampFn(),\n context: Object.keys(finalContext).length > 0 ? finalContext : undefined,\n error: error\n ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n : undefined,\n };\n\n for (const transport of this.transports) {\n transport.log(entry);\n }\n }\n\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(\"TRACE\", message, context);\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log(\"INFO\", message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"ERROR\", message, ctx, err);\n }\n\n fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"FATAL\", message, ctx, err);\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config?: Partial<LoggerConfig>): Logger {\n return new Logger(config);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger();\n\n/**\n * Utility: Log error with proper formatting\n */\nexport function logError(\n log: Logger,\n error: unknown,\n message: string,\n context?: Record<string, unknown>\n): void {\n if (error instanceof Error) {\n log.error(message, error, context);\n } else {\n log.error(message, { error: String(error), ...context });\n }\n}\n\n/**\n * Utility: Measure execution time\n */\nexport async function measureTime<T>(\n log: Logger,\n operation: string,\n fn: () => Promise<T>\n): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n const duration = Date.now() - start;\n log.info(`${operation} completed`, { operation, durationMs: duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n logError(log, error, `${operation} failed`, { operation, durationMs: duration });\n throw error;\n }\n}\n\n/**\n * Utility: Create request logger middleware context\n */\nexport function createRequestLogger(\n baseLogger: Logger,\n request: {\n method?: string;\n url?: string;\n requestId?: string;\n userId?: string;\n tenantId?: string;\n }\n): Logger {\n const pathname = request.url ? new URL(request.url).pathname : undefined;\n return baseLogger.child({\n requestId: request.requestId,\n method: request.method,\n path: pathname,\n userId: request.userId,\n tenantId: request.tenantId,\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/env.ts","../src/transports/console.ts","../src/logger.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process?.versions?.node ?? \"unknown\"}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Logger\n * Lightweight, edge-compatible structured logging\n * Can be used standalone or as abstraction over pino/winston in Node.js\n */\n\nimport { getEnv } from \"./env.js\";\nimport { ConsoleTransport } from \"./transports/console.js\";\nimport type { LogTransport } from \"./transports/types.js\";\n\n// Re-export ConsoleTransport for backward compatibility\nexport { ConsoleTransport, type ConsoleTransportOptions } from \"./transports/console.js\";\n\n// Re-export transport types\nexport type { LogTransport } from \"./transports/types.js\";\n\n/**\n * Log levels\n */\nexport const LogLevel = {\n TRACE: 10,\n DEBUG: 20,\n INFO: 30,\n WARN: 40,\n ERROR: 50,\n FATAL: 60,\n SILENT: 100,\n} as const;\n\nexport type LogLevelName = keyof typeof LogLevel;\nexport type LogLevelValue = (typeof LogLevel)[LogLevelName];\n\n/**\n * Error info structure\n */\nexport interface ErrorInfo {\n name: string;\n message: string;\n stack: string | undefined;\n}\n\n/**\n * Log entry structure\n */\nexport interface LogEntry {\n level: LogLevelName;\n levelValue: LogLevelValue;\n message: string;\n timestamp: string;\n context: Record<string, unknown> | undefined;\n error: ErrorInfo | undefined;\n}\n\n\n/**\n * Logger configuration\n */\nexport interface LoggerConfig {\n /** Minimum log level */\n level: LogLevelName | undefined;\n /** Logger name/module */\n name: string | undefined;\n /** Base context added to all logs */\n context: Record<string, unknown> | undefined;\n /** Custom transports */\n transports: LogTransport[] | undefined;\n /** Pretty print in development */\n pretty: boolean | undefined;\n /** Redact sensitive fields */\n redact: string[] | undefined;\n /** Timestamp format */\n timestamp: boolean | (() => string) | undefined;\n}\n\n\n/**\n * Redact sensitive fields from context\n */\nfunction redactFields(\n obj: Record<string, unknown>,\n fields: string[]\n): Record<string, unknown> {\n const result = { ...obj };\n for (const field of fields) {\n if (field in result) {\n result[field] = \"[REDACTED]\";\n }\n // Handle nested fields like \"user.password\"\n const parts = field.split(\".\");\n if (parts.length > 1) {\n let current: Record<string, unknown> | undefined = result;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part && current && typeof current === \"object\" && part in current) {\n const val = current[part];\n if (val && typeof val === \"object\") {\n current = val as Record<string, unknown>;\n } else {\n current = undefined;\n break;\n }\n } else {\n current = undefined;\n break;\n }\n }\n const lastPart = parts[parts.length - 1];\n if (lastPart && current && typeof current === \"object\" && lastPart in current) {\n current[lastPart] = \"[REDACTED]\";\n }\n }\n }\n return result;\n}\n\n/**\n * Default redact fields\n */\nconst DEFAULT_REDACT_FIELDS = [\n \"password\",\n \"secret\",\n \"token\",\n \"accessToken\",\n \"refreshToken\",\n \"apiKey\",\n \"authorization\",\n \"cookie\",\n \"creditCard\",\n \"ssn\",\n];\n\n/**\n * Logger class\n */\nexport class Logger {\n private level: LogLevelValue;\n private name: string | undefined;\n private context: Record<string, unknown>;\n private transports: LogTransport[];\n private redactFields: string[];\n private timestampFn: () => string;\n\n constructor(config: Partial<LoggerConfig> = {}) {\n const levelName = config.level ?? (getEnv(\"LOG_LEVEL\") as LogLevelName | undefined) ?? \"INFO\";\n this.level = LogLevel[levelName] ?? LogLevel.INFO;\n this.name = config.name;\n this.context = config.context ?? {};\n this.transports = config.transports ?? [\n new ConsoleTransport(\n config.pretty !== undefined ? { pretty: config.pretty } : {}\n ),\n ];\n this.redactFields = [...DEFAULT_REDACT_FIELDS, ...(config.redact ?? [])];\n\n if (config.timestamp === false) {\n this.timestampFn = () => \"\";\n } else if (typeof config.timestamp === \"function\") {\n this.timestampFn = config.timestamp;\n } else {\n this.timestampFn = () => new Date().toISOString();\n }\n }\n\n /**\n * Create a child logger with additional context\n */\n child(context: Record<string, unknown>): Logger {\n const levelEntry = Object.entries(LogLevel).find(([_, v]) => v === this.level);\n const levelName = levelEntry ? (levelEntry[0] as LogLevelName) : \"INFO\";\n\n const child = new Logger({\n level: levelName,\n name: this.name,\n context: { ...this.context, ...context },\n transports: this.transports,\n redact: this.redactFields,\n });\n return child;\n }\n\n /**\n * Log a message\n */\n private log(\n level: LogLevelName,\n message: string,\n context?: Record<string, unknown>,\n error?: Error\n ): void {\n const levelValue = LogLevel[level];\n if (levelValue < this.level) return;\n\n let finalContext = { ...this.context };\n if (this.name) {\n finalContext[\"module\"] = this.name;\n }\n if (context) {\n finalContext = { ...finalContext, ...context };\n }\n\n // Redact sensitive fields\n finalContext = redactFields(finalContext, this.redactFields);\n\n const entry: LogEntry = {\n level,\n levelValue,\n message,\n timestamp: this.timestampFn(),\n context: Object.keys(finalContext).length > 0 ? finalContext : undefined,\n error: error\n ? {\n name: error.name,\n message: error.message,\n stack: error.stack,\n }\n : undefined,\n };\n\n for (const transport of this.transports) {\n transport.log(entry);\n }\n }\n\n trace(message: string, context?: Record<string, unknown>): void {\n this.log(\"TRACE\", message, context);\n }\n\n debug(message: string, context?: Record<string, unknown>): void {\n this.log(\"DEBUG\", message, context);\n }\n\n info(message: string, context?: Record<string, unknown>): void {\n this.log(\"INFO\", message, context);\n }\n\n warn(message: string, context?: Record<string, unknown>): void {\n this.log(\"WARN\", message, context);\n }\n\n error(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"ERROR\", message, ctx, err);\n }\n\n fatal(message: string, error?: Error | unknown, context?: Record<string, unknown>): void {\n const err = error instanceof Error ? error : undefined;\n const ctx = error instanceof Error ? context : (error as Record<string, unknown> | undefined);\n this.log(\"FATAL\", message, ctx, err);\n }\n}\n\n/**\n * Create a logger instance\n */\nexport function createLogger(config?: Partial<LoggerConfig>): Logger {\n return new Logger(config);\n}\n\n/**\n * Default logger instance\n */\nexport const logger = createLogger();\n\n/**\n * Utility: Log error with proper formatting\n */\nexport function logError(\n log: Logger,\n error: unknown,\n message: string,\n context?: Record<string, unknown>\n): void {\n if (error instanceof Error) {\n log.error(message, error, context);\n } else {\n log.error(message, { error: String(error), ...context });\n }\n}\n\n/**\n * Utility: Measure execution time\n */\nexport async function measureTime<T>(\n log: Logger,\n operation: string,\n fn: () => Promise<T>\n): Promise<T> {\n const start = Date.now();\n try {\n const result = await fn();\n const duration = Date.now() - start;\n log.info(`${operation} completed`, { operation, durationMs: duration });\n return result;\n } catch (error) {\n const duration = Date.now() - start;\n logError(log, error, `${operation} failed`, { operation, durationMs: duration });\n throw error;\n }\n}\n\n/**\n * Utility: Create request logger middleware context\n */\nexport function createRequestLogger(\n baseLogger: Logger,\n request: {\n method?: string;\n url?: string;\n requestId?: string;\n userId?: string;\n tenantId?: string;\n }\n): Logger {\n const pathname = request.url ? new URL(request.url).pathname : undefined;\n return baseLogger.child({\n requestId: request.requestId,\n method: request.method,\n path: pathname,\n userId: request.userId,\n tenantId: request.tenantId,\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/runtime.js
CHANGED
|
@@ -57,7 +57,7 @@ function isServer() {
|
|
|
57
57
|
function getRuntimeVersion() {
|
|
58
58
|
switch (runtime) {
|
|
59
59
|
case "node":
|
|
60
|
-
return `Node.js ${process
|
|
60
|
+
return `Node.js ${process?.versions?.node ?? "unknown"}`;
|
|
61
61
|
case "bun":
|
|
62
62
|
return `Bun ${globalThis.Bun.version}`;
|
|
63
63
|
case "deno":
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process?.versions?.node ?? \"unknown\"}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n"],"mappings":";AAUO,SAAS,gBAAyB;AAEvC,MAAI,OAAO,eAAe,eAAe,SAAS,YAAY;AAC5D,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,eAAe,eAAe,UAAU,YAAY;AAC7D,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,WAAW,eACtC,OAAQ,WAAmB,YAAY,aACvC;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,gBAAgB,aAC3C;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,eAAe,eACtB,OAAQ,WAAmB,WAAW,eACtC,OAAQ,WAAmB,aAAa,aACxC;AACA,WAAO;AAAA,EACT;AAGA,MACE,OAAO,YAAY,eACnB,QAAQ,YACR,QAAQ,SAAS,MACjB;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAKO,IAAM,UAAU,cAAc;AAK9B,IAAM,cAAc;AAAA,EACzB;AAAA,EACA,QAAQ,YAAY;AAAA,EACpB,QAAQ,YAAY;AAAA,EACpB,OAAO,YAAY;AAAA,EACnB,cAAc,YAAY;AAAA,EAC1B,QAAQ,YAAY,gBAAgB,YAAY,UAAU,YAAY;AAAA,EACtE,WAAW,YAAY;AAAA,EACvB,UAAU,YAAY;AAAA,EACtB,mBAAmB,OAAO,WAAW,QAAQ,WAAW;AAAA,EACxD,iBAAiB,OAAO,WAAW,mBAAmB;AACxD;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,QAAiB;AAC/B,SAAO,YAAY;AACrB;AAKO,SAAS,eAAwB;AACtC,SAAO,YAAY;AACrB;AAKO,SAAS,SAAkB;AAChC,SAAO,YAAY;AACrB;AAKO,SAAS,YAAqB;AACnC,SAAO,YAAY;AACrB;AAKO,SAAS,WAAoB;AAClC,SAAO,YAAY;AACrB;AAKO,SAAS,oBAA4B;AAC1C,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO,WAAW,SAAS,UAAU,QAAQ,SAAS;AAAA,IACxD,KAAK;AACH,aAAO,OAAQ,WAAmB,IAAI,OAAO;AAAA,IAC/C,KAAK;AACH,aAAO,QAAS,WAAmB,KAAK,QAAQ,IAAI;AAAA,IACtD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,cAAc,cAAc,UAAU,YAAY;AAAA,IAClE;AACE,aAAO;AAAA,EACX;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime.ts","../../src/env.ts","../../src/transports/console.ts","../../src/transports/axiom.ts","../../src/transports/sentry.ts","../../src/transports/logtape.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process.versions.node}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Axiom Transport\n * Log ingestion transport for Axiom (axiom.co)\n * Uses native fetch - works on all runtimes (Node, Deno, Bun, Workers)\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type { LogTransport, BatchTransportOptions } from \"./types.js\";\n\n/**\n * Axiom transport options\n */\nexport interface AxiomTransportOptions extends BatchTransportOptions {\n /** Axiom API token */\n token: string;\n /** Dataset name to ingest logs into */\n dataset: string;\n /** Organization ID (optional, for personal tokens) */\n orgId?: string;\n /** Custom Axiom API URL (default: https://api.axiom.co) */\n apiUrl?: string;\n /** Callback for errors during ingestion */\n onError?: (error: Error, droppedCount: number) => void;\n}\n\n/**\n * Axiom log event structure\n */\ninterface AxiomEvent {\n _time: string;\n level: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Axiom Transport\n * Batches logs and sends them to Axiom's ingest API\n */\nexport class AxiomTransport implements LogTransport {\n readonly name = \"axiom\";\n\n private buffer: AxiomEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private readonly options: Required<\n Pick<AxiomTransportOptions, \"batchSize\" | \"flushInterval\" | \"apiUrl\">\n > &\n AxiomTransportOptions;\n\n constructor(options: AxiomTransportOptions) {\n this.options = {\n batchSize: 100,\n flushInterval: 5000,\n apiUrl: \"https://api.axiom.co\",\n ...options,\n };\n\n // Start flush interval if enabled\n if (this.options.flushInterval > 0) {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.options.flushInterval\n );\n }\n }\n\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n const event: AxiomEvent = {\n _time: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add context fields\n if (entry.context) {\n Object.assign(event, entry.context);\n }\n\n // Add error fields\n if (entry.error) {\n event[\"error.name\"] = entry.error.name;\n event[\"error.message\"] = entry.error.message;\n event[\"error.stack\"] = entry.error.stack;\n }\n\n this.buffer.push(event);\n\n // Flush if buffer is full\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing || this.buffer.length === 0) return;\n\n this.isFlushing = true;\n const events = this.buffer;\n this.buffer = [];\n\n try {\n const response = await fetch(\n `${this.options.apiUrl}/v1/datasets/${this.options.dataset}/ingest`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n ...(this.options.orgId && {\n \"X-Axiom-Org-Id\": this.options.orgId,\n }),\n },\n body: JSON.stringify(events),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Axiom ingest failed: ${response.status} ${errorText}`);\n }\n } catch (error) {\n // Call error handler if provided\n if (this.options.onError) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error)),\n events.length\n );\n } else {\n // Silent fail by default - don't crash the app for logging failures\n console.error(\"[Axiom] Failed to send logs:\", error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n async close(): Promise<void> {\n // Stop flush timer\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Final flush\n await this.flush();\n }\n}\n\n/**\n * Create Axiom transport\n */\nexport function createAxiomTransport(\n options: AxiomTransportOptions\n): AxiomTransport {\n return new AxiomTransport(options);\n}\n","/**\n * @parsrun/core - Sentry Transport\n * Error tracking transport for Sentry\n *\n * Supports two modes:\n * 1. HTTP API mode (default) - Zero dependency, works on all runtimes\n * 2. SDK mode (BYOS) - Full features with user-provided Sentry SDK\n *\n * @example HTTP API mode (simple, universal)\n * ```typescript\n * const sentry = new SentryTransport({\n * dsn: 'https://xxx@sentry.io/123',\n * environment: 'production',\n * });\n * ```\n *\n * @example SDK mode (full features)\n * ```typescript\n * import * as Sentry from '@sentry/cloudflare'; // or @sentry/node\n *\n * Sentry.init({ dsn: '...' });\n *\n * const sentry = new SentryTransport({\n * client: Sentry,\n * });\n * ```\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type {\n LogTransport,\n ErrorTransport,\n ErrorContext,\n ErrorUser,\n Breadcrumb,\n BaseTransportOptions,\n} from \"./types.js\";\n\n/**\n * Sentry SDK interface (minimal interface for BYOS)\n * Compatible with @sentry/node, @sentry/cloudflare, @sentry/browser, etc.\n */\nexport interface SentryClient {\n captureException(error: Error, hint?: unknown): string;\n captureMessage(message: string, level?: string): string;\n withScope(callback: (scope: SentryScope) => void): void;\n flush?(timeout?: number): Promise<boolean>;\n}\n\nexport interface SentryScope {\n setTag(key: string, value: string): void;\n setUser(user: { id: string; email?: string; [key: string]: unknown } | null): void;\n setExtra(key: string, value: unknown): void;\n setExtras(extras: Record<string, unknown>): void;\n setLevel(level: string): void;\n addBreadcrumb(breadcrumb: unknown): void;\n}\n\n/**\n * Parsed DSN components\n */\ninterface ParsedDSN {\n protocol: string;\n publicKey: string;\n host: string;\n projectId: string;\n}\n\n/**\n * Sentry transport options\n */\nexport interface SentryTransportOptions extends BaseTransportOptions {\n /**\n * Sentry DSN (required for HTTP mode)\n * Format: https://{publicKey}@{host}/{projectId}\n */\n dsn?: string;\n\n /**\n * Sentry SDK client (for BYOS mode)\n * Pass your initialized Sentry client for full SDK features\n */\n client?: SentryClient;\n\n /** Environment name (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Release version */\n release?: string;\n\n /** Server name */\n serverName?: string;\n\n /** Sample rate for error events (0.0 to 1.0) */\n sampleRate?: number;\n\n /** Additional tags to add to all events */\n tags?: Record<string, string>;\n\n /** Callback before sending (return null to drop event) */\n beforeSend?: (event: SentryEvent) => SentryEvent | null;\n\n /** Callback for transport errors */\n onError?: (error: Error) => void;\n}\n\n/**\n * Sentry event structure (simplified)\n */\nexport interface SentryEvent {\n event_id: string;\n timestamp: string;\n platform: string;\n level: \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n logger?: string;\n transaction?: string;\n server_name?: string;\n release?: string;\n environment?: string;\n message?: { formatted: string };\n exception?: {\n values: Array<{\n type: string;\n value: string;\n stacktrace?: {\n frames: Array<{\n filename?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n in_app?: boolean;\n }>;\n };\n }>;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n user?: {\n id?: string;\n email?: string;\n username?: string;\n [key: string]: unknown;\n };\n breadcrumbs?: Array<{\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n }>;\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Sentry Transport\n * Implements both LogTransport and ErrorTransport\n */\nexport class SentryTransport implements LogTransport, ErrorTransport {\n readonly name = \"sentry\";\n\n private readonly client?: SentryClient;\n private readonly dsn?: ParsedDSN;\n private readonly options: SentryTransportOptions;\n private user: ErrorUser | null = null;\n private contexts: Map<string, Record<string, unknown>> = new Map();\n private breadcrumbs: Breadcrumb[] = [];\n private readonly maxBreadcrumbs = 100;\n\n constructor(options: SentryTransportOptions) {\n this.options = {\n sampleRate: 1.0,\n ...options,\n };\n\n if (options.client) {\n this.client = options.client;\n } else if (options.dsn) {\n this.dsn = this.parseDSN(options.dsn);\n } else {\n throw new Error(\"SentryTransport requires either 'dsn' or 'client' option\");\n }\n }\n\n /**\n * Parse Sentry DSN\n */\n private parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(/^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/);\n if (!match || !match[1] || !match[2] || !match[3] || !match[4]) {\n throw new Error(`Invalid Sentry DSN: ${dsn}`);\n }\n return {\n protocol: match[1],\n publicKey: match[2],\n host: match[3],\n projectId: match[4],\n };\n }\n\n /**\n * LogTransport implementation\n * Only sends ERROR and FATAL level logs\n */\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n // Only capture errors\n if (entry.levelValue < 50) return; // ERROR = 50, FATAL = 60\n\n if (entry.error) {\n const error = new Error(entry.error.message);\n error.name = entry.error.name;\n if (entry.error.stack) {\n error.stack = entry.error.stack;\n }\n\n this.captureException(\n error,\n entry.context ? { extra: entry.context } : undefined\n );\n } else {\n this.captureMessage(\n entry.message,\n entry.level === \"FATAL\" ? \"error\" : \"warning\",\n entry.context ? { extra: entry.context } : undefined\n );\n }\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: ErrorContext): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.captureWithSdk(error, context);\n } else {\n this.captureWithHttp(error, context);\n }\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: \"info\" | \"warning\" | \"error\",\n context?: ErrorContext\n ): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.client.withScope((scope) => {\n this.applyContext(scope, context);\n scope.setLevel(level);\n this.client!.captureMessage(message, level);\n });\n } else {\n this.sendHttpEvent({\n level: level === \"warning\" ? \"warning\" : level === \"info\" ? \"info\" : \"error\",\n message: { formatted: message },\n ...this.buildEventContext(context),\n });\n }\n }\n\n /**\n * Set user context\n */\n setUser(user: ErrorUser | null): void {\n this.user = user;\n }\n\n /**\n * Set custom context\n */\n setContext(name: string, context: Record<string, unknown>): void {\n this.contexts.set(name, context);\n }\n\n /**\n * Add breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: breadcrumb.timestamp ?? Date.now() / 1000,\n });\n\n // Keep only last N breadcrumbs\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n\n /**\n * Flush pending events\n */\n async flush(): Promise<void> {\n if (this.client?.flush) {\n await this.client.flush(2000);\n }\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private shouldSample(): boolean {\n const rate = this.options.sampleRate ?? 1.0;\n return Math.random() < rate;\n }\n\n /**\n * Capture with SDK (BYOS mode)\n */\n private captureWithSdk(error: Error, context?: ErrorContext): void {\n this.client!.withScope((scope) => {\n this.applyContext(scope, context);\n this.client!.captureException(error);\n });\n }\n\n /**\n * Apply context to SDK scope\n */\n private applyContext(scope: SentryScope, context?: ErrorContext): void {\n // User\n if (this.user) {\n scope.setUser(this.user);\n } else if (context?.userId) {\n scope.setUser({ id: context.userId });\n }\n\n // Tags\n if (this.options.tags) {\n for (const [key, value] of Object.entries(this.options.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.tags) {\n for (const [key, value] of Object.entries(context.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.requestId) {\n scope.setTag(\"requestId\", context.requestId);\n }\n if (context?.tenantId) {\n scope.setTag(\"tenantId\", context.tenantId);\n }\n\n // Extra\n if (context?.extra) {\n scope.setExtras(context.extra);\n }\n\n // Breadcrumbs\n for (const bc of this.breadcrumbs) {\n scope.addBreadcrumb(bc);\n }\n }\n\n /**\n * Capture with HTTP API (default mode)\n */\n private captureWithHttp(error: Error, context?: ErrorContext): void {\n const stacktrace = this.parseStackTrace(error.stack);\n const exceptionValue: {\n type: string;\n value: string;\n stacktrace?: { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> };\n } = {\n type: error.name,\n value: error.message,\n };\n\n if (stacktrace) {\n exceptionValue.stacktrace = stacktrace;\n }\n\n const event: Partial<SentryEvent> = {\n level: \"error\",\n exception: {\n values: [exceptionValue],\n },\n ...this.buildEventContext(context),\n };\n\n this.sendHttpEvent(event);\n }\n\n /**\n * Build event context for HTTP API\n */\n private buildEventContext(context?: ErrorContext): Partial<SentryEvent> {\n const event: Partial<SentryEvent> = {};\n\n // Environment & Release\n if (this.options.environment) {\n event.environment = this.options.environment;\n }\n if (this.options.release) {\n event.release = this.options.release;\n }\n if (this.options.serverName) {\n event.server_name = this.options.serverName;\n }\n\n // Tags\n const tags: Record<string, string> = { ...this.options.tags };\n if (context?.tags) {\n Object.assign(tags, context.tags);\n }\n if (context?.requestId) {\n tags[\"requestId\"] = context.requestId;\n }\n if (context?.tenantId) {\n tags[\"tenantId\"] = context.tenantId;\n }\n if (Object.keys(tags).length > 0) {\n event.tags = tags;\n }\n\n // Extra\n if (context?.extra) {\n event.extra = context.extra;\n }\n\n // User\n if (this.user) {\n event.user = this.user;\n } else if (context?.userId) {\n event.user = { id: context.userId };\n }\n\n // Breadcrumbs\n if (this.breadcrumbs.length > 0) {\n event.breadcrumbs = this.breadcrumbs.map((bc) => {\n const crumb: {\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n } = {};\n if (bc.type) crumb.type = bc.type;\n if (bc.category) crumb.category = bc.category;\n if (bc.message) crumb.message = bc.message;\n if (bc.data) crumb.data = bc.data;\n if (bc.level) crumb.level = bc.level;\n if (bc.timestamp !== undefined) crumb.timestamp = bc.timestamp;\n return crumb;\n });\n }\n\n // Contexts\n if (this.contexts.size > 0) {\n event.contexts = Object.fromEntries(this.contexts);\n }\n\n return event;\n }\n\n /**\n * Parse error stack trace into Sentry format\n */\n private parseStackTrace(\n stack?: string\n ): { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> } | undefined {\n if (!stack) return undefined;\n\n const lines = stack.split(\"\\n\").slice(1); // Skip first line (error message)\n const frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> = [];\n\n for (const line of lines) {\n // Parse V8 stack trace format\n const match = line.match(/^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (match && match[3] && match[4]) {\n const frame: { filename?: string; function?: string; lineno?: number; colno?: number } = {\n function: match[1] || \"<anonymous>\",\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n };\n if (match[2]) {\n frame.filename = match[2];\n }\n frames.push(frame);\n }\n }\n\n // Sentry expects oldest frame first\n frames.reverse();\n\n return frames.length > 0 ? { frames } : undefined;\n }\n\n /**\n * Generate event ID\n */\n private generateEventId(): string {\n // 32 character hex string\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Send event via HTTP API\n */\n private async sendHttpEvent(eventData: Partial<SentryEvent>): Promise<void> {\n if (!this.dsn) return;\n\n const event: SentryEvent = {\n event_id: this.generateEventId(),\n timestamp: new Date().toISOString(),\n platform: \"javascript\",\n level: \"error\",\n ...eventData,\n };\n\n // Apply beforeSend hook\n if (this.options.beforeSend) {\n const result = this.options.beforeSend(event);\n if (result === null) return;\n }\n\n const url = `${this.dsn.protocol}://${this.dsn.host}/api/${this.dsn.projectId}/store/`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Sentry-Auth\": [\n \"Sentry sentry_version=7\",\n `sentry_client=pars-sentry/1.0.0`,\n `sentry_key=${this.dsn.publicKey}`,\n ].join(\", \"),\n },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n throw new Error(`Sentry API error: ${response.status}`);\n }\n } catch (error) {\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n // Silent fail - don't crash the app for logging failures\n }\n }\n}\n\n/**\n * Create Sentry transport\n */\nexport function createSentryTransport(options: SentryTransportOptions): SentryTransport {\n return new SentryTransport(options);\n}\n","/**\n * @parsrun/core - Logtape Transport\n * Structured logging transport for Logtape (@logtape/logtape)\n *\n * Logtape is a TypeScript-first structured logging library.\n * This transport bridges Pars Logger to Logtape for advanced logging scenarios.\n *\n * @example BYOS (Bring Your Own SDK)\n * ```typescript\n * import { getLogger, configure } from '@logtape/logtape';\n *\n * // Configure Logtape\n * await configure({\n * sinks: { console: consoleSink() },\n * loggers: [{ category: 'pars', sinks: ['console'], level: 'info' }],\n * });\n *\n * const logtapeLogger = getLogger('pars');\n * const transport = new LogtapeTransport({ logger: logtapeLogger });\n * ```\n *\n * @example Simple mode (creates internal logger)\n * ```typescript\n * const transport = new LogtapeTransport({\n * category: 'my-app',\n * });\n * ```\n */\n\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport, BaseTransportOptions } from \"./types.js\";\n\n/**\n * Logtape Logger interface (minimal interface for BYOS)\n * Compatible with @logtape/logtape getLogger() return type\n */\nexport interface LogtapeLogger {\n debug(message: string, properties?: Record<string, unknown>): void;\n info(message: string, properties?: Record<string, unknown>): void;\n warn(message: string, properties?: Record<string, unknown>): void;\n warning(message: string, properties?: Record<string, unknown>): void;\n error(message: string, properties?: Record<string, unknown>): void;\n fatal(message: string, properties?: Record<string, unknown>): void;\n}\n\n/**\n * Level mapping from Pars to Logtape\n */\ntype LogtapeLevel = \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\n/**\n * Logtape transport options\n */\nexport interface LogtapeTransportOptions extends BaseTransportOptions {\n /**\n * Logtape logger instance (for BYOS mode)\n * Get this from @logtape/logtape's getLogger()\n */\n logger?: LogtapeLogger;\n\n /**\n * Category name for the logger\n * Only used if logger is not provided (creates a simple fallback logger)\n */\n category?: string;\n\n /**\n * Include timestamp in properties\n * @default true\n */\n includeTimestamp?: boolean;\n\n /**\n * Include level value in properties\n * @default false\n */\n includeLevelValue?: boolean;\n}\n\n/**\n * Simple fallback logger when no Logtape instance is provided\n * Just outputs structured JSON - users should use BYOS for full features\n */\nclass FallbackLogger implements LogtapeLogger {\n constructor(private category: string) {}\n\n private log(level: string, message: string, properties?: Record<string, unknown>): void {\n const entry = {\n level,\n category: this.category,\n msg: message,\n time: new Date().toISOString(),\n ...properties,\n };\n console.log(JSON.stringify(entry));\n }\n\n debug(message: string, properties?: Record<string, unknown>): void {\n this.log(\"debug\", message, properties);\n }\n\n info(message: string, properties?: Record<string, unknown>): void {\n this.log(\"info\", message, properties);\n }\n\n warn(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warn\", message, properties);\n }\n\n warning(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warning\", message, properties);\n }\n\n error(message: string, properties?: Record<string, unknown>): void {\n this.log(\"error\", message, properties);\n }\n\n fatal(message: string, properties?: Record<string, unknown>): void {\n this.log(\"fatal\", message, properties);\n }\n}\n\n/**\n * Logtape Transport\n * Bridges Pars Logger to Logtape\n */\nexport class LogtapeTransport implements LogTransport {\n readonly name = \"logtape\";\n\n private readonly logger: LogtapeLogger;\n private readonly includeTimestamp: boolean;\n private readonly includeLevelValue: boolean;\n private readonly enabled: boolean;\n\n constructor(options: LogtapeTransportOptions = {}) {\n this.enabled = options.enabled !== false;\n this.includeTimestamp = options.includeTimestamp !== false;\n this.includeLevelValue = options.includeLevelValue ?? false;\n\n if (options.logger) {\n this.logger = options.logger;\n } else {\n // Create fallback logger\n this.logger = new FallbackLogger(options.category ?? \"pars\");\n }\n }\n\n log(entry: LogEntry): void {\n if (!this.enabled) return;\n\n const level = this.mapLevel(entry.level);\n const properties = this.buildProperties(entry);\n\n // Call the appropriate log method\n this.logger[level](entry.message, properties);\n }\n\n /**\n * Map Pars log level to Logtape level\n */\n private mapLevel(level: LogLevelName): LogtapeLevel {\n const mapping: Record<LogLevelName, LogtapeLevel> = {\n TRACE: \"debug\",\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warning\",\n ERROR: \"error\",\n FATAL: \"fatal\",\n SILENT: \"debug\", // Should never be logged\n };\n return mapping[level];\n }\n\n /**\n * Build properties object for Logtape\n */\n private buildProperties(entry: LogEntry): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Add timestamp if enabled\n if (this.includeTimestamp) {\n properties[\"timestamp\"] = entry.timestamp;\n }\n\n // Add level value if enabled\n if (this.includeLevelValue) {\n properties[\"levelValue\"] = entry.levelValue;\n }\n\n // Add context\n if (entry.context) {\n Object.assign(properties, entry.context);\n }\n\n // Add error info\n if (entry.error) {\n properties[\"error\"] = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return properties;\n }\n}\n\n/**\n * Create Logtape transport\n */\nexport function createLogtapeTransport(\n options?: LogtapeTransportOptions\n): LogtapeTransport {\n return new LogtapeTransport(options);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime.ts","../../src/env.ts","../../src/transports/console.ts","../../src/transports/axiom.ts","../../src/transports/sentry.ts","../../src/transports/logtape.ts"],"sourcesContent":["/**\n * @parsrun/core - Runtime Detection\n * Edge-compatible runtime detection for Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nexport type Runtime = \"node\" | \"deno\" | \"bun\" | \"cloudflare\" | \"edge\" | \"browser\" | \"unknown\";\n\n/**\n * Detect the current JavaScript runtime\n */\nexport function detectRuntime(): Runtime {\n // Bun check (must be before Node since Bun also has process)\n if (typeof globalThis !== \"undefined\" && \"Bun\" in globalThis) {\n return \"bun\";\n }\n\n // Deno check\n if (typeof globalThis !== \"undefined\" && \"Deno\" in globalThis) {\n return \"deno\";\n }\n\n // Cloudflare Workers check (has caches but no process)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).caches !== \"undefined\" &&\n typeof (globalThis as any).process === \"undefined\"\n ) {\n return \"cloudflare\";\n }\n\n // Generic Edge runtime check (Vercel Edge, etc.)\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).EdgeRuntime !== \"undefined\"\n ) {\n return \"edge\";\n }\n\n // Browser check\n if (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as any).window !== \"undefined\" &&\n typeof (globalThis as any).document !== \"undefined\"\n ) {\n return \"browser\";\n }\n\n // Node.js check\n if (\n typeof process !== \"undefined\" &&\n process.versions &&\n process.versions.node\n ) {\n return \"node\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Current runtime (cached)\n */\nexport const runtime = detectRuntime();\n\n/**\n * Runtime information helpers\n */\nexport const runtimeInfo = {\n runtime,\n isNode: runtime === \"node\",\n isDeno: runtime === \"deno\",\n isBun: runtime === \"bun\",\n isCloudflare: runtime === \"cloudflare\",\n isEdge: runtime === \"cloudflare\" || runtime === \"edge\" || runtime === \"deno\",\n isBrowser: runtime === \"browser\",\n isServer: runtime !== \"browser\",\n supportsWebCrypto: typeof globalThis.crypto?.subtle !== \"undefined\",\n supportsStreams: typeof globalThis.ReadableStream !== \"undefined\",\n} as const;\n\n/**\n * Check if running in Node.js\n */\nexport function isNode(): boolean {\n return runtime === \"node\";\n}\n\n/**\n * Check if running in Deno\n */\nexport function isDeno(): boolean {\n return runtime === \"deno\";\n}\n\n/**\n * Check if running in Bun\n */\nexport function isBun(): boolean {\n return runtime === \"bun\";\n}\n\n/**\n * Check if running in Cloudflare Workers\n */\nexport function isCloudflare(): boolean {\n return runtime === \"cloudflare\";\n}\n\n/**\n * Check if running in any edge environment\n */\nexport function isEdge(): boolean {\n return runtimeInfo.isEdge;\n}\n\n/**\n * Check if running in browser\n */\nexport function isBrowser(): boolean {\n return runtime === \"browser\";\n}\n\n/**\n * Check if running on server (not browser)\n */\nexport function isServer(): boolean {\n return runtimeInfo.isServer;\n}\n\n/**\n * Get runtime version string\n */\nexport function getRuntimeVersion(): string {\n switch (runtime) {\n case \"node\":\n return `Node.js ${process?.versions?.node ?? \"unknown\"}`;\n case \"bun\":\n return `Bun ${(globalThis as any).Bun.version}`;\n case \"deno\":\n return `Deno ${(globalThis as any).Deno.version.deno}`;\n case \"cloudflare\":\n return \"Cloudflare Workers\";\n case \"edge\":\n return \"Edge Runtime\";\n case \"browser\":\n return typeof navigator !== \"undefined\" ? navigator.userAgent : \"Browser\";\n default:\n return \"Unknown\";\n }\n}\n","/**\n * @parsrun/core - Environment Variables\n * Runtime-agnostic environment variable access\n * Works in Node.js, Deno, Bun, and Cloudflare Workers\n */\n\nimport { runtime } from \"./runtime.js\";\n\n/**\n * Environment variable store for edge runtimes\n * Must be set from the request handler's env parameter\n */\nlet edgeEnvStore: Record<string, string | undefined> = {};\n\n/**\n * Set environment variables for edge runtimes (Cloudflare Workers, etc.)\n * Call this from your worker's fetch handler with the env parameter\n *\n * @example\n * ```typescript\n * export default {\n * async fetch(request, env) {\n * setEdgeEnv(env);\n * // ... rest of handler\n * }\n * }\n * ```\n */\nexport function setEdgeEnv(env: Record<string, string | undefined>): void {\n edgeEnvStore = { ...edgeEnvStore, ...env };\n}\n\n/**\n * Clear edge environment store\n */\nexport function clearEdgeEnv(): void {\n edgeEnvStore = {};\n}\n\n/**\n * Get an environment variable value\n * Works across all runtimes\n */\nexport function getEnv(key: string, defaultValue?: string): string | undefined {\n // Edge runtimes (Cloudflare Workers, etc.)\n if (runtime === \"cloudflare\" || runtime === \"edge\") {\n return edgeEnvStore[key] ?? defaultValue;\n }\n\n // Deno\n if (runtime === \"deno\") {\n try {\n return (globalThis as any).Deno.env.get(key) ?? defaultValue;\n } catch {\n return defaultValue;\n }\n }\n\n // Node.js / Bun (both use process.env)\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key] ?? defaultValue;\n }\n\n // Browser - check for injected env\n if (runtime === \"browser\" && typeof (globalThis as any).__ENV__ !== \"undefined\") {\n return (globalThis as any).__ENV__[key] ?? defaultValue;\n }\n\n return defaultValue;\n}\n\n/**\n * Get an environment variable, throwing if not found\n */\nexport function requireEnv(key: string): string {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n return value;\n}\n\n/**\n * Get an environment variable as a number\n */\nexport function getEnvNumber(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseInt(value, 10);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a float\n */\nexport function getEnvFloat(key: string, defaultValue?: number): number | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n const parsed = parseFloat(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Get an environment variable as a boolean\n */\nexport function getEnvBoolean(key: string, defaultValue: boolean = false): boolean {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value === \"true\" || value === \"1\" || value === \"yes\";\n}\n\n/**\n * Get an environment variable as an array (comma-separated)\n */\nexport function getEnvArray(key: string, defaultValue: string[] = []): string[] {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n return value.split(\",\").map((s) => s.trim()).filter(Boolean);\n}\n\n/**\n * Get an environment variable as JSON\n */\nexport function getEnvJson<T>(key: string, defaultValue?: T): T | undefined {\n const value = getEnv(key);\n if (value === undefined || value === \"\") {\n return defaultValue;\n }\n try {\n return JSON.parse(value) as T;\n } catch {\n return defaultValue;\n }\n}\n\n/**\n * Check if running in development mode\n */\nexport function isDevelopment(): boolean {\n const env = getEnv(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n\n/**\n * Check if running in production mode\n */\nexport function isProduction(): boolean {\n return getEnv(\"NODE_ENV\") === \"production\";\n}\n\n/**\n * Check if running in test mode\n */\nexport function isTest(): boolean {\n return getEnv(\"NODE_ENV\") === \"test\";\n}\n\n/**\n * Environment mode\n */\nexport type EnvMode = \"development\" | \"production\" | \"test\";\n\n/**\n * Get current environment mode\n */\nexport function getEnvMode(): EnvMode {\n const env = getEnv(\"NODE_ENV\");\n if (env === \"production\") return \"production\";\n if (env === \"test\") return \"test\";\n return \"development\";\n}\n\n/**\n * Create a typed environment configuration object\n *\n * @example\n * ```typescript\n * const env = createEnvConfig({\n * DATABASE_URL: { required: true },\n * PORT: { type: 'number', default: 3000 },\n * DEBUG: { type: 'boolean', default: false },\n * });\n *\n * env.DATABASE_URL // string\n * env.PORT // number\n * env.DEBUG // boolean\n * ```\n */\nexport function createEnvConfig<T extends EnvSchema>(schema: T): EnvResult<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, config] of Object.entries(schema)) {\n const envConfig = config as EnvConfigItem;\n let value: unknown;\n\n switch (envConfig.type) {\n case \"number\":\n value = getEnvNumber(key, envConfig.default as number | undefined);\n break;\n case \"boolean\":\n value = getEnvBoolean(key, envConfig.default as boolean | undefined);\n break;\n case \"array\":\n value = getEnvArray(key, envConfig.default as string[] | undefined);\n break;\n case \"json\":\n value = getEnvJson(key, envConfig.default);\n break;\n default:\n value = getEnv(key, envConfig.default as string | undefined);\n }\n\n if (envConfig.required && (value === undefined || value === \"\")) {\n throw new Error(`Required environment variable \"${key}\" is not set`);\n }\n\n result[key] = value;\n }\n\n return result as EnvResult<T>;\n}\n\n// Type helpers for createEnvConfig\ntype EnvConfigItem = {\n type?: \"string\" | \"number\" | \"boolean\" | \"array\" | \"json\";\n required?: boolean;\n default?: unknown;\n};\n\ntype EnvSchema = Record<string, EnvConfigItem>;\n\ntype EnvResult<T extends EnvSchema> = {\n [K in keyof T]: T[K][\"type\"] extends \"number\"\n ? number\n : T[K][\"type\"] extends \"boolean\"\n ? boolean\n : T[K][\"type\"] extends \"array\"\n ? string[]\n : T[K][\"type\"] extends \"json\"\n ? unknown\n : string;\n};\n","/**\n * @parsrun/core - Console Transport\n * Default transport that outputs to console\n */\n\nimport { runtime } from \"../runtime.js\";\nimport { isDevelopment } from \"../env.js\";\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport } from \"./types.js\";\n\n/**\n * Console transport options\n */\nexport interface ConsoleTransportOptions {\n /** Enable pretty printing (default: true in development) */\n pretty?: boolean;\n /** Enable ANSI colors (default: true in Node/Bun) */\n colors?: boolean;\n}\n\n/**\n * Console transport\n * Outputs logs to console with optional pretty printing and colors\n */\nexport class ConsoleTransport implements LogTransport {\n readonly name = \"console\";\n\n private pretty: boolean;\n private colors: boolean;\n\n constructor(options: ConsoleTransportOptions = {}) {\n this.pretty = options.pretty ?? isDevelopment();\n this.colors = options.colors ?? (runtime === \"node\" || runtime === \"bun\");\n }\n\n log(entry: LogEntry): void {\n if (this.pretty) {\n this.logPretty(entry);\n } else {\n this.logJson(entry);\n }\n }\n\n private logJson(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const output: Record<string, unknown> = {\n level,\n time: timestamp,\n msg: message,\n };\n\n if (context && Object.keys(context).length > 0) {\n Object.assign(output, context);\n }\n\n if (error) {\n output[\"err\"] = error;\n }\n\n console.log(JSON.stringify(output));\n }\n\n private logPretty(entry: LogEntry): void {\n const { level, message, timestamp, context, error } = entry;\n\n const levelColors: Record<LogLevelName, string> = {\n TRACE: \"\\x1b[90m\", // Gray\n DEBUG: \"\\x1b[36m\", // Cyan\n INFO: \"\\x1b[32m\", // Green\n WARN: \"\\x1b[33m\", // Yellow\n ERROR: \"\\x1b[31m\", // Red\n FATAL: \"\\x1b[35m\", // Magenta\n SILENT: \"\",\n };\n\n const reset = \"\\x1b[0m\";\n const color = this.colors ? levelColors[level] : \"\";\n const resetCode = this.colors ? reset : \"\";\n\n // Extract time part from ISO timestamp\n const timePart = timestamp.split(\"T\")[1];\n const time = timePart ? timePart.slice(0, 8) : timestamp;\n\n let output = `${color}[${time}] ${level.padEnd(5)}${resetCode} ${message}`;\n\n if (context && Object.keys(context).length > 0) {\n output += ` ${JSON.stringify(context)}`;\n }\n\n // Route to appropriate console method\n if (level === \"ERROR\" || level === \"FATAL\") {\n console.error(output);\n if (error?.stack) {\n console.error(error.stack);\n }\n } else if (level === \"WARN\") {\n console.warn(output);\n } else if (level === \"DEBUG\" || level === \"TRACE\") {\n console.debug(output);\n } else {\n console.log(output);\n }\n }\n}\n","/**\n * @parsrun/core - Axiom Transport\n * Log ingestion transport for Axiom (axiom.co)\n * Uses native fetch - works on all runtimes (Node, Deno, Bun, Workers)\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type { LogTransport, BatchTransportOptions } from \"./types.js\";\n\n/**\n * Axiom transport options\n */\nexport interface AxiomTransportOptions extends BatchTransportOptions {\n /** Axiom API token */\n token: string;\n /** Dataset name to ingest logs into */\n dataset: string;\n /** Organization ID (optional, for personal tokens) */\n orgId?: string;\n /** Custom Axiom API URL (default: https://api.axiom.co) */\n apiUrl?: string;\n /** Callback for errors during ingestion */\n onError?: (error: Error, droppedCount: number) => void;\n}\n\n/**\n * Axiom log event structure\n */\ninterface AxiomEvent {\n _time: string;\n level: string;\n message: string;\n [key: string]: unknown;\n}\n\n/**\n * Axiom Transport\n * Batches logs and sends them to Axiom's ingest API\n */\nexport class AxiomTransport implements LogTransport {\n readonly name = \"axiom\";\n\n private buffer: AxiomEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private isFlushing = false;\n private readonly options: Required<\n Pick<AxiomTransportOptions, \"batchSize\" | \"flushInterval\" | \"apiUrl\">\n > &\n AxiomTransportOptions;\n\n constructor(options: AxiomTransportOptions) {\n this.options = {\n batchSize: 100,\n flushInterval: 5000,\n apiUrl: \"https://api.axiom.co\",\n ...options,\n };\n\n // Start flush interval if enabled\n if (this.options.flushInterval > 0) {\n this.flushTimer = setInterval(\n () => this.flush(),\n this.options.flushInterval\n );\n }\n }\n\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n const event: AxiomEvent = {\n _time: entry.timestamp,\n level: entry.level,\n message: entry.message,\n };\n\n // Add context fields\n if (entry.context) {\n Object.assign(event, entry.context);\n }\n\n // Add error fields\n if (entry.error) {\n event[\"error.name\"] = entry.error.name;\n event[\"error.message\"] = entry.error.message;\n event[\"error.stack\"] = entry.error.stack;\n }\n\n this.buffer.push(event);\n\n // Flush if buffer is full\n if (this.buffer.length >= this.options.batchSize) {\n this.flush();\n }\n }\n\n async flush(): Promise<void> {\n // Prevent concurrent flushes\n if (this.isFlushing || this.buffer.length === 0) return;\n\n this.isFlushing = true;\n const events = this.buffer;\n this.buffer = [];\n\n try {\n const response = await fetch(\n `${this.options.apiUrl}/v1/datasets/${this.options.dataset}/ingest`,\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.token}`,\n \"Content-Type\": \"application/json\",\n ...(this.options.orgId && {\n \"X-Axiom-Org-Id\": this.options.orgId,\n }),\n },\n body: JSON.stringify(events),\n }\n );\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Axiom ingest failed: ${response.status} ${errorText}`);\n }\n } catch (error) {\n // Call error handler if provided\n if (this.options.onError) {\n this.options.onError(\n error instanceof Error ? error : new Error(String(error)),\n events.length\n );\n } else {\n // Silent fail by default - don't crash the app for logging failures\n console.error(\"[Axiom] Failed to send logs:\", error);\n }\n } finally {\n this.isFlushing = false;\n }\n }\n\n async close(): Promise<void> {\n // Stop flush timer\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n\n // Final flush\n await this.flush();\n }\n}\n\n/**\n * Create Axiom transport\n */\nexport function createAxiomTransport(\n options: AxiomTransportOptions\n): AxiomTransport {\n return new AxiomTransport(options);\n}\n","/**\n * @parsrun/core - Sentry Transport\n * Error tracking transport for Sentry\n *\n * Supports two modes:\n * 1. HTTP API mode (default) - Zero dependency, works on all runtimes\n * 2. SDK mode (BYOS) - Full features with user-provided Sentry SDK\n *\n * @example HTTP API mode (simple, universal)\n * ```typescript\n * const sentry = new SentryTransport({\n * dsn: 'https://xxx@sentry.io/123',\n * environment: 'production',\n * });\n * ```\n *\n * @example SDK mode (full features)\n * ```typescript\n * import * as Sentry from '@sentry/cloudflare'; // or @sentry/node\n *\n * Sentry.init({ dsn: '...' });\n *\n * const sentry = new SentryTransport({\n * client: Sentry,\n * });\n * ```\n */\n\nimport type { LogEntry } from \"../logger.js\";\nimport type {\n LogTransport,\n ErrorTransport,\n ErrorContext,\n ErrorUser,\n Breadcrumb,\n BaseTransportOptions,\n} from \"./types.js\";\n\n/**\n * Sentry SDK interface (minimal interface for BYOS)\n * Compatible with @sentry/node, @sentry/cloudflare, @sentry/browser, etc.\n */\nexport interface SentryClient {\n captureException(error: Error, hint?: unknown): string;\n captureMessage(message: string, level?: string): string;\n withScope(callback: (scope: SentryScope) => void): void;\n flush?(timeout?: number): Promise<boolean>;\n}\n\nexport interface SentryScope {\n setTag(key: string, value: string): void;\n setUser(user: { id: string; email?: string; [key: string]: unknown } | null): void;\n setExtra(key: string, value: unknown): void;\n setExtras(extras: Record<string, unknown>): void;\n setLevel(level: string): void;\n addBreadcrumb(breadcrumb: unknown): void;\n}\n\n/**\n * Parsed DSN components\n */\ninterface ParsedDSN {\n protocol: string;\n publicKey: string;\n host: string;\n projectId: string;\n}\n\n/**\n * Sentry transport options\n */\nexport interface SentryTransportOptions extends BaseTransportOptions {\n /**\n * Sentry DSN (required for HTTP mode)\n * Format: https://{publicKey}@{host}/{projectId}\n */\n dsn?: string;\n\n /**\n * Sentry SDK client (for BYOS mode)\n * Pass your initialized Sentry client for full SDK features\n */\n client?: SentryClient;\n\n /** Environment name (e.g., 'production', 'staging') */\n environment?: string;\n\n /** Release version */\n release?: string;\n\n /** Server name */\n serverName?: string;\n\n /** Sample rate for error events (0.0 to 1.0) */\n sampleRate?: number;\n\n /** Additional tags to add to all events */\n tags?: Record<string, string>;\n\n /** Callback before sending (return null to drop event) */\n beforeSend?: (event: SentryEvent) => SentryEvent | null;\n\n /** Callback for transport errors */\n onError?: (error: Error) => void;\n}\n\n/**\n * Sentry event structure (simplified)\n */\nexport interface SentryEvent {\n event_id: string;\n timestamp: string;\n platform: string;\n level: \"fatal\" | \"error\" | \"warning\" | \"info\" | \"debug\";\n logger?: string;\n transaction?: string;\n server_name?: string;\n release?: string;\n environment?: string;\n message?: { formatted: string };\n exception?: {\n values: Array<{\n type: string;\n value: string;\n stacktrace?: {\n frames: Array<{\n filename?: string;\n function?: string;\n lineno?: number;\n colno?: number;\n in_app?: boolean;\n }>;\n };\n }>;\n };\n tags?: Record<string, string>;\n extra?: Record<string, unknown>;\n user?: {\n id?: string;\n email?: string;\n username?: string;\n [key: string]: unknown;\n };\n breadcrumbs?: Array<{\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n }>;\n contexts?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Sentry Transport\n * Implements both LogTransport and ErrorTransport\n */\nexport class SentryTransport implements LogTransport, ErrorTransport {\n readonly name = \"sentry\";\n\n private readonly client?: SentryClient;\n private readonly dsn?: ParsedDSN;\n private readonly options: SentryTransportOptions;\n private user: ErrorUser | null = null;\n private contexts: Map<string, Record<string, unknown>> = new Map();\n private breadcrumbs: Breadcrumb[] = [];\n private readonly maxBreadcrumbs = 100;\n\n constructor(options: SentryTransportOptions) {\n this.options = {\n sampleRate: 1.0,\n ...options,\n };\n\n if (options.client) {\n this.client = options.client;\n } else if (options.dsn) {\n this.dsn = this.parseDSN(options.dsn);\n } else {\n throw new Error(\"SentryTransport requires either 'dsn' or 'client' option\");\n }\n }\n\n /**\n * Parse Sentry DSN\n */\n private parseDSN(dsn: string): ParsedDSN {\n const match = dsn.match(/^(https?):\\/\\/([^@]+)@([^/]+)\\/(.+)$/);\n if (!match || !match[1] || !match[2] || !match[3] || !match[4]) {\n throw new Error(`Invalid Sentry DSN: ${dsn}`);\n }\n return {\n protocol: match[1],\n publicKey: match[2],\n host: match[3],\n projectId: match[4],\n };\n }\n\n /**\n * LogTransport implementation\n * Only sends ERROR and FATAL level logs\n */\n log(entry: LogEntry): void {\n if (this.options.enabled === false) return;\n\n // Only capture errors\n if (entry.levelValue < 50) return; // ERROR = 50, FATAL = 60\n\n if (entry.error) {\n const error = new Error(entry.error.message);\n error.name = entry.error.name;\n if (entry.error.stack) {\n error.stack = entry.error.stack;\n }\n\n this.captureException(\n error,\n entry.context ? { extra: entry.context } : undefined\n );\n } else {\n this.captureMessage(\n entry.message,\n entry.level === \"FATAL\" ? \"error\" : \"warning\",\n entry.context ? { extra: entry.context } : undefined\n );\n }\n }\n\n /**\n * Capture an exception\n */\n captureException(error: Error, context?: ErrorContext): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.captureWithSdk(error, context);\n } else {\n this.captureWithHttp(error, context);\n }\n }\n\n /**\n * Capture a message\n */\n captureMessage(\n message: string,\n level: \"info\" | \"warning\" | \"error\",\n context?: ErrorContext\n ): void {\n if (this.options.enabled === false) return;\n if (!this.shouldSample()) return;\n\n if (this.client) {\n this.client.withScope((scope) => {\n this.applyContext(scope, context);\n scope.setLevel(level);\n this.client!.captureMessage(message, level);\n });\n } else {\n this.sendHttpEvent({\n level: level === \"warning\" ? \"warning\" : level === \"info\" ? \"info\" : \"error\",\n message: { formatted: message },\n ...this.buildEventContext(context),\n });\n }\n }\n\n /**\n * Set user context\n */\n setUser(user: ErrorUser | null): void {\n this.user = user;\n }\n\n /**\n * Set custom context\n */\n setContext(name: string, context: Record<string, unknown>): void {\n this.contexts.set(name, context);\n }\n\n /**\n * Add breadcrumb\n */\n addBreadcrumb(breadcrumb: Breadcrumb): void {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: breadcrumb.timestamp ?? Date.now() / 1000,\n });\n\n // Keep only last N breadcrumbs\n if (this.breadcrumbs.length > this.maxBreadcrumbs) {\n this.breadcrumbs = this.breadcrumbs.slice(-this.maxBreadcrumbs);\n }\n }\n\n /**\n * Flush pending events\n */\n async flush(): Promise<void> {\n if (this.client?.flush) {\n await this.client.flush(2000);\n }\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private shouldSample(): boolean {\n const rate = this.options.sampleRate ?? 1.0;\n return Math.random() < rate;\n }\n\n /**\n * Capture with SDK (BYOS mode)\n */\n private captureWithSdk(error: Error, context?: ErrorContext): void {\n this.client!.withScope((scope) => {\n this.applyContext(scope, context);\n this.client!.captureException(error);\n });\n }\n\n /**\n * Apply context to SDK scope\n */\n private applyContext(scope: SentryScope, context?: ErrorContext): void {\n // User\n if (this.user) {\n scope.setUser(this.user);\n } else if (context?.userId) {\n scope.setUser({ id: context.userId });\n }\n\n // Tags\n if (this.options.tags) {\n for (const [key, value] of Object.entries(this.options.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.tags) {\n for (const [key, value] of Object.entries(context.tags)) {\n scope.setTag(key, value);\n }\n }\n if (context?.requestId) {\n scope.setTag(\"requestId\", context.requestId);\n }\n if (context?.tenantId) {\n scope.setTag(\"tenantId\", context.tenantId);\n }\n\n // Extra\n if (context?.extra) {\n scope.setExtras(context.extra);\n }\n\n // Breadcrumbs\n for (const bc of this.breadcrumbs) {\n scope.addBreadcrumb(bc);\n }\n }\n\n /**\n * Capture with HTTP API (default mode)\n */\n private captureWithHttp(error: Error, context?: ErrorContext): void {\n const stacktrace = this.parseStackTrace(error.stack);\n const exceptionValue: {\n type: string;\n value: string;\n stacktrace?: { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> };\n } = {\n type: error.name,\n value: error.message,\n };\n\n if (stacktrace) {\n exceptionValue.stacktrace = stacktrace;\n }\n\n const event: Partial<SentryEvent> = {\n level: \"error\",\n exception: {\n values: [exceptionValue],\n },\n ...this.buildEventContext(context),\n };\n\n this.sendHttpEvent(event);\n }\n\n /**\n * Build event context for HTTP API\n */\n private buildEventContext(context?: ErrorContext): Partial<SentryEvent> {\n const event: Partial<SentryEvent> = {};\n\n // Environment & Release\n if (this.options.environment) {\n event.environment = this.options.environment;\n }\n if (this.options.release) {\n event.release = this.options.release;\n }\n if (this.options.serverName) {\n event.server_name = this.options.serverName;\n }\n\n // Tags\n const tags: Record<string, string> = { ...this.options.tags };\n if (context?.tags) {\n Object.assign(tags, context.tags);\n }\n if (context?.requestId) {\n tags[\"requestId\"] = context.requestId;\n }\n if (context?.tenantId) {\n tags[\"tenantId\"] = context.tenantId;\n }\n if (Object.keys(tags).length > 0) {\n event.tags = tags;\n }\n\n // Extra\n if (context?.extra) {\n event.extra = context.extra;\n }\n\n // User\n if (this.user) {\n event.user = this.user;\n } else if (context?.userId) {\n event.user = { id: context.userId };\n }\n\n // Breadcrumbs\n if (this.breadcrumbs.length > 0) {\n event.breadcrumbs = this.breadcrumbs.map((bc) => {\n const crumb: {\n type?: string;\n category?: string;\n message?: string;\n data?: Record<string, unknown>;\n level?: string;\n timestamp?: number;\n } = {};\n if (bc.type) crumb.type = bc.type;\n if (bc.category) crumb.category = bc.category;\n if (bc.message) crumb.message = bc.message;\n if (bc.data) crumb.data = bc.data;\n if (bc.level) crumb.level = bc.level;\n if (bc.timestamp !== undefined) crumb.timestamp = bc.timestamp;\n return crumb;\n });\n }\n\n // Contexts\n if (this.contexts.size > 0) {\n event.contexts = Object.fromEntries(this.contexts);\n }\n\n return event;\n }\n\n /**\n * Parse error stack trace into Sentry format\n */\n private parseStackTrace(\n stack?: string\n ): { frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> } | undefined {\n if (!stack) return undefined;\n\n const lines = stack.split(\"\\n\").slice(1); // Skip first line (error message)\n const frames: Array<{ filename?: string; function?: string; lineno?: number; colno?: number }> = [];\n\n for (const line of lines) {\n // Parse V8 stack trace format\n const match = line.match(/^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/);\n if (match && match[3] && match[4]) {\n const frame: { filename?: string; function?: string; lineno?: number; colno?: number } = {\n function: match[1] || \"<anonymous>\",\n lineno: parseInt(match[3], 10),\n colno: parseInt(match[4], 10),\n };\n if (match[2]) {\n frame.filename = match[2];\n }\n frames.push(frame);\n }\n }\n\n // Sentry expects oldest frame first\n frames.reverse();\n\n return frames.length > 0 ? { frames } : undefined;\n }\n\n /**\n * Generate event ID\n */\n private generateEventId(): string {\n // 32 character hex string\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n }\n\n /**\n * Send event via HTTP API\n */\n private async sendHttpEvent(eventData: Partial<SentryEvent>): Promise<void> {\n if (!this.dsn) return;\n\n const event: SentryEvent = {\n event_id: this.generateEventId(),\n timestamp: new Date().toISOString(),\n platform: \"javascript\",\n level: \"error\",\n ...eventData,\n };\n\n // Apply beforeSend hook\n if (this.options.beforeSend) {\n const result = this.options.beforeSend(event);\n if (result === null) return;\n }\n\n const url = `${this.dsn.protocol}://${this.dsn.host}/api/${this.dsn.projectId}/store/`;\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Sentry-Auth\": [\n \"Sentry sentry_version=7\",\n `sentry_client=pars-sentry/1.0.0`,\n `sentry_key=${this.dsn.publicKey}`,\n ].join(\", \"),\n },\n body: JSON.stringify(event),\n });\n\n if (!response.ok) {\n throw new Error(`Sentry API error: ${response.status}`);\n }\n } catch (error) {\n if (this.options.onError) {\n this.options.onError(error instanceof Error ? error : new Error(String(error)));\n }\n // Silent fail - don't crash the app for logging failures\n }\n }\n}\n\n/**\n * Create Sentry transport\n */\nexport function createSentryTransport(options: SentryTransportOptions): SentryTransport {\n return new SentryTransport(options);\n}\n","/**\n * @parsrun/core - Logtape Transport\n * Structured logging transport for Logtape (@logtape/logtape)\n *\n * Logtape is a TypeScript-first structured logging library.\n * This transport bridges Pars Logger to Logtape for advanced logging scenarios.\n *\n * @example BYOS (Bring Your Own SDK)\n * ```typescript\n * import { getLogger, configure } from '@logtape/logtape';\n *\n * // Configure Logtape\n * await configure({\n * sinks: { console: consoleSink() },\n * loggers: [{ category: 'pars', sinks: ['console'], level: 'info' }],\n * });\n *\n * const logtapeLogger = getLogger('pars');\n * const transport = new LogtapeTransport({ logger: logtapeLogger });\n * ```\n *\n * @example Simple mode (creates internal logger)\n * ```typescript\n * const transport = new LogtapeTransport({\n * category: 'my-app',\n * });\n * ```\n */\n\nimport type { LogEntry, LogLevelName } from \"../logger.js\";\nimport type { LogTransport, BaseTransportOptions } from \"./types.js\";\n\n/**\n * Logtape Logger interface (minimal interface for BYOS)\n * Compatible with @logtape/logtape getLogger() return type\n */\nexport interface LogtapeLogger {\n debug(message: string, properties?: Record<string, unknown>): void;\n info(message: string, properties?: Record<string, unknown>): void;\n warn(message: string, properties?: Record<string, unknown>): void;\n warning(message: string, properties?: Record<string, unknown>): void;\n error(message: string, properties?: Record<string, unknown>): void;\n fatal(message: string, properties?: Record<string, unknown>): void;\n}\n\n/**\n * Level mapping from Pars to Logtape\n */\ntype LogtapeLevel = \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\n/**\n * Logtape transport options\n */\nexport interface LogtapeTransportOptions extends BaseTransportOptions {\n /**\n * Logtape logger instance (for BYOS mode)\n * Get this from @logtape/logtape's getLogger()\n */\n logger?: LogtapeLogger;\n\n /**\n * Category name for the logger\n * Only used if logger is not provided (creates a simple fallback logger)\n */\n category?: string;\n\n /**\n * Include timestamp in properties\n * @default true\n */\n includeTimestamp?: boolean;\n\n /**\n * Include level value in properties\n * @default false\n */\n includeLevelValue?: boolean;\n}\n\n/**\n * Simple fallback logger when no Logtape instance is provided\n * Just outputs structured JSON - users should use BYOS for full features\n */\nclass FallbackLogger implements LogtapeLogger {\n constructor(private category: string) {}\n\n private log(level: string, message: string, properties?: Record<string, unknown>): void {\n const entry = {\n level,\n category: this.category,\n msg: message,\n time: new Date().toISOString(),\n ...properties,\n };\n console.log(JSON.stringify(entry));\n }\n\n debug(message: string, properties?: Record<string, unknown>): void {\n this.log(\"debug\", message, properties);\n }\n\n info(message: string, properties?: Record<string, unknown>): void {\n this.log(\"info\", message, properties);\n }\n\n warn(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warn\", message, properties);\n }\n\n warning(message: string, properties?: Record<string, unknown>): void {\n this.log(\"warning\", message, properties);\n }\n\n error(message: string, properties?: Record<string, unknown>): void {\n this.log(\"error\", message, properties);\n }\n\n fatal(message: string, properties?: Record<string, unknown>): void {\n this.log(\"fatal\", message, properties);\n }\n}\n\n/**\n * Logtape Transport\n * Bridges Pars Logger to Logtape\n */\nexport class LogtapeTransport implements LogTransport {\n readonly name = \"logtape\";\n\n private readonly logger: LogtapeLogger;\n private readonly includeTimestamp: boolean;\n private readonly includeLevelValue: boolean;\n private readonly enabled: boolean;\n\n constructor(options: LogtapeTransportOptions = {}) {\n this.enabled = options.enabled !== false;\n this.includeTimestamp = options.includeTimestamp !== false;\n this.includeLevelValue = options.includeLevelValue ?? false;\n\n if (options.logger) {\n this.logger = options.logger;\n } else {\n // Create fallback logger\n this.logger = new FallbackLogger(options.category ?? \"pars\");\n }\n }\n\n log(entry: LogEntry): void {\n if (!this.enabled) return;\n\n const level = this.mapLevel(entry.level);\n const properties = this.buildProperties(entry);\n\n // Call the appropriate log method\n this.logger[level](entry.message, properties);\n }\n\n /**\n * Map Pars log level to Logtape level\n */\n private mapLevel(level: LogLevelName): LogtapeLevel {\n const mapping: Record<LogLevelName, LogtapeLevel> = {\n TRACE: \"debug\",\n DEBUG: \"debug\",\n INFO: \"info\",\n WARN: \"warning\",\n ERROR: \"error\",\n FATAL: \"fatal\",\n SILENT: \"debug\", // Should never be logged\n };\n return mapping[level];\n }\n\n /**\n * Build properties object for Logtape\n */\n private buildProperties(entry: LogEntry): Record<string, unknown> {\n const properties: Record<string, unknown> = {};\n\n // Add timestamp if enabled\n if (this.includeTimestamp) {\n properties[\"timestamp\"] = entry.timestamp;\n }\n\n // Add level value if enabled\n if (this.includeLevelValue) {\n properties[\"levelValue\"] = entry.levelValue;\n }\n\n // Add context\n if (entry.context) {\n Object.assign(properties, entry.context);\n }\n\n // Add error info\n if (entry.error) {\n properties[\"error\"] = {\n name: entry.error.name,\n message: entry.error.message,\n stack: entry.error.stack,\n };\n }\n\n return properties;\n }\n}\n\n/**\n * Create Logtape transport\n */\nexport function createLogtapeTransport(\n options?: LogtapeTransportOptions\n): LogtapeTransport {\n return new LogtapeTransport(options);\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parsrun/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15",
|
|
4
4
|
"description": "Core utilities and types for Pars framework - Edge compatible",
|
|
5
5
|
"keywords": ["pars", "core", "utilities", "edge", "cloudflare", "deno", "bun"],
|
|
6
6
|
"homepage": "https://pars.run",
|