豆豆友情提示:这是一个非官方 GitHub 代理镜像,主要用于网络测试或访问加速。请勿在此进行登录、注册或处理任何敏感信息。进行这些操作请务必访问官方网站 github.com。 Raw 内容也通过此代理提供。
Skip to content

Commit 757d038

Browse files
committed
feat(bazel/spec-bundling): generate ESM mjs bundle for node spec bundles
1 parent 4505df9 commit 757d038

File tree

6 files changed

+60
-34
lines changed

6 files changed

+60
-34
lines changed

bazel/esbuild/index.bzl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,33 @@ def esbuild(
1919
**kwargs
2020
)
2121

22+
def esbuild_esm_bundle(name, **kwargs):
23+
"""ESBuild macro supports an ESM/CJS interop.
24+
25+
Args:
26+
name: Name of the target
27+
**kwargs: Other arguments passed to the `esbuild` rule.
28+
"""
29+
30+
args = dict(
31+
resolveExtensions = [".mjs", ".js"],
32+
outExtension = {".js": ".mjs"},
33+
# Workaround for: https://github.com/evanw/esbuild/issues/1921.
34+
banner = {
35+
"js": """
36+
import {createRequire as __cjsCompatRequire} from 'module';
37+
const require = __cjsCompatRequire(import.meta.url);
38+
""",
39+
},
40+
)
41+
42+
esbuild(
43+
name = name,
44+
format = "esm",
45+
args = args,
46+
**kwargs
47+
)
48+
2249
def esbuild_amd(name, entry_point, module_name, testonly = False, config = None, deps = [], **kwargs):
2350
"""Generates an AMD bundle for the specified entry-point with the given AMD module name."""
2451
expand_template(
@@ -47,6 +74,7 @@ def esbuild_amd(name, entry_point, module_name, testonly = False, config = None,
4774
testonly = testonly,
4875
deps = deps,
4976
entry_point = entry_point,
77+
format = "iife",
5078
config = "%s_config_lib" % name,
5179
**kwargs
5280
)

bazel/spec-bundling/esbuild.config-tmpl.mjs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,5 @@ export default {
2929
conditions: ['es2020', 'es2015', 'module'],
3030
// This ensures that we prioritize ES2020. RxJS would otherwise use the ESM5 output.
3131
mainFields: ['es2020', 'es2015', 'module', 'main'],
32-
// Use the `iife` format for the test entry-point as tests should run immediately.
33-
// For browser tests which are wrapped in an AMD header and footer, this works as well.
34-
format: 'iife',
3532
plugins,
3633
};

bazel/spec-bundling/index.bzl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
2-
load("//bazel/esbuild:index.bzl", "esbuild", "esbuild_amd", "esbuild_config")
2+
load("//bazel/esbuild:index.bzl", "esbuild_amd", "esbuild_config", "esbuild_esm_bundle")
33
load("//bazel/spec-bundling:spec-entrypoint.bzl", "spec_entrypoint")
44
load("//bazel/spec-bundling:bundle-config.bzl", "spec_bundle_config_file")
55

@@ -63,16 +63,16 @@ def spec_bundle(
6363

6464
# Browser tests (Karma) need named AMD modules to load.
6565
# TODO(devversion): consider updating `@bazel/concatjs` to support loading JS files directly.
66-
esbuild_rule = esbuild_amd if is_browser_test else esbuild
66+
esbuild_rule = esbuild_amd if is_browser_test else esbuild_esm_bundle
6767
amd_name = "%s/%s/%s" % (workspace_name, package_name, name + "_spec") if is_browser_test else None
6868

6969
esbuild_rule(
7070
name = "%s_bundle" % name,
7171
testonly = True,
7272
config = ":%s_config" % name,
73+
output = "%s_spec.%s" % (name, "js" if is_browser_test else "mjs"),
7374
entry_point = ":%s_spec_entrypoint" % name,
7475
module_name = amd_name,
75-
output = "%s_spec.js" % name,
7676
target = target,
7777
platform = platform,
7878
deps = deps + [":%s_spec_entrypoint" % name],

bazel/spec-bundling/test/BUILD.bazel

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
# NOTE: We need to test with the raw jasmine rule here because our default
2+
# repo rule uses spec-bundling as well, with some additional defaults.
3+
load("@npm//@bazel/jasmine:index.bzl", "jasmine_node_test")
14
load("//bazel/spec-bundling:index.bzl", "spec_bundle")
2-
load("//tools:defaults.bzl", "jasmine_node_test", "ts_library")
5+
load("//tools:defaults.bzl", "ts_library")
36

47
ts_library(
58
name = "test_lib",
@@ -19,7 +22,7 @@ spec_bundle(
1922

2023
jasmine_node_test(
2124
name = "test",
22-
specs = [
25+
deps = [
2326
":test_bundle",
2427
],
2528
)

ng-dev/utils/test/BUILD.bazel

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,8 @@ ts_library(
1414

1515
jasmine_node_test(
1616
name = "test",
17+
data = ["@npm//@yarnpkg/lockfile"],
18+
# Same reasoning as in "ng-dev/BUILD.bazel". This package cannot be bundled.
19+
external = ["@yarnpkg/lockfile"],
1720
specs = [":test_lib"],
1821
)

tools/esbuild.bzl

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
1-
load("//bazel/esbuild:index.bzl", _esbuild = "esbuild", _esbuild_config = "esbuild_config")
1+
load(
2+
"//bazel/esbuild:index.bzl",
3+
_esbuild = "esbuild",
4+
_esbuild_config = "esbuild_config",
5+
_esbuild_esm_bundle = "esbuild_esm_bundle",
6+
)
27
load("//bazel:extract_js_module_output.bzl", "extract_js_module_output")
38
load("@build_bazel_rules_nodejs//:index.bzl", "generated_file_test")
49

510
esbuild_config = _esbuild_config
611

7-
def esbuild(name, platform = "node", target = "node14", deps = [], **kwargs):
12+
def _esbuild_devmode_prioritize(
13+
esbuild_rule,
14+
name,
15+
platform = "node",
16+
target = "node14",
17+
deps = [],
18+
**kwargs):
819
# TODO: Rename once devmode and prodmode have been combined.
920
# This helps speeding up building as ESBuild (used internally by the rule) would
1021
# request both devmode and prodmode output flavor (resulting in 2x TS compilations).
@@ -19,39 +30,23 @@ def esbuild(name, platform = "node", target = "node14", deps = [], **kwargs):
1930
include_declarations = False,
2031
)
2132

22-
_esbuild(
33+
esbuild_rule(
2334
name = name,
2435
platform = platform,
2536
target = target,
2637
deps = [":%s_devmode_deps" % name],
2738
**kwargs
2839
)
2940

30-
def esbuild_esm_bundle(name, **kwargs):
31-
"""ESBuild macro that prioritizes ESM output and supports an ESM/CJS interop.
32-
33-
Args:
34-
name: Name of the target
35-
deps: List of dependencies
36-
**kwargs: Other arguments passed to the `esbuild` rule.
37-
"""
38-
39-
args = dict(
40-
resolveExtensions = [".mjs", ".js"],
41-
outExtension = {".js": ".mjs"},
42-
# Workaround for: https://github.com/evanw/esbuild/issues/1921.
43-
banner = {
44-
"js": """
45-
import {createRequire as __cjsCompatRequire} from 'module';
46-
const require = __cjsCompatRequire(import.meta.url);
47-
""",
48-
},
41+
def esbuild(**kwargs):
42+
_esbuild_devmode_prioritize(
43+
_esbuild,
44+
**kwargs
4945
)
5046

51-
esbuild(
52-
name = name,
53-
format = "esm",
54-
args = args,
47+
def esbuild_esm_bundle(**kwargs):
48+
_esbuild_devmode_prioritize(
49+
_esbuild_esm_bundle,
5550
**kwargs
5651
)
5752

0 commit comments

Comments
 (0)