@jmoak/vibrissa 0.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +268 -254
- package/bin/vib-test.js +1 -1
- package/dist/chunk-AMDRQ2RV.js +2329 -0
- package/dist/chunk-AMDRQ2RV.js.map +1 -0
- package/dist/chunk-TZK5KIGQ.js +10706 -0
- package/dist/chunk-TZK5KIGQ.js.map +1 -0
- package/dist/cli.d.ts +57 -0
- package/dist/cli.js +5896 -613
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +837 -58
- package/dist/index.js +211 -10
- package/dist/index.js.map +1 -1
- package/dist/runner-J_V7pgax.d.ts +1194 -0
- package/dist/vitest.d.ts +44 -0
- package/dist/vitest.js +240 -0
- package/dist/vitest.js.map +1 -0
- package/package.json +27 -9
- package/schema/case.schema.json +405 -14
- package/schema/vibrissa.schema.json +528 -12
- package/dist/chunk-FTVETYUK.js +0 -656
- package/dist/chunk-FTVETYUK.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp-session.ts","../src/defaults.ts","../src/display.ts","../src/match.ts","../src/runner.ts","../src/paths.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js'\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'\nimport { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js'\nimport type { JsonValue, ServerConfig } from './types.js'\n\nexport interface ToolError {\n kind: 'protocol' | 'tool'\n code?: number\n codeName?: string\n message: string\n}\n\nexport type ToolCallOutcome =\n | { kind: 'result'; result: JsonValue }\n | { kind: 'error'; error: ToolError }\n\nexport interface ToolSummary {\n name: string\n description?: string\n inputSchema: JsonValue\n}\n\nconst CLIENT_INFO = { name: 'vibrissa', version: '0.1.0' }\n\nfunction inheritedEnv(overrides: Record<string, string>): Record<string, string> {\n const env: Record<string, string> = {}\n for (const [key, value] of Object.entries(process.env)) {\n if (typeof value === 'string') env[key] = value\n }\n return { ...env, ...overrides }\n}\n\nfunction errorCodeName(code: number): string | undefined {\n const name = (ErrorCode as Record<number, string | number>)[code]\n return typeof name === 'string' ? name : undefined\n}\n\nfunction textFromContent(content: unknown): string {\n if (!Array.isArray(content)) return ''\n return content\n .filter((item): item is { type: string; text: string } => {\n return (\n typeof item === 'object' &&\n item !== null &&\n (item as { type?: unknown }).type === 'text' &&\n typeof (item as { text?: unknown }).text === 'string'\n )\n })\n .map((item) => item.text)\n .join('\\n')\n}\n\nfunction stripMcpErrorPrefix(message: string): string {\n return message.replace(/^MCP error -?\\d+:\\s*/, '')\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeoutMs: number, message: string): Promise<T> {\n let handle: NodeJS.Timeout | undefined\n const timeout = new Promise<never>((_, reject) => {\n handle = setTimeout(() => reject(new Error(message)), timeoutMs)\n })\n try {\n return await Promise.race([promise, timeout])\n } finally {\n if (handle) clearTimeout(handle)\n }\n}\n\nexport class McpSession {\n private constructor(private readonly client: Client) {}\n\n static async start(server: ServerConfig, timeoutMs: number): Promise<McpSession> {\n const transport = new StdioClientTransport({\n command: server.cmd,\n args: server.args ?? [],\n cwd: server.cwd ?? '.',\n env: inheritedEnv(server.env ?? {}),\n stderr: 'inherit',\n })\n const client = new Client(CLIENT_INFO, { capabilities: {} })\n try {\n await withTimeout(client.connect(transport), timeoutMs, 'Server spawn timeout')\n } catch (err) {\n await transport.close().catch(() => {})\n if (err instanceof McpError && err.code === ErrorCode.ConnectionClosed) {\n throw new Error(`Server exited early before completing MCP initialization: ${err.message}`)\n }\n throw err\n }\n return new McpSession(client)\n }\n\n async callTool(\n name: string,\n args: Record<string, JsonValue>,\n timeoutMs: number,\n ): Promise<ToolCallOutcome> {\n try {\n const result = await this.client.callTool({ name, arguments: args }, undefined, {\n timeout: timeoutMs,\n })\n if (result.isError) {\n return {\n kind: 'error',\n error: { kind: 'tool', message: textFromContent(result.content) },\n }\n }\n return { kind: 'result', result: result as JsonValue }\n } catch (err) {\n if (err instanceof McpError) {\n return {\n kind: 'error',\n error: {\n kind: 'protocol',\n code: err.code,\n codeName: errorCodeName(err.code),\n message: stripMcpErrorPrefix(err.message),\n },\n }\n }\n throw err\n }\n }\n\n async listTools(): Promise<ToolSummary[]> {\n const { tools } = await this.client.listTools()\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as JsonValue,\n }))\n }\n\n async close(): Promise<void> {\n await this.client.close().catch(() => {})\n }\n}\n","import type { RunCasesOptions } from './types.js'\n\nexport const defaultRunCasesOptions: RunCasesOptions = {\n server: { cmd: 'node', args: ['dist/index.js'], cwd: '.', env: {} },\n globs: ['tests/integration/**/*.json'],\n timeoutMs: 15000,\n failFast: false,\n display: 'pretty',\n allowEmpty: false,\n}\n","import { diffStringsUnified } from 'jest-diff'\nexport interface ResultsDisplay {\n onStart(total: number): void\n onCasePass(name: string): void\n onCaseFail(name: string, error?: string): void\n onComplete(summary: { total: number; passed: number; failed: number; durationMs: number }): void\n}\n\nexport class ConsoleResultsDisplay implements ResultsDisplay {\n onStart(_total: number): void {}\n onCasePass(_name: string): void {}\n onCaseFail(name: string, error?: string): void {\n // Keep the exact message to satisfy existing tests that spy on console.error\n // Case failed: <name> - <error>\n console.error(`Case failed: ${name}${error ? ` - ${error}` : ''}`)\n }\n onComplete(_summary: {\n total: number\n passed: number\n failed: number\n durationMs: number\n }): void {}\n}\n\nconst RESET = '\\x1b[0m'\nconst BOLD = '\\x1b[1m'\nconst FG_RED = '\\x1b[31m'\nconst FG_GREEN = '\\x1b[32m'\nconst FG_CYAN = '\\x1b[36m'\nconst FG_GRAY = '\\x1b[90m'\n\nfunction color(text: string, code: string): string {\n return `${code}${text}${RESET}`\n}\n\nfunction visibleLength(text: string): number {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: stripping ANSI escapes\n return text.replace(/\\x1b\\[[0-9;]*m/g, '').length\n}\n\nfunction boxLine(content: string, width: number): string {\n const pad = Math.max(0, width - 2 - visibleLength(content))\n return `|${content}${' '.repeat(pad)}|`\n}\n\nfunction padCenter(text: string, width: number): string {\n if (text.length >= width) return text.slice(0, width)\n const totalPad = width - text.length\n const left = Math.floor(totalPad / 2)\n const right = totalPad - left\n return `${' '.repeat(left)}${text}${' '.repeat(right)}`\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`\n return `${(ms / 1000).toFixed(2)}s`\n}\n\nexport class PrettyConsoleResultsDisplay implements ResultsDisplay {\n private total = 0\n private startedAt = 0\n private passed: string[] = []\n private failed: { name: string; error?: string }[] = []\n private cases: { name: string; status: 'pass' | 'fail'; error?: string }[] = []\n\n onStart(total: number): void {\n this.total = total\n this.startedAt = Date.now()\n }\n\n onCasePass(name: string): void {\n this.passed.push(name)\n this.cases.push({ name, status: 'pass' })\n const badge = color('[OK]', FG_GREEN)\n const nameColored = color(name, FG_CYAN)\n console.log(`${badge} ${nameColored}`)\n }\n\n onCaseFail(name: string, error?: string): void {\n this.failed.push({ name, error })\n this.cases.push({ name, status: 'fail', error })\n const badge = color('[!!]', FG_RED)\n const nameColored = color(name, FG_CYAN)\n console.log(`${badge} ${nameColored}`)\n }\n\n onComplete(summary: { total: number; passed: number; failed: number; durationMs: number }): void {\n const width = 64\n const top = `+${'='.repeat(width - 2)}+`\n const mid = `+${'-'.repeat(width - 2)}+`\n const title = boxLine(color(padCenter('vib-test results', width - 2), BOLD + FG_CYAN), width)\n\n const totals = [\n ` Total: ${color(String(summary.total), FG_CYAN)} `,\n ` Passed: ${color(String(summary.passed), FG_GREEN)} `,\n ` Failed: ${color(String(summary.failed), FG_RED)} `,\n ` Duration: ${color(formatDuration(summary.durationMs), FG_GRAY)}`,\n ].join(' |')\n\n console.log(top)\n console.log(title)\n console.log(mid)\n console.log(boxLine(totals, width))\n\n if (this.failed.length > 0) {\n console.log(mid)\n console.log(color(boxLine(` Failures (${this.failed.length}):`, width), FG_RED))\n const maxList = 10\n for (let i = 0; i < Math.min(this.failed.length, maxList); i++) {\n const f = this.failed[i]\n const lineRaw = ` - ${f.name}`\n const maxContent = width - 3\n const trimmed =\n lineRaw.length > maxContent ? `${lineRaw.slice(0, maxContent - 3)}...` : lineRaw\n console.log(color(boxLine(` ${trimmed}`, width), FG_RED))\n\n if (f.error?.includes('::')) {\n const idx = f.error.indexOf('::')\n try {\n const json = f.error.slice(idx + 2).trim()\n const parsed = JSON.parse(json) as { expected?: unknown; actual?: unknown }\n const expectedStr = JSON.stringify(parsed.expected, null, 2)\n const actualStr = JSON.stringify(parsed.actual, null, 2)\n const unified = diffStringsUnified(expectedStr, actualStr, {\n aAnnotation: 'expected',\n bAnnotation: 'actual',\n expand: false,\n contextLines: 3,\n })\n const diffLines = (unified ?? '').split(/\\r?\\n/)\n for (const d of diffLines) console.log(`|${d}`)\n } catch {}\n }\n }\n if (this.failed.length > maxList) {\n console.log(color(boxLine(` ...and ${this.failed.length - maxList} more`, width), FG_RED))\n }\n }\n\n console.log(top)\n }\n}\n","import type { JsonValue } from './types.js'\n\nexport interface Mismatch {\n path: string\n message: string\n expected?: unknown\n actual?: unknown\n}\n\ninterface MatchContext {\n partial: boolean\n mismatches: Mismatch[]\n}\n\nconst MAX_MISMATCHES = 25\n\nexport function matchValue(expected: JsonValue, actual: unknown): Mismatch[] {\n const ctx: MatchContext = { partial: false, mismatches: [] }\n matchNode(expected, actual, '', ctx)\n return ctx.mismatches\n}\n\nexport function matches(expected: JsonValue, actual: unknown): boolean {\n return matchValue(expected, actual).length === 0\n}\n\nfunction report(ctx: MatchContext, mismatch: Mismatch): void {\n if (ctx.mismatches.length < MAX_MISMATCHES) ctx.mismatches.push(mismatch)\n}\n\nfunction displayPath(path: string): string {\n return path === '' ? '(root)' : path\n}\n\nfunction describeType(value: unknown): string {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n return typeof value\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, JsonValue> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction matchNode(expected: JsonValue, actual: unknown, path: string, ctx: MatchContext): void {\n if (isPlainObject(expected)) {\n if ('$regex' in expected) {\n matchRegexDirective(expected, actual, path, ctx)\n return\n }\n if ('$wildcard' in expected) {\n matchWildcardDirective(expected, actual, path, ctx)\n return\n }\n if (expected.$unordered === true && Array.isArray(expected.value)) {\n matchUnordered(expected.value, actual, path, ctx)\n return\n }\n matchObject(expected, actual, path, ctx)\n return\n }\n if (Array.isArray(expected)) {\n matchArray(expected, actual, path, ctx)\n return\n }\n if (!Object.is(expected, actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`,\n expected,\n actual,\n })\n }\n}\n\nfunction matchRegexDirective(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const pattern = directive.$regex\n const flags = directive.flags\n if (typeof pattern !== 'string' || (flags !== undefined && typeof flags !== 'string')) {\n report(ctx, {\n path: displayPath(path),\n message: `invalid $regex directive: ${JSON.stringify(directive)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (typeof actual !== 'string') {\n report(ctx, {\n path: displayPath(path),\n message: `expected a string matching /${pattern}/${flags ?? ''}, got ${describeType(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n let regex: RegExp\n try {\n regex = new RegExp(pattern, flags)\n } catch (err) {\n report(ctx, {\n path: displayPath(path),\n message: `invalid $regex pattern /${pattern}/${flags ?? ''}: ${err instanceof Error ? err.message : String(err)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (!regex.test(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected string matching /${pattern}/${flags ?? ''}, got ${JSON.stringify(actual)}`,\n expected: directive,\n actual,\n })\n }\n}\n\nfunction wildcardToRegex(pattern: string): RegExp {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n const body = escaped.replace(/\\*/g, '[\\\\s\\\\S]*').replace(/\\?/g, '[\\\\s\\\\S]')\n return new RegExp(`^${body}$`)\n}\n\nfunction matchWildcardDirective(\n directive: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n const pattern = directive.$wildcard\n if (typeof pattern !== 'string') {\n report(ctx, {\n path: displayPath(path),\n message: `invalid $wildcard directive: ${JSON.stringify(directive)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (typeof actual !== 'string') {\n report(ctx, {\n path: displayPath(path),\n message: `expected a string matching wildcard \"${pattern}\", got ${describeType(actual)}`,\n expected: directive,\n actual,\n })\n return\n }\n if (!wildcardToRegex(pattern).test(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected string matching wildcard \"${pattern}\", got ${JSON.stringify(actual)}`,\n expected: directive,\n actual,\n })\n }\n}\n\nfunction matchObject(\n expected: Record<string, JsonValue>,\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (!isPlainObject(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an object, got ${describeType(actual)}`,\n expected,\n actual,\n })\n return\n }\n const partial = ctx.partial || expected.$partial === true\n const expectedKeys = Object.keys(expected).filter((key) => key !== '$partial')\n if (!partial) {\n const actualKeys = Object.keys(actual)\n const extra = actualKeys.filter((key) => !expectedKeys.includes(key))\n if (extra.length > 0) {\n report(ctx, {\n path: displayPath(path),\n message: `unexpected key${extra.length > 1 ? 's' : ''} ${extra.map((k) => JSON.stringify(k)).join(', ')} (use \"$partial\": true to allow extra fields)`,\n expected,\n actual,\n })\n }\n }\n for (const key of expectedKeys) {\n const childPath = path === '' ? key : `${path}.${key}`\n if (!(key in actual)) {\n report(ctx, {\n path: displayPath(childPath),\n message: `missing expected key (expected ${JSON.stringify(expected[key])})`,\n expected: expected[key],\n actual: undefined,\n })\n continue\n }\n const childCtx: MatchContext = { partial, mismatches: ctx.mismatches }\n matchNode(expected[key], actual[key], childPath, childCtx)\n }\n}\n\nfunction matchArray(expected: JsonValue[], actual: unknown, path: string, ctx: MatchContext): void {\n if (!Array.isArray(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an array, got ${describeType(actual)}`,\n expected,\n actual,\n })\n return\n }\n const lengthOk = ctx.partial\n ? actual.length >= expected.length\n : actual.length === expected.length\n if (!lengthOk) {\n report(ctx, {\n path: displayPath(path),\n message: `expected array of length ${ctx.partial ? `>= ${expected.length}` : expected.length}, got ${actual.length}`,\n expected,\n actual,\n })\n return\n }\n for (let i = 0; i < expected.length; i++) {\n matchNode(expected[i], actual[i], `${path}[${i}]`, ctx)\n }\n}\n\nfunction matchesQuietly(expected: JsonValue, actual: unknown, partial: boolean): boolean {\n const scratch: MatchContext = { partial, mismatches: [] }\n matchNode(expected, actual, '', scratch)\n return scratch.mismatches.length === 0\n}\n\nfunction matchUnordered(\n expected: JsonValue[],\n actual: unknown,\n path: string,\n ctx: MatchContext,\n): void {\n if (!Array.isArray(actual)) {\n report(ctx, {\n path: displayPath(path),\n message: `expected an array (unordered), got ${describeType(actual)}`,\n expected,\n actual,\n })\n return\n }\n if (ctx.partial ? actual.length < expected.length : actual.length !== expected.length) {\n report(ctx, {\n path: displayPath(path),\n message: `expected unordered array of length ${ctx.partial ? `>= ${expected.length}` : expected.length}, got ${actual.length}`,\n expected,\n actual,\n })\n return\n }\n const used = new Array<boolean>(actual.length).fill(false)\n const assign = (index: number): boolean => {\n if (index === expected.length) return true\n for (let j = 0; j < actual.length; j++) {\n if (used[j]) continue\n if (matchesQuietly(expected[index], actual[j], ctx.partial)) {\n used[j] = true\n if (assign(index + 1)) return true\n used[j] = false\n }\n }\n return false\n }\n if (!assign(0)) {\n report(ctx, {\n path: displayPath(path),\n message: `no arrangement of the actual array satisfies the expected elements (unordered${ctx.partial ? ', partial' : ''})`,\n expected,\n actual,\n })\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport fg from 'fast-glob'\nimport type { ResultsDisplay } from './display.js'\nimport { ConsoleResultsDisplay } from './display.js'\nimport { type Mismatch, matchValue } from './match.js'\nimport { McpSession, type ToolError } from './mcp-session.js'\nimport { resolveRootDir, resolveServerConfig } from './paths.js'\nimport type { JsonValue, RunCasesOptions, TestCase } from './types.js'\n\ninterface CaseResult {\n ok: boolean\n error?: string\n expected?: unknown\n actual?: unknown\n}\n\nasync function resolveCaseFiles(globs: string[], cwd: string): Promise<string[]> {\n const patterns = globs.map((g) => {\n const isNegative = g.startsWith('!')\n const body = isNegative ? g.slice(1) : g\n const resolved = (path.isAbsolute(body) ? body : path.join(cwd, body)).replace(/\\\\/g, '/')\n return isNegative ? `!${resolved}` : resolved\n })\n return await fg(patterns, { dot: false, onlyFiles: true, unique: true })\n}\n\nfunction summarizeMismatches(mismatches: Mismatch[], label: string): string {\n const first = mismatches[0]\n const suffix = mismatches.length > 1 ? ` (+${mismatches.length - 1} more)` : ''\n return `${label} at ${first.path}: ${first.message}${suffix}`\n}\n\nfunction matchExpectedError(\n expected: NonNullable<TestCase['expectError']>,\n actual: ToolError,\n): CaseResult {\n const observed = {\n code: actual.codeName ?? (actual.code !== undefined ? String(actual.code) : undefined),\n message: actual.message,\n }\n if (expected.code !== undefined) {\n const codeMatches =\n expected.code === actual.codeName || expected.code === String(actual.code ?? '')\n if (!codeMatches) {\n return {\n ok: false,\n error: `Error code mismatch: expected ${JSON.stringify(expected.code)}, got ${JSON.stringify(observed.code)}`,\n expected: expected as JsonValue,\n actual: observed,\n }\n }\n }\n if (expected.message !== undefined) {\n const mismatches = matchValue(expected.message as JsonValue, actual.message)\n if (mismatches.length > 0) {\n return {\n ok: false,\n error: summarizeMismatches(mismatches, 'Error message mismatch'),\n expected: expected as JsonValue,\n actual: observed,\n }\n }\n }\n return { ok: true }\n}\n\nasync function executeCase(\n session: McpSession,\n testCase: TestCase,\n timeoutMs: number,\n): Promise<CaseResult> {\n if (!testCase.tool) {\n return { ok: false, error: 'Case is missing required \"tool\" field' }\n }\n const outcome = await session.callTool(testCase.tool, testCase.args ?? {}, timeoutMs)\n\n if (testCase.expectError !== undefined) {\n if (outcome.kind === 'result') {\n return {\n ok: false,\n error: 'Expected an error but tool call succeeded',\n expected: testCase.expectError as JsonValue,\n actual: outcome.result,\n }\n }\n return matchExpectedError(testCase.expectError, outcome.error)\n }\n\n if (outcome.kind === 'error') {\n const label = outcome.error.codeName ? ` [${outcome.error.codeName}]` : ''\n return { ok: false, error: `Tool call failed${label}: ${outcome.error.message}` }\n }\n\n if (testCase.expect !== undefined) {\n const mismatches = matchValue(testCase.expect, outcome.result)\n if (mismatches.length > 0) {\n return {\n ok: false,\n error: summarizeMismatches(mismatches, 'Expectation failed'),\n expected: testCase.expect,\n actual: outcome.result,\n }\n }\n }\n return { ok: true }\n}\n\nasync function runWithTimeout<T>(fn: () => Promise<T>, timeoutMs: number): Promise<T> {\n let timeoutHandle: NodeJS.Timeout | undefined\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutHandle = setTimeout(() => reject(new Error('Case timeout exceeded')), timeoutMs)\n })\n try {\n return await Promise.race([fn(), timeoutPromise])\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle)\n }\n}\n\nexport class Runner {\n private readonly options: RunCasesOptions\n private readonly display: ResultsDisplay\n\n constructor(options: RunCasesOptions, display: ResultsDisplay = new ConsoleResultsDisplay()) {\n this.options = options\n this.display = display\n }\n\n async run(): Promise<number> {\n const rootDir = resolveRootDir(this.options)\n const files = await resolveCaseFiles(this.options.globs, rootDir)\n if (files.length === 0) {\n const pattern = this.options.globs.join(', ')\n const message = `No test cases matched globs: ${pattern} (from ${rootDir})`\n if (this.options.allowEmpty) {\n console.warn(message)\n return 0\n }\n console.error(message)\n return 1\n }\n this.display.onStart(files.length)\n const spawnTimeoutMs = Math.max(2000, Math.min(10000, this.options.timeoutMs))\n const server = resolveServerConfig(this.options)\n const session = await McpSession.start(server, spawnTimeoutMs)\n try {\n let failures = 0\n const startedAt = Date.now()\n let processed = 0\n for (const file of files) {\n let data: TestCase\n try {\n data = JSON.parse(fs.readFileSync(file, 'utf8')) as TestCase\n } catch (err) {\n failures++\n const reason = err instanceof Error ? err.message : String(err)\n this.display.onCaseFail(path.basename(file), `Failed to load case file: ${reason}`)\n processed++\n if (this.options.failFast) break\n continue\n }\n const { ok, error, expected, actual } = await runWithTimeout(\n () => executeCase(session, data, this.options.timeoutMs),\n this.options.timeoutMs,\n )\n if (!ok) {\n failures++\n const caseName = data.name ?? path.basename(file)\n const details =\n expected !== undefined ? ` :: ${JSON.stringify({ expected, actual })}` : ''\n this.display.onCaseFail(caseName, `${error ?? 'Error'}${details}`)\n if (this.options.failFast) break\n } else {\n const caseName = data.name ?? path.basename(file)\n this.display.onCasePass(caseName)\n }\n processed++\n }\n this.display.onComplete({\n total: processed,\n passed: processed - failures,\n failed: failures,\n durationMs: Date.now() - startedAt,\n })\n return failures === 0 ? 0 : 1\n } finally {\n await session.close()\n }\n }\n}\n","import path from 'node:path'\nimport type { RunCasesOptions, ServerConfig } from './types.js'\n\nexport function resolveRootDir(options: Pick<RunCasesOptions, 'rootDir'>): string {\n return options.rootDir ? path.resolve(options.rootDir) : process.cwd()\n}\n\nexport function resolveServerConfig(options: RunCasesOptions): ServerConfig {\n const rootDir = resolveRootDir(options)\n const cwd = options.server.cwd ?? '.'\n return {\n ...options.server,\n cwd: path.isAbsolute(cwd) ? cwd : path.resolve(rootDir, cwd),\n }\n}\n"],"mappings":";AAAA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,WAAW,gBAAgB;AAoBpC,IAAM,cAAc,EAAE,MAAM,YAAY,SAAS,QAAQ;AAEzD,SAAS,aAAa,WAA2D;AAC/E,QAAM,MAA8B,CAAC;AACrC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AACtD,QAAI,OAAO,UAAU,SAAU,KAAI,GAAG,IAAI;AAAA,EAC5C;AACA,SAAO,EAAE,GAAG,KAAK,GAAG,UAAU;AAChC;AAEA,SAAS,cAAc,MAAkC;AACvD,QAAM,OAAQ,UAA8C,IAAI;AAChE,SAAO,OAAO,SAAS,WAAW,OAAO;AAC3C;AAEA,SAAS,gBAAgB,SAA0B;AACjD,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QACJ,OAAO,CAAC,SAAiD;AACxD,WACE,OAAO,SAAS,YAChB,SAAS,QACR,KAA4B,SAAS,UACtC,OAAQ,KAA4B,SAAS;AAAA,EAEjD,CAAC,EACA,IAAI,CAAC,SAAS,KAAK,IAAI,EACvB,KAAK,IAAI;AACd;AAEA,SAAS,oBAAoB,SAAyB;AACpD,SAAO,QAAQ,QAAQ,wBAAwB,EAAE;AACnD;AAEA,eAAe,YAAe,SAAqB,WAAmB,SAA6B;AACjG,MAAI;AACJ,QAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAChD,aAAS,WAAW,MAAM,OAAO,IAAI,MAAM,OAAO,CAAC,GAAG,SAAS;AAAA,EACjE,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,SAAS,OAAO,CAAC;AAAA,EAC9C,UAAE;AACA,QAAI,OAAQ,cAAa,MAAM;AAAA,EACjC;AACF;AAEO,IAAM,aAAN,MAAM,YAAW;AAAA,EACd,YAA6B,QAAgB;AAAhB;AAAA,EAAiB;AAAA,EAEtD,aAAa,MAAM,QAAsB,WAAwC;AAC/E,UAAM,YAAY,IAAI,qBAAqB;AAAA,MACzC,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,MACtB,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,aAAa,OAAO,OAAO,CAAC,CAAC;AAAA,MAClC,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,SAAS,IAAI,OAAO,aAAa,EAAE,cAAc,CAAC,EAAE,CAAC;AAC3D,QAAI;AACF,YAAM,YAAY,OAAO,QAAQ,SAAS,GAAG,WAAW,sBAAsB;AAAA,IAChF,SAAS,KAAK;AACZ,YAAM,UAAU,MAAM,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AACtC,UAAI,eAAe,YAAY,IAAI,SAAS,UAAU,kBAAkB;AACtE,cAAM,IAAI,MAAM,6DAA6D,IAAI,OAAO,EAAE;AAAA,MAC5F;AACA,YAAM;AAAA,IACR;AACA,WAAO,IAAI,YAAW,MAAM;AAAA,EAC9B;AAAA,EAEA,MAAM,SACJ,MACA,MACA,WAC0B;AAC1B,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAO,SAAS,EAAE,MAAM,WAAW,KAAK,GAAG,QAAW;AAAA,QAC9E,SAAS;AAAA,MACX,CAAC;AACD,UAAI,OAAO,SAAS;AAClB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,QAAQ,SAAS,gBAAgB,OAAO,OAAO,EAAE;AAAA,QAClE;AAAA,MACF;AACA,aAAO,EAAE,MAAM,UAAU,OAA4B;AAAA,IACvD,SAAS,KAAK;AACZ,UAAI,eAAe,UAAU;AAC3B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,IAAI;AAAA,YACV,UAAU,cAAc,IAAI,IAAI;AAAA,YAChC,SAAS,oBAAoB,IAAI,OAAO;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,YAAoC;AACxC,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,OAAO,UAAU;AAC9C,WAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,aAAa,KAAK;AAAA,IACpB,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC1C;AACF;;;ACtIO,IAAM,yBAA0C;AAAA,EACrD,QAAQ,EAAE,KAAK,QAAQ,MAAM,CAAC,eAAe,GAAG,KAAK,KAAK,KAAK,CAAC,EAAE;AAAA,EAClE,OAAO,CAAC,6BAA6B;AAAA,EACrC,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AACd;;;ACTA,SAAS,0BAA0B;AAQ5B,IAAM,wBAAN,MAAsD;AAAA,EAC3D,QAAQ,QAAsB;AAAA,EAAC;AAAA,EAC/B,WAAW,OAAqB;AAAA,EAAC;AAAA,EACjC,WAAW,MAAc,OAAsB;AAG7C,YAAQ,MAAM,gBAAgB,IAAI,GAAG,QAAQ,MAAM,KAAK,KAAK,EAAE,EAAE;AAAA,EACnE;AAAA,EACA,WAAW,UAKF;AAAA,EAAC;AACZ;AAEA,IAAM,QAAQ;AACd,IAAM,OAAO;AACb,IAAM,SAAS;AACf,IAAM,WAAW;AACjB,IAAM,UAAU;AAChB,IAAM,UAAU;AAEhB,SAAS,MAAM,MAAc,MAAsB;AACjD,SAAO,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK;AAC/B;AAEA,SAAS,cAAc,MAAsB;AAE3C,SAAO,KAAK,QAAQ,mBAAmB,EAAE,EAAE;AAC7C;AAEA,SAAS,QAAQ,SAAiB,OAAuB;AACvD,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,IAAI,cAAc,OAAO,CAAC;AAC1D,SAAO,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;AACtC;AAEA,SAAS,UAAU,MAAc,OAAuB;AACtD,MAAI,KAAK,UAAU,MAAO,QAAO,KAAK,MAAM,GAAG,KAAK;AACpD,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,OAAO,KAAK,MAAM,WAAW,CAAC;AACpC,QAAM,QAAQ,WAAW;AACzB,SAAO,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,OAAO,KAAK,CAAC;AACvD;AAEA,SAAS,eAAe,IAAoB;AAC1C,MAAI,KAAK,IAAM,QAAO,GAAG,EAAE;AAC3B,SAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAClC;AAEO,IAAM,8BAAN,MAA4D;AAAA,EACzD,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,SAAmB,CAAC;AAAA,EACpB,SAA6C,CAAC;AAAA,EAC9C,QAAqE,CAAC;AAAA,EAE9E,QAAQ,OAAqB;AAC3B,SAAK,QAAQ;AACb,SAAK,YAAY,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,WAAW,MAAoB;AAC7B,SAAK,OAAO,KAAK,IAAI;AACrB,SAAK,MAAM,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC;AACxC,UAAM,QAAQ,MAAM,QAAQ,QAAQ;AACpC,UAAM,cAAc,MAAM,MAAM,OAAO;AACvC,YAAQ,IAAI,GAAG,KAAK,IAAI,WAAW,EAAE;AAAA,EACvC;AAAA,EAEA,WAAW,MAAc,OAAsB;AAC7C,SAAK,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAChC,SAAK,MAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,MAAM,CAAC;AAC/C,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,UAAM,cAAc,MAAM,MAAM,OAAO;AACvC,YAAQ,IAAI,GAAG,KAAK,IAAI,WAAW,EAAE;AAAA,EACvC;AAAA,EAEA,WAAW,SAAsF;AAC/F,UAAM,QAAQ;AACd,UAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AACrC,UAAM,MAAM,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC;AACrC,UAAM,QAAQ,QAAQ,MAAM,UAAU,oBAAoB,QAAQ,CAAC,GAAG,OAAO,OAAO,GAAG,KAAK;AAE5F,UAAM,SAAS;AAAA,MACb,WAAW,MAAM,OAAO,QAAQ,KAAK,GAAG,OAAO,CAAC;AAAA,MAChD,YAAY,MAAM,OAAO,QAAQ,MAAM,GAAG,QAAQ,CAAC;AAAA,MACnD,YAAY,MAAM,OAAO,QAAQ,MAAM,GAAG,MAAM,CAAC;AAAA,MACjD,cAAc,MAAM,eAAe,QAAQ,UAAU,GAAG,OAAO,CAAC;AAAA,IAClE,EAAE,KAAK,IAAI;AAEX,YAAQ,IAAI,GAAG;AACf,YAAQ,IAAI,KAAK;AACjB,YAAQ,IAAI,GAAG;AACf,YAAQ,IAAI,QAAQ,QAAQ,KAAK,CAAC;AAElC,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,cAAQ,IAAI,GAAG;AACf,cAAQ,IAAI,MAAM,QAAQ,cAAc,KAAK,OAAO,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAC/E,YAAM,UAAU;AAChB,eAAS,IAAI,GAAG,IAAI,KAAK,IAAI,KAAK,OAAO,QAAQ,OAAO,GAAG,KAAK;AAC9D,cAAM,IAAI,KAAK,OAAO,CAAC;AACvB,cAAM,UAAU,MAAM,EAAE,IAAI;AAC5B,cAAM,aAAa,QAAQ;AAC3B,cAAM,UACJ,QAAQ,SAAS,aAAa,GAAG,QAAQ,MAAM,GAAG,aAAa,CAAC,CAAC,QAAQ;AAC3E,gBAAQ,IAAI,MAAM,QAAQ,IAAI,OAAO,IAAI,KAAK,GAAG,MAAM,CAAC;AAExD,YAAI,EAAE,OAAO,SAAS,IAAI,GAAG;AAC3B,gBAAM,MAAM,EAAE,MAAM,QAAQ,IAAI;AAChC,cAAI;AACF,kBAAM,OAAO,EAAE,MAAM,MAAM,MAAM,CAAC,EAAE,KAAK;AACzC,kBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,kBAAM,cAAc,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC;AAC3D,kBAAM,YAAY,KAAK,UAAU,OAAO,QAAQ,MAAM,CAAC;AACvD,kBAAM,UAAU,mBAAmB,aAAa,WAAW;AAAA,cACzD,aAAa;AAAA,cACb,aAAa;AAAA,cACb,QAAQ;AAAA,cACR,cAAc;AAAA,YAChB,CAAC;AACD,kBAAM,aAAa,WAAW,IAAI,MAAM,OAAO;AAC/C,uBAAW,KAAK,UAAW,SAAQ,IAAI,IAAI,CAAC,EAAE;AAAA,UAChD,QAAQ;AAAA,UAAC;AAAA,QACX;AAAA,MACF;AACA,UAAI,KAAK,OAAO,SAAS,SAAS;AAChC,gBAAQ,IAAI,MAAM,QAAQ,WAAW,KAAK,OAAO,SAAS,OAAO,SAAS,KAAK,GAAG,MAAM,CAAC;AAAA,MAC3F;AAAA,IACF;AAEA,YAAQ,IAAI,GAAG;AAAA,EACjB;AACF;;;AC/HA,IAAM,iBAAiB;AAEhB,SAAS,WAAW,UAAqB,QAA6B;AAC3E,QAAM,MAAoB,EAAE,SAAS,OAAO,YAAY,CAAC,EAAE;AAC3D,YAAU,UAAU,QAAQ,IAAI,GAAG;AACnC,SAAO,IAAI;AACb;AAEO,SAAS,QAAQ,UAAqB,QAA0B;AACrE,SAAO,WAAW,UAAU,MAAM,EAAE,WAAW;AACjD;AAEA,SAAS,OAAO,KAAmB,UAA0B;AAC3D,MAAI,IAAI,WAAW,SAAS,eAAgB,KAAI,WAAW,KAAK,QAAQ;AAC1E;AAEA,SAAS,YAAYA,OAAsB;AACzC,SAAOA,UAAS,KAAK,WAAWA;AAClC;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,SAAO,OAAO;AAChB;AAEA,SAAS,cAAc,OAAoD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,UAAU,UAAqB,QAAiBA,OAAc,KAAyB;AAC9F,MAAI,cAAc,QAAQ,GAAG;AAC3B,QAAI,YAAY,UAAU;AACxB,0BAAoB,UAAU,QAAQA,OAAM,GAAG;AAC/C;AAAA,IACF;AACA,QAAI,eAAe,UAAU;AAC3B,6BAAuB,UAAU,QAAQA,OAAM,GAAG;AAClD;AAAA,IACF;AACA,QAAI,SAAS,eAAe,QAAQ,MAAM,QAAQ,SAAS,KAAK,GAAG;AACjE,qBAAe,SAAS,OAAO,QAAQA,OAAM,GAAG;AAChD;AAAA,IACF;AACA,gBAAY,UAAU,QAAQA,OAAM,GAAG;AACvC;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAW,UAAU,QAAQA,OAAM,GAAG;AACtC;AAAA,EACF;AACA,MAAI,CAAC,OAAO,GAAG,UAAU,MAAM,GAAG;AAChC,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,YAAY,KAAK,UAAU,QAAQ,CAAC,SAAS,KAAK,UAAU,MAAM,CAAC;AAAA,MAC5E;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,WACA,QACAA,OACA,KACM;AACN,QAAM,UAAU,UAAU;AAC1B,QAAM,QAAQ,UAAU;AACxB,MAAI,OAAO,YAAY,YAAa,UAAU,UAAa,OAAO,UAAU,UAAW;AACrF,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,6BAA6B,KAAK,UAAU,SAAS,CAAC;AAAA,MAC/D,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,+BAA+B,OAAO,IAAI,SAAS,EAAE,SAAS,aAAa,MAAM,CAAC;AAAA,MAC3F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,YAAQ,IAAI,OAAO,SAAS,KAAK;AAAA,EACnC,SAAS,KAAK;AACZ,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,2BAA2B,OAAO,IAAI,SAAS,EAAE,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC/G,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,MAAM,KAAK,MAAM,GAAG;AACvB,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,6BAA6B,OAAO,IAAI,SAAS,EAAE,SAAS,KAAK,UAAU,MAAM,CAAC;AAAA,MAC3F,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,SAAyB;AAChD,QAAM,UAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAC3D,QAAM,OAAO,QAAQ,QAAQ,OAAO,WAAW,EAAE,QAAQ,OAAO,UAAU;AAC1E,SAAO,IAAI,OAAO,IAAI,IAAI,GAAG;AAC/B;AAEA,SAAS,uBACP,WACA,QACAA,OACA,KACM;AACN,QAAM,UAAU,UAAU;AAC1B,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,gCAAgC,KAAK,UAAU,SAAS,CAAC;AAAA,MAClE,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,wCAAwC,OAAO,UAAU,aAAa,MAAM,CAAC;AAAA,MACtF,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,CAAC,gBAAgB,OAAO,EAAE,KAAK,MAAM,GAAG;AAC1C,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,sCAAsC,OAAO,UAAU,KAAK,UAAU,MAAM,CAAC;AAAA,MACtF,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YACP,UACA,QACAA,OACA,KACM;AACN,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,2BAA2B,aAAa,MAAM,CAAC;AAAA,MACxD;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,UAAU,IAAI,WAAW,SAAS,aAAa;AACrD,QAAM,eAAe,OAAO,KAAK,QAAQ,EAAE,OAAO,CAAC,QAAQ,QAAQ,UAAU;AAC7E,MAAI,CAAC,SAAS;AACZ,UAAM,aAAa,OAAO,KAAK,MAAM;AACrC,UAAM,QAAQ,WAAW,OAAO,CAAC,QAAQ,CAAC,aAAa,SAAS,GAAG,CAAC;AACpE,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO,KAAK;AAAA,QACV,MAAM,YAAYA,KAAI;AAAA,QACtB,SAAS,iBAAiB,MAAM,SAAS,IAAI,MAAM,EAAE,IAAI,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACvG;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,aAAW,OAAO,cAAc;AAC9B,UAAM,YAAYA,UAAS,KAAK,MAAM,GAAGA,KAAI,IAAI,GAAG;AACpD,QAAI,EAAE,OAAO,SAAS;AACpB,aAAO,KAAK;AAAA,QACV,MAAM,YAAY,SAAS;AAAA,QAC3B,SAAS,kCAAkC,KAAK,UAAU,SAAS,GAAG,CAAC,CAAC;AAAA,QACxE,UAAU,SAAS,GAAG;AAAA,QACtB,QAAQ;AAAA,MACV,CAAC;AACD;AAAA,IACF;AACA,UAAM,WAAyB,EAAE,SAAS,YAAY,IAAI,WAAW;AACrE,cAAU,SAAS,GAAG,GAAG,OAAO,GAAG,GAAG,WAAW,QAAQ;AAAA,EAC3D;AACF;AAEA,SAAS,WAAW,UAAuB,QAAiBA,OAAc,KAAyB;AACjG,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,0BAA0B,aAAa,MAAM,CAAC;AAAA,MACvD;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,WAAW,IAAI,UACjB,OAAO,UAAU,SAAS,SAC1B,OAAO,WAAW,SAAS;AAC/B,MAAI,CAAC,UAAU;AACb,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,4BAA4B,IAAI,UAAU,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,MAClH;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,cAAU,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,GAAGA,KAAI,IAAI,CAAC,KAAK,GAAG;AAAA,EACxD;AACF;AAEA,SAAS,eAAe,UAAqB,QAAiB,SAA2B;AACvF,QAAM,UAAwB,EAAE,SAAS,YAAY,CAAC,EAAE;AACxD,YAAU,UAAU,QAAQ,IAAI,OAAO;AACvC,SAAO,QAAQ,WAAW,WAAW;AACvC;AAEA,SAAS,eACP,UACA,QACAA,OACA,KACM;AACN,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,sCAAsC,aAAa,MAAM,CAAC;AAAA,MACnE;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,MAAI,IAAI,UAAU,OAAO,SAAS,SAAS,SAAS,OAAO,WAAW,SAAS,QAAQ;AACrF,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,sCAAsC,IAAI,UAAU,MAAM,SAAS,MAAM,KAAK,SAAS,MAAM,SAAS,OAAO,MAAM;AAAA,MAC5H;AAAA,MACA;AAAA,IACF,CAAC;AACD;AAAA,EACF;AACA,QAAM,OAAO,IAAI,MAAe,OAAO,MAAM,EAAE,KAAK,KAAK;AACzD,QAAM,SAAS,CAAC,UAA2B;AACzC,QAAI,UAAU,SAAS,OAAQ,QAAO;AACtC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,KAAK,CAAC,EAAG;AACb,UAAI,eAAe,SAAS,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,GAAG;AAC3D,aAAK,CAAC,IAAI;AACV,YAAI,OAAO,QAAQ,CAAC,EAAG,QAAO;AAC9B,aAAK,CAAC,IAAI;AAAA,MACZ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,CAAC,OAAO,CAAC,GAAG;AACd,WAAO,KAAK;AAAA,MACV,MAAM,YAAYA,KAAI;AAAA,MACtB,SAAS,gFAAgF,IAAI,UAAU,cAAc,EAAE;AAAA,MACvH;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC/RA,OAAO,QAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;;;ACFf,OAAO,UAAU;AAGV,SAAS,eAAe,SAAmD;AAChF,SAAO,QAAQ,UAAU,KAAK,QAAQ,QAAQ,OAAO,IAAI,QAAQ,IAAI;AACvE;AAEO,SAAS,oBAAoB,SAAwC;AAC1E,QAAM,UAAU,eAAe,OAAO;AACtC,QAAM,MAAM,QAAQ,OAAO,OAAO;AAClC,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,KAAK,KAAK,WAAW,GAAG,IAAI,MAAM,KAAK,QAAQ,SAAS,GAAG;AAAA,EAC7D;AACF;;;ADGA,eAAe,iBAAiB,OAAiB,KAAgC;AAC/E,QAAM,WAAW,MAAM,IAAI,CAAC,MAAM;AAChC,UAAM,aAAa,EAAE,WAAW,GAAG;AACnC,UAAM,OAAO,aAAa,EAAE,MAAM,CAAC,IAAI;AACvC,UAAM,YAAYC,MAAK,WAAW,IAAI,IAAI,OAAOA,MAAK,KAAK,KAAK,IAAI,GAAG,QAAQ,OAAO,GAAG;AACzF,WAAO,aAAa,IAAI,QAAQ,KAAK;AAAA,EACvC,CAAC;AACD,SAAO,MAAM,GAAG,UAAU,EAAE,KAAK,OAAO,WAAW,MAAM,QAAQ,KAAK,CAAC;AACzE;AAEA,SAAS,oBAAoB,YAAwB,OAAuB;AAC1E,QAAM,QAAQ,WAAW,CAAC;AAC1B,QAAM,SAAS,WAAW,SAAS,IAAI,MAAM,WAAW,SAAS,CAAC,WAAW;AAC7E,SAAO,GAAG,KAAK,OAAO,MAAM,IAAI,KAAK,MAAM,OAAO,GAAG,MAAM;AAC7D;AAEA,SAAS,mBACP,UACA,QACY;AACZ,QAAM,WAAW;AAAA,IACf,MAAM,OAAO,aAAa,OAAO,SAAS,SAAY,OAAO,OAAO,IAAI,IAAI;AAAA,IAC5E,SAAS,OAAO;AAAA,EAClB;AACA,MAAI,SAAS,SAAS,QAAW;AAC/B,UAAM,cACJ,SAAS,SAAS,OAAO,YAAY,SAAS,SAAS,OAAO,OAAO,QAAQ,EAAE;AACjF,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,iCAAiC,KAAK,UAAU,SAAS,IAAI,CAAC,SAAS,KAAK,UAAU,SAAS,IAAI,CAAC;AAAA,QAC3G;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,YAAY,QAAW;AAClC,UAAM,aAAa,WAAW,SAAS,SAAsB,OAAO,OAAO;AAC3E,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,oBAAoB,YAAY,wBAAwB;AAAA,QAC/D;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;AAEA,eAAe,YACb,SACA,UACA,WACqB;AACrB,MAAI,CAAC,SAAS,MAAM;AAClB,WAAO,EAAE,IAAI,OAAO,OAAO,wCAAwC;AAAA,EACrE;AACA,QAAM,UAAU,MAAM,QAAQ,SAAS,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS;AAEpF,MAAI,SAAS,gBAAgB,QAAW;AACtC,QAAI,QAAQ,SAAS,UAAU;AAC7B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,UAAU,SAAS;AAAA,QACnB,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AACA,WAAO,mBAAmB,SAAS,aAAa,QAAQ,KAAK;AAAA,EAC/D;AAEA,MAAI,QAAQ,SAAS,SAAS;AAC5B,UAAM,QAAQ,QAAQ,MAAM,WAAW,KAAK,QAAQ,MAAM,QAAQ,MAAM;AACxE,WAAO,EAAE,IAAI,OAAO,OAAO,mBAAmB,KAAK,KAAK,QAAQ,MAAM,OAAO,GAAG;AAAA,EAClF;AAEA,MAAI,SAAS,WAAW,QAAW;AACjC,UAAM,aAAa,WAAW,SAAS,QAAQ,QAAQ,MAAM;AAC7D,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,oBAAoB,YAAY,oBAAoB;AAAA,QAC3D,UAAU,SAAS;AAAA,QACnB,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;AAEA,eAAe,eAAkB,IAAsB,WAA+B;AACpF,MAAI;AACJ,QAAM,iBAAiB,IAAI,QAAe,CAAC,GAAG,WAAW;AACvD,oBAAgB,WAAW,MAAM,OAAO,IAAI,MAAM,uBAAuB,CAAC,GAAG,SAAS;AAAA,EACxF,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,GAAG,GAAG,cAAc,CAAC;AAAA,EAClD,UAAE;AACA,QAAI,cAAe,cAAa,aAAa;AAAA,EAC/C;AACF;AAEO,IAAM,SAAN,MAAa;AAAA,EACD;AAAA,EACA;AAAA,EAEjB,YAAY,SAA0B,UAA0B,IAAI,sBAAsB,GAAG;AAC3F,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,MAAuB;AAC3B,UAAM,UAAU,eAAe,KAAK,OAAO;AAC3C,UAAM,QAAQ,MAAM,iBAAiB,KAAK,QAAQ,OAAO,OAAO;AAChE,QAAI,MAAM,WAAW,GAAG;AACtB,YAAM,UAAU,KAAK,QAAQ,MAAM,KAAK,IAAI;AAC5C,YAAM,UAAU,gCAAgC,OAAO,UAAU,OAAO;AACxE,UAAI,KAAK,QAAQ,YAAY;AAC3B,gBAAQ,KAAK,OAAO;AACpB,eAAO;AAAA,MACT;AACA,cAAQ,MAAM,OAAO;AACrB,aAAO;AAAA,IACT;AACA,SAAK,QAAQ,QAAQ,MAAM,MAAM;AACjC,UAAM,iBAAiB,KAAK,IAAI,KAAM,KAAK,IAAI,KAAO,KAAK,QAAQ,SAAS,CAAC;AAC7E,UAAM,SAAS,oBAAoB,KAAK,OAAO;AAC/C,UAAM,UAAU,MAAM,WAAW,MAAM,QAAQ,cAAc;AAC7D,QAAI;AACF,UAAI,WAAW;AACf,YAAM,YAAY,KAAK,IAAI;AAC3B,UAAI,YAAY;AAChB,iBAAW,QAAQ,OAAO;AACxB,YAAI;AACJ,YAAI;AACF,iBAAO,KAAK,MAAM,GAAG,aAAa,MAAM,MAAM,CAAC;AAAA,QACjD,SAAS,KAAK;AACZ;AACA,gBAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,eAAK,QAAQ,WAAWA,MAAK,SAAS,IAAI,GAAG,6BAA6B,MAAM,EAAE;AAClF;AACA,cAAI,KAAK,QAAQ,SAAU;AAC3B;AAAA,QACF;AACA,cAAM,EAAE,IAAI,OAAO,UAAU,OAAO,IAAI,MAAM;AAAA,UAC5C,MAAM,YAAY,SAAS,MAAM,KAAK,QAAQ,SAAS;AAAA,UACvD,KAAK,QAAQ;AAAA,QACf;AACA,YAAI,CAAC,IAAI;AACP;AACA,gBAAM,WAAW,KAAK,QAAQA,MAAK,SAAS,IAAI;AAChD,gBAAM,UACJ,aAAa,SAAY,OAAO,KAAK,UAAU,EAAE,UAAU,OAAO,CAAC,CAAC,KAAK;AAC3E,eAAK,QAAQ,WAAW,UAAU,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE;AACjE,cAAI,KAAK,QAAQ,SAAU;AAAA,QAC7B,OAAO;AACL,gBAAM,WAAW,KAAK,QAAQA,MAAK,SAAS,IAAI;AAChD,eAAK,QAAQ,WAAW,QAAQ;AAAA,QAClC;AACA;AAAA,MACF;AACA,WAAK,QAAQ,WAAW;AAAA,QACtB,OAAO;AAAA,QACP,QAAQ,YAAY;AAAA,QACpB,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B,CAAC;AACD,aAAO,aAAa,IAAI,IAAI;AAAA,IAC9B,UAAE;AACA,YAAM,QAAQ,MAAM;AAAA,IACtB;AAAA,EACF;AACF;","names":["path","path","path"]}
|