blob: 090a8e60d2cede3298c132c71ceb8a8c498a2fb8 [file] [log] [blame] [view]
---
title: Migrating to rules_js 2.x
sidebar_label: Migrating to rules_js 2.x
description: How to migrate from rules_js 1.x to rules_js 2.x
---
The [rules_js 2.0 release](https://blog.aspect.build/rulesjs-2) comes almost exactly two years after the [release of rules_js 1.0](https://blog.aspect.build/rulesjs-launch). It is our first major release where we've made breaking changes in rules_js to keep the codebase healthy and adaptable to users needs. We expect to make major releases no more frequently than yearly and aim to minimize breaking changes for users as much as possible given reasonable trade-offs between maintaining backward compatibility and dropping support for old patterns. We think we struck a good balance with rules_js 2.0 as the majority of users that we've heard from who have upgraded reported a smooth upgrade with a small amount of effort.
You can follow the link to each rules_js pull request in the notes below.
In many cases, updates to the testing folders (`e2e` or `examples`) are illustrative of the changes required.
## Dependency versions
Bazel 5 is no longer supported. Users must upgrade to Bazel 6 or greater. ([#1589](https://github.com/aspect-build/rules_js/pull/1589)), ([#1610](https://github.com/aspect-build/rules_js/pull/1610))
Minimum dependency versions have been increased:
- `rules_nodejs` 6.1.0 ([#1579](https://github.com/aspect-build/rules_js/pull/1579))
- `aspect_bazel_lib` 2.7.1 ([#1580](https://github.com/aspect-build/rules_js/pull/1580))
## User facing changes
Any rules_js user is likely to encounter these changes which require some edits to your code.
### npm_translate_lock
The default label used to link a package has changed to `pkg` ([#1684](https://github.com/aspect-build/rules_js/pull/1684)).
You can change your `npm_package` rules to have `name = 'pkg'`, see [examples](https://github.com/aspect-build/rules_js/pull/1684/files#diff-d13f73189fcb63af69a6bfa0eb9cb61e71d6466d2eac4c1051674b73976a1cfe).
Alternatively, set the attribute [`npm_package_target_name`](https://github.com/aspect-build/rules_js/blob/main/docs/npm_translate_lock.md#npm_translate_lock-npm_package_target_name) back to match the folder name to restore the rules_js 1.0 behavior where `{dirname}` was the default.
The `update_pnpm_lock` default value is now `False` rather than based on presence of `npm_package_lock` or `yarn_lock`. ([#1624](https://github.com/aspect-build/rules_js/pull/1624))
Deprecated attributes have been removed from the repository rule:
- `warn_on_unqualified_tarball_url` ([#1568](https://github.com/aspect-build/rules_js/pull/1568))
- `package_json` ([#1569](https://github.com/aspect-build/rules_js/pull/1569))
- `update_pnpm_lock_node_toolchain_prefix` ([#1574](https://github.com/aspect-build/rules_js/pull/1574))
- `use_starlark_yaml_parser` ([#1658](https://github.com/aspect-build/rules_js/pull/1658))
And one attribute from the module extension used in `MODULE.bazel`:
- `pnpm_version` ([#1576](https://github.com/aspect-build/rules_js/pull/1576))
### npm_package
The `npm_package#include_runfiles` attribute allows a package to ship with the default runfiles produced by the `srcs`.
The default is now `False` ([#1567](https://github.com/aspect-build/rules_js/pull/1567)).
You may need to set it back to `True` in a few cases:
- to work-around issues with rules that don't provide everything needed in the `JsInfo` fields (`sources`, `transitive_sources`, `types` & `transitive_types`)
- to depend on the runfiles targets that don't use `JsInfo`
### npm_import
Two deprecated attributes were removed:
- `run_lifecycle_hooks` ([#1572](https://github.com/aspect-build/rules_js/pull/1572))
- `lifecycle_hooks_no_sandbox` ([#1573](https://github.com/aspect-build/rules_js/pull/1573))
### js_filegroup
`js_filegroup` has been renamed to `js_info_files` ([#1615](https://github.com/aspect-build/rules_js/pull/1615))
It also has two new attributes, `include_sources` and `include_transitive_declarations`. These are used by helpers `gather_files_from_js_providers` + `gather_runfiles` ([#1585](https://github.com/aspect-build/rules_js/pull/1585))
### declarations => types
The term `declarations` has been renamed to `types` in `JsInfo` & throughout rules_js ([#1619](https://github.com/aspect-build/rules_js/pull/1619))
### WORKSPACE
The `nodejs_register_toolchains()` helper has been replaced by a new `rules_js_register_toolchains` WORKSPACE function ([#1593](https://github.com/aspect-build/rules_js/pull/1593)).
See [examples](https://github.com/aspect-build/rules_js/pull/1593/files#diff-c808f5893f0766a46d39f5b1ff8b3cbeb5eb3cadef752af39a56ab65f1c92c93)
The deprecated `//npm:npm_import.bzl` helper has been removed. ([#1570](https://github.com/aspect-build/rules_js/pull/1570))
### Other
The `expand_template` rule is removed, we recommend the [alternative in bazel-lib](https://github.com/bazel-contrib/bazel-lib/blob/main/docs/expand_template.md) ([#1587](https://github.com/aspect-build/rules_js/pull/1587))
`js_binary`, `js_test` and `js_run_binary` have new attributes `include_sources` and `include_transitive_types`. (https://github.com/aspect-build/rules_js/commit/9b1d03c23519e6d47c59687be7f8e2327e85a931)
## Internal changes
These changes aren't visible to end-users.
However if you have written your own custom rules based on rules_js, changes may be required in those rules.
### js_binary
- refactor: make internal `unresolved_symlinks_enabled` attribute of `js_binary` mandatory ([#1571](https://github.com/aspect-build/rules_js/pull/1571))
### NpmPackageInfo
- refactor: rename `directory` attribute of `NpmPackageInfo` to `src` ([#1575](https://github.com/aspect-build/rules_js/pull/1575))
### NpmPackageStoreInfo
- refactor: don't gather files from `NpmPackageStoreInfo` providers in `gather_files_from_js_info` ([#1663](https://github.com/aspect-build/rules_js/pull/1663))
- refactor: remove unused `src_directory` from `NpmPackageStoreInfo` ([#1566](https://github.com/aspect-build/rules_js/pull/1566))
### JsInfo
- refactor: rename `JsInfo` `npm_package_store_deps` to `npm_package_store_infos` ([#1620](https://github.com/aspect-build/rules_js/pull/1620))
- refactor: rename `include_npm_linked_packages` to `include_npm_sources` && JsInfo `npm_linked_packages` to `npm_sources` ([#1623](https://github.com/aspect-build/rules_js/pull/1623))
- refactor: rename `declarations` to `types` in JsInfo & throughout rules_js ([#1619](https://github.com/aspect-build/rules_js/pull/1619))
- refactor: re-order fields in `JsInfo` for readability ([#1648](https://github.com/aspect-build/rules_js/pull/1684))
### Other
- refactor: rename `gather_files_from_js_providers` to `gather_files_from_js_info` ([#1617](https://github.com/aspect-build/rules_js/pull/1617))
- refactor: rename `gather_files_from_js_info` to `gather_files_from_js_infos` ([#1665](https://github.com/aspect-build/rules_js/pull/1665))
- refactor: remove `utils.home_directory` and use `get_home_directory` from Aspect bazel-lib utils instead ([#1606](https://github.com/aspect-build/rules_js/pull/1606))
- refactor: remove `//js:enable_runfiles` and use `@aspect_bazel_lib//lib:enable_runfiles` instead ([#1605](https://github.com/aspect-build/rules_js/pull/1605))
- fix: drop `.sh` extension from `js_binary`, `merger` and `js_image_layer` launchers ([#1586](https://github.com/aspect-build/rules_js/pull/1586))
- refactor: remove unused `NpmLinkedPackageInfo` provider and corresponding unused `npm_linked_packages` from JsInfo; rename load bearing `npm_linked_package_files` to `npm_linked_packages` ([#1588](https://github.com/aspect-build/rules_js/pull/1588))
- refactor: remove deprecated `//js/private:enable_runfiles` and `//js/private:experimental_allow_unresolved_symlinks` ([#1577](https://github.com/aspect-build/rules_js/pull/1577))
- refactor: remove `JS_LIBRARY_DATA_ATTR` and `DOWNSTREAM_LINKED_NPM_DEPS_DOCSTRING` from js_helpers