{"version":3,"file":"validation.cjs","names":[],"sources":["../../../../src/batteries/tts/native/validation.ts"],"sourcesContent":["/**\n * Runtime validation schema and wrapper for OS-native TTS adapter options.\n *\n * @module @nhtio/adk/batteries/tts/native/validation\n *\n * @remarks\n * Validates `NativeTtsAdapterOptions` at construction time. Throws\n * {@link @nhtio/adk/batteries/tts/native!E_INVALID_NATIVE_TTS_OPTIONS} on failure. Every field is\n * optional — a zero-config `new NativeTtsAdapter()` is valid and auto-detects the platform — but\n * unknown top-level keys are rejected (`.unknown(false)`) so typos fail loud. The seam functions\n * (`executor`/`fs`/`tmpdir`/`randomName`/`isAvailable`) are accepted as bare functions (or, for\n * `fs`/`executor`, an object whose members are functions) so unit tests can inject fakes.\n */\n\nimport { isError } from '@nhtio/adk/guards'\nimport { E_INVALID_NATIVE_TTS_OPTIONS } from './exceptions'\nimport { validator, ValidationError } from '@nhtio/validation'\nimport type { NativeTtsAdapterOptions } from './types'\n\n/**\n * Validator schema for `NativeTtsAdapterOptions`. Every field is optional; unknown top-level keys\n * are rejected. Seam functions are accepted as-is.\n */\nexport const nativeTtsOptionsSchema = validator\n  .object<NativeTtsAdapterOptions>({\n    // Shared TTS base\n    voice: validator.string().optional(),\n    rate: validator.number().optional(),\n    // Native transport / engine knobs\n    platform: validator.string().valid('darwin', 'linux', 'win32').optional(),\n    command: validator.string().optional(),\n    extraArgs: validator.array().items(validator.string()).optional(),\n    wordsPerMinute: validator.number().integer().positive().optional(),\n    pitch: validator.number().integer().min(0).max(99).optional(),\n    timeoutMs: validator.number().integer().positive().optional(),\n    // BYO seams: executor is an object with an `exec` function; fs is an object with two function\n    // members; tmpdir/randomName/isAvailable are bare functions. All accepted as-is.\n    executor: validator.object({ exec: validator.function() }).unknown(true).optional(),\n    fs: validator\n      .object({ readFile: validator.function(), unlink: validator.function() })\n      .unknown(true)\n      .optional(),\n    tmpdir: validator.function().optional(),\n    randomName: validator.function().optional(),\n    isAvailable: 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 {@link nativeTtsOptionsSchema}.\n *\n * @param input - The raw options object to validate (pass `{}` for zero-config).\n * @returns The resolved options object (typed as {@link NativeTtsAdapterOptions}).\n * @throws {@link @nhtio/adk/batteries/tts/native!E_INVALID_NATIVE_TTS_OPTIONS} when invalid.\n */\nexport const validateOptions = (input: unknown): NativeTtsAdapterOptions => {\n  const { value, error } = nativeTtsOptionsSchema.validate(input, {\n    abortEarly: false,\n    convert: false,\n  })\n  if (error && isValidationError(error)) {\n    throw new E_INVALID_NATIVE_TTS_OPTIONS([formatValidationDetails(error)], {\n      cause: error,\n    })\n  }\n  return value as NativeTtsAdapterOptions\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAa,yBAAyB,kBAAA,UACnC,OAAgC;CAE/B,OAAO,kBAAA,UAAU,OAAO,EAAE,SAAS;CACnC,MAAM,kBAAA,UAAU,OAAO,EAAE,SAAS;CAElC,UAAU,kBAAA,UAAU,OAAO,EAAE,MAAM,UAAU,SAAS,OAAO,EAAE,SAAS;CACxE,SAAS,kBAAA,UAAU,OAAO,EAAE,SAAS;CACrC,WAAW,kBAAA,UAAU,MAAM,EAAE,MAAM,kBAAA,UAAU,OAAO,CAAC,EAAE,SAAS;CAChE,gBAAgB,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;CACjE,OAAO,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;CAC5D,WAAW,kBAAA,UAAU,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;CAG5D,UAAU,kBAAA,UAAU,OAAO,EAAE,MAAM,kBAAA,UAAU,SAAS,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,SAAS;CAClF,IAAI,kBAAA,UACD,OAAO;EAAE,UAAU,kBAAA,UAAU,SAAS;EAAG,QAAQ,kBAAA,UAAU,SAAS;CAAE,CAAC,EACvE,QAAQ,IAAI,EACZ,SAAS;CACZ,QAAQ,kBAAA,UAAU,SAAS,EAAE,SAAS;CACtC,YAAY,kBAAA,UAAU,SAAS,EAAE,SAAS;CAC1C,aAAa,kBAAA,UAAU,SAAS,EAAE,SAAS;AAC7C,CAAC,EACA,QAAQ,KAAK;AAEhB,IAAM,qBAAqB,UACzB,eAAA,QAAQ,KAAK,KAAK,MAAM,QAAS,MAA0B,OAAO;AAEpE,IAAM,2BAA2B,QAC/B,IAAI,QAAQ,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;;;;;;;;AAShD,IAAa,mBAAmB,UAA4C;CAC1E,MAAM,EAAE,OAAO,UAAU,uBAAuB,SAAS,OAAO;EAC9D,YAAY;EACZ,SAAS;CACX,CAAC;CACD,IAAI,SAAS,kBAAkB,KAAK,GAClC,MAAM,IAAI,wCAAA,6BAA6B,CAAC,wBAAwB,KAAK,CAAC,GAAG,EACvE,OAAO,MACT,CAAC;CAEH,OAAO;AACT"}