UNPKG

@sinclair/typebox

Version:

Json Schema Type Builder with Static Type Resolution for TypeScript

54 lines (53 loc) 2.1 kB
import { IsTemplateLiteralExpressionFinite } from './finite.mjs'; import { TemplateLiteralParseExact } from './parse.mjs'; import { TypeBoxError } from '../error/index.mjs'; // ------------------------------------------------------------------ // TemplateLiteralGenerateError // ------------------------------------------------------------------ export class TemplateLiteralGenerateError extends TypeBoxError { } // ------------------------------------------------------------------ // TemplateLiteralExpressionGenerate // ------------------------------------------------------------------ // prettier-ignore function* GenerateReduce(buffer) { if (buffer.length === 1) return yield* buffer[0]; for (const left of buffer[0]) { for (const right of GenerateReduce(buffer.slice(1))) { yield `${left}${right}`; } } } // prettier-ignore function* GenerateAnd(expression) { return yield* GenerateReduce(expression.expr.map((expr) => [...TemplateLiteralExpressionGenerate(expr)])); } // prettier-ignore function* GenerateOr(expression) { for (const expr of expression.expr) yield* TemplateLiteralExpressionGenerate(expr); } // prettier-ignore function* GenerateConst(expression) { return yield expression.const; } export function* TemplateLiteralExpressionGenerate(expression) { return expression.type === 'and' ? yield* GenerateAnd(expression) : expression.type === 'or' ? yield* GenerateOr(expression) : expression.type === 'const' ? yield* GenerateConst(expression) : (() => { throw new TemplateLiteralGenerateError('Unknown expression'); })(); } /** Generates a tuple of strings from the given TemplateLiteral. Returns an empty tuple if infinite. */ export function TemplateLiteralGenerate(schema) { const expression = TemplateLiteralParseExact(schema.pattern); // prettier-ignore return (IsTemplateLiteralExpressionFinite(expression) ? [...TemplateLiteralExpressionGenerate(expression)] : []); }