{"version":3,"file":"vitest.cjs","names":["LLMock","loadFixturesFromDir","loadFixtureFile"],"sources":["../src/vitest.ts"],"sourcesContent":["/**\n * Vitest integration for aimock.\n *\n * Usage:\n *   import { useAimock } from \"@copilotkit/aimock/vitest\";\n *\n *   const mock = useAimock({ fixtures: \"./fixtures\" });\n *\n *   it(\"responds\", async () => {\n *     const res = await fetch(`${mock().url}/v1/chat/completions`, { ... });\n *   });\n */\n\nimport { beforeAll, afterAll, beforeEach } from \"vitest\";\nimport { LLMock } from \"./llmock.js\";\nimport { loadFixtureFile, loadFixturesFromDir } from \"./fixture-loader.js\";\nimport type { Fixture, MockServerOptions } from \"./types.js\";\nimport { statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\n\nexport interface UseAimockOptions extends MockServerOptions {\n  /** Path to fixture file or directory. Loaded automatically on start. */\n  fixtures?: string;\n  /** If true, sets process.env.OPENAI_BASE_URL to the mock URL + /v1. */\n  patchEnv?: boolean;\n}\n\nexport interface AimockHandle {\n  /** The LLMock instance. */\n  readonly llm: LLMock;\n  /** The server URL (e.g., http://127.0.0.1:4010). */\n  readonly url: string;\n}\n\n/**\n * Start an aimock server for the duration of the test suite.\n *\n * - `beforeAll`: starts the server and optionally loads fixtures\n * - `beforeEach`: resets fixture match counts (not fixtures themselves)\n * - `afterAll`: stops the server\n *\n * Returns a getter function — call it inside tests to access the handle.\n */\nexport function useAimock(options: UseAimockOptions = {}): () => AimockHandle {\n  let handle: AimockHandle | null = null;\n  let origOpenaiUrl: string | undefined;\n  let origAnthropicUrl: string | undefined;\n\n  beforeAll(async () => {\n    const { fixtures: fixturePath, patchEnv, ...serverOpts } = options;\n    const llm = new LLMock(serverOpts);\n\n    if (fixturePath) {\n      const resolved = resolve(fixturePath);\n      const loadedFixtures = loadFixtures(resolved);\n      for (const f of loadedFixtures) {\n        llm.addFixture(f);\n      }\n    }\n\n    const url = await llm.start();\n\n    if (patchEnv !== false) {\n      origOpenaiUrl = process.env.OPENAI_BASE_URL;\n      origAnthropicUrl = process.env.ANTHROPIC_BASE_URL;\n      process.env.OPENAI_BASE_URL = `${url}/v1`;\n      process.env.ANTHROPIC_BASE_URL = `${url}/v1`;\n    }\n\n    handle = { llm, url };\n  });\n\n  beforeEach(() => {\n    if (handle) {\n      handle.llm.resetMatchCounts();\n    }\n  });\n\n  afterAll(async () => {\n    if (handle) {\n      if (options.patchEnv !== false) {\n        if (origOpenaiUrl !== undefined) process.env.OPENAI_BASE_URL = origOpenaiUrl;\n        else delete process.env.OPENAI_BASE_URL;\n        if (origAnthropicUrl !== undefined) process.env.ANTHROPIC_BASE_URL = origAnthropicUrl;\n        else delete process.env.ANTHROPIC_BASE_URL;\n      }\n      await handle.llm.stop();\n      handle = null;\n    }\n  });\n\n  return () => {\n    if (!handle) {\n      throw new Error(\"useAimock(): server not started — are you calling this inside a test?\");\n    }\n    return handle;\n  };\n}\n\nfunction loadFixtures(fixturePath: string): Fixture[] {\n  try {\n    const stat = statSync(fixturePath);\n    if (stat.isDirectory()) {\n      return loadFixturesFromDir(fixturePath);\n    }\n    return loadFixtureFile(fixturePath);\n  } catch (err) {\n    console.warn(\n      `[aimock] Failed to load fixtures from ${fixturePath}: ${err instanceof Error ? err.message : String(err)}`,\n    );\n    return [];\n  }\n}\n\nexport { LLMock } from \"./llmock.js\";\nexport type { MockServerOptions, Fixture } from \"./types.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,SAAgB,UAAU,UAA4B,EAAE,EAAsB;CAC5E,IAAI,SAA8B;CAClC,IAAI;CACJ,IAAI;AAEJ,uBAAU,YAAY;EACpB,MAAM,EAAE,UAAU,aAAa,UAAU,GAAG,eAAe;EAC3D,MAAM,MAAM,IAAIA,sBAAO,WAAW;AAElC,MAAI,aAAa;GAEf,MAAM,iBAAiB,oCADE,YAAY,CACQ;AAC7C,QAAK,MAAM,KAAK,eACd,KAAI,WAAW,EAAE;;EAIrB,MAAM,MAAM,MAAM,IAAI,OAAO;AAE7B,MAAI,aAAa,OAAO;AACtB,mBAAgB,QAAQ,IAAI;AAC5B,sBAAmB,QAAQ,IAAI;AAC/B,WAAQ,IAAI,kBAAkB,GAAG,IAAI;AACrC,WAAQ,IAAI,qBAAqB,GAAG,IAAI;;AAG1C,WAAS;GAAE;GAAK;GAAK;GACrB;AAEF,8BAAiB;AACf,MAAI,OACF,QAAO,IAAI,kBAAkB;GAE/B;AAEF,sBAAS,YAAY;AACnB,MAAI,QAAQ;AACV,OAAI,QAAQ,aAAa,OAAO;AAC9B,QAAI,kBAAkB,OAAW,SAAQ,IAAI,kBAAkB;QAC1D,QAAO,QAAQ,IAAI;AACxB,QAAI,qBAAqB,OAAW,SAAQ,IAAI,qBAAqB;QAChE,QAAO,QAAQ,IAAI;;AAE1B,SAAM,OAAO,IAAI,MAAM;AACvB,YAAS;;GAEX;AAEF,cAAa;AACX,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,wEAAwE;AAE1F,SAAO;;;AAIX,SAAS,aAAa,aAAgC;AACpD,KAAI;AAEF,4BADsB,YAAY,CACzB,aAAa,CACpB,QAAOC,2CAAoB,YAAY;AAEzC,SAAOC,uCAAgB,YAAY;UAC5B,KAAK;AACZ,UAAQ,KACN,yCAAyC,YAAY,IAAI,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,GAC1G;AACD,SAAO,EAAE"}