{"version":3,"file":"validation.mjs","names":[],"sources":["../../../../src/batteries/embeddings/webllm/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for WebLLM Embeddings adapter options.\n *\n * @module @nhtio/adk/batteries/embeddings/webllm/validation\n *\n * @remarks\n * Validates `WebLLMEmbeddingsAdapterOptions` at construction time. Throws\n * `E_INVALID_WEBLLM_EMBEDDINGS_OPTIONS` on failure. `model` is required; unknown top-level keys\n * are rejected so typos fail loud. WebGPU availability is checked at engine-resolution time (not\n * here), since an `engine` may be injected for tests/non-WebGPU paths.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_WEBLLM_EMBEDDINGS_OPTIONS } from './exceptions'\nimport type { WebLLMEmbeddingsAdapterOptions } from './types'\n\n/**\n * Validator schema for `WebLLMEmbeddingsAdapterOptions`. Rejects unknown top-level keys.\n */\nexport const webLLMEmbeddingsOptionsSchema = validator\n  .object<WebLLMEmbeddingsAdapterOptions>({\n    // Shared base\n    model: validator.string().min(1).required(),\n    queryPrefix: validator.string().optional(),\n    documentPrefix: validator.string().optional(),\n    dimensions: validator.number().integer().min(1).optional(),\n    // Engine knobs\n    engine: validator.object().unknown(true).optional(),\n    createEngine: validator.function().optional(),\n    engineConfig: validator.object().unknown(true).optional(),\n    chatOptions: validator\n      .alternatives(\n        validator.object().unknown(true),\n        validator.array().items(validator.object().unknown(true))\n      )\n      .optional(),\n    onInitProgress: validator.function().optional(),\n    isWebGPUAvailable: validator.function().optional(),\n  })\n  .unknown(false)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n  err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `webLLMEmbeddingsOptionsSchema` and returns the resolved\n * options shape. Throws `E_INVALID_WEBLLM_EMBEDDINGS_OPTIONS` (carrying the validator's report on\n * `cause`) on failure.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n */\nexport const validateOptions = (input: unknown): WebLLMEmbeddingsAdapterOptions => {\n  const { value, error } = webLLMEmbeddingsOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error) {\n    throw new E_INVALID_WEBLLM_EMBEDDINGS_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as WebLLMEmbeddingsAdapterOptions\n}\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n  isError(value) && Array.isArray((value as ValidationError).details)\n\nvoid isValidationError\n"],"mappings":";;;;;;;AAoBA,IAAa,gCAAgC,UAC1C,OAAuC;CAEtC,OAAO,UAAU,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;CAC1C,aAAa,UAAU,OAAO,EAAE,SAAS;CACzC,gBAAgB,UAAU,OAAO,EAAE,SAAS;CAC5C,YAAY,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS;CAEzD,QAAQ,UAAU,OAAO,EAAE,QAAQ,IAAI,EAAE,SAAS;CAClD,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,cAAc,UAAU,OAAO,EAAE,QAAQ,IAAI,EAAE,SAAS;CACxD,aAAa,UACV,aACC,UAAU,OAAO,EAAE,QAAQ,IAAI,GAC/B,UAAU,MAAM,EAAE,MAAM,UAAU,OAAO,EAAE,QAAQ,IAAI,CAAC,CAC1D,EACC,SAAS;CACZ,gBAAgB,UAAU,SAAS,EAAE,SAAS;CAC9C,mBAAmB,UAAU,SAAS,EAAE,SAAS;AACnD,CAAC,EACA,QAAQ,KAAK;AAEhB,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;;AAUhD,IAAa,mBAAmB,UAAmD;CACjF,MAAM,EAAE,OAAO,UAAU,8BAA8B,SAAS,OAAO;EACrE,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,OACF,MAAM,IAAI,oCAAoC,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAC9E,OAAO,MACT,CAAC;CAEH,OAAO;AACT"}