From dbcdd26b7c08f18ea9a3b92334277bfe938becc7 Mon Sep 17 00:00:00 2001 From: tinkoff-bot Date: Thu, 23 Sep 2021 10:19:42 +0000 Subject: [PATCH] Release v1.9.3 Co-authored-by: Drapeza Oleg Co-authored-by: Andrey Rublev GitOrigin-RevId: 529e46620111f4e0cb11659b4502e54f415461ed --- docs.json | 4 +- docs/concepts/versioning.en.md | 57 +++++++ docs/concepts/versioning.md | 56 +++++++ .../{how-to => guides}/bundle-optimization.md | 0 docs/{how-to => guides}/deploy.md | 0 docs/guides/tramvai-library.en.md | 147 ++++++++++++++++++ docs/guides/tramvai-library.md | 147 ++++++++++++++++++ docs/{how-to => guides}/universal.md | 0 docs/how-to/tramvai-update.en.md | 38 +++++ docs/how-to/tramvai-update.md | 38 +++++ packages-versions.json | 2 +- packages/cli/README.md | 2 +- packages/modules/cache-warmup/src/server.ts | 2 +- packages/modules/router/MIGRATION.md | 130 ---------------- .../integration-jest/src/node-environment.ts | 4 + .../src/app/__integration__/fakeApp.test.ts | 4 +- packages/tramvai/test/puppeteer/package.json | 3 + packages/tramvai/test/puppeteer/src/launch.ts | 4 +- .../tramvai/test/puppeteer/src/wrapper.ts | 38 ++++- tools/docSite/baseSidebar.js | 34 ++-- .../current.json | 4 - 21 files changed, 556 insertions(+), 158 deletions(-) create mode 100644 docs/concepts/versioning.en.md create mode 100644 docs/concepts/versioning.md rename docs/{how-to => guides}/bundle-optimization.md (100%) rename docs/{how-to => guides}/deploy.md (100%) create mode 100644 docs/guides/tramvai-library.en.md create mode 100644 docs/guides/tramvai-library.md rename docs/{how-to => guides}/universal.md (100%) create mode 100644 docs/how-to/tramvai-update.en.md create mode 100644 docs/how-to/tramvai-update.md delete mode 100644 packages/modules/router/MIGRATION.md diff --git a/docs.json b/docs.json index a34c49e88..01453d1e7 100644 --- a/docs.json +++ b/docs.json @@ -20,8 +20,8 @@ ] }, { - "name": "community", - "label": "Сообщество", + "name": "contribute", + "label": "Contribute", "items": [ { "path": "CONTRIBUTING.md", diff --git a/docs/concepts/versioning.en.md b/docs/concepts/versioning.en.md new file mode 100644 index 000000000..673ea754a --- /dev/null +++ b/docs/concepts/versioning.en.md @@ -0,0 +1,57 @@ +# Versioning + +Most of the libraries in the `tramvai` repository are bundled into a unified versioning. + +All current versions of libraries are stored in release tags, in `package.json` versions are used - stubs `0.0.0-stub`. + +The versioning of `tramvai` libraries follows [semver](https://semver.org/lang/ru/). For versions that start with zero (`0.x.x`), the major (` major`) is the second digit in the version, and the minor (`minor`) is the third digit - `0.major.minor`. Thus, on a `BREAKING CHANGE` commit, package version `1.0.0` will go up to `2.0.0`, and package version `0.1.0` will go up to `0.2.0`. + +Library versions are updated according to [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) + +## Unified versioning + +Most of the libraries in the `tramvai` repository are combined into end-to-end versioning - these are `core` packages, tram modules and tokens, everything that is included in the `@tramvai` and `@tramvai-tinkoff` scopes. The release and publication of these libraries occurs at the same time, even if the changes affect only one package from the list. +You can see this approach in [Angular](https://angular.io/guide/releases), and with some restrictions, in monorepositories using [Lerna](https://github.com/lerna/lerna#fixedlocked-mode-default) + +The main advantage of unified versioning is that compatibility between packages of the same version is guaranteed. + +Previously, the user had only one way to raise the framework version without losing compatibility between packages - to install all packages to their latest version. +Now, you can specify a common target version for each `tramvai` library, or use the `tramvai update` command. + +One of the drawbacks of this approach is that any update of a package from the unified list requires raising versions and publishing all these packages from the list, which significantly slows down CI. + +## Storing versions in release tags + +One of the reasons for storing a version in release tags is the protected `master` branch, which we cannot automatically make changes to after the release and update of package versions. + +Storing versions in release tags does not in itself provide any advantage, and we use it together with stub versions of packages in the source `package.json` files. + +Let's say we had a package with dependencies: + +```json +{ + "name": "@tramvai/foo", + "version": "0.1.0", + "dependencies": { + "@tramvai/bar": "^1.1.0", + "@tramvai/baz": "^2.0.0" + } +} +``` + +Previously, every big Merge Request was accompanied by conflicts if package versions were updated in the master branch, and the affected libraries in MR contained changes in dependencies. + +Now, our package looks like this: + +```json +{ + "name": "@tramvai/foo", + "version": "0.0.0-stub", + "dependencies": { + "@tramvai/bar": "0.0.0-stub", + "@tramvai/baz": "0.0.0-stub" + } +} +``` + +The version `0.0.0-stub` will never cause merge conflicts, and the calculation of real versions occurs only in CI - when creating a new release tag and publishing, inside the `pvm` library. diff --git a/docs/concepts/versioning.md b/docs/concepts/versioning.md new file mode 100644 index 000000000..2c0485c80 --- /dev/null +++ b/docs/concepts/versioning.md @@ -0,0 +1,56 @@ +# Версионирование + +Большинство библиотек в `tramvai` репозитории объединены в общее версионирование. + +Все актуальные версии библиотек хранятся в релизных тегах, в `package.json` используются версии - заглушки `0.0.0-stub`. + +Версионирование `tramvai` библиотек придерживается [semver](https://semver.org/lang/ru/). Для версий, которые начинаются с нуля (`0.x.x`), мажорной (`major`) считается вторая цифра в версии, а минорной (`minor`) считается третья цифра - `0.major.minor`. Таким образом, при `BREAKING CHANGE` коммите, пакет версии `1.0.0` поднимется до `2.0.0`, а пакет версии `0.1.0` поднимется до `0.2.0`. + +Версии библиотек обновляются согласно [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) + +## Сквозное версионирование + +Большинство библиотек в `tramvai` репозитории объединены в сквозное версионирование - это `core` пакеты, трамвай модули и токены, все что входит в скоупы `@tramvai` и `@tramvai-tinkoff`. Релиз и публикация этих библиотек происходит одновременно, даже если изменения затронули только один пакет из списка. +Такой подход вы можете увидеть у [Angular](https://angular.io/guide/releases), и с некоторыми ограничениями, в монорепозиториях использующих [Lerna](https://github.com/lerna/lerna#fixedlocked-mode-default) + +Основной плюс unified версионирования - гарантируется совместимость между пакетами одной версии. + +Раньше у пользователя был только один способ поднять версию фреймворка, не потеряв совместимость между пакетами - устанавливать все пакеты до их latest версии. +Сейчас, можно указать общую целевую версию для каждой `tramvai` библиотеки, либо использовать команду `tramvai update`. + +Один из минусов подхода - любое обновление пакета из списка unified, требует поднять версии и опубликовать все эти пакеты из списка, что значительно замедляет CI. + +## Хранение версий в релизных тегах + +Одна из причин для хранения версии в релизных тегах - protected ветка `master`, в которую мы не можем автоматически внести изменения после релиза и обновления версий пакетов. + +Хранение версий в релизных тегах само по себе не дает преимуществ, и у нас используется вместе со stub версиями пакетов в исходных `package.json` файлах. + +Допустим, у нас был пакет с зависимостями: + +```json +{ + "name": "@tramvai/foo", + "version": "0.1.0", + "dependencies": { + "@tramvai/bar": "^1.1.0", + "@tramvai/baz": "^2.0.0" + } +} +``` + +Раньше, каждый крупный Merge Request сопровождался конфликтами, если в master ветке обновлялась версии пакетов, а затронутые библиотеки в MR содержали изменения в dependencies. + +Теперь, наш пакет выглядит так: +```json +{ + "name": "@tramvai/foo", + "version": "0.0.0-stub", + "dependencies": { + "@tramvai/bar": "0.0.0-stub", + "@tramvai/baz": "0.0.0-stub" + } +} +``` + +Версия `0.0.0-stub` никогда не вызовет конфликтов слияния, а вычисление реальных версий происходит только в CI - при создании нового релизного тега и публикации, внутри библиотеки `pvm`. diff --git a/docs/how-to/bundle-optimization.md b/docs/guides/bundle-optimization.md similarity index 100% rename from docs/how-to/bundle-optimization.md rename to docs/guides/bundle-optimization.md diff --git a/docs/how-to/deploy.md b/docs/guides/deploy.md similarity index 100% rename from docs/how-to/deploy.md rename to docs/guides/deploy.md diff --git a/docs/guides/tramvai-library.en.md b/docs/guides/tramvai-library.en.md new file mode 100644 index 000000000..34206afb1 --- /dev/null +++ b/docs/guides/tramvai-library.en.md @@ -0,0 +1,147 @@ +--- +id: tramvai-library +title: Creating a tramvai library +--- + +Adding a new library or module to the `tramvai` repository is detailed in the [Contribute section](contribute/contribute.md) + +This guide contains a set of tips for developing individual `tramvai` packages in application repositories, +also, many teams maintain separate monoreps with common packages for a number of applications, divided into different repositories. + +### Prerequisites + +Let's consider all important cases using the example of creating a new `tramvai` module. +Let's say the module will provide a new HTTP client to work with the Github `API`. + +### Package name + +It is highly discouraged to use the `@tramvai` and `@tramvai-tinkoff` scopes outside the `tramvai` repository. +If our application is called `tincoin`, you can, for example, select one of these scopes: + +- `@tincoin` +- `@tramvai-tincoin` +- `@tincoin-core` + +For modules, the prefix is ​​usually `module-`, for example: `@tramvai-tincoin/module-github-api-client` + +### Versioning + +The choice of a versioning strategy is entirely yours. +We definitely recommend following `semver`, and we can recommend using [unified versioning](concepts/versioning.md) if: + +- you support monorep with core libraries +- these libraries can be linked +- and these packages are used in applications all together (or most of them) + +### Dependencies + +Dealing with library dependencies is not an easy task, and there is no ideal solution, but there are a number of tips to make it easier to manage dependencies. +The best place to start is by dividing dependencies into different types: + +#### Framework + +Examples of such dependencies are `react` and `react-dom`, `@tramvai/*` and `@tramvai-tinkoff/*`. +If we write `babel` or `eslint` plugin, it can be `@babel/core` and `eslint`. + +Typically, an end user, such as a `tramvai` application, is required to install a dependency framework, +without them it simply won't work. + +Therefore, our library should set them to `peerDependencies`, with the most free versions, for example, if the package is tied to the basic functionality of `tramvai`, and uses React hooks: + +```json +{ + "peerDependencies": { + "@tramvai/core": "*", + "react": ">=16.8", + "react-dom": ">=16.8" + } +} +``` + +#### Singleton + +A number of dependencies must be strictly one in the application. +Any duplicates are a minus. increase the weight of the application bundle, but libraries such as `react` or `@tinkoff/logger` require a single copy in our application. + +For them, the rule applies as with the framework, you need to install them in `peerDependencies`, with the most free versions: + +```json +{ + "peerDependencies": { + "@tinkoff/logger": "*" + } +} +``` + +#### Popular + +Many packages are popular enough that chances are they are already being used in the final application. +An example of such dependencies is - `date-fns`, `lru-cache`, `@tinkoff/dippy` + +For them, the rule applies as with the framework, you need to install them in `peerDependencies`, with the most free versions: + +```json +{ + "peerDependencies": { + "@tinkoff/dippy": "*", + "date-fns": ">=2", + "lru-cache": "*" + } +} +``` + +#### Specific + +Let's say our new tramvai module delivers unique functionality to the application that requires a third-party library (or even another package in your monorepo) + +If we are developing a service to work with the Github API, it might be the `@octokit/rest` package. + +In this case, you need to put the library in `dependencies`, and you can leave the standard range using `^`: + +```json +{ + "dependencies": { + "@octokit/rest": "^18.0.0" + } +} +``` + +#### Development + +A dependency may be involved in building your package - for example, `rollup` or `@tramvai/build`. +The dependency is required to run library tests. +The dependency contains the taipings required for the build. + +In all these cases, even if either is already in `peerDependencies`, it is worth adding a more specific version to `devDependencies`, for example: + +```json +{ + "devDependencies": { + "@tramvai/build": "^2.5.0", + "@types/react": "^17.0.0", + "react": "^17.0.0" + } +} +``` + +#### Exclusion + +Of course, there are exceptional cases. + +For example, tramvai provides many test utilities where all the main `@tramvai` dependencies were in `peerDependencies`. +As soon as these utilities began to be used not in repositories with applications, but in monoreps with core packages, the problem of missing dependencies appeared, and we moved almost everything from `peerDependencies` to `dependencies` + +Proceed according to the situation and always think about the usability of your product :) + +### Build + +It is assumed that the final assembly of packages in the context of the application will be done by `@tramvai/cli`. +Therefore, to publish packages written in `TypeScript`, it suffices to use` tsc`, and publish many compiled `.js` and` .d.ts` files. + +But building packages into bundles before publishing, for example via `rollup` or` @tramvai/build`, gives a number of possibilities: + +- preliminary tree-shaking will cut off all unnecessary, this will have a positive effect on the assembly of the application +- you can make several bundles for different environments, in CJS or ES modules formats +- you can make a separate bundle for the browser build, separate for the server one - top for libraries with SSR support + +Detailed documentation on using `@tramvai/build` is available in [documentation](references/tools/build.md) diff --git a/docs/guides/tramvai-library.md b/docs/guides/tramvai-library.md new file mode 100644 index 000000000..8a4e44eeb --- /dev/null +++ b/docs/guides/tramvai-library.md @@ -0,0 +1,147 @@ +--- +id: tramvai-library +title: Создание tramvai библиотеки +--- + +Добавление новой библиотеки или модуля в репозитории `tramvai` подробно рассмотрено в разделе [Contribute](contribute/contribute.md) + +Этот гайд содержит набор советов для разработки отдельных `tramvai` пакетов в репозиториях приложений, +также многие команды поддерживают отдельные монорепы с общими пакетами для ряда приложений, разделенных по разным репозитриям. + +### Предпосылки + +Рассмотрим все важные кейсы на примере создания нового `tramvai` модуля. +Допустим, модуль будет предоставлять новый HTTP клиент для работы с `API` Github. + +### Название пакета + +Крайне не рекомендуется использовать скоупы `@tramvai` и `@tramvai-tinkoff` вне репозитория `tramvai`. +Если наше приложение называется `tincoin`, можно например выбрать один из таких скоупов: + +- `@tincoin` +- `@tramvai-tincoin` +- `@tincoin-core` + +Для модулей, как правило используется префикс `module-`, например: `@tramvai-tincoin/module-github-api-client` + +### Версионирование + +Выбор стратегии версионирования исключительно за вами. +Мы определенно рекомендуем следовать `semver`, и можем рекомендовать использовать [сквозное версионирование](concepts/versioning.md), если: + +- вы поддерживаете монорепу с core библиотеками +- эти библиотеки могут быть связаны между собой +- и эти пакеты используются в приложениях все вместе (или большинство из них) + +### Dependencies + +Работа с зависимостями у библиотек - не простая задача, и не имеет идеального решения, но есть ряд советов, упрощающих управление зависимостями. +Лучше всего начать с разделения зависимостей на различные типы: + +#### Framework + +Пример таких зависимостей - `react` и `react-dom`, `@tramvai/*` и `@tramvai-tinkoff/*`. +Если мы пишем `babel` или `eslint` плагин, то это могут быть `@babel/core` и `eslint`. + +Как правило, конечный пользователь, например `tramvai` приложение, обязано устанавливать фреймворк зависимости, +без них оно просто не будет работать. + +Поэтому наша библиотека должна устанавливать их в `peerDependencies`, с максимально свободными версиями, например если пакет завязан на базовый функционал `tramvai`, и использует React хуки: + +```json +{ + "peerDependencies": { + "@tramvai/core": "*", + "react": ">=16.8", + "react-dom": ">=16.8" + } +} +``` + +#### Singleton + +Ряд зависимостей должен быть строго один в приложении. +Любые дубликаты это минус, т.к. увеличивают вес бандла приложения, но такие библиотеки как `react` или `@tinkoff/logger` требуют быть в единственном экземпляре в нашем приложении. + +Для них действует правило как с framework, надо устанавливать их в `peerDependencies`, с максимально свободными версиями: + +```json +{ + "peerDependencies": { + "@tinkoff/logger": "*" + } +} +``` + +#### Popular + +Многие пакеты достаточно популярны, и большая вероятность, что они уже используются в конечном приложении. +Пример таких зависимостей - `date-fns`, `lru-cache`, `@tinkoff/dippy` + +Для них действует правило как с framework, надо устанавливать их в `peerDependencies`, с максимально свободными версиями: + +```json +{ + "peerDependencies": { + "@tinkoff/dippy": "*", + "date-fns": ">=2", + "lru-cache": "*" + } +} +``` + +#### Specific + +Допустим, наш новый tramvai модуль поставляет в приложение уникальный функционал, для которого требуется сторонняя библиотека (или даже другой пакет в вашей монорепе) + +Если мы разрабатываем сервис для работы с API Github, это может быть пакет `@octokit/rest`. + +В таком случае, нужно ставить библиотеку в `dependencies`, и можно оставить стандартный range с помощью `^`: + +```json +{ + "dependencies": { + "@octokit/rest": "^18.0.0" + } +} +``` + +#### Development + +Завимость может участвовать в сборке вашего пакета - например `rollup` или `@tramvai/build`. +Зависимость требуется для запуска тестов библиотеки. +Зависимость содержит необходимые для сборки тайпинги. + +Во всех этих случаях, даже если либа уже есть в `peerDependencies`, стоит добавить более конкретную версию в `devDependencies`, например: + +```json +{ + "devDependencies": { + "@tramvai/build": "^2.5.0", + "@types/react": "^17.0.0", + "react": "^17.0.0" + } +} +``` + +#### Исключения + +Конечно, есть исключительные кейсы. + +Например, tramvai предоставляет множество тестовых утилит, где все основные `@tramvai` зависимости были в `peerDependencies`. +Как только эти утилиты начали использовать не в репозиториях с приложениями, а в монорепах с core пакетами, появилась проблема отсутствующих зависимостей, и мы перенесли почти все из `peerDependencies` в `dependencies` + +Действуйте по ситуации, и всегда думайте об удобстве использования вашего продукта :) + +### Сборка + +Предполагается, что итоговую сборку пакетов в контексте приложения будет осуществлять `@tramvai/cli`. +Поэтому, для публикации пакетов, написанных на `TypeScript`, достаточно использовать `tsc`, и публиковать множество собранных `.js` и `.d.ts` файлов. + +Но сборка пакетов в бандлы перед публикацией, например через `rollup` или `@tramvai/build`, дает ряд возможностей: + +- предварительный tree-shaking отсечет все лишнее, это положительно скажется на сборке приложения +- можно сделать несколько бандлов для разного окружения, в CJS или ES modules форматах +- можно сделать отдельный бандл для браузерной сборки, отдельный для серверной - топ для библиотек с поддержкой SSR + +Подробная документация про использование `@tramvai/build` доступна в [документации](references/tools/build.md) diff --git a/docs/how-to/universal.md b/docs/guides/universal.md similarity index 100% rename from docs/how-to/universal.md rename to docs/guides/universal.md diff --git a/docs/how-to/tramvai-update.en.md b/docs/how-to/tramvai-update.en.md new file mode 100644 index 000000000..76fecf664 --- /dev/null +++ b/docs/how-to/tramvai-update.en.md @@ -0,0 +1,38 @@ +--- +id: tramvai-update +title: Tramvai update in application +sidebar_label: Tramvai update +--- + +Most of the libraries in the `tramvai` repository are combined into a common versioning - these are `core` packages, tram modules and tokens. +This makes it much easier to upgrade tramvai to a specific version. + +Detailed documentation is available in the [Release section](concepts/versioning.md) + +The cli command `tramvai update` has been developed to update packages. +This command updates the versions of all `@tramvai/*` and `@tramvai-tinkoff/*` dependencies in the application, and tries to deduplicate the `lock` file, adjusting to the package manager being used. + +## Upgrading to a latest version + +`tramvai update` by default use `latest`: + +```bash +tramvai update +``` + +## Upgrading to a specific version + +The `--to` flag allows you to specify the exact version: + +```bash +tramvai update --to 1.0.0 +``` + +## Checking tramvai versions in the app + +The utility `@tramvai/tools-check-versions` has been created to automatically check the synchronization of tramvai versions. +To check, you need to run the command: + +```bash +yarn tramvai-check-versions +``` diff --git a/docs/how-to/tramvai-update.md b/docs/how-to/tramvai-update.md new file mode 100644 index 000000000..21359b841 --- /dev/null +++ b/docs/how-to/tramvai-update.md @@ -0,0 +1,38 @@ +--- +id: tramvai-update +title: Обновление tramvai в приложении +sidebar_label: Обновление tramvai +--- + +Большинство библиотек в `tramvai` репозитории объединены в общее версионирование - это `core` пакеты, трамвай модули и токены. +Это значительно упрощает обновление `tramvai` на конкретную версию. + +Подробная документация доступна в разделе [Версионирование](concepts/versioning.md) + +Для обновления пакетов разработана cli команда `tramvai update`. +Эта команда обновляет версии всех `@tramvai/*` и `@tramvai-tinkoff/*` зависимости в приложении, и старается сделать дедупликацию в `lock` файле, подстраиваясь под используемый пакетный менеджер. + +## Обновление до latest версии + +`tramvai update` по умолчанию использует `latest`: + +```bash +tramvai update +``` + +## Обновление до конкретной версии + +Флаг `--to` позволяет указать точную версию: + +```bash +tramvai update --to 1.0.0 +``` + +## Проверка версий tramvai в приложении + +Для автоматической проверки синхронизации версий трамвай зависимостей создана утилита `@tramvai/tools-check-versions`, +для запуска нужно выполнить команду: + +```bash +yarn tramvai-check-versions +``` diff --git a/packages-versions.json b/packages-versions.json index 4f820ba87..3dbe16168 100644 --- a/packages-versions.json +++ b/packages-versions.json @@ -1,2 +1,2 @@ -{"@tramvai/cli":"1.9.2","@tramvai/core":"1.9.2","@tramvai/mock":"1.9.2","@tramvai/papi":"1.9.2","@tramvai/react":"1.9.2","@tramvai/react-query":"1.9.2","@tramvai/state":"1.9.2","@tramvai/types-actions-state-context":"1.9.2","@tramvai/test-unit":"1.9.2","@tramvai/test-react":"1.9.2","@tramvai/test-puppeteer":"1.9.2","@tramvai/test-mocks":"1.9.2","@tramvai/test-jsdom":"1.9.2","@tramvai/test-integration-jest":"1.9.2","@tramvai/test-integration":"1.9.2","@tramvai/test-helpers":"1.9.2","@tramvai/tools-migrate":"0.5.97","@tramvai/tools-check-versions":"0.3.5","@tramvai/tools-generate-schema":"0.0.7","@tramvai/build":"2.5.4","@tinkoff-monorepo/depscheck":"1.8.4","@tinkoff-monorepo/fix-ts-references":"1.8.4","@tinkoff-monorepo/pkgs-collector":"1.8.4","@tinkoff-monorepo/pkgs-collector-dir":"1.8.4","@tinkoff-monorepo/pkgs-collector-workspaces":"1.8.4","@tramvai/tokens-common":"1.9.2","@tramvai/tokens-http-client":"1.9.2","@tramvai/tokens-metrics":"1.9.2","@tramvai/tokens-render":"1.9.2","@tramvai/tokens-router":"1.9.2","@tramvai/tokens-server":"1.9.2","@tramvai/module-common":"1.9.2","@tramvai/module-cookie":"1.9.2","@tramvai/module-environment":"1.9.2","@tramvai/module-log":"1.9.2","@tramvai/module-render":"1.9.2","@tramvai/module-server":"1.9.2","@tramvai/module-router":"1.9.2","@tramvai/module-http-client":"1.9.2","@tramvai/module-seo":"1.9.2","@tramvai/module-error-interceptor":"1.9.2","@tramvai/module-sentry":"1.9.2","@tramvai/module-metrics":"1.9.2","@tramvai/module-deps-graph":"1.9.2","@tramvai/module-react-query":"1.9.2","@tramvai/module-mocker":"1.9.2","@tramvai/module-cache-warmup":"1.9.2","@tramvai/module-client-hints":"1.9.2","@tramvai/module-autoscroll":"1.9.2","@tramvai/react-lazy-hydration-render":"0.1.28","@tramvai/safe-strings":"0.4.2","@tinkoff/errors":"0.2.18","@tinkoff/pubsub":"0.4.22","@tinkoff/url":"0.7.36","@tinkoff/browser-cookies":"1.4.2","@tinkoff/logger":"0.10.4","@tinkoff/is-modern-lib":"1.2.9","@tinkoff/minicss-class-generator":"0.1.13","@tinkoff/dippy":"0.7.35","@tinkoff/router":"0.1.57","@tinkoff/browserslist-config":"0.1.12","@tinkoff/layout-factory":"0.2.27","@tinkoff/user-agent":"0.3.89","@tinkoff/htmlpagebuilder":"0.4.22","@tinkoff/express-terminus":"0.1.11","@tinkoff/monkeypatch":"1.3.3","@tinkoff/meta-tags-generate":"0.4.26","@tinkoff/error-handlers":"0.4.25","@tinkoff/measure-express-requests":"1.4.2","@tinkoff/browser-timings":"0.9.3","@tinkoff/mocker":"1.5.2","@tinkoff/metrics-noop":"1.0.2","@tramvai/http-client":"0.1.21","@tramvai/tinkoff-request-http-client-adapter":"0.8.97","@tinkoff/react-hooks":"0.0.22","@tinkoff/hook-runner":"0.3.20","@tinkoff/eslint-plugin-tramvai":"0.5.12","prettier-config-tinkoff":"0.1.9","@tinkoff/pack-polyfills":"0.2.38"} +{"@tramvai/cli":"1.9.3","@tramvai/core":"1.9.3","@tramvai/mock":"1.9.3","@tramvai/papi":"1.9.3","@tramvai/react":"1.9.3","@tramvai/react-query":"1.9.3","@tramvai/state":"1.9.3","@tramvai/types-actions-state-context":"1.9.3","@tramvai/test-unit":"1.9.3","@tramvai/test-react":"1.9.3","@tramvai/test-puppeteer":"1.9.3","@tramvai/test-mocks":"1.9.3","@tramvai/test-jsdom":"1.9.3","@tramvai/test-integration-jest":"1.9.3","@tramvai/test-integration":"1.9.3","@tramvai/test-helpers":"1.9.3","@tramvai/tools-migrate":"0.5.98","@tramvai/tools-check-versions":"0.3.5","@tramvai/tools-generate-schema":"0.0.7","@tramvai/build":"2.5.4","@tinkoff-monorepo/depscheck":"1.8.4","@tinkoff-monorepo/fix-ts-references":"1.8.4","@tinkoff-monorepo/pkgs-collector":"1.8.4","@tinkoff-monorepo/pkgs-collector-dir":"1.8.4","@tinkoff-monorepo/pkgs-collector-workspaces":"1.8.4","@tramvai/tokens-common":"1.9.3","@tramvai/tokens-http-client":"1.9.3","@tramvai/tokens-metrics":"1.9.3","@tramvai/tokens-render":"1.9.3","@tramvai/tokens-router":"1.9.3","@tramvai/tokens-server":"1.9.3","@tramvai/module-common":"1.9.3","@tramvai/module-cookie":"1.9.3","@tramvai/module-environment":"1.9.3","@tramvai/module-log":"1.9.3","@tramvai/module-render":"1.9.3","@tramvai/module-server":"1.9.3","@tramvai/module-router":"1.9.3","@tramvai/module-http-client":"1.9.3","@tramvai/module-seo":"1.9.3","@tramvai/module-error-interceptor":"1.9.3","@tramvai/module-sentry":"1.9.3","@tramvai/module-metrics":"1.9.3","@tramvai/module-deps-graph":"1.9.3","@tramvai/module-react-query":"1.9.3","@tramvai/module-mocker":"1.9.3","@tramvai/module-cache-warmup":"1.9.3","@tramvai/module-client-hints":"1.9.3","@tramvai/module-autoscroll":"1.9.3","@tramvai/react-lazy-hydration-render":"0.1.28","@tramvai/safe-strings":"0.4.2","@tinkoff/errors":"0.2.18","@tinkoff/pubsub":"0.4.22","@tinkoff/url":"0.7.36","@tinkoff/browser-cookies":"1.4.2","@tinkoff/logger":"0.10.4","@tinkoff/is-modern-lib":"1.2.9","@tinkoff/minicss-class-generator":"0.1.13","@tinkoff/dippy":"0.7.35","@tinkoff/router":"0.1.57","@tinkoff/browserslist-config":"0.1.12","@tinkoff/layout-factory":"0.2.27","@tinkoff/user-agent":"0.3.90","@tinkoff/htmlpagebuilder":"0.4.22","@tinkoff/express-terminus":"0.1.11","@tinkoff/monkeypatch":"1.3.3","@tinkoff/meta-tags-generate":"0.4.26","@tinkoff/error-handlers":"0.4.25","@tinkoff/measure-express-requests":"1.4.2","@tinkoff/browser-timings":"0.9.3","@tinkoff/mocker":"1.5.2","@tinkoff/metrics-noop":"1.0.2","@tramvai/http-client":"0.1.21","@tramvai/tinkoff-request-http-client-adapter":"0.8.98","@tinkoff/react-hooks":"0.0.22","@tinkoff/hook-runner":"0.3.20","@tinkoff/eslint-plugin-tramvai":"0.5.12","prettier-config-tinkoff":"0.1.9","@tinkoff/pack-polyfills":"0.2.38"} diff --git a/packages/cli/README.md b/packages/cli/README.md index 7a78f031d..aa12a733a 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -28,7 +28,7 @@ npm i --save-dev @tramvai/cli - `tramvai build` - сборка приложений для сервера и клиента - `tramvai analyze` - анализ размер приложения - `tramvai generate` - кодогенерация различных компонентов. К примеру новых проектов, react компонентов, экшенов, сервис и так далее -- `tramvai update` - обновление `@tramvai/cli` и всех `@tramvai` и `@tramvai/tinkoff` зависимостей в приложении +- `tramvai update` - обновление `@tramvai/cli` и всех `@tramvai` и `@tramvai-tinkoff` зависимостей в приложении ## Конфигурация diff --git a/packages/modules/cache-warmup/src/server.ts b/packages/modules/cache-warmup/src/server.ts index 6a12f40ca..ac0ce2073 100644 --- a/packages/modules/cache-warmup/src/server.ts +++ b/packages/modules/cache-warmup/src/server.ts @@ -14,7 +14,7 @@ import { warmUpCache } from './warmup'; const log = deps.logger('cache-warmup'); if (!deps.papiService) { - log.info('Skip cache warmup when @travmai/module-api-clients is not enabled'); + log.info('Skip cache warmup when @tramvai/module-http-client is not enabled'); return; } diff --git a/packages/modules/router/MIGRATION.md b/packages/modules/router/MIGRATION.md deleted file mode 100644 index b3640bdfa..000000000 --- a/packages/modules/router/MIGRATION.md +++ /dev/null @@ -1,130 +0,0 @@ -# Описание процесса миграции на модуль @tramvai/module-router - -Миграция подразумевает уход от старых модулей: `@tramvai/module-route-base`, `@tramvai/module-route-spa` и переход на новый модуль [`@tramvai/module-router`](references/modules/router.md), который включает в себя функционал для спа и не-спа переходов. - -## Заменяем старые модули на новые - -```ts -import { createApp } from '@tramvai/core'; -// Раньше -import { RouterBaseModule } from '@tramvai/module-route-base'; -import { RouterSpaModule } from '@tramvai/module-route-spa'; -// Теперь выбираем необходимый модуль из одного пакета -import { NoSpaRouterModule, SpaRouterModule } from '@tramvai/module-router'; - -createApp({ - name: 'tincoin', - modules: [ - //... - // Раньше - RouterBaseModule, // старый базовый модуль для роутинга - RouterSpaModule, // добавлял spa-переходы в роутинг - - // Теперь одно из двух - NoSpaRouterModule, // если не нужны spa-переходы на клиенте - SpaRouterModule, // если нужны spa-переходы на клиенте - //... - ], -}); -``` - -## Интерфейс роута - -Немного меняется интерфейс роута: - -### Конфиг страниц - -Вместо вложенного поля `properties` и отдельных конфигов страницы (вроде `httpStatus`) теперь всё предлагается хранить в одном общем поле `config` и из которого же можно будет получить все эти свойства на странице. - -```ts -// Задание -const legacyRoutes = [ - { - name: 'route', - path: '/route', - properties: { - pageComponent: 'page', - }, - httpStatus: 203, - }, -]; - -const newRoutes = [ - { - name: 'route', - path: '/route', - config: { - pageComponent: 'page', - httpStatus: 203, - }, - }, -]; - -// Использование -import { PAGE_SERVICE } from '@tramvai/tokens-route'; -import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router'; - -const pageLegacy = pageServiceLegacy.getCurrentRoute().config.properties.pageComponent; -const pageNew = pageServiceNew.getCurrentRoute().config.pageComponent; -``` - -## Задание статичных роутов - -Токен переименован и немного поменялся формат, [согласно](references/modules/router.md#Задание-статичных-роутов-в-приложении) - -```ts -// было -import { INITIAL_ROUTES_TOKEN } from '@tramvai/tokens-route'; -// стало -import { ROUTES_TOKEN } from '@tramvai/tokens-router'; -``` - -## PageService - -Заменить токен для PAGE_SERVICE на новый вариант: - -```ts -// было -// import { PAGE_SERVICE } from '@tramvai/tokens-route' -// или -// import { PAGE_SERVICE } from '@tramvai/module-route' - -// должно стать -import { PAGE_SERVICE_TOKEN } from '@tramvai/tokens-router'; -``` - -Что поменялось: - -- разделение роута и урла на две отдельные сущности: чтобы получить роут по прежнему надо обращаться к методу `getCurrentRoute`, чтобы получить урл - `getCurrentUrl` -- метод `getProperties` заменён на `getConfig` для соответствия с интерфейсом роута - -Остальные изменения в основном косметические, подробнее про новый интерфейс в [доке модуля](references/modules/router.md) - -## RouterStore - -Имя стора остался прежним но поменялись [интерфейсы роута](#Интерфейс-роута) - -- Для получения конфига страницы нужно обращаться к свойству `currentRoute.config` вместо `currentRoute.config.properties` -- Для получения урл надо обращаться к `currentUrl` вместо `currentRoute.parsedUrl` - -## Router Guard - -Изменился интерфейс для router guard подробнее в доке [@tinkoff/router](references/libs/router.md#Router%20Guards) - -## Редиректы - -Редиректы теперь задаются в [рамках роута](references/modules/router.md#Задание-редиректов). Достаточно перенести старые редиректы, задаваемые через токен `ROUTER_REDIRECT_MAP` - -## NotFound роут - -Вместо явного задания параметра `notFoundRoute` или токена `NOT_FOUND_ROUTE_TOKEN` роут можно задать в списке роутов с использованием символа `*`. Смотри [доку](references/modules/router.md#Not-Found-роут) - -## Способ задания когда должны выполняться экшены при спа-переходах - -Смотри доку [@tramvai/module-router](references/modules/router.md#Способ-задания-когда-должны-выполняться-экшены-при-спа-переходах) - -## Устаревшие и неиспользуемые токены - -- `ROUTER_EVENT_INIT` и `ROUTER_EVENT_LEAVE` удалены т.к. являются слишком специфичными и малоиспользуемыми -- `ROUTE_PLUGIN` удалён без предоставления замены, т.к. использование плагинов для низкоуровневой структуры роутинга создаёт сильную зависимость между приложением и самим роутингом -- `ENABLE_DELAY_ROUTER_STORE_DISPATCH_FEATURE` - удалён, новый роутинг по умолчанию не должен вызывать проблем diff --git a/packages/tramvai/test/integration-jest/src/node-environment.ts b/packages/tramvai/test/integration-jest/src/node-environment.ts index c50f2d5e8..f0ef5f198 100644 --- a/packages/tramvai/test/integration-jest/src/node-environment.ts +++ b/packages/tramvai/test/integration-jest/src/node-environment.ts @@ -1,4 +1,7 @@ import NodeEnvironment from 'jest-environment-node'; +import console from 'console'; + +const nativeConsole = new console.Console({ stdout: process.stdout, stderr: process.stderr }); module.exports = class CustomEnvironment extends NodeEnvironment { async setup() { @@ -7,5 +10,6 @@ module.exports = class CustomEnvironment extends NodeEnvironment { // пробрасываем дальше глобальные переменные в сами тесты, т.к. global в окружении изолировано от global в тестах this.global.__tramvai_cli_mock = global.__tramvai_cli_mock; this.global.app = global.app; + this.global.nativeConsole = nativeConsole; } }; diff --git a/packages/tramvai/test/integration/src/app/__integration__/fakeApp.test.ts b/packages/tramvai/test/integration/src/app/__integration__/fakeApp.test.ts index 6ef9b152e..815a7a7ec 100644 --- a/packages/tramvai/test/integration/src/app/__integration__/fakeApp.test.ts +++ b/packages/tramvai/test/integration/src/app/__integration__/fakeApp.test.ts @@ -30,10 +30,10 @@ describe('test/integration/app/runFakeApp', () => { const page = await browser.newPage(); - await page.goto(app.serverUrl); - const wrapper = wrapPuppeteerPage(page); + await page.goto(app.serverUrl); + expect( await page.$eval('.application', (node) => (node as HTMLElement).innerText) ).toMatchInlineSnapshot(`"fake app"`); diff --git a/packages/tramvai/test/puppeteer/package.json b/packages/tramvai/test/puppeteer/package.json index 1ac57543a..6fdb2d0be 100644 --- a/packages/tramvai/test/puppeteer/package.json +++ b/packages/tramvai/test/puppeteer/package.json @@ -20,12 +20,15 @@ "dependencies": { "@tinkoff/utils": "^2.1.2", "@tramvai/tokens-router": "0.0.0-stub", + "console-with-style": "^1.1.0", + "supports-color": "8.1.1", "tslib": "^2.0.3" }, "peerDependencies": { "puppeteer": "^10.0.0" }, "devDependencies": { + "@types/supports-color": "^8.1.1", "puppeteer": "^10.0.0" }, "license": "Apache-2.0" diff --git a/packages/tramvai/test/puppeteer/src/launch.ts b/packages/tramvai/test/puppeteer/src/launch.ts index 7d4fd6161..ccf2097b9 100644 --- a/packages/tramvai/test/puppeteer/src/launch.ts +++ b/packages/tramvai/test/puppeteer/src/launch.ts @@ -70,11 +70,13 @@ export const initPuppeteer = async ( getPageWrapper: async (url?: string) => { const page = await browser.newPage(); + const wrapper = wrapPuppeteerPage(page); + if (url) { await page.goto(url); } - return wrapPuppeteerPage(page); + return wrapper; }, close: () => { if (hasSharedBrowser) { diff --git a/packages/tramvai/test/puppeteer/src/wrapper.ts b/packages/tramvai/test/puppeteer/src/wrapper.ts index 3423634c8..25e39afbd 100644 --- a/packages/tramvai/test/puppeteer/src/wrapper.ts +++ b/packages/tramvai/test/puppeteer/src/wrapper.ts @@ -1,4 +1,7 @@ import type { Page } from 'puppeteer'; +import { stderr as stderrSupportsColor } from 'supports-color'; +// @ts-ignore +import consoleWithStyle from 'console-with-style'; import { wrapRouter } from './router'; const checkSsrErrors = (text: string) => { @@ -7,15 +10,44 @@ const checkSsrErrors = (text: string) => { } }; +const format = consoleWithStyle((stderrSupportsColor && stderrSupportsColor.level) || 0); + +// console.log нельзя использовать, см. https://github.com/facebook/jest/pull/11054#issuecomment-872682575 +// console.error тоже перехвачен жестом и спамит стек-трейсами +// поэтому используем nativeConsole который определен в node-environment.ts +declare global { + namespace NodeJS { + interface Global { + nativeConsole: typeof console; + } + } +} + +const { nativeConsole } = global; + export const wrapPuppeteerPage = (page: Page) => { + if (page.url() && page.url() !== 'about:blank') { + throw new Error( + `You should wrap blank page before navigation, but page already has url "${page.url()}"` + ); + } + page.on('requestfailed', (request) => - console.log('[PAGE REQUEST FAILED]', { + nativeConsole.error('[PAGE REQUEST FAILED]', { error: request.failure(), url: request.url(), headers: request.headers(), }) ); + page.on('error', (error) => { + nativeConsole.error(`[PAGE CRASHED]`, error.message); + }); + + page.on('pageerror', (error) => { + nativeConsole.error(`[PAGE ERROR]`, error.message); + }); + page.on('console', async (consoleObj) => { const args = consoleObj.args(); const text = consoleObj.text(); @@ -31,7 +63,9 @@ export const wrapPuppeteerPage = (page: Page) => { messages.push(json); } - console.log(`[PAGE LOG]`, messages.length > 0 ? messages : text); + const logLevel = consoleObj.type() === 'error' ? 'error' : 'log'; + const consoleArgs = messages.length ? messages : [text]; + nativeConsole[logLevel](`[PAGE ${consoleObj.type().toUpperCase()}]`, format(...consoleArgs)); }); return { diff --git a/tools/docSite/baseSidebar.js b/tools/docSite/baseSidebar.js index 0d1de0d41..2163325e1 100644 --- a/tools/docSite/baseSidebar.js +++ b/tools/docSite/baseSidebar.js @@ -13,6 +13,7 @@ module.exports = { 'concepts/command-line-runner', 'concepts/action', 'concepts/bundle', + 'concepts/versioning', ], Возможности: [ 'features/react', @@ -22,12 +23,12 @@ module.exports = { items: [ 'features/routing', { - type: 'doc', + type: 'ref', label: 'Интеграция с tramvai', id: 'references/modules/router', }, { - type: 'doc', + type: 'ref', label: 'Библиотека @tinkoff/router', id: 'references/libs/router', }, @@ -43,32 +44,32 @@ module.exports = { label: 'Data fetching', items: [ { - type: 'doc', + type: 'ref', label: 'HTTP запросы', id: 'references/modules/http-client', }, { - type: 'doc', + type: 'ref', label: 'Введение в экшены', id: 'concepts/action', }, { - type: 'doc', + type: 'ref', label: 'Создание экшена', id: 'how-to/how-create-action', }, { - type: 'doc', + type: 'ref', label: 'Глобальные экшены', id: 'how-to/actions-execution', }, { - type: 'doc', + type: 'ref', label: 'Условия выполнения экшенов', id: 'how-to/actions-conditions', }, { - type: 'doc', + type: 'ref', label: 'Интерфейс createAction', id: 'references/tramvai/create-action', }, @@ -80,12 +81,12 @@ module.exports = { items: [ 'features/papi/introduction', { - type: 'doc', + type: 'ref', label: 'Рецепты', id: 'how-to/how-create-papi', }, { - type: 'doc', + type: 'ref', label: 'Библиотека @tramvai/papi', id: 'references/libs/papi', }, @@ -98,6 +99,12 @@ module.exports = { }, 'features/migration', ], + Guides: [ + 'guides/tramvai-library', + 'guides/bundle-optimization', + 'guides/universal', + 'guides/deploy', + ], Рецепты: [ 'how-to/how-create-module', 'how-to/how-create-bundle', @@ -106,9 +113,7 @@ module.exports = { 'how-to/how-create-async-component', 'how-to/how-enable-modern', 'how-to/how-debug-modules', - 'how-to/universal', - 'how-to/bundle-optimization', - 'how-to/deploy', + 'how-to/tramvai-update', ], Справочник: [ { @@ -137,5 +142,6 @@ module.exports = { items: [], }, ], - Сообщество: [], + Релизы: [], + Contribute: [], }; diff --git a/tools/docSite/i18n/en/docusaurus-plugin-content-docs/current.json b/tools/docSite/i18n/en/docusaurus-plugin-content-docs/current.json index 21af2405a..78890fe82 100644 --- a/tools/docSite/i18n/en/docusaurus-plugin-content-docs/current.json +++ b/tools/docSite/i18n/en/docusaurus-plugin-content-docs/current.json @@ -107,10 +107,6 @@ "message": "Migrations from platform-legacy", "description": "The label for category Миграции c platform-legacy in sidebar docs" }, - "sidebar.docs.category.Сообщество": { - "message": "Community", - "description": "The label for category Сообщество in sidebar docs" - }, "sidebar.docs.category.Известные ошибки": { "message": "Known errors", "description": "The label for category Известные ошибки in sidebar docs"