Skip to content

Support generic Node.js version configuration files in `node.toolchain #3922

Description

@qhai-dev

Currently, rules_nodejs provides the following configuration for specifying the Node.js version:

node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node")

node.toolchain(
    node_version_from_nvmrc = "//:.nvmrc",
)

use_repo(node, "nodejs_toolchains")

The node_version_from_nvmrc option is specifically tied to the .nvmrc file format.

However, many modern Node.js projects use other Node.js version management tools and configuration files, such as:

  • .node-version (nodenv, mise, etc.)
  • .tool-versions (asdf)
  • package.json engines.node
  • other project-specific version management configurations

This makes node_version_from_nvmrc difficult to adopt in existing repositories where the Node.js version is already defined by another tool.

Motivation

In many monorepos, the Node.js version is already managed by tools such as:

  • mise
  • asdf
  • nodenv
  • volta
  • nvm

For example:

.node-version

or:

.tool-versions

When Bazel is introduced into an existing repository, requiring an additional .nvmrc file only for rules_nodejs creates duplicated configuration and may cause version drift.

A more generic Node.js version source mechanism would make rules_nodejs easier to integrate with existing workflows.

Proposed Change

Consider introducing a generic Node.js version configuration API instead of coupling the API to .nvmrc.

For example:

node.toolchain(
    node_version_from_file = "//:.node-version",
)

or:

node.toolchain(
    node_version_file = "//:.node-version",
)

The implementation could support different file formats or provide an extensible mechanism for custom version sources.

Example:

node.toolchain(
    node_version_file = "//:.tool-versions",
    node_version_file_format = "asdf",
)

Alternatively, the API could support a generic resolver abstraction:

node.toolchain(
    node_version_source = "//tools/node_version:resolver",
)

where different version sources can be implemented independently.

Expected Behavior

The Node.js toolchain should be able to resolve the Node.js version from common project configuration files.

Examples:

.nvmrc

20.15.0

.node-version

20.15.0

.tool-versions

nodejs 20.15.0

The resolved version should then be used to configure the Bazel Node.js toolchain.

Questions

  1. Is node_version_from_nvmrc intentionally limited to .nvmrc support?

  2. Would the maintainers consider introducing a generic Node.js version source API?

  3. Would a contribution adding support for .node-version or other Node.js version files be considered?

Additional Context

The current API:

node_version_from_nvmrc

appears to couple the toolchain configuration with a specific Node.js version manager (nvm).

The underlying requirement is not specifically about nvm, but about resolving the Node.js version from a repository-level configuration source.

A more generic abstraction could improve compatibility with different Node.js ecosystem workflows and make rules_nodejs easier to adopt in modern monorepo environments.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions