diff --git a/packages/core/test/render3/load_domino.ts b/packages/core/test/render3/load_domino.ts index 3fa4a37ea8..8d9d549640 100644 --- a/packages/core/test/render3/load_domino.ts +++ b/packages/core/test/render3/load_domino.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - // Needed to run animation tests import 'zone.js/lib/node/rollup-main'; import '@angular/compiler'; // For JIT mode. Must be in front of any other @angular/* imports. diff --git a/packages/zone.js/test/node_bluebird_entry_point.ts b/packages/zone.js/test/node_bluebird_entry_point.ts index 41ca57f817..ae0da24027 100644 --- a/packages/zone.js/test/node_bluebird_entry_point.ts +++ b/packages/zone.js/test/node_bluebird_entry_point.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - // Must be loaded before zone loads, so that zone can detect WTF. import './test_fake_polyfill'; diff --git a/packages/zone.js/test/node_entry_point.ts b/packages/zone.js/test/node_entry_point.ts index f63265b69a..e63e7595d6 100644 --- a/packages/zone.js/test/node_entry_point.ts +++ b/packages/zone.js/test/node_entry_point.ts @@ -13,12 +13,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - // Must be loaded before zone loads, so that zone can detect WTF. import './node-env-setup'; import './test_fake_polyfill'; diff --git a/packages/zone.js/test/node_entry_point_no_patch_clock.ts b/packages/zone.js/test/node_entry_point_no_patch_clock.ts index 80d7c478bc..a91766407f 100644 --- a/packages/zone.js/test/node_entry_point_no_patch_clock.ts +++ b/packages/zone.js/test/node_entry_point_no_patch_clock.ts @@ -13,12 +13,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - // Must be loaded before zone loads, so that zone can detect WTF. import './node-env-setup'; import './test_fake_polyfill'; diff --git a/packages/zone.js/test/node_error_disable_policy_entry_point.ts b/packages/zone.js/test/node_error_disable_policy_entry_point.ts index 61eb31cc12..841039900d 100644 --- a/packages/zone.js/test/node_error_disable_policy_entry_point.ts +++ b/packages/zone.js/test/node_error_disable_policy_entry_point.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - process.env['errorpolicy'] = (global as any)['__Zone_Error_BlacklistedStackFrames_policy'] = 'disable'; import './node_error_entry_point'; diff --git a/packages/zone.js/test/node_error_lazy_policy_entry_point.ts b/packages/zone.js/test/node_error_lazy_policy_entry_point.ts index cb08a023cc..61b5e56093 100644 --- a/packages/zone.js/test/node_error_lazy_policy_entry_point.ts +++ b/packages/zone.js/test/node_error_lazy_policy_entry_point.ts @@ -6,11 +6,5 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - process.env['errorpolicy'] = (global as any)['__Zone_Error_BlacklistedStackFrames_policy'] = 'lazy'; import './node_error_entry_point'; diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 56618df1be..4d96e64f52 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -268,11 +268,16 @@ def jasmine_node_test(bootstrap = [], **kwargs): "@npm//source-map-support", "@npm//tslib", "@npm//xhr2", + "//tools/testing:bazel_patch_require.js", ] configuration_env_vars = kwargs.pop("configuration_env_vars", []) + [ "angular_ivy_enabled", ] - templated_args = kwargs.pop("templated_args", []) + templated_args = [ + # bazel_patch_require.js must be first + # TODO(gregmagolan): remove this once linker has been applied to nodejs_binary targets by default in rules_nodejs + "--node_options=--require=$(rlocation $(location //tools/testing:bazel_patch_require.js))", + ] + kwargs.pop("templated_args", []) for label in bootstrap: deps += [label] templated_args += ["--node_options=--require=$(rlocation $(location %s))" % label] diff --git a/tools/testing/BUILD.bazel b/tools/testing/BUILD.bazel index 705e4d562b..e29e450f40 100644 --- a/tools/testing/BUILD.bazel +++ b/tools/testing/BUILD.bazel @@ -2,6 +2,8 @@ load("//tools:defaults.bzl", "ts_library") package(default_visibility = ["//visibility:public"]) +exports_files(["bazel_patch_require.js"]) + ts_library( name = "browser", testonly = 1, diff --git a/tools/testing/bazel_patch_require.js b/tools/testing/bazel_patch_require.js new file mode 100644 index 0000000000..8b1d06f8e1 --- /dev/null +++ b/tools/testing/bazel_patch_require.js @@ -0,0 +1,26 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +// Load the Bazel Node runfiles helper script and patch the NodeJS module resolution. This is +// necessary to ensure that imports are properly resolved in Bazel. By default, the module +// resolution is patched in `nodejs_binary` targets when the main script loads, but since we +// --require boostrap scripts before the main script, this bootstrap script is loaded first so that +// subsequent bootstrap scripts can resolve their imports. +// +// We're in a valley with the runfiles support right now having removed the `bootstrap` attribute +// for rule_nodejs 1.0 but not applied the linker to run targets yet in rules_nodejs. In a near +// future rules_nodejs release, the runfiles helper won't be required as standard node module +// resolution works with the linker. +// +// We could have left the `bootstrap` attribute in for 1.0 and removed it for 2.0 but since we had +// an alternate approach that we're using here that isn't going to be broken in the future by the +// linker being added we decided to pull it for 1.0 so that we have fewer major breaking changes in +// 2.0. +if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { + require(process.env['BAZEL_NODE_RUNFILES_HELPER']).patchRequire(); +} diff --git a/tools/testing/init_node_spec.ts b/tools/testing/init_node_spec.ts index 54ec2186d2..7a0aa0eec6 100644 --- a/tools/testing/init_node_spec.ts +++ b/tools/testing/init_node_spec.ts @@ -6,12 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -// bootstrap the bazel require patch since this bootstrap script is loaded with -// `--node_options=--require=$(rlocation $(location script.js))` -if (process.env['BAZEL_NODE_RUNFILES_HELPER']) { - require(process.env['BAZEL_NODE_RUNFILES_HELPER'] as string).patchRequire(); -} - import 'zone.js/lib/node/rollup-main'; import 'zone.js/lib/zone-spec/long-stack-trace'; import 'zone.js/lib/zone-spec/task-tracking';