{"version":3,"file":"validation.mjs","names":[],"sources":["../../../../../src/batteries/specialists/ocr/tesseract_js/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for tesseract.js OCR adapter options.\n *\n * @module @nhtio/adk/batteries/specialists/ocr/tesseract_js/validation\n *\n * @remarks\n * Validates `TesseractJsOcrAdapterOptions` at construction time. Throws\n * `E_INVALID_TESSERACT_JS_OCR_OPTIONS` on failure. `languages` is required and must be a non-empty\n * array of strings — language packs download on first use, so a missing/empty value fails loud\n * rather than silently picking a default; unknown top-level keys are rejected so typos fail loud.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport { E_INVALID_TESSERACT_JS_OCR_OPTIONS } from './exceptions'\nimport type { TesseractJsOcrAdapterOptions } from './types'\n\n/** Validator schema for `TesseractJsOcrAdapterOptions`. Rejects unknown top-level keys. */\nexport const tesseractJsOcrOptionsSchema = validator\n  .object<TesseractJsOcrAdapterOptions>({\n    languages: validator.array().items(validator.string().min(1)).min(1).required(),\n    langPath: validator.string().optional(),\n    cachePath: validator.string().optional(),\n    workerOptions: validator.object().unknown(true).optional(),\n    tesseract: validator.function().optional(),\n    createWorker: validator.function().optional(),\n    isAvailable: validator.function().optional(),\n    // ── Lifecycle hooks (opt-in, normalized phase machine) ──\n    onLifecycle: validator.function().optional(),\n    onLoading: validator.function().optional(),\n    onCompiling: validator.function().optional(),\n    onReady: validator.function().optional(),\n    onGenerating: validator.function().optional(),\n    onComplete: validator.function().optional(),\n    onError: validator.function().optional(),\n  })\n  .unknown(false)\n\nconst isValidationError = (value: unknown): value is ValidationError =>\n  isError(value) && Array.isArray((value as ValidationError).details)\n\nconst formatValidationDetails = (err: ValidationError): string =>\n  err.details.map((d) => d.message).join(' and ')\n\n/**\n * Validates an arbitrary input against `tesseractJsOcrOptionsSchema`.\n *\n * @param input - The raw options object to validate.\n * @returns The resolved options object with defaults filled in.\n * @throws {@link @nhtio/adk/batteries!E_INVALID_TESSERACT_JS_OCR_OPTIONS} when invalid.\n */\nexport const validateOptions = (input: unknown): TesseractJsOcrAdapterOptions => {\n  const { value, error } = tesseractJsOcrOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error && isValidationError(error)) {\n    throw new E_INVALID_TESSERACT_JS_OCR_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as TesseractJsOcrAdapterOptions\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAa,8BAA8B,UACxC,OAAqC;CACpC,WAAW,UAAU,MAAM,EAAE,MAAM,UAAU,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;CAC9E,UAAU,UAAU,OAAO,EAAE,SAAS;CACtC,WAAW,UAAU,OAAO,EAAE,SAAS;CACvC,eAAe,UAAU,OAAO,EAAE,QAAQ,IAAI,EAAE,SAAS;CACzD,WAAW,UAAU,SAAS,EAAE,SAAS;CACzC,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,aAAa,UAAU,SAAS,EAAE,SAAS;CAE3C,aAAa,UAAU,SAAS,EAAE,SAAS;CAC3C,WAAW,UAAU,SAAS,EAAE,SAAS;CACzC,aAAa,UAAU,SAAS,EAAE,SAAS;CAC3C,SAAS,UAAU,SAAS,EAAE,SAAS;CACvC,cAAc,UAAU,SAAS,EAAE,SAAS;CAC5C,YAAY,UAAU,SAAS,EAAE,SAAS;CAC1C,SAAS,UAAU,SAAS,EAAE,SAAS;AACzC,CAAC,EACA,QAAQ,KAAK;AAEhB,IAAM,qBAAqB,UACzB,QAAQ,KAAK,KAAK,MAAM,QAAS,MAA0B,OAAO;AAEpE,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;AAShD,IAAa,mBAAmB,UAAiD;CAC/E,MAAM,EAAE,OAAO,UAAU,4BAA4B,SAAS,OAAO;EACnE,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,SAAS,kBAAkB,KAAK,GAClC,MAAM,IAAI,mCAAmC,CAAC,wBAAwB,KAAK,CAAC,GAAG,EAC7E,OAAO,MACT,CAAC;CAEH,OAAO;AACT"}