diff --git a/WORKSPACE b/WORKSPACE
index 4cd59655b9..621b229923 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -122,9 +122,9 @@ browser_repositories(
)
# Setup esbuild dependencies
-load("//packages/esbuild:esbuild_repo.bzl", "esbuild_dependencies")
+load("//packages/esbuild:esbuild_repositories.bzl", "esbuild_repositories")
-esbuild_dependencies()
+esbuild_repositories()
#
# Dependencies to run stardoc & generating documentation
diff --git a/docs/esbuild.md b/docs/esbuild.md
index 9b8fcd762a..41dab1a1fb 100755
--- a/docs/esbuild.md
+++ b/docs/esbuild.md
@@ -22,64 +22,40 @@ or using yarn
yarn add -D @bazel/esbuild
```
-Add an `http_archive` fetching the esbuild binary for each platform that you need to support.
+The esbuild binary is fetched from npm automatically and exposed via toolchains. Add the `esbuild_repositories` rule to the `WORKSPACE`:
```python
-_ESBUILD_VERSION = "0.12.1" # reminder: update SHAs below when changing this value
-http_archive(
- name = "esbuild_darwin",
- urls = [
- "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % _ESBUILD_VERSION,
- ],
- strip_prefix = "package",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f",
-)
+load("@npm//@bazel/esbuild:esbuild_repositories.bzl", "esbuild_repositories")
-http_archive(
- name = "esbuild_windows",
- urls = [
- "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % _ESBUILD_VERSION,
- ],
- strip_prefix = "package",
- build_file_content = """exports_files(["esbuild.exe"])""",
- sha256 = "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9",
-)
+esbuild_repositories()
+```
+
+As esbuild is being fetched from `npm`, the load statement above can cause eager fetches of the `@npm` external repository.
+To work around this, it's possible to fetch the `@bazel/esbuild` package via an `http_archive`
+```python
http_archive(
- name = "esbuild_linux",
+ name = "bazel_esbuild",
urls = [
- "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _ESBUILD_VERSION,
+ "https://registry.npmjs.org/@bazel/esbuild/-/esbuild-4.0.0.tgz",
],
strip_prefix = "package",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a",
)
-```
-These can then be referenced on the `tool` attribute of the `esbuild` rule.
+load("@bazel_esbuild//:esbuild_repositories.bzl", "esbuild_repositories")
-```python
-esbuild(
- name = "bundle",
- ...
- tool = select({
- "@bazel_tools//src/conditions:darwin": "@esbuild_darwin//:bin/esbuild",
- "@bazel_tools//src/conditions:windows": "@esbuild_windows//:esbuild.exe",
- "@bazel_tools//src/conditions:linux_x86_64": "@esbuild_linux//:bin/esbuild",
- }),
-)
+esbuild_repositories()
```
-It might be useful to wrap this locally in a macro for better reuseability, see `packages/esbuild/test/tests.bzl` for an example.
+## Overview
The `esbuild` rule can take a JS or TS dependency tree and bundle it to a single file, or split across multiple files, outputting a directory.
```python
load("@npm//@bazel/esbuild:index.bzl", "esbuild")
-load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_project")
-ts_library(
+ts_project(
name = "lib",
srcs = ["a.ts"],
)
@@ -97,9 +73,9 @@ To create a code split bundle, set `splitting = True` on the `esbuild` rule.
```python
load("@npm//@bazel/esbuild:index.bzl", "esbuild")
-load("@npm//@bazel/typescript:index.bzl", "ts_library")
+load("@npm//@bazel/typescript:index.bzl", "ts_project")
-ts_library(
+ts_project(
name = "lib",
srcs = ["a.ts"],
deps = [
@@ -125,7 +101,7 @@ This will create an output directory containing all the code split chunks, along
esbuild(name, args, define, deps, entry_point, entry_points, external, format, launcher,
link_workspace_root, max_threads, minify, output, output_css, output_dir, output_map,
- platform, sourcemap, sources_content, srcs, target, tool)
+ platform, sourcemap, sources_content, srcs, target)
Runs the esbuild bundler under Bazel
@@ -302,9 +278,56 @@ See https://esbuild.github.io/api/#target for more details
Defaults to `"es2015"`
-
-(*Label, mandatory*): An executable for the esbuild binary
+## configure_esbuild_toolchain
+
+**USAGE**
+
+
+configure_esbuild_toolchain(name, binary, exec_compatible_with)
+
+
+Defines a toolchain for esbuild given the binary path and platform constraints
+
+**PARAMETERS**
+
+
+
+unique name for this toolchain, generally in the form "esbuild_platform_arch"
+
+
+
+
+
+label for the esbuild binary
+
+
+
+
+
+list of platform constraints
+
+
+
+
+## esbuild_repositories
+
+**USAGE**
+
+
+esbuild_repositories(name)
+
+
+Helper for fetching and setting up the esbuild versions and toolchains
+
+**PARAMETERS**
+
+
+name
+
+currently unused
+
+Defaults to `""`
diff --git a/examples/esbuild/WORKSPACE b/examples/esbuild/WORKSPACE
index 0614a0fa7f..24fa6b20dd 100644
--- a/examples/esbuild/WORKSPACE
+++ b/examples/esbuild/WORKSPACE
@@ -25,38 +25,6 @@ http_archive(
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/3.5.1/rules_nodejs-3.5.1.tar.gz"],
)
-_ESBUILD_VERSION = "0.12.1"
-
-http_archive(
- name = "esbuild_darwin",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f",
- strip_prefix = "package",
- urls = [
- "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % _ESBUILD_VERSION,
- ],
-)
-
-http_archive(
- name = "esbuild_windows",
- build_file_content = """exports_files(["esbuild.exe"])""",
- sha256 = "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9",
- strip_prefix = "package",
- urls = [
- "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % _ESBUILD_VERSION,
- ],
-)
-
-http_archive(
- name = "esbuild_linux",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a",
- strip_prefix = "package",
- urls = [
- "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _ESBUILD_VERSION,
- ],
-)
-
load("@build_bazel_rules_nodejs//:index.bzl", "npm_install")
npm_install(
@@ -64,3 +32,7 @@ npm_install(
package_json = "//:package.json",
package_lock_json = "//:package-lock.json",
)
+
+load("@npm//@bazel/esbuild:esbuild_repositories.bzl", "esbuild_repositories")
+
+esbuild_repositories()
diff --git a/examples/esbuild/src/BUILD.bazel b/examples/esbuild/src/BUILD.bazel
index ebffce910a..d2de5a24c1 100644
--- a/examples/esbuild/src/BUILD.bazel
+++ b/examples/esbuild/src/BUILD.bazel
@@ -26,11 +26,6 @@ esbuild(
minify = True,
# setting node as the platform will default us to CJS
platform = "node",
- tool = select({
- "@bazel_tools//src/conditions:darwin": "@esbuild_darwin//:bin/esbuild",
- "@bazel_tools//src/conditions:linux_x86_64": "@esbuild_linux//:bin/esbuild",
- "@bazel_tools//src/conditions:windows": "@esbuild_windows//:esbuild.exe",
- }),
deps = [
":lib",
],
diff --git a/package.json b/package.json
index 11526aec72..63e73cab67 100644
--- a/package.json
+++ b/package.json
@@ -124,7 +124,7 @@
"bazel:update-deleted-packages": "sed -i.bak \"/--deleted_packages/s#=.*#=$(find {examples,e2e}/*/* \\( -name BUILD -or -name BUILD.bazel \\) | xargs -n 1 dirname | paste -sd, -)#\" .bazelrc && rm .bazelrc.bak",
"update-codeowners": "./scripts/update_codeowners.sh",
"update-nodejs-versions": "node ./scripts/update-nodejs-versions.js > internal/node/node_versions.bzl",
- "update-esbuild-versions": "node ./scripts/update-esbuild-versions.js > packages/esbuild/esbuild_repo.bzl",
+ "update-esbuild-versions": "node ./scripts/update-esbuild-versions.js",
"format": "git-clang-format",
"format-all": "clang-format --glob='{internal/**/,examples/**/}*.{js,ts}' -i",
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && node ./scripts/on-version.js && bazel build //:release && node ./scripts/on-release.js && git stage version.bzl docs/install.md packages/create/index.js README.md CHANGELOG.md e2e/*/WORKSPACE examples/*/WORKSPACE",
diff --git a/packages/esbuild/BUILD.bazel b/packages/esbuild/BUILD.bazel
index d9ff35e7aa..42feadd7f7 100644
--- a/packages/esbuild/BUILD.bazel
+++ b/packages/esbuild/BUILD.bazel
@@ -27,8 +27,11 @@ codeowners(
bzl_library(
name = "bzl",
- srcs = glob(["**/*.bzl"]),
+ srcs = glob(["**/*.bzl"]) + [
+ "@bazel_tools//tools:bzl_srcs",
+ ],
deps = [
+ "//packages/esbuild/toolchain:bzl",
"@bazel_skylib//lib:paths",
"@build_bazel_rules_nodejs//:bzl",
"@build_bazel_rules_nodejs//internal/common:bzl",
@@ -51,20 +54,28 @@ copy_file(
out = ":npm_version_check.js",
)
-pkg_npm(
- name = "npm_package",
+filegroup(
+ name = "srcs",
srcs = [
"esbuild.bzl",
+ "esbuild_packages.bzl",
+ "esbuild_repositories.bzl",
"helpers.bzl",
"index.bzl",
"launcher.js",
"package.json",
],
- build_file_content = """exports_files(["launcher.js"])
- """,
+)
+
+pkg_npm(
+ name = "npm_package",
+ srcs = [
+ ":srcs",
+ "//packages/esbuild/toolchain:srcs",
+ ],
+ build_file_content = """exports_files(["launcher.js"])""",
substitutions = dict({
- "@build_bazel_rules_nodejs//packages/esbuild:esbuild.bzl": "//@bazel/esbuild:esbuild.bzl",
- "@build_bazel_rules_nodejs//packages/esbuild:launcher.js": "//@bazel/esbuild:launcher.js",
+ "@build_bazel_rules_nodejs//packages/esbuild": "//@bazel/esbuild",
}),
deps = [
":README.md",
diff --git a/packages/esbuild/esbuild.bzl b/packages/esbuild/esbuild.bzl
index ba9b0cebee..fdddb1dabf 100644
--- a/packages/esbuild/esbuild.bzl
+++ b/packages/esbuild/esbuild.bzl
@@ -5,6 +5,7 @@ esbuild rule
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
load("@build_bazel_rules_nodejs//:providers.bzl", "ExternalNpmPackageInfo", "JSEcmaScriptModuleInfo", "JSModuleInfo", "node_modules_aspect", "run_node")
load("@build_bazel_rules_nodejs//internal/linker:link_node_modules.bzl", "MODULE_MAPPINGS_ASPECT_RESULTS_NAME", "module_mappings_aspect")
+load("@build_bazel_rules_nodejs//packages/esbuild/toolchain:toolchain.bzl", "TOOLCHAIN")
load(":helpers.bzl", "desugar_entry_point_names", "filter_files", "generate_path_mapping", "resolve_entry_point", "write_jsconfig_file")
def _esbuild_impl(ctx):
@@ -135,7 +136,7 @@ def _esbuild_impl(ctx):
execution_requirements = {"no-remote-exec": "1"}
launcher_args = ctx.actions.args()
- launcher_args.add("--esbuild=%s" % ctx.executable.tool.path)
+ launcher_args.add("--esbuild=%s" % ctx.toolchains[TOOLCHAIN].binary.path)
run_node(
ctx = ctx,
@@ -148,7 +149,7 @@ def _esbuild_impl(ctx):
env = env,
executable = "launcher",
link_workspace_root = ctx.attr.link_workspace_root,
- tools = [ctx.executable.tool],
+ tools = [ctx.toolchains[TOOLCHAIN].binary],
)
outputs_depset = depset(outputs)
@@ -307,15 +308,11 @@ edge16, node10, esnext). Default es2015.
See https://esbuild.github.io/api/#target for more details
""",
),
- "tool": attr.label(
- allow_single_file = True,
- mandatory = True,
- executable = True,
- cfg = "exec",
- doc = "An executable for the esbuild binary",
- ),
},
implementation = _esbuild_impl,
+ toolchains = [
+ str(TOOLCHAIN),
+ ],
doc = """Runs the esbuild bundler under Bazel
For further information about esbuild, see https://esbuild.github.io/
diff --git a/packages/esbuild/esbuild_packages.bzl b/packages/esbuild/esbuild_packages.bzl
new file mode 100644
index 0000000000..524f4f4c4e
--- /dev/null
+++ b/packages/esbuild/esbuild_packages.bzl
@@ -0,0 +1,70 @@
+"""Info for the esbuild packages used"""
+
+### These values are updated automaticly via `yarn update-esbuild-versions`
+_VERSION = "0.12.5"
+_DARWIN_AMD64_SHA = "6037c279c2bd09ae6ff490f18ea95ab514db044df63db47268411dfc48a49b16"
+_DARWIN_ARM64_SHA = "bb950e084302652a11c5d38aeae773fa6f46b864e7b89264c9354222aa8d326d"
+_LINUX_AMD64_SHA = "ea9bae194f4d18297ccb00139c62326e3da40835bbadbe21848c3e2cded35a3a"
+_LINUX_ARM64_SHA = "f70fbe27a5dab5dd6f19f76f60660ad59b8a6883652bb1fd878078cf922915ad"
+_WINDOWS_AMD64_SHA = "ce16dc8d565f8b30b538496961ba17c1977ddd400d0f20b7e89482ecd0944d5d"
+
+ESBUILD_PACKAGES = struct(
+ version = _VERSION,
+ platforms = dict({
+ "darwin_amd64": struct(
+ sha = _DARWIN_AMD64_SHA,
+ urls = [
+ "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % _VERSION,
+ ],
+ binary_path = "bin/esbuild",
+ exec_compatible_with = [
+ "@platforms//os:macos",
+ "@platforms//cpu:x86_64",
+ ],
+ ),
+ "darwin_arm64": struct(
+ sha = _DARWIN_ARM64_SHA,
+ urls = [
+ "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-%s.tgz" % _VERSION,
+ ],
+ binary_path = "bin/esbuild",
+ exec_compatible_with = [
+ "@platforms//os:macos",
+ "@platforms//cpu:aarch64",
+ ],
+ ),
+ "linux_amd64": struct(
+ sha = _LINUX_AMD64_SHA,
+ urls = [
+ "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _VERSION,
+ ],
+ binary_path = "bin/esbuild",
+ exec_compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:x86_64",
+ ],
+ ),
+ "linux_arm64": struct(
+ sha = _LINUX_ARM64_SHA,
+ urls = [
+ "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-%s.tgz" % _VERSION,
+ ],
+ binary_path = "bin/esbuild",
+ exec_compatible_with = [
+ "@platforms//os:linux",
+ "@platforms//cpu:aarch64",
+ ],
+ ),
+ "windows_amd64": struct(
+ sha = _WINDOWS_AMD64_SHA,
+ urls = [
+ "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % _VERSION,
+ ],
+ binary_path = "esbuild.exe",
+ exec_compatible_with = [
+ "@platforms//os:windows",
+ "@platforms//cpu:x86_64",
+ ],
+ ),
+ }),
+)
diff --git a/packages/esbuild/esbuild_repo.bzl b/packages/esbuild/esbuild_repo.bzl
deleted file mode 100644
index da474a90e8..0000000000
--- a/packages/esbuild/esbuild_repo.bzl
+++ /dev/null
@@ -1,42 +0,0 @@
-""" Generated code; do not edit
-Update by running yarn update-esbuild-versions
-
-Helper macro for fetching esbuild versions for internal tests and examples in rules_nodejs
-"""
-
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
-
-_VERSION = "0.12.1"
-
-def esbuild_dependencies():
- """Helper to install required dependencies for the esbuild rules"""
-
- version = _VERSION
-
- http_archive(
- name = "esbuild_darwin",
- urls = [
- "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % version,
- ],
- strip_prefix = "package",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f",
- )
- http_archive(
- name = "esbuild_windows",
- urls = [
- "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % version,
- ],
- strip_prefix = "package",
- build_file_content = """exports_files(["esbuild.exe"])""",
- sha256 = "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9",
- )
- http_archive(
- name = "esbuild_linux",
- urls = [
- "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % version,
- ],
- strip_prefix = "package",
- build_file_content = """exports_files(["bin/esbuild"])""",
- sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a",
- )
diff --git a/packages/esbuild/esbuild_repositories.bzl b/packages/esbuild/esbuild_repositories.bzl
new file mode 100644
index 0000000000..315c3d2feb
--- /dev/null
+++ b/packages/esbuild/esbuild_repositories.bzl
@@ -0,0 +1,30 @@
+"""
+Helper macro for fetching esbuild versions
+"""
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+load(":esbuild_packages.bzl", "ESBUILD_PACKAGES")
+
+def _maybe(repo_rule, name, **kwargs):
+ if name not in native.existing_rules():
+ repo_rule(name = name, **kwargs)
+
+def esbuild_repositories(name = ""):
+ """Helper for fetching and setting up the esbuild versions and toolchains
+
+ Args:
+ name: currently unused
+ """
+
+ for name, meta in ESBUILD_PACKAGES.platforms.items():
+ _maybe(
+ http_archive,
+ name = "esbuild_%s" % name,
+ urls = meta.urls,
+ strip_prefix = "package",
+ build_file_content = """exports_files(["%s"])""" % meta.binary_path,
+ sha256 = meta.sha,
+ )
+
+ toolchain_label = Label("@build_bazel_rules_nodejs//packages/esbuild/toolchain:esbuild_%s_toolchain" % name)
+ native.register_toolchains("@%s//%s:%s" % (toolchain_label.workspace_name, toolchain_label.package, toolchain_label.name))
diff --git a/packages/esbuild/index.bzl b/packages/esbuild/index.bzl
index 8ff188399a..298d89d8c5 100644
--- a/packages/esbuild/index.bzl
+++ b/packages/esbuild/index.bzl
@@ -19,5 +19,10 @@ load(
"@build_bazel_rules_nodejs//packages/esbuild:esbuild.bzl",
_esbuild_macro = "esbuild_macro",
)
+load(
+ "@build_bazel_rules_nodejs//packages/esbuild/toolchain:toolchain.bzl",
+ _configure_esbuild_toolchain = "configure_esbuild_toolchain",
+)
esbuild = _esbuild_macro
+configure_esbuild_toolchain = _configure_esbuild_toolchain
diff --git a/packages/esbuild/index.docs.bzl b/packages/esbuild/index.docs.bzl
index 7d4cd6a246..0a47606797 100644
--- a/packages/esbuild/index.docs.bzl
+++ b/packages/esbuild/index.docs.bzl
@@ -16,64 +16,40 @@ or using yarn
yarn add -D @bazel/esbuild
```
-Add an `http_archive` fetching the esbuild binary for each platform that you need to support.
+The esbuild binary is fetched from npm automatically and exposed via toolchains. Add the `esbuild_repositories` rule to the `WORKSPACE`:
```python
-_ESBUILD_VERSION = "0.12.1" # reminder: update SHAs below when changing this value
-http_archive(
- name = "esbuild_darwin",
- urls = [
- "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-%s.tgz" % _ESBUILD_VERSION,
- ],
- strip_prefix = "package",
- build_file_content = \"""exports_files(["bin/esbuild"])\""",
- sha256 = "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f",
-)
+load("@npm//@bazel/esbuild:esbuild_repositories.bzl", "esbuild_repositories")
-http_archive(
- name = "esbuild_windows",
- urls = [
- "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-%s.tgz" % _ESBUILD_VERSION,
- ],
- strip_prefix = "package",
- build_file_content = \"""exports_files(["esbuild.exe"])\""",
- sha256 = "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9",
-)
+esbuild_repositories()
+```
+As esbuild is being fetched from `npm`, the load statement above can cause eager fetches of the `@npm` external repository.
+To work around this, it's possible to fetch the `@bazel/esbuild` package via an `http_archive`
+
+```python
http_archive(
- name = "esbuild_linux",
+ name = "bazel_esbuild",
urls = [
- "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _ESBUILD_VERSION,
+ "https://registry.npmjs.org/@bazel/esbuild/-/esbuild-4.0.0.tgz",
],
strip_prefix = "package",
- build_file_content = \"""exports_files(["bin/esbuild"])\""",
- sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a",
)
-```
-These can then be referenced on the `tool` attribute of the `esbuild` rule.
+load("@bazel_esbuild//:esbuild_repositories.bzl", "esbuild_repositories")
-```python
-esbuild(
- name = "bundle",
- ...
- tool = select({
- "@bazel_tools//src/conditions:darwin": "@esbuild_darwin//:bin/esbuild",
- "@bazel_tools//src/conditions:windows": "@esbuild_windows//:esbuild.exe",
- "@bazel_tools//src/conditions:linux_x86_64": "@esbuild_linux//:bin/esbuild",
- }),
-)
+esbuild_repositories()
```
-It might be useful to wrap this locally in a macro for better reuseability, see `packages/esbuild/test/tests.bzl` for an example.
+## Overview
The `esbuild` rule can take a JS or TS dependency tree and bundle it to a single file, or split across multiple files, outputting a directory.
```python
load("//packages/esbuild:index.bzl", "esbuild")
-load("//packages/typescript:index.bzl", "ts_library")
+load("//packages/typescript:index.bzl", "ts_project")
-ts_library(
+ts_project(
name = "lib",
srcs = ["a.ts"],
)
@@ -91,9 +67,9 @@ To create a code split bundle, set `splitting = True` on the `esbuild` rule.
```python
load("//packages/esbuild:index.bzl", "esbuild")
-load("//packages/typescript:index.bzl", "ts_library")
+load("//packages/typescript:index.bzl", "ts_project")
-ts_library(
+ts_project(
name = "lib",
srcs = ["a.ts"],
deps = [
@@ -116,5 +92,15 @@ load(
"@build_bazel_rules_nodejs//packages/esbuild:esbuild.bzl",
_esbuild = "esbuild",
)
+load(
+ "@build_bazel_rules_nodejs//packages/esbuild:esbuild_repositories.bzl",
+ _esbuild_repositories = "esbuild_repositories",
+)
+load(
+ "@build_bazel_rules_nodejs//packages/esbuild/toolchain:toolchain.bzl",
+ _configure_esbuild_toolchain = "configure_esbuild_toolchain",
+)
esbuild = _esbuild
+esbuild_repositories = _esbuild_repositories
+configure_esbuild_toolchain = _configure_esbuild_toolchain
diff --git a/packages/esbuild/test/alias-mapping/BUILD.bazel b/packages/esbuild/test/alias-mapping/BUILD.bazel
index ad015e587e..3e3c69edb6 100644
--- a/packages/esbuild/test/alias-mapping/BUILD.bazel
+++ b/packages/esbuild/test/alias-mapping/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
esbuild(
name = "bundle",
diff --git a/packages/esbuild/test/bundle/BUILD.bazel b/packages/esbuild/test/bundle/BUILD.bazel
index e491106da4..e7db81d516 100644
--- a/packages/esbuild/test/bundle/BUILD.bazel
+++ b/packages/esbuild/test/bundle/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/typescript:index.bzl", "ts_library")
ts_library(
diff --git a/packages/esbuild/test/css/BUILD.bazel b/packages/esbuild/test/css/BUILD.bazel
index 8b9dbdb13e..c612dde96f 100644
--- a/packages/esbuild/test/css/BUILD.bazel
+++ b/packages/esbuild/test/css/BUILD.bazel
@@ -1,5 +1,5 @@
load("@build_bazel_rules_nodejs//:index.bzl", "copy_to_bin")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/jasmine:index.bzl", "jasmine_node_test")
load("//packages/typescript:index.bzl", "ts_library")
diff --git a/packages/esbuild/test/define/BUILD.bazel b/packages/esbuild/test/define/BUILD.bazel
index a6dca40447..c6a2a268d2 100644
--- a/packages/esbuild/test/define/BUILD.bazel
+++ b/packages/esbuild/test/define/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/jasmine:index.bzl", "jasmine_node_test")
load("//packages/typescript:index.bzl", "ts_library")
diff --git a/packages/esbuild/test/entries/BUILD.bazel b/packages/esbuild/test/entries/BUILD.bazel
index 962d5ecce3..2063a159ae 100644
--- a/packages/esbuild/test/entries/BUILD.bazel
+++ b/packages/esbuild/test/entries/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "nodejs_test")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/typescript:index.bzl", "ts_library")
ts_library(
diff --git a/packages/esbuild/test/external-flag/BUILD.bazel b/packages/esbuild/test/external-flag/BUILD.bazel
index 705c02e540..a29977e8bc 100644
--- a/packages/esbuild/test/external-flag/BUILD.bazel
+++ b/packages/esbuild/test/external-flag/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/jasmine:index.bzl", "jasmine_node_test")
load("//packages/typescript:index.bzl", "ts_library")
diff --git a/packages/esbuild/test/js-library/BUILD.bazel b/packages/esbuild/test/js-library/BUILD.bazel
index 508e65d9da..955096209c 100644
--- a/packages/esbuild/test/js-library/BUILD.bazel
+++ b/packages/esbuild/test/js-library/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test", "js_library", "nodejs_binary", "npm_package_bin")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
js_library(
name = "lib",
diff --git a/packages/esbuild/test/node/BUILD.bazel b/packages/esbuild/test/node/BUILD.bazel
index c7c3aced4c..b2a25e7f2a 100644
--- a/packages/esbuild/test/node/BUILD.bazel
+++ b/packages/esbuild/test/node/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test", "nodejs_binary", "npm_package_bin")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
esbuild(
name = "bundle",
diff --git a/packages/esbuild/test/output/BUILD.bazel b/packages/esbuild/test/output/BUILD.bazel
index fa004b8b5a..97dbe35b87 100644
--- a/packages/esbuild/test/output/BUILD.bazel
+++ b/packages/esbuild/test/output/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/jasmine:index.bzl", "jasmine_node_test")
load("//packages/typescript:index.bzl", "ts_library")
diff --git a/packages/esbuild/test/sourcemap/BUILD.bazel b/packages/esbuild/test/sourcemap/BUILD.bazel
index 7138fc8f27..7871430f63 100644
--- a/packages/esbuild/test/sourcemap/BUILD.bazel
+++ b/packages/esbuild/test/sourcemap/BUILD.bazel
@@ -1,4 +1,4 @@
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/jasmine:index.bzl", "jasmine_node_test")
load("//packages/typescript:index.bzl", "ts_library")
diff --git a/packages/esbuild/test/splitting/BUILD.bazel b/packages/esbuild/test/splitting/BUILD.bazel
index 70a146e551..f33b7a08d6 100644
--- a/packages/esbuild/test/splitting/BUILD.bazel
+++ b/packages/esbuild/test/splitting/BUILD.bazel
@@ -1,6 +1,6 @@
load("//:index.bzl", "nodejs_test")
load("//:tools/defaults.bzl", "pkg_tar")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/typescript:index.bzl", "ts_library")
ts_library(
diff --git a/packages/esbuild/test/tests.bzl b/packages/esbuild/test/tests.bzl
deleted file mode 100644
index aed4aed16d..0000000000
--- a/packages/esbuild/test/tests.bzl
+++ /dev/null
@@ -1,13 +0,0 @@
-"""Default esbuild binary selection for tests"""
-
-load("//packages/esbuild:index.bzl", _esbuild = "esbuild")
-
-def esbuild(**kwargs):
- _esbuild(
- tool = select({
- "@bazel_tools//src/conditions:darwin": "@esbuild_darwin//:bin/esbuild",
- "@bazel_tools//src/conditions:linux_x86_64": "@esbuild_linux//:bin/esbuild",
- "@bazel_tools//src/conditions:windows": "@esbuild_windows//:esbuild.exe",
- }),
- **kwargs
- )
diff --git a/packages/esbuild/test/typescript/BUILD.bazel b/packages/esbuild/test/typescript/BUILD.bazel
index 7ac2d609eb..ce0e04afb1 100644
--- a/packages/esbuild/test/typescript/BUILD.bazel
+++ b/packages/esbuild/test/typescript/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
load("//packages/typescript:index.bzl", "ts_library")
exports_files(["tsconfig.json"])
diff --git a/packages/esbuild/test/typescript/ts_as_srcs/BUILD.bazel b/packages/esbuild/test/typescript/ts_as_srcs/BUILD.bazel
index dd436a379b..a010d0d7de 100644
--- a/packages/esbuild/test/typescript/ts_as_srcs/BUILD.bazel
+++ b/packages/esbuild/test/typescript/ts_as_srcs/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test", "nodejs_binary", "npm_package_bin")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
esbuild(
name = "lib",
diff --git a/packages/esbuild/test/vanilla_js/BUILD.bazel b/packages/esbuild/test/vanilla_js/BUILD.bazel
index 664112bfc8..e414ae7c09 100644
--- a/packages/esbuild/test/vanilla_js/BUILD.bazel
+++ b/packages/esbuild/test/vanilla_js/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test", "nodejs_binary", "npm_package_bin")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
esbuild(
name = "lib",
diff --git a/packages/esbuild/test/workspace-mapping/BUILD.bazel b/packages/esbuild/test/workspace-mapping/BUILD.bazel
index 7d4f7d5f5d..7d4a92d5fb 100644
--- a/packages/esbuild/test/workspace-mapping/BUILD.bazel
+++ b/packages/esbuild/test/workspace-mapping/BUILD.bazel
@@ -1,5 +1,5 @@
load("//:index.bzl", "generated_file_test")
-load("//packages/esbuild/test:tests.bzl", "esbuild")
+load("//packages/esbuild:index.bzl", "esbuild")
esbuild(
name = "bundle",
diff --git a/packages/esbuild/toolchain/BUILD.bazel b/packages/esbuild/toolchain/BUILD.bazel
new file mode 100644
index 0000000000..7916c3fdaa
--- /dev/null
+++ b/packages/esbuild/toolchain/BUILD.bazel
@@ -0,0 +1,29 @@
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+load("@build_bazel_rules_nodejs//packages/esbuild:esbuild_packages.bzl", "ESBUILD_PACKAGES")
+load(":toolchain.bzl", "configure_esbuild_toolchains")
+
+toolchain_type(
+ name = "toolchain_type",
+ visibility = ["//visibility:public"],
+)
+
+configure_esbuild_toolchains(
+ platforms = ESBUILD_PACKAGES.platforms,
+)
+
+bzl_library(
+ name = "bzl",
+ srcs = [
+ "toolchain.bzl",
+ ],
+ visibility = ["//packages/esbuild:__pkg__"],
+)
+
+filegroup(
+ name = "srcs",
+ srcs = [
+ "BUILD.bazel",
+ "toolchain.bzl",
+ ],
+ visibility = ["//packages/esbuild:__pkg__"],
+)
diff --git a/packages/esbuild/toolchain/toolchain.bzl b/packages/esbuild/toolchain/toolchain.bzl
new file mode 100644
index 0000000000..22c2666b3d
--- /dev/null
+++ b/packages/esbuild/toolchain/toolchain.bzl
@@ -0,0 +1,61 @@
+"""Toolchain and helper definitions for esbuild"""
+
+def _esbuild_toolchain_impl(ctx):
+ return [
+ platform_common.ToolchainInfo(
+ binary = ctx.executable.binary,
+ ),
+ platform_common.TemplateVariableInfo({
+ "ESBUILD_PATH": ctx.executable.binary.path,
+ }),
+ ]
+
+_esbuild_toolchain = rule(
+ implementation = _esbuild_toolchain_impl,
+ attrs = {
+ "binary": attr.label(
+ allow_single_file = True,
+ executable = True,
+ cfg = "exec",
+ ),
+ },
+)
+
+TOOLCHAIN = Label("@build_bazel_rules_nodejs//packages/esbuild/toolchain:toolchain_type")
+
+def configure_esbuild_toolchain(name, binary, exec_compatible_with):
+ """Defines a toolchain for esbuild given the binary path and platform constraints
+
+ Args:
+ name: unique name for this toolchain, generally in the form "esbuild_platform_arch"
+ binary: label for the esbuild binary
+ exec_compatible_with: list of platform constraints
+ """
+
+ _esbuild_toolchain(
+ name = name,
+ binary = binary,
+ )
+
+ native.toolchain(
+ name = "%s_toolchain" % name,
+ exec_compatible_with = exec_compatible_with,
+ toolchain = name,
+ toolchain_type = TOOLCHAIN,
+ )
+
+def configure_esbuild_toolchains(name = "", platforms = {}):
+ """Configures esbuild toolchains for a list of supported platforms
+
+ Args:
+ name: unused
+ platforms: dict of platforms to configure toolchains for
+ """
+
+ for name, meta in platforms.items():
+ repo = "esbuild_%s" % name
+ configure_esbuild_toolchain(
+ name = repo,
+ binary = "@%s//:%s" % (repo, meta.binary_path),
+ exec_compatible_with = meta.exec_compatible_with,
+ )
diff --git a/scripts/update-esbuild-versions.js b/scripts/update-esbuild-versions.js
index e440c37fef..4b2436b332 100644
--- a/scripts/update-esbuild-versions.js
+++ b/scripts/update-esbuild-versions.js
@@ -1,13 +1,15 @@
-const https = require("https");
+const https = require('https');
const { exec } = require('shelljs');
const { mkdirSync, rmdirSync, createWriteStream, readFileSync, writeFileSync } = require('fs');
const { join } = require('path');
const { tmpdir } = require('os');
const PLATFORMS = {
- "esbuild_darwin": "esbuild-darwin-64",
- "esbuild_windows": "esbuild-windows-64",
- "esbuild_linux": "esbuild-linux-64"
+ "_DARWIN_AMD64": "esbuild-darwin-64",
+ "_DARWIN_ARM64": "esbuild-darwin-arm64",
+ "_LINUX_AMD64": "esbuild-linux-64",
+ "_LINUX_ARM64": "esbuild-linux-arm64",
+ "_WINDOWS_AMD64": "esbuild-windows-64"
}
function replaceFileContent(filepath, replacements) {
@@ -43,24 +45,15 @@ function downloadFile(url, dest) {
return new Promise((resolve, reject) => {
const file = createWriteStream(dest);
- const request = https.get(url, (response) => {
- response.pipe(file);
- });
-
+ https.get(url, (response) => response.pipe(file));
file.on('finish', () => {
file.end();
resolve();
- });
+ });
});
};
async function main() {
- const content = [];
- const fileReplacements = [];
-
- content.push('""" Generated code; do not edit\nUpdate by running yarn update-esbuild-versions\n\nHelper macro for fetching esbuild versions for internal tests and examples in rules_nodejs\n"""\n');
- content.push('load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")\n');
-
if(process.argv.length !== 2 && process.argv.length !== 3) {
console.log("Expected number of arguments is 0 or 1");
process.exit(1);
@@ -73,45 +66,20 @@ async function main() {
version = (await fetch('https://registry.npmjs.org/esbuild/latest')).version;
}
- content.push(`_VERSION = "${version}"\n`);
- fileReplacements.push([/_ESBUILD_VERSION = "(.+?)"/, version]);
-
- content.push('def esbuild_dependencies():');
- content.push(' """Helper to install required dependencies for the esbuild rules"""\n');
- content.push(' version = _VERSION\n');
-
const tmpDir = tmpdir();
mkdirSync(tmpDir, {recursive: true});
- for(const platform of Object.keys(PLATFORMS)) {
- const downloadUrl = `https://registry.npmjs.org/${PLATFORMS[platform]}/-/${PLATFORMS[platform]}-${version}.tgz`;
-
- const downloadPath = join(tmpDir, PLATFORMS[platform]);
- await downloadFile(downloadUrl, downloadPath);
- const shasumOutput = exec(`shasum -a 256 ${downloadPath}`, { silent: true }).stdout;
- const shasum = shasumOutput.split(' ')[0];
-
- fileReplacements.push([new RegExp(`"${platform}",.+?sha256 = "(.+?)"`, 's'), shasum]);
-
- content.push(' http_archive(');
- content.push(` name = "${platform}",`);
- content.push(' urls = [');
- content.push(` "https://registry.npmjs.org/${PLATFORMS[platform]}/-/${PLATFORMS[platform]}-%s.tgz" % version,`);
- content.push(' ],');
- content.push(' strip_prefix = "package",');
- content.push(` build_file_content = """exports_files(["${platform === 'esbuild_windows' ? 'esbuild.exe' : 'bin/esbuild'}"])""",`);
- content.push(` sha256 = "${shasum}",`);
- content.push(' )');
- }
-
+ const replacements = await Promise.all(Object.entries(PLATFORMS).map(async ([_var, platform]) => {
+ const downloadPath = join(tmpDir, platform);
- rmdirSync(tmpDir, {recursive: true});
+ await downloadFile(`https://registry.npmjs.org/${platform}/-/${platform}-${version}.tgz`, downloadPath);
+ const shasum = exec(`shasum -a 256 ${downloadPath}`, {silent: true}).stdout.split(' ')[0];
- console.log(content.join('\n'));
+ return [new RegExp(`${_var}_SHA = "(.+?)"`, 's'), shasum];
+ }));
- // replace shasums in some manually edited files
- replaceFileContent('examples/esbuild/WORKSPACE', fileReplacements);
- replaceFileContent('packages/esbuild/index.docs.bzl', fileReplacements);
+ replacements.push([/_VERSION = "(.+?)"/, version]);
+ replaceFileContent('packages/esbuild/esbuild_packages.bzl', replacements);
}
main();
\ No newline at end of file