{"version":3,"file":"mock-image-model.mjs","names":[],"sources":["../../../../../../../ai/src/mock/mock-image-model.ts"],"sourcesContent":["import type {\n  GeneratedImage,\n  ImageGenerationOptions,\n  ImageGenerationResponse,\n  ImageModelContract,\n  ImageModelPricing,\n} from \"../contracts/image-model.contract\";\nimport type { Usage } from \"../contracts/result/usage.type\";\n\n/** One scripted response for a {@link MockImageModel}. */\nexport type MockImageResponse = {\n  /** Images to return; defaults to a single 1×1 transparent PNG. */\n  images?: GeneratedImage[];\n  /** Token usage to report; defaults to all-zero (per-image-metered). */\n  usage?: Usage;\n  /** Throw this instead of returning — drives the never-throws/error path. */\n  error?: Error;\n  /** Simulate latency before resolving/rejecting (ms). */\n  delay?: number;\n};\n\n/** One recorded `generate()` invocation, for test assertions. */\nexport type MockImageCall = {\n  prompt: string;\n  options: ImageGenerationOptions | undefined;\n};\n\n/** A 1×1 transparent PNG — the default mock image payload. */\nconst TRANSPARENT_PNG_BASE64 =\n  \"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==\";\n\n/**\n * Deterministic {@link ImageModelContract} double for tests — no HTTP.\n * Scripts responses in sequence (the last repeats once exhausted),\n * records every call, and can be primed with pricing to exercise the\n * cost rollup. Mirrors {@link MockModel} for the image path.\n *\n * @example\n * const model = new MockImageModel(\"mock-image\", [{ usage: { input: 0, output: 0, total: 0 } }], {\n *   perImage: 0.04,\n * });\n * const { data, usage } = await ai.image({ model, prompt: \"a cat\" });\n */\nexport class MockImageModel implements ImageModelContract {\n  public readonly provider = \"mock\";\n  public readonly calls: MockImageCall[] = [];\n\n  private callIndex = 0;\n\n  public constructor(\n    public readonly name: string,\n    private readonly responses: MockImageResponse[],\n    public readonly pricing?: ImageModelPricing,\n  ) {}\n\n  public async generate(\n    prompt: string,\n    options?: ImageGenerationOptions,\n  ): Promise<ImageGenerationResponse> {\n    this.calls.push({ prompt, options });\n\n    const response = this.responses[Math.min(this.callIndex, this.responses.length - 1)] ?? {};\n    this.callIndex += 1;\n\n    if (response.delay) {\n      await new Promise((resolve) => setTimeout(resolve, response.delay));\n    }\n\n    if (response.error) {\n      throw response.error;\n    }\n\n    const count = options?.count ?? 1;\n    const images: GeneratedImage[] =\n      response.images ??\n      Array.from({ length: count }, () => ({\n        type: \"base64\" as const,\n        base64: TRANSPARENT_PNG_BASE64,\n        mediaType: \"image/png\",\n      }));\n\n    return {\n      images,\n      usage: response.usage ?? { input: 0, output: 0, total: 0 },\n    };\n  }\n}\n"],"mappings":";;AA4BA,MAAM,yBACJ;;;;;;;;;;;;;AAcF,IAAa,iBAAb,MAA0D;CAMxD,AAAO,YACL,AAAgB,MAChB,AAAiB,WACjB,AAAgB,SAChB;EAHgB;EACC;EACD;kBARS;eACc,CAAC;mBAEtB;CAMjB;CAEH,MAAa,SACX,QACA,SACkC;EAClC,KAAK,MAAM,KAAK;GAAE;GAAQ;EAAQ,CAAC;EAEnC,MAAM,WAAW,KAAK,UAAU,KAAK,IAAI,KAAK,WAAW,KAAK,UAAU,SAAS,CAAC,MAAM,CAAC;EACzF,KAAK,aAAa;EAElB,IAAI,SAAS,OACX,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,SAAS,KAAK,CAAC;EAGpE,IAAI,SAAS,OACX,MAAM,SAAS;EAGjB,MAAM,QAAQ,SAAS,SAAS;EAShC,OAAO;GACL,QARA,SAAS,UACT,MAAM,KAAK,EAAE,QAAQ,MAAM,UAAU;IACnC,MAAM;IACN,QAAQ;IACR,WAAW;GACb,EAAE;GAIF,OAAO,SAAS,SAAS;IAAE,OAAO;IAAG,QAAQ;IAAG,OAAO;GAAE;EAC3D;CACF;AACF"}