UNPKG

tsc-template

Version:

Utility to build TypeScript AST from a string, similar to @babel/template

34 lines 1.64 kB
import { createSourceFile, isIdentifier, isSourceFile, ScriptKind, ScriptTarget, transform, } from 'typescript'; import { createTransformer } from './createTransformer.js'; import { findBestNode } from './findBestNode.js'; import { $templateResult, isTemplateResult } from './TemplateResult.js'; export * from './createTransformer.js'; export default function ast(parts, ...fillers) { let code = ''; const transformers = []; for (let i = 0; i < parts.length; i++) { const filler = fillers[i]; code += parts[i]; if (filler != null) { if (typeof filler === 'string') { code += filler; } else { const id = `$${crypto.randomUUID().replace(/-/gu, '_')}`; code += id; transformers.push(createTransformer((n) => isIdentifier(n) && n.text === id ? (isTemplateResult(filler) ? filler.node : filler) : n)); } } } if (code.includes('%{') || code.includes('}%')) { code = code.replaceAll('%{', '/** @START */').replaceAll('}%', '/** @END */'); } if (code.indexOf('/** @START */') !== code.lastIndexOf('/** @START */') || code.indexOf('/** @END */') !== code.lastIndexOf('/** @END */')) { throw new Error('Only one set of code extractors is allowed: %{ ... }% or /** @START */ ... /** @END */'); } const source = transform(createSourceFile('', code, ScriptTarget.Latest, false, ScriptKind.TSX), transformers) .transformed[0]; return { brand: $templateResult, node: findBestNode(source), source }; } //# sourceMappingURL=index.js.map