Получить расположение вывода для SourceFile с учетом CompilerOptions - PullRequest
0 голосов
/ 08 апреля 2020

Можно ли получить выходное местоположение для SourceFile при заданном наборе CompilerOptions при использовании API компилятора?

Я мог бы имитировать c способ, которым TypeScript разрешает этот путь, используя outDir, rootDir и набор включенных путей к файлам, но это действительно не кажется хорошей идеей (по понятным причинам).

Я заметил функции ts.getOutputFileNames и ts.getTsBuildInfoEmitOutputFilePath, которые выглядят многообещающими , но первый принимает ts.ParsedCommandLine (что не имеет смысла при использовании programmati c), а второй возвращает undefined независимо от введенного мной CompilerOptions.

Редактировать:

Я проверил код компилятора, и похоже, что он использует getOwnEmitOutputFilePath для вычисления этого пути во время «обычной компиляции». К сожалению, эта функция помечена как внутренняя, что означает, что она не легко доступна для использования API.

Даже если эта функция доступна (например, путем ручного увеличения ее типа), для этого требуется EmitHost, который, к сожалению, также помечен как внутренний.
Как ни странно, интерфейс TransformationContext имеет (внутреннюю) функцию getEmitHost, но это всегда возвращало undefined во время моего тестирования, вероятно, потому что я использую функцию programmati c transform вместо полноценной компиляции.

Другими словами: мне придется вручную создайте EmitHost.
Похоже, что это делается в двух местах в компиляторе, внутри createProgram и в самом эмиттере . К сожалению, в обоих случаях этот «конструктор» недоступен для программного c использования.
Ручная реализация EmitHost также не представляется жизнеспособным решением из-за использования внутренних API.

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

1 Ответ

0 голосов
/ 18 апреля 2020

Я сегодня на той же охоте. Я сталкивался и с другим вашим вопросом.

То, что вы ищете, это ts.getOutputFileNames(). Сначала я волновался, что это может не совпадать с тем, что дает emit, однако, друг указал, что он создан для ts-loader , так что все должно быть в порядке!

В порядке чтобы использовать его, вы можете сгенерировать быстрый ParsedCommandLine на основе ваших опций и файлов.

Если у вас есть полный файл tsconfig, вы можете просто использовать ts.getParsedCommandLineOfConfigFile(). (Для хоста просто укажите ts.sys as any)

Или, если вы хотите его синтезировать, вы можете использовать ts.parseJsonConfigFileContent():

  const cfg = {
    files: [ '/path/to/FileA', '/path/to/FileB' ], // your filepaths here
    compilerOptions: {} // your compilerOptions here
  }
  parsedCommandLine = ts.parseJsonConfigFileContent(cfg, /* host */ ts.sys as any, /* baseDir */ process.cwd())!;

Я предполагаю, что у вас будет свой собственный значения для baseDir, files и compilerOptions.

Примечание : не беспокойтесь о создании новой parsedCommandLine. Тестирование показывает, что это занимает 2 мс, поэтому это не дорого.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...