Смешивание модулей typescript и javascript при запуске тестов Mocha

тлдр; Я хочу преобразовать свой JS-проект в TS по одному файлу за раз, имея возможность запускать тесты Mocha без этапа сборки.

Я использую много преобразований Babel (реквизиты классов, jsx, ...) в моем текущем коде javascript, который Mocha обрабатывает во время выполнения, регистрируя загрузчик babel (в основном mocha --require @babel/register). Это означает, что запуск одного теста выполняется быстро и не требует этапа сборки для всего проекта.

Я подписался на руководство по началу работы с TypeScript с использованием (относительно) нового плагина babel от Microsoft: @babel/preset-typescript. Это отлично сработало для основного случая: преобразование app.js в app.ts.

Чего он не охватил, так это того, как сделать пошаговый переход. Для меня исправление 3978 ошибок машинописи (фактическое количество после выполнения <code>find</code> ...) немного утомительно и затормозит разработку на две недели. На то, чтобы моя библиотека из 200 LOC helpers скомпилировалась с определениями из react-redux, ушло больше часа.

В то время как выполнение git mv app.{j,t}s работало нормально, выполнение этого для любого другого файла было катастрофой. Существующие тесты Mocha быстро вылетали из-за невозможности найти нужные файлы даже при регистрации Babel и добавлении подходящих расширений:

mocha --extension js,jsx,ts,tsx --require @babel/register

Обычно, если я делаю git mv Logger.{j,t}s, я получаю Error: Cannot find module './lib/logging/Logger'.

Есть ли способ заставить загрузчик модулей Mocha распознавать файлы машинописного текста и прозрачно запускать их через Babel?

Вам всегда будет нужен шаг компиляции для файлов ts, однако у вас может быть два отдельных сценария: один для файлов ts / tsx, которые вы компилируете, а другой для файлов js и связываете их, а затем просто запускаете mocha --extension js,jsx вместо того, чтобы включать и передавать tsx в реестр babel.

Morphasis 04.11.2019 18:18

Хм... Думаю, это выполнимо. Подскажите как это настроить? Думаю, мне понадобится папка build, которая скопирует все модули js и перенесет все модули ts во что-то, что может быть загружено Mocha.

oligofren 05.11.2019 15:57

я предполагаю, что вы используете npm или пряжу, вы можете просто добавить их в часть скриптов вашего package.json, вы можете сделать это по каталогу или по расширению файла, например --extension js, jsx, а затем использовать прекомпилятор для ts и tsx . Конечно, webpack предоставляет для этого множество простых настроек, которые могут облегчить вашу жизнь, если вы начнете их использовать.

Morphasis 06.11.2019 14:47
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
9
3
1 597
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот как я заставил это работать в нашей смешанной кодовой базе франкенштейна javascript/typescript. mocha просто транспилирует код перед выполнением наших тестов. Это позволяет сделать все за один шаг, а не за два отдельных шага. Это мой конфиг ниже. Вы можете заменить параметры мокко, просто добавив их в качестве флагов cli.

// .mocharc.js
module.exports = {
    diff: true,
    extension: ['ts', 'tsx', 'js'], // include extensions
    opts: './mocha.opts', // point to you mocha options file. the rest is whatever.
    package: './package.json',
    reporter: 'spec',
    slow: 75,
    timeout: 2000,
    ui: 'bdd'
};
// mocha.opts
--require ts-node/register/transpile-only // This will transpile your code first without type checking it. We have type checking as a separate step.
// ...rest of your options.
// package.json
{
  "scripts": {
    "test": "mocha"
  }
}

обновление: включая соответствующие параметры tsconfig для преобразованного проекта реакции:

{
    "compilerOptions": {
        "noEmit": true, // This is set to true because we are only using tsc as a typechecker - not as a compiler.
        "module": "commonjs",
        "moduleResolution": "node",
        "lib": ["dom", "es2015", "es2017"],
        "jsx": "react", // uses typescript to transpile jsx to js
        "target": "es5", // specify ECMAScript target version
        "allowJs": true, // allows a partial TypeScript and JavaScript codebase
        "checkJs": true, // checks types in .js files (https://github.com/microsoft/TypeScript/wiki/Type-Checking-JavaScript-Files)
        "allowSyntheticDefaultImports": true,
        "resolveJsonModule": true,
        "esModuleInterop": true,
    },
    "include": [
        "./src/**/*.ts",
        "./src/**/*.tsx",
        "./src/pages/editor/variations/**/*" // type-checks all js files as well not just .ts extension
    ]
}

Это действительно кажется очень многообещающе, но это по сути такой же, как моя конфигурация Babel (которая также не выполняла никаких реальных проверок типов, только поверхностную транспиляцию). Действительно ли этап пересылки приводит к выводу перенесенных файлов javascript или это скорее временная вещь? Я бы хотел, чтобы у меня не было папки dist или необходимости git clean -fd каждый раз. P.S. mocha.opts устарел, и .mocharc.js делает все, что делает. Таким образом, вы можете просто удалить файл mocha.opts и встроить вызовы require в конфигурацию как поле require: ['ts-node/register/transpile-only'].

oligofren 12.11.2019 17:36

Я дам вам ответ, как только у меня будет время, чтобы проверить это и убедиться, что я могу заставить его работать так, как я надеюсь, что он работает :-) P.S. Я только что понял, что вы были это Cam из Twitter :D Спасибо, что ответили мне с некоторым реальным кодом!

oligofren 12.11.2019 17:39

У меня ушло много времени, чтобы заставить это работать, так как JSX приведет к сбою, но оказалось, что конфигурация TS была настроена так, чтобы не касаться JSX, поэтому мне пришлось создать новый tsconfig только для тестов, которые расширили мой стандартный tsconfig и в основном установили jsx: "react".

oligofren 13.11.2019 02:48

Ах да, мой файл tsconfig для работы с реакцией сам по себе является целым. Я отредактирую и включу то, что, по моему мнению, является соответствующими параметрами компилятора. Чтобы получить тесты, линтинг и компиляцию для работы с большим реактивным проектом, который изначально не был настроен в TS, нужно много прыгать. Это целая отдельная история.

Cam Sloan 13.11.2019 18:15

Другие вопросы по теме