Как мне присоединить пользовательские преобразователи к хосту компилятора? - PullRequest
0 голосов
/ 02 июля 2019

У меня есть собственный наблюдатель TypeScript, который выглядит примерно так:

const compilerHost = typescript.createWatchCompilerHost(config.fileNames, config.options, typescript.sys, undefined, reportDiagnostic)
typescript.createWatchProgram(compilerHost)

Я хочу подключить специальный преобразователь, который используется, когда наблюдатель компилирует мои .ts файлы. Если бы я делал одноразовую компиляцию, я бы сделал что-то вроде этого, указав в качестве последнего параметра преобразователь.

const program = typescript.createProgram(config.fileNames, config.options)
const emitResult = program.emit(undefined, undefined, undefined, undefined, { before: [ transformer(program) ] })

Однако я не могу найти способ добавить преобразователь ни к хосту компилятора, ни к созданию программы наблюдения.

Как добавить собственный преобразователь в хост компилятора часов?

Один из теоретических способов сделать это - предоставить пользовательский CreateProgram для createWatchCompilerHost, который имеет функцию emit для возвращаемых объектов, переопределенных моим пользовательским преобразователем. Мне неясно, насколько реалистичным будет этот путь, и я ищу лучший вариант.

1 Ответ

0 голосов
/ 02 июля 2019

Следующее является функциональным (для моего случая), но я не большой поклонник этого.Хотелось бы увидеть лучшие ответы.

const compilerHost = typescript.createWatchCompilerHost(config.fileNames, config.options, typescript.sys, undefined, reportDiagnostic)
const originalAfterProgramCreate = compilerHost.afterProgramCreate
compilerHost.afterProgramCreate = builderProgram => {
    const originalEmit = builderProgram.emit
    builderProgram.emit = (targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, customTransformers): typescript.EmitResult => {
        const transformers = customTransformers || { before: [] }
        if (!transformers.before) transformers.before = []
        transformers.before.push(myTransformer(builderProgram.getProgram()))
        return originalEmit(targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, transformers)
    }
    if (originalAfterProgramCreate) originalAfterProgramCreate(builderProgram)
}
typescript.createWatchProgram(compilerHost)
...