Files
NapCatQQ/.pnpm-store/v3/files/0f/780f3171a32fcc52c36e1f6fe914f78225cd33098724fb4c0b94f537e1942e8cb67b1a3be73fd1d644f84c07c3101c3a9689ef64b94a5287e220e06b906008
TanTan e311ca3275
Build NapCat Artifacts / Windows Loader Test (push) Canceled after 0s
Build NapCat Artifacts / Type Check & Test (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Framework (push) Canceled after 0s
Build NapCat Artifacts / Build NapCat.Shell (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:25:58 +08:00

54 lines
2.1 KiB
Plaintext

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)]
: []);
}