From c6c2e568632bdd28102808472a519bbc87fdfe41 Mon Sep 17 00:00:00 2001 From: Matt Mackay Date: Wed, 26 May 2021 12:35:24 -0400 Subject: [PATCH] feat(esbuild): add support for toolchains --- WORKSPACE | 4 +- examples/esbuild/WORKSPACE | 36 +----- examples/esbuild/src/BUILD.bazel | 5 - packages/esbuild/BUILD.bazel | 24 ++-- packages/esbuild/esbuild.bzl | 15 +-- packages/esbuild/esbuild_repo.bzl | 42 ------- packages/esbuild/esbuild_repositories.bzl | 108 ++++++++++++++++++ packages/esbuild/index.docs.bzl | 59 +++------- .../esbuild/test/alias-mapping/BUILD.bazel | 2 +- packages/esbuild/test/bundle/BUILD.bazel | 2 +- packages/esbuild/test/css/BUILD.bazel | 2 +- packages/esbuild/test/define/BUILD.bazel | 2 +- packages/esbuild/test/entries/BUILD.bazel | 2 +- .../esbuild/test/external-flag/BUILD.bazel | 2 +- packages/esbuild/test/js-library/BUILD.bazel | 2 +- packages/esbuild/test/node/BUILD.bazel | 2 +- packages/esbuild/test/output/BUILD.bazel | 2 +- packages/esbuild/test/sourcemap/BUILD.bazel | 2 +- packages/esbuild/test/splitting/BUILD.bazel | 2 +- packages/esbuild/test/tests.bzl | 13 --- packages/esbuild/test/typescript/BUILD.bazel | 2 +- .../test/typescript/ts_as_srcs/BUILD.bazel | 2 +- packages/esbuild/test/vanilla_js/BUILD.bazel | 2 +- .../test/workspace-mapping/BUILD.bazel | 2 +- packages/esbuild/toolchain/BUILD.bazel | 29 +++++ packages/esbuild/toolchain/toolchain.bzl | 83 ++++++++++++++ 26 files changed, 277 insertions(+), 171 deletions(-) delete mode 100644 packages/esbuild/esbuild_repo.bzl create mode 100644 packages/esbuild/esbuild_repositories.bzl delete mode 100644 packages/esbuild/test/tests.bzl create mode 100644 packages/esbuild/toolchain/BUILD.bazel create mode 100644 packages/esbuild/toolchain/toolchain.bzl 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/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/packages/esbuild/BUILD.bazel b/packages/esbuild/BUILD.bazel index d9ff35e7aa..099325af6c 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,27 @@ copy_file( out = ":npm_version_check.js", ) -pkg_npm( - name = "npm_package", +filegroup( + name = "srcs", srcs = [ "esbuild.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_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..c3fc539e27 --- /dev/null +++ b/packages/esbuild/esbuild_repositories.bzl @@ -0,0 +1,108 @@ +""" +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") +load("@build_bazel_rules_nodejs//internal/common:check_version.bzl", "parse_version") + +_VERSION = "0.12.1" +_MIN_VERSION = "0.12.0" +_MAX_VERSION = "0.13.0" + +DARWIN_AMD64 = "darwin_amd64" +LINUX_AMD64 = "linux_amd64" +WINDOWS_AMD64 = "windows_amd64" + +ESBUILD_SHAS = dict({ + DARWIN_AMD64: "efb34692bfa34db61139eb8e46cd6cf767a42048f41c8108267279aaf58a948f", + LINUX_AMD64: "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a", + WINDOWS_AMD64: "10439647b11c7fd1d9647fd98d022fe2188b4877d2d0b4acbe857f4e764b17a9", +}) + +def _maybe(repo_rule, name, **kwargs): + if name not in native.existing_rules(): + repo_rule(name = name, **kwargs) + +def _esbuild_toolchain_repository_impl(repository_ctx): + content = "SUPPORTED_PLATFORMS = %s" % str(repository_ctx.attr.platforms) + repository_ctx.file("index.bzl", content = content) + repository_ctx.file("BUILD.bazel") + +_esbuild_toolchain_repository = repository_rule( + implementation = _esbuild_toolchain_repository_impl, + attrs = { + "platforms": attr.string_list( + mandatory = True, + ), + }, +) + +def esbuild_repositories(name = "esbuild_repositories", version = _VERSION, shas = ESBUILD_SHAS): + """Helper for fetching and setting up the esbuild versions and toolchains + + Args: + name: currently unused + version: version of esbuild to use + shas: mapping of platform_arch to the sha256 sum of the esbuild package for that platform + """ + + current_version = parse_version(version) + if not (current_version >= parse_version(_MIN_VERSION) and current_version < parse_version(_MAX_VERSION)): + fail("Expected esbuild version to be >= %s and < %s, but got %s" % (_MIN_VERSION, _MAX_VERSION, version)) + + shas = dict({}, **shas) + platforms = [] + + if DARWIN_AMD64 in shas: + _maybe( + http_archive, + name = "esbuild_darwin_amd64", + 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 = shas.pop(DARWIN_AMD64), + ) + platforms.append(DARWIN_AMD64) + + if WINDOWS_AMD64 in shas: + _maybe( + http_archive, + name = "esbuild_windows_amd64", + 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 = shas.pop(WINDOWS_AMD64), + ) + platforms.append(WINDOWS_AMD64) + + if LINUX_AMD64 in shas: + _maybe( + http_archive, + name = "esbuild_linux_amd64", + 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 = shas.pop(LINUX_AMD64), + ) + platforms.append(LINUX_AMD64) + + if len(shas.keys()) > 0: + fail( + "Unsupported platforms defined for esbuild repositories: %s\n" % ", ".join(shas.keys()) + + "To define a custom esbuild toolchain, see the rules_nodejs esbuild documentation pages", + ) + + _esbuild_toolchain_repository( + name = "esbuild_toolchains", + platforms = platforms, + ) + + for platform in platforms: + toolchain_label = Label("@build_bazel_rules_nodejs//packages/esbuild/toolchain:esbuild_%s_toolchain" % platform) + native.register_toolchains("@%s//%s:%s" % (toolchain_label.workspace_name, toolchain_label.package, toolchain_label.name)) diff --git a/packages/esbuild/index.docs.bzl b/packages/esbuild/index.docs.bzl index 038b9af9ae..d6a64b4922 100644 --- a/packages/esbuild/index.docs.bzl +++ b/packages/esbuild/index.docs.bzl @@ -16,57 +16,14 @@ 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 automaticly 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", -) - -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", -) +load("@npm//@bazel/esbuild:esbuild_repositories.bzl", "esbuild_repositories") -http_archive( - name = "esbuild_linux", - urls = [ - "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-%s.tgz" % _ESBUILD_VERSION, - ], - strip_prefix = "package", - build_file_content = \"""exports_files(["bin/esbuild"])\""", - sha256 = "de8409b90ec3c018ffd899b49ed5fc462c61b8c702ea0f9da013e0e1cd71549a", -) +esbuild_repositories() ``` -These can then be referenced on the `tool` attribute of the `esbuild` rule. - -```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", - }), -) -``` - -It might be useful to wrap this locally in a macro for better reuseability, see `packages/esbuild/test/tests.bzl` for an example. - 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 @@ -116,8 +73,18 @@ 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 # DO NOT ADD MORE rules here unless they appear in the generated docsite. # Run yarn stardoc to re-generate the docsite. 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..8599ede98e --- /dev/null +++ b/packages/esbuild/toolchain/BUILD.bazel @@ -0,0 +1,29 @@ +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") +load("@esbuild_toolchains//:index.bzl", "SUPPORTED_PLATFORMS") +load(":toolchain.bzl", "configure_esbuild_toolchains") + +toolchain_type( + name = "toolchain_type", + visibility = ["//visibility:public"], +) + +configure_esbuild_toolchains( + platforms = SUPPORTED_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..d01d377021 --- /dev/null +++ b/packages/esbuild/toolchain/toolchain.bzl @@ -0,0 +1,83 @@ +"""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: list of platforms to configure toolchains for + """ + + if "darwin_amd64" in platforms: + configure_esbuild_toolchain( + name = "esbuild_darwin_amd64", + binary = "@esbuild_darwin_amd64//:bin/esbuild", + exec_compatible_with = [ + "@platforms//os:macos", + "@platforms//cpu:x86_64", + ], + ) + + if "linux_amd64" in platforms: + configure_esbuild_toolchain( + name = "esbuild_linux_amd64", + binary = "@esbuild_linux_amd64//:bin/esbuild", + exec_compatible_with = [ + "@platforms//os:linux", + "@platforms//cpu:x86_64", + ], + ) + + if "windows_amd64" in platforms: + configure_esbuild_toolchain( + name = "esbuild_windows_amd64", + binary = "@esbuild_windows_amd64//:esbuild.exe", + exec_compatible_with = [ + "@platforms//os:windows", + "@platforms//cpu:x86_64", + ], + )