UNPKG

@glint/core

Version:

A CLI for performing typechecking on Glimmer templates

45 lines 2.28 kB
import { assert } from './assert.js'; export function patchProgramBuilder(ts, transformManagerOrPool, builder) { return (...args) => { let program = builder(...args); patchProgram(ts, program, transformManagerOrPool); return program; }; } export function patchProgram(ts, program, transformManagerOrPool) { let { getSyntacticDiagnostics, getSemanticDiagnostics } = program; // We have two scenarios: either we are working with a single program for a // single project, in which case we have a `TransformManager`, *or* we have a // `TransformManagerPool` to deal with the case where we are running a // `--build` across a composite project. In the latter case, we need to *get* // a manager for the project in question, if it exists at all, to use in // getting transform errors (both type errors and syntax errors). let manager; if (isPool(transformManagerOrPool)) { let configFile = program.getCompilerOptions()['configFilePath']; assert(typeof configFile === 'string', 'internal error: missing TS config file'); manager = transformManagerOrPool.managerForFile(configFile); } else { manager = transformManagerOrPool; } program.getSyntacticDiagnostics = function (sourceFile, cancelationToken) { let diagnostics = getSyntacticDiagnostics.call(program, sourceFile, cancelationToken); let transformDiagnostics = manager?.getTransformDiagnostics(sourceFile?.fileName) ?? []; return ts.sortAndDeduplicateDiagnostics([...diagnostics, ...transformDiagnostics]); }; program.getSemanticDiagnostics = (sourceFile, cancellationToken) => { let diagnostics = getSemanticDiagnostics.call(program, sourceFile, cancellationToken); let rewrittenDiagnostics = manager?.rewriteDiagnostics(diagnostics, sourceFile?.fileName) ?? diagnostics; return rewrittenDiagnostics; }; // We want to patch these methods on both the outer "builder" program and, if // applicable, its inner program representation. if ('getProgram' in program) { patchProgram(ts, program.getProgram(), transformManagerOrPool); } } function isPool(manager) { return !!manager.isPool; } //# sourceMappingURL=patch-program.js.map