import { HasTag, LiteralBase, SomeSpec, Spec, SpecSuccess, SpectypesError } from './types.js' import { error } from './error.js' type Template = Specs extends readonly [infer First, ...infer Rest] ? First extends Spec ? SpecSuccess extends LiteralBase ? Rest extends readonly Spec[] ? `${SpecSuccess}${Template}` : '' : '' : '' : '' type SpectypesTemplateError = SpectypesError /** * Creates a template string validator spec. * * @param specs Specs to validate parts of the string. Can be only `number`s, `string`s, `boolean`s, `literal`s or their `union`s */ export const template: ( ...specs: Specs & { readonly [Index in keyof Specs]: Specs[Index] extends Spec ? HasTag extends true ? SpectypesTemplateError<'optional'> : HasTag extends true ? SpectypesTemplateError<'filter'> : HasTag extends true ? SpectypesTemplateError<'unknown'> : HasTag extends true ? SpectypesTemplateError<'nullish'> : HasTag extends true ? SpectypesTemplateError<'lazy'> : HasTag extends true ? SpectypesTemplateError<'array'> : HasTag extends true ? SpectypesTemplateError<'tuple'> : HasTag extends true ? SpectypesTemplateError<'merge'> : HasTag extends true ? SpectypesTemplateError<'object'> : HasTag extends true ? SpectypesTemplateError<'record'> : HasTag extends true ? SpectypesTemplateError<'struct'> : HasTag extends true ? SpectypesTemplateError<'template'> : HasTag extends true ? SpectypesTemplateError<'limit'> : HasTag extends true ? SpectypesTemplateError<'map'> : Specs[Index] : never } ) => Spec<['template'], 'validator', Template> = error