Эта проблема предназначена для отслеживания внутренней миграции Jest на TypeScript.
Мы бы _любили_ получить помощь от сообщества здесь. Я составил список всех пакетов в этом репо ниже - не стесняйтесь заявлять о любых пакетах, которые не были заявлены, и отправлять PR о его переносе.
| Имя пакета | Владелец задачи | PR | Статус | Примечания |
| --------------------------- | ------------- | ----- | ------- | -------------- |
| @jest/core
| @SimenB | # 7998 | ОБЪЕДИНЕННЫЕ | |
| @jest/reporters
| @loryman | # 7994 | ОБЪЕДИНЕННЫЕ | |
| @jest/transform
| @SimenB | # 7918 | ОБЪЕДИНЕННЫЕ | |
| babel-jest
| @SimenB | # 7862 | ОБЪЕДИНЕННЫЕ | |
| babel-plugin-jest-hoist
| @ deneuv34 | # 7898 | ОБЪЕДИНЕННЫЕ | |
| babel-preset-jest
| - | - | - | Не транспилировано |
| diff-sequences
| @loryman | # 7820 | ОБЪЕДИНЕННЫЕ | |
| eslint-config-fb-strict
| - | - | - | Не транспилировано |
| expect
| @natealcedo | # 7919 | ОБЪЕДИНЕННЫЕ | |
| jest
| @SimenB | # 8024 | ОБЪЕДИНЕННЫЕ | |
| jest-changed-files
| @loryman | # 7827 | ОБЪЕДИНЕННЫЕ | |
| jest-circus
| @ doniyor2109 | # 7916 | ОБЪЕДИНЕННЫЕ | |
| jest-cli
| @SimenB | # 8024 | ОБЪЕДИНЕННЫЕ | |
| jest-config
| @SimenB | # 7944 | ОБЪЕДИНЕННЫЕ | |
| jest-diff
| @SimenB | # 7824 | ОБЪЕДИНЕННЫЕ | |
| jest-docblock
| @SimenB | # 7836 | ОБЪЕДИНЕННЫЕ | |
| jest-each
| @mattphillips | # 8007 | ОБЪЕДИНЕННЫЕ | |
| jest-environment-jsdom
| @lirbank | # 8003 | ОБЪЕДИНЕННЫЕ | |
| jest-environment-node
| @lirbank | # 7985 | ОБЪЕДИНЕННЫЕ | |
| jest-get-type
| @SimenB | # 7818 | ОБЪЕДИНЕННЫЕ | |
| jest-haste-map
| @jeysal | # 7854 | ОБЪЕДИНЕННЫЕ | |
| jest-jasmine2
| @ doniyor2109 | # 7970 | ОБЪЕДИНЕННЫЕ | |
| jest-leak-detector
| @ r3nya | # 7825 | ОБЪЕДИНЕННЫЕ | |
| jest-matcher-utils
| @SimenB | # 7835 | ОБЪЕДИНЕННЫЕ | |
| jest-message-util
| @SimenB | # 7834 | ОБЪЕДИНЕННЫЕ | |
| jest-mock
| @thymikee | # 7847 | ОБЪЕДИНЕННЫЕ | |
| jest-phabricator
| @ r3nya | # 7965 | ОБЪЕДИНЕННЫЕ | |
| jest-regex-util
| @loryman | # 7822 | ОБЪЕДИНЕННЫЕ | |
| jest-repl
| @natealcedo | # 8000 | ОБЪЕДИНЕННЫЕ | |
| jest-resolve
| @SimenB | # 7871 | ОБЪЕДИНЕННЫЕ | |
| jest-resolve-dependencies
| @jeysal | # 7922 | ОБЪЕДИНЕННЫЕ | |
| jest-runner
| @natealcedo | # 7968 | ОБЪЕДИНЕННЫЕ | |
| jest-runtime
| @SimenB | # 7964 | ОБЪЕДИНЕННЫЕ | |
| jest-serializer
| @thymikee | # 7841 | ОБЪЕДИНЕННЫЕ | |
| jest-snapshot
| @ doniyor2109 | # 7899 | ОБЪЕДИНЕННЫЕ | |
| jest-util
| @SimenB | # 7844 | ОБЪЕДИНЕННЫЕ | |
| jest-validate
| @SimenB | # 7991 | ОБЪЕДИНЕННЫЕ | |
| jest-watcher
| @SimenB | # 7843 | ОБЪЕДИНЕННЫЕ | |
| jest-worker
| @SimenB | # 7853 | ОБЪЕДИНЕННЫЕ | |
| pretty-format
| @SimenB | # 7809 | ОБЪЕДИНЕННЫЕ | |
После переноса всех пакетов мы можем начать перенос наших интеграционных тестов. В зависимости от того, как идет этот переход, мы можем отслеживать это и в этом выпуске, или мы можем отслеживать его отдельно позже.
Следует отметить, что поскольку это репо является монорепозиторием, у нас есть зависимости между пакетами. Итак, мы должны сначала перенести листовые пакеты (без зависимостей), а затем пройти вверх по дереву зависимостей, пока все не будет перенесено. Это означает, что jest-cli
будет последним перенесенным пакетом.
Вы можете использовать yarn, чтобы выяснить, какие пакеты зависят от внутренних: yarn --silent workspaces info
. Это выведет объект JSON всех пакетов в рабочей области. Пример выглядит так:
{
"babel-jest": {
"location": "packages/babel-jest",
"workspaceDependencies": ["babel-preset-jest"],
"mismatchedWorkspaceDependencies": []
}
}
Здесь самое интересное - workspaceDependencies
. Если этот массив пуст, это идеальный пакет для начала миграции. Если он _не_ пуст, вам нужно убедиться, что каждый пакет, указанный в массиве, уже был перенесен.
tsconfig.json
из уже перенесенного пакетаreferences
types/
в корне репозитория пакета, переместите его в каталог src
пакета как файл с именем types.ts
"types": "build/index.d.ts"
в package.json ниже main
js
в ts
(или tsx
если в них есть jsx), исправляя ошибки типа по ходуДля сборки вы можете запустить yarn build
или yarn watch
в корне репозитория.
Вы можете посмотреть мой PR для pretty-format
чтобы увидеть, как может выглядеть миграция.
Вы можете использовать flow-to-typescript
для помощи в миграции. Однако, поскольку синтаксис между Flow и Typescript очень похож, я лично использовал его только для файлов определения типа в types
- для обычных исходных файлов было проще переименовать файл в ts(x)
и исправить синтаксические ошибки, которые мне показала моя IDE.
*) Сделайте это, сравнив git diff
s до и после миграции (также, пожалуйста, включите эту разницу в PR после ее открытия)
yarn build
на master
git add -f packages/MY_PACKAGE/build*
git commit -m 'before migration'
yarn build
в своей ветке с миграциейrm packages/MY_PACKAGE/build*/**/*.ts packages/MY_PACKAGE/build*/**/*.map
git add -f packages/MY_PACKAGE/build*
git commit -m 'after migration'
git diff master packages/MY_PACKAGE/build*
git --no-pager diff master packages/MY_PACKAGE/build* | pbcopy
. Вставьте это в забор кода с синтаксисом diff
в PR.any
Текущая настройка с потоком позволяет это - просто добавьте явный any
(или более строгий тип, если можете) в этих случаях. Если возможно, используйте unknown
вместо any
.
Преобразовать require
в import
Используйте exports =
для замены modules.exports
- это позволяет TypeScript понимать экспорт. Мы включаем плагин babel, который переводит это в module.exports
для распределенного кода (и тестов).
Возможно, больше, но я запишу те, о которых знаю
types/
в корне этого репо, что позволяет нам использовать типы в пакетах без зависимости от них (обычно модули будут зависеть от types/Config
что позволяет им иметь ProjectConfig
качестве аргументов). Поскольку мы будем распространять типы, нам нужно, чтобы эти зависимости были явными.jest-config
, кроме конфигураций по умолчанию (чтобы он мог отбросить babel-jest
, тестовые среды и т. Д.)types/TestResult
используется jest-jasmine2
, jest-circus
и jest-cli
(для репортеров). Нам нужно выяснить, как эффективно разделить этот тип между пакетами.Еще одна идея решения проблемы «разделения типов» - использовать отдельный проект jest-types
, _just_ типы, общие для модулей.
Идеи здесь приветствуются!
РЕДАКТИРОВАТЬ: С # 7834 я создал пакет @jest/types
PS: Это не повлияет на тех, кто использует Jest (если вы не используете модули, экспортированные напрямую Jest, которые станут типизированными). Это строго внутренний рефакторинг. Мы _не_ будем рассматривать добавление типов как критическое изменение.
PPS: В настоящее время не ставится цель распространять типы TS для использования Jest - это уже отлично обрабатывается в @types/jest
. В какой-то момент мы, возможно, захотим распространить и это в шутку, но это отдельная тема.
PPPS: эта проблема _не_ для обсуждения достоинств миграции как таковой - отзывы можно публиковать в RFC . Однако, если у вас есть опыт миграции, сборки, тестирования или распространения модуля, написанного на TS, не стесняйтесь поделиться своими знаниями, полученными в этом процессе, в этом выпуске.
Я хотел бы внести свой вклад в это! Могу ли я взять сейчас diff-sequences
? Я уже портировал его в своей ветке и все тесты для модуля проходят.
Да, дерзай!
Привет, @SimenB!
Буду рад помочь. Можете ли вы порекомендовать пакет для начала? :)
Классно @ r3nya!
Я бы сказал, что самые простые - это babel-plugin-jest-hoist
, jest-leak-detector
и jest-phabricator
.
Другие, которые должны быть довольно простыми: jest-changed-files
, jest-diff
, jest-docblock
, jest-message-util
, jest-regex-util
и jest-serializer
.
Да, дерзай!
Спасибо! Я мог бы взять и jest-changed-files
и jest-regex-util
.
🎉 Я обновил OP
@SimenB позвольте мне пока сделать jest-leak-detector
и jest-phabricator
. ;)
@ r3nya дерзай ! :)
Итак, jest-changed-files
импортирует из types/Config
и types/ChangedFiles
которые также импортируются несколькими пакетами. Как вы думаете, как лучше всего двигаться дальше?
Path
- это просто string
, поэтому его можно заменить. Вы можете type Path = string
чтобы уменьшить разницу 🙂
types/ChangedFiles
можно скопировать и переместить в jest-changed-files
(аналогично тому, что я сделал с types/PrettyFormat
)
Понял, спасибо! Я создал пиар :)
Я возьму jest-repl
😁
@ MohamadKh75 спасибо! Однако это зависит от jest-runtime
, jest-config
и jest-validate
, все из которых необходимо сначала перенести. Вы можете попробовать jest-validate
?
Рад перенести jest-each
over: smile:
Ву, сделай это 😀
@ MohamadKh75 спасибо! Однако это зависит от
jest-runtime
,jest-config
иjest-validate
, все из которых необходимо сначала перенести. Вы можете попробоватьjest-validate
?
Конечно! затем я начинаю jest-validate
здорово!
Попробую удачи с картой спешки 😄
Я был бы счастлив сделать jest-environment-node
и jest-environment-jsdom
.
Отлично, спасибо! OP обновлен 🙂
Привет, могу я сделать первую попытку за babel-plugin-jest-hoist
?
Для уверенности!
Рад взять jest-snapshot
😄
Замечательно @ doniyor2109! Обязательно поработайте поверх # 7871 (надеюсь, сегодня объединю его) 🙂
Вызов фишек на jest-config
:)
Отличный @natealcedo! Следует координировать свои действия с @ MohamadKh75, который работает над jest-validate
подождите, я только что понял, что смотрю не на ту упаковку. jest-config
все еще имеет зависимости, которые не были перенесены. Позвольте мне вместо этого коллировать ставки на expect
. Извини, что хаха
👍
Привет, что мы делаем в сценарии, когда мы импортируем типы из types
но у них не обязательно есть свой собственный пакет. В моем случае expect
использует типы из types/Matchers
. Могу ли я перенести большинство из них в файл types.ts
из expect
?
@natealcedo Думаю, имеет смысл expect
- там живут все сопоставители. В настоящее время его используют только expect
, jest-jasmine2
и jest-circus
, и они оба уже импортируют из expect
.
Однако, поскольку мы делаем module.exports
, трудно (невозможно) также экспортировать типы, поэтому нам может потребоваться вставить его в @jest/types
на данный момент и переместить его в expect
всякий раз, когда мы бросаем CJS
Сделаю jest-resolve-dependencies
только jest-snapshot
PR будет завершен :) за исключением того, что на этот раз приближаются выходные, так что у меня действительно будет время, чтобы добраться до него достаточно быстро 😅
Готов принять jest-circus
при переносе зависимостей 💪
Круто @ doniyor2109 , записал.
@mattphillips @lirbank @ r3nya @ MohamadKh75 эй, как дела с заявленными вами пакетами? 🙂 Не стесняйтесь использовать потрясающую новую функцию Draft PR на GitHub, чтобы получить ранние отзывы, если вы в чем-то застряли.
https://github.blog/changelog/2019-02-14-draft-pull-requests/
@SimenB, спасибо за это
Скоро воспользуюсь ...
Во-первых, __tests__ также нужно преобразовать в .ts
?
@ MohamadKh75, было бы неплохо сделать это, но в данный момент это не требуется, особенно если они в настоящее время не набраны (я говорю о jest-validate
)
Согласовано - мы можем провести дополнительные тесты, если они окажутся сложными. Важно преобразовать исходный код для продолжения миграции. Мы знаем, что текущий код _works_, поэтому я хотел бы видеть разницу с мастером в PR
Я создам новую задачу для тестов, утилит и т. Д. (А также буду следить за @ts-ignore
s) позже.
Для всех, кто следит за нами, мы добавили в репозиторий 2 новых пакета, которые также необходимо преобразовать - @jest/transform
& @jest/reporters
(отделены от jest-runtime
и jest-cli
соответственно). Они должны быть довольно простыми для преобразования, если кто-то захочет их забрать 🙂
Не стесняйтесь использовать потрясающую новую функцию Draft PR на GitHub, чтобы получить ранние отзывы, если вы в чем-то застряли.
Странный. Это не работает для моего пиара 🙈
Ха, думаю, мне следовало проверить это, а не слепо доверять блогу 😅
Просто вставьте [WIP]
в заголовок, пока функция не заработает как рекламируется 🙂
Привет, @SimenB!
Извините за опоздание. Скоро сделаю!
Привет, ребята, как вы проверяете, что сборка действительно работает? Пытался построить мастер, и сценарий build:ts
не работает для меня
$ yarn build:ts
$ node scripts/buildTs.js
Building TypeScript definition files
Building..............................................................error
TS5055: Cannot write file '/Users/natealcedo/open-source/jest/packages/jest-
diff/build/index.d.ts' because it would overwrite input file.
error TS5055: Cannot write file '/Users/natealcedo/open-source/jest/packages
/jest-diff/build/types.d.ts' because it would overwrite input file.
Found 2 errors.
Unable to build TypeScript definition files
Error: Command failed: tsc -b /Users/natealcedo/open-source/jest/packages/ba
bel-jest /Users/natealcedo/open-source/jest/packages/babel-plugin-jest-hoist
/Users/natealcedo/open-source/jest/packages/diff-sequences /Users/natealced
o/open-source/jest/packages/jest-changed-files /Users/natealcedo/open-source
/jest/packages/jest-diff /Users/natealcedo/open-source/jest/packages/jest-do
cblock /Users/natealcedo/open-source/jest/packages/jest-get-type /Users/nate
alcedo/open-source/jest/packages/jest-haste-map /Users/natealcedo/open-sourc
e/jest/packages/jest-leak-detector /Users/natealcedo/open-source/jest/packag
es/jest-matcher-utils /Users/natealcedo/open-source/jest/packages/jest-messa
ge-util /Users/natealcedo/open-source/jest/packages/jest-mock /Users/natealc
edo/open-source/jest/packages/jest-regex-util /Users/natealcedo/open-source/
jest/packages/jest-resolve /Users/natealcedo/open-source/jest/packages/jest-
serializer /Users/natealcedo/open-source/jest/packages/jest-snapshot /Users/
natealcedo/open-source/jest/packages/jest-types /Users/natealcedo/open-sourc
e/jest/packages/jest-util /Users/natealcedo/open-source/jest/packages/jest-w
atcher /Users/natealcedo/open-source/jest/packages/jest-worker /Users/nateal
cedo/open-source/jest/packages/pretty-format
at makeError (/Users/natealcedo/open-source/jest/node_modules/execa/inde
x.js:174:9)
at Function.module.exports.sync (/Users/natealcedo/open-source/jest/node
_modules/execa/index.js:338:15)
at Object.<anonymous> (/Users/natealcedo/open-source/jest/scripts/buildT
s.js:29:9)
at Module._compile (module.js:653:30)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Function.Module.runMain (module.js:694:10)
at startup (bootstrap_node.js:204:16)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this
command.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this
command.
@natealcedo Это тоже случилось со мной. После удаления файлов сборки работает
Вызов на jest-runner
! :)
Я был бы счастлив взять jest-cli
после переноса всех зависимостей, если кто-то еще не потребовал это :)
Потрясающий @loryman , обновил ОП! Обратите внимание, что jest-cli
зависит от всего остального, поэтому может пройти некоторое время, прежде чем все его зависимости будут перенесены 🙂
Да нет проблем! А пока я могу сделать @jest/reporters
так как все его зависимости перенесены
Давайте закончим jest-jasmine2
💪. Я попробую еще раз
Привет, быстрый вопрос, могу ли я перенести types/TestRunner
на jest-runner
или jest-types
.
@natealcedo jest-runner
для меня имеет смысл. Хотя экспортированный Reporter
можно переместить в @jest/reporters
, над переносом которого работает
Если это окажется трудным (из-за CJS, циклических зависимостей или чего-то еще), просто переместите его в @jest/types
и мы сможем очистить его позже 🙂
Сладкий! Звучит как план. @SimenB
Эй, что осталось, что можно подобрать? :)
Ого, мы почти закончили! Замечательно 😀 Если хотите, можете приступить к конвертации тестов e2e? Только те, что находятся в этом каталоге, а не сами тесты: https://github.com/facebook/jest/tree/master/e2e/__tests__
По сути, это включает преобразование Utils
в TypeScript, я думаю, после чего сами тесты должны просто переименовывать файл
Я пингую те, которые заявили пакеты, но еще не открыли PR, могут быть более доступными.
@mattphillips @lirbank @ MohamadKh75 привет , еще один пинг. Если у вас нет времени на миграцию, это нормально, но если да, было бы неплохо, если бы кто-то другой мог забрать пакет, который вы заявили 🙂
По предоставленной вами ссылке возвращается 404. Но вы имеете в виду содержимое каталога __tests__
я полагаю?
Если это так, я с радостью возьмусь за это 👍
Да! Не уверен, почему GH испортил ссылку, я вставил https://github.com/facebook/jest/tree/master/e2e/__tests__
. Похоже на ошибку 🤷♂️
Мне понадобится tsconfig.json в каталоге __tests__
?
Я не знаю. Я так не думаю (здесь мы не будем создавать файлы типизации)? Попробуйте без 🙂
Конечно. 💯
@SimenB Осталось еще jest-repl
У него есть зависимости, которые не были перенесены. Но я думаю, что мы можем просто сделать ts-ignore
для этого импорта на данный момент, я думаю, что у нас есть достаточно хорошая установка для поддержки этого сейчас. Хотя это займет около 5 минут
@SimenB Извините за задержку, отвлекся и отсутствовал всю неделю. Я сделаю это сегодня!
Потрясающе. Я добавил пакет @jest/environment
, который должен экспортировать интерфейс, который будет реализован средами. Я не тестировал его, поэтому он может работать некорректно. Не стесняйтесь открывать ранний PR, если он вызывает у вас трудности
Ого, мы почти закончили! Awesome Если хотите, можете приступить к конвертации тестов e2e? Только те, что находятся в этом каталоге, а не сами тесты: https://github.com/facebook/jest/tree/master/e2e/__tests__
По сути, это включает преобразованиеUtils
в TypeScript, я думаю, после чего сами тесты должны просто переименовывать файлЯ пингую те, которые заявили пакеты, но еще не открыли PR, могут быть более доступными.
@mattphillips @lirbank @ MohamadKh75 привет , еще один пинг. Если у вас нет времени на миграцию, это нормально, но если да, было бы хорошо, если бы кто-то другой мог забрать пакет, который вы заявили.
Мне очень жаль ... у меня возникли неожиданные проблемы ... может быть, я смогу помочь в других разделах ...: разочаровано:
Нет проблем @ MohamadKh75 , спасибо за jest-repl
если хотите сделать пакет? Мы находимся в точке, где нам не нужно ждать зависимостей. Если у вас нет времени, это, конечно, не проблема - мы все делаем это в свободное время
Привет, я могу взять jest-repl
поскольку @ MohamadKh75 недоступен для выполнения задания? :)
Конечно, дерзай 🙂
Привет, @loryman , я взял jest-cli
так как ты занят @jest/reporters
🙂
Привет, @loryman , я взял
jest-cli
так как ты занят@jest/reporters
🙂
Конечно, вперед!
Черт возьми, мы закончили! 🎉
Большое спасибо всем, кто помогал. Я _не_ думал, что мы сможем сделать это всего за 4 недели.
Jest теперь официально является репо TS.
$ cloc packages --vcs git --exclude-dir __tests__,__mocks__
462 text files.
408 unique files.
76 files ignored.
github.com/AlDanial/cloc v 1.80 T=0.45 s (896.0 files/s, 98149.4 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
TypeScript 286 4581 4052 29135
JSON 82 0 0 2106
Markdown 19 571 0 1697
JavaScript 16 217 213 1497
PHP 1 22 14 150
-------------------------------------------------------------------------------
SUM: 404 5391 4279 34585
-------------------------------------------------------------------------------
Следующие шаги следующие:
[email protected]
)@types/jest
Я скоро открою для них выпуски (иш).
Еще раз спасибо всем, кто скинулся!
Альфа выпущена! Пожалуйста, сделайте yarn add -D jest@beta
или npm i -D jest@beta
(в настоящее время [email protected]
) и пожалуйтесь, если он ужасно взорвется 🙂
Самый полезный комментарий
Черт возьми, мы закончили! 🎉
Большое спасибо всем, кто помогал. Я _не_ думал, что мы сможем сделать это всего за 4 недели.
Jest теперь официально является репо TS.
Следующие шаги следующие:
[email protected]
)@types/jest
Я скоро открою для них выпуски (иш).
Еще раз спасибо всем, кто скинулся!