on the page.
+ browser.wait(ExpectedConditions.presenceOf(element(by.css('div.ts1'))), timeoutMs);
+ }, timeoutMs);
+
+ it('should display: Hello, TypeScript today is May 7, 2019', (done) => {
+ const div = element(by.css('div.ts1'));
+ div.getText().then(t => expect(t).toEqual(`Hello, TypeScript today is May 7, 2019`));
+ done();
+ });
+
+ it('should display: firstname: foo', (done) => {
+ const div = element(by.css('div.entrypoint-browser'));
+ div.getText().then(t => expect(t).toEqual(`firstname: foo`));
+ done();
+ });
+
+ it('should display: rxjs works with modules!', (done) => {
+ const div = element(by.css('div.entrypoint-module'));
+ div.getText().then(t => expect(t).toEqual(`rxjs works with modules!`));
+ done();
+ });
+});
diff --git a/e2e/concatjs_devserver_directory_artifacts/dummy_test.sh b/e2e/concatjs_devserver_directory_artifacts/dummy_test.sh
new file mode 100755
index 0000000000..ea29726125
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/dummy_test.sh
@@ -0,0 +1,2 @@
+echo "Just a dummy test so that we have a test target for //... on certain bazelci platforms with bazel_integration_test"
+exit 0
\ No newline at end of file
diff --git a/e2e/concatjs_devserver_directory_artifacts/genrule/BUILD.bazel b/e2e/concatjs_devserver_directory_artifacts/genrule/BUILD.bazel
new file mode 100644
index 0000000000..186858b13c
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/genrule/BUILD.bazel
@@ -0,0 +1,80 @@
+# Copyright 2017 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+load("@npm//@bazel/concatjs:index.bzl", "concatjs_devserver")
+load("@npm//@bazel/protractor:index.bzl", "protractor_web_test_suite")
+load("@npm//@bazel/typescript:index.bzl", "ts_project")
+
+ts_project(
+ name = "compile",
+ srcs = [
+ "app.ts",
+ "app_e2e-spec.ts",
+ ],
+ declaration = True,
+ extends = "//:tsconfig.json",
+ tsconfig = ":tsconfig.json",
+ validate = False,
+ deps = [
+ "@npm//@types",
+ "@npm//protractor",
+ ],
+)
+
+js_library(
+ name = "lib",
+ named_module_srcs = [":compile"],
+ deps = [":compile"],
+)
+
+concatjs_devserver(
+ name = "devserver",
+ additional_root_paths = [
+ "npm/node_modules/tslib",
+ "concatjs_devserver_directory_artifacts/genrule/devserver/",
+ ],
+ serving_path = "/bundle.js",
+ static_files = [
+ # Files you want to import from the "additional_root_paths", still need to be explicitly specified
+ # as files that should be served. The root paths just make it more convenient to import those dependencies.
+ "@npm//tslib",
+ ":say-hello",
+ ":show-host",
+ ":index.html",
+ ],
+ # Dependencies that produce JavaScript output will be automatically picked up by ConcatJS and will be
+ # part of the serving_path bundle.
+ deps = [":lib"],
+)
+
+genrule(
+ name = "say-hello",
+ outs = ["say-hello.js"],
+ cmd = "echo 'var el = document.createElement(\"div\"); el.innerText = \"Hello, genrule\"; el.className = \"ts2\"; document.body.appendChild(el);' > $@",
+)
+
+genrule(
+ name = "show-host",
+ outs = ["test/show-host.js"],
+ cmd = "echo 'var el = document.createElement(\"div\"); el.innerText = location.host; el.className = \"ts3\"; document.body.appendChild(el);' > $@",
+)
+
+protractor_web_test_suite(
+ name = "devserver_test",
+ on_prepare = "//:protractor.on-prepare.js",
+ protractor_entry_point = {"@npm//:node_modules/protractor": "bin/protractor"},
+ server = ":devserver",
+ deps = [":lib"],
+)
diff --git a/e2e/concatjs_devserver_directory_artifacts/genrule/app.ts b/e2e/concatjs_devserver_directory_artifacts/genrule/app.ts
new file mode 100644
index 0000000000..ffaab3b7c5
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/genrule/app.ts
@@ -0,0 +1,6 @@
+///
+
+const el: HTMLDivElement = document.createElement('div');
+el.innerText = 'Hello, TypeScript';
+el.className = 'ts1';
+document.body.appendChild(el);
diff --git a/e2e/concatjs_devserver_directory_artifacts/genrule/app_e2e-spec.ts b/e2e/concatjs_devserver_directory_artifacts/genrule/app_e2e-spec.ts
new file mode 100644
index 0000000000..21007a2aa9
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/genrule/app_e2e-spec.ts
@@ -0,0 +1,40 @@
+///
+
+import {browser, by, element, ExpectedConditions} from 'protractor';
+
+// This test uses Protractor without Angular, so disable Angular features
+browser.waitForAngularEnabled(false);
+
+// Since we don't have a protractor bazel rule yet, the test is brought up in
+// parallel with building the service under test. So the timeout must include
+// compiling the application as well as starting the server.
+const timeoutMs = 90 * 1000;
+
+describe('app', () => {
+ beforeAll(() => {
+ browser.get('');
+ // Don't run any specs until we see a
on the page.
+ browser.wait(ExpectedConditions.presenceOf(element(by.css('div.ts1'))), timeoutMs);
+ browser.wait(ExpectedConditions.presenceOf(element(by.css('div.ts2'))), timeoutMs);
+ browser.wait(ExpectedConditions.presenceOf(element(by.css('div.ts3'))), timeoutMs);
+ }, timeoutMs);
+
+ it('should display: Hello, TypeScript', async (done) => {
+ const text = await element(by.css('div.ts1')).getText();
+ expect(text).toEqual(`Hello, TypeScript`);
+ done();
+ });
+
+ it('should display: Hello, genrule', async (done) => {
+ const text = await element(by.css('div.ts2')).getText();
+ expect(text).toEqual(`Hello, genrule`);
+ done();
+ });
+
+ it('should display: location.host', async (done) => {
+ const currentUrl = await browser.getCurrentUrl();
+ const text = await element(by.css('div.ts3')).getText();
+ expect(`http://${text}/`).toEqual(currentUrl);
+ done();
+ });
+});
diff --git a/e2e/concatjs_devserver_directory_artifacts/genrule/index.html b/e2e/concatjs_devserver_directory_artifacts/genrule/index.html
new file mode 100644
index 0000000000..ea6948801f
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/genrule/index.html
@@ -0,0 +1,16 @@
+
+
+
Devserver example
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/e2e/concatjs_devserver_directory_artifacts/genrule/tsconfig.json b/e2e/concatjs_devserver_directory_artifacts/genrule/tsconfig.json
new file mode 100644
index 0000000000..20395ceb30
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/genrule/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../tsconfig.json",
+ "files": [
+ "app_e2e-spec.ts",
+ "app.ts"
+ ]
+}
diff --git a/e2e/concatjs_devserver_directory_artifacts/package.json b/e2e/concatjs_devserver_directory_artifacts/package.json
new file mode 100644
index 0000000000..a6dc230650
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/package.json
@@ -0,0 +1,20 @@
+{
+ "dependencies": {
+ "@bazel/concatjs": "^3.5.1",
+ "@bazel/protractor": "^3.5.1",
+ "@bazel/typescript": "^3.5.1",
+ "@types/jasmine": "3.7.5",
+ "@types/node": "15.6.1",
+ "date-fns": "1.30.1",
+ "html-insert-assets": "0.14.2",
+ "jasmine": "3.7.0",
+ "protractor": "7.0.0",
+ "rxjs": "7.1.0",
+ "tslib": "2.2.0",
+ "typeorm": "0.2.17",
+ "typescript": "3.9.9"
+ },
+ "scripts": {
+ "test": "bazel test ..."
+ }
+}
diff --git a/e2e/concatjs_devserver_directory_artifacts/protractor.on-prepare.js b/e2e/concatjs_devserver_directory_artifacts/protractor.on-prepare.js
new file mode 100644
index 0000000000..d9082390c2
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/protractor.on-prepare.js
@@ -0,0 +1,21 @@
+// The function exported from this file is used by the protractor_web_test_suite.
+// It is passed to the `onPrepare` configuration setting in protractor and executed
+// before running tests.
+//
+// If the function returns a promise, as it does here, protractor will wait
+// for the promise to resolve before running tests.
+
+const protractorUtils = require('@bazel/protractor/protractor-utils');
+const protractor = require('protractor');
+
+module.exports = function(config) {
+ // In this example, `@bazel/protractor/protractor-utils` is used to run
+ // the server. protractorUtils.runServer() runs the server on a randomly
+ // selected port (given a port flag to pass to the server as an argument).
+ // The port used is returned in serverSpec and the protractor serverUrl
+ // is the configured.
+ return protractorUtils.runServer(config.workspace, config.server, '-port', [])
+ .then(serverSpec => {
+ protractor.browser.baseUrl = `http://localhost:${serverSpec.port}`;
+ });
+};
diff --git a/e2e/concatjs_devserver_directory_artifacts/red-body-style.css b/e2e/concatjs_devserver_directory_artifacts/red-body-style.css
new file mode 100644
index 0000000000..5c5e887d76
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/red-body-style.css
@@ -0,0 +1,3 @@
+body {
+ background: red;
+}
diff --git a/e2e/concatjs_devserver_directory_artifacts/subpackage/BUILD.bazel b/e2e/concatjs_devserver_directory_artifacts/subpackage/BUILD.bazel
new file mode 100644
index 0000000000..01ef626b84
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/subpackage/BUILD.bazel
@@ -0,0 +1,70 @@
+# Copyright 2017 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+load("@npm//@bazel/concatjs:index.bzl", "concatjs_devserver")
+load("@npm//@bazel/protractor:index.bzl", "protractor_web_test_suite")
+load("@npm//@bazel/typescript:index.bzl", "ts_project")
+load("@npm//html-insert-assets:index.bzl", "html_insert_assets")
+
+html_insert_assets(
+ name = "inject",
+ outs = ["index.html"],
+ args = [
+ "--html=$(execpath index.tmpl.html)",
+ "--out=$@",
+ "--roots=$(RULEDIR)",
+ "--assets",
+ "$(execpath //:red-body-style.css)",
+ ],
+ data = [
+ "index.tmpl.html",
+ "//:red-body-style.css",
+ ],
+)
+
+concatjs_devserver(
+ name = "devserver",
+ static_files = [
+ "inject",
+ "//:red-body-style.css",
+ ],
+)
+
+ts_project(
+ name = "compile",
+ srcs = ["subpackage_e2e-spec.ts"],
+ declaration = True,
+ extends = "//:tsconfig.json",
+ tsconfig = ":tsconfig.json",
+ validate = False,
+ deps = [
+ "@npm//@types",
+ "@npm//protractor",
+ ],
+)
+
+js_library(
+ name = "lib",
+ named_module_srcs = [":compile"],
+ deps = [":compile"],
+)
+
+protractor_web_test_suite(
+ name = "devserver_test",
+ on_prepare = "//:protractor.on-prepare.js",
+ protractor_entry_point = {"@npm//:node_modules/protractor": "bin/protractor"},
+ server = ":devserver",
+ deps = [":lib"],
+)
diff --git a/e2e/concatjs_devserver_directory_artifacts/subpackage/index.tmpl.html b/e2e/concatjs_devserver_directory_artifacts/subpackage/index.tmpl.html
new file mode 100644
index 0000000000..4ea2bf3c14
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/subpackage/index.tmpl.html
@@ -0,0 +1,10 @@
+
+
+
+
+
Subpackage Devserver
+
+
+ This is the devserver for a Bazel subpackage.
+
+
diff --git a/e2e/concatjs_devserver_directory_artifacts/subpackage/subpackage_e2e-spec.ts b/e2e/concatjs_devserver_directory_artifacts/subpackage/subpackage_e2e-spec.ts
new file mode 100644
index 0000000000..47a8dcd419
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/subpackage/subpackage_e2e-spec.ts
@@ -0,0 +1,18 @@
+///
+
+import {browser, by, element} from 'protractor';
+
+describe('subpackage', () => {
+ beforeAll(async () => {
+ await browser.waitForAngularEnabled(false);
+ await browser.get('');
+ });
+
+ // Ensures that the "concatjs_devserver" properly injects and loads static files which
+ // are in the current workspace, but not part of the current Bazel package. See
+ // related issue: https://github.com/bazelbuild/rules_typescript/issues/409
+ it('should be able to properly load the injected CSS file', async () => {
+ const bodyElement = element(by.css('body'));
+ expect(await bodyElement.getCssValue('background')).toContain('rgb(255, 0, 0)');
+ });
+});
diff --git a/e2e/concatjs_devserver_directory_artifacts/subpackage/tsconfig.json b/e2e/concatjs_devserver_directory_artifacts/subpackage/tsconfig.json
new file mode 100644
index 0000000000..871adab383
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/subpackage/tsconfig.json
@@ -0,0 +1,6 @@
+{
+ "extends": "../tsconfig.json",
+ "files": [
+ "subpackage_e2e-spec.ts"
+ ]
+}
diff --git a/e2e/concatjs_devserver_directory_artifacts/tsconfig.json b/e2e/concatjs_devserver_directory_artifacts/tsconfig.json
new file mode 100644
index 0000000000..4a74a37d61
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/tsconfig.json
@@ -0,0 +1,30 @@
+{
+ "compilerOptions": {
+ "target": "es2015",
+ "module": "umd",
+ "downlevelIteration": true,
+ "skipDefaultLibCheck": true,
+ "skipLibCheck": true,
+ "moduleResolution": "node",
+ "preserveConstEnums": false,
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true,
+ "jsx": "react",
+ "noErrorTruncation": false,
+ "noEmitOnError": false,
+ "declaration": true,
+ "stripInternal": true,
+ "inlineSourceMap": true,
+ "inlineSources": true,
+ "sourceMap": false,
+ "typeRoots": [
+ "node_modules/@types",
+ "../node_modules/@types"
+ ],
+ "types": ["jasmine"]
+ },
+ "files": [
+ "app_e2e-spec.ts",
+ "app.ts"
+ ]
+}
diff --git a/e2e/concatjs_devserver_directory_artifacts/yarn.lock b/e2e/concatjs_devserver_directory_artifacts/yarn.lock
new file mode 100644
index 0000000000..687b0cb5a0
--- /dev/null
+++ b/e2e/concatjs_devserver_directory_artifacts/yarn.lock
@@ -0,0 +1,1597 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@bazel/concatjs@^3.5.1":
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/@bazel/concatjs/-/concatjs-3.5.1.tgz#0e0ae61051a8e72e364739dc51c3e050d87fb2ab"
+ integrity sha512-Cbj/cSBv2PGBfv5Stov6PX2dNZoYpyOxI/+BWutMevhz1cYQAcJNbS+usbnrVY34bbo+5YRIoAzJg4E4Up4WQw==
+ dependencies:
+ protobufjs "6.8.8"
+ source-map-support "0.5.9"
+ tsutils "2.27.2"
+
+"@bazel/protractor@^3.5.1":
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/@bazel/protractor/-/protractor-3.5.1.tgz#a17d6193e29b4eb614c2d4cbb8637c20e2b5f01c"
+ integrity sha512-WRgA1Ihx7yqaDtNsL0yryMDRH9pKOneN5R/JjttIya/xspaUOHJHqB0+5PuVji91OI2OWjUkTuKJD0IYdgsv4A==
+
+"@bazel/typescript@^3.5.1":
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-3.5.1.tgz#c6027d683adeefa2c3cebfa3ed5efa17c405a63b"
+ integrity sha512-dU5sGgaGdFWV1dJ1B+9iFbttgcKtmob+BvlM8mY7Nxq4j7/wVbgPjiVLOBeOD7kpzYep8JHXfhAokHt486IG+Q==
+ dependencies:
+ protobufjs "6.8.8"
+ semver "5.6.0"
+ source-map-support "0.5.9"
+ tsutils "2.27.2"
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha1-m4sMxmPWaafY9vXQiToU00jzD78=
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha1-NVy8mLr61ZePntCV85diHx0Ga3A=
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=
+
+"@types/jasmine@3.7.5":
+ version "3.7.5"
+ resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.7.5.tgz#c0b2c3e4cf19f7f2db6ddf27d27552f6de1a264d"
+ integrity sha512-BVi20hbOxJvPGOgK7Hpsr4Hc9O4BUxq4liNl8i/8spbPsBJgRp6KhHDORFaMIdLVGdjiakrDQWRQEaQoUe3LIw==
+
+"@types/long@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.0.tgz#719551d2352d301ac8b81db732acb6bdc28dbdef"
+ integrity sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==
+
+"@types/node@15.6.1":
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.1.tgz#32d43390d5c62c5b6ec486a9bc9c59544de39a08"
+ integrity sha512-7EIraBEyRHEe7CH+Fm1XvgqU6uwZN8Q7jppJGcqjROMT29qhAuuOxYB1uEY5UMYQKEmA5D+5tBnhdaPXSsLONA==
+
+"@types/node@^10.1.0":
+ version "10.14.21"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.21.tgz#4a9db7ef1d1671c0015e632c5fa3d46c86c58c1e"
+ integrity sha512-nuFlRdBiqbF+PJIEVxm2jLFcQWN7q7iWEJGsBV4n7v1dbI9qXB8im2pMMKMCUZe092sQb5SQft2DHfuQGK5hqQ==
+
+"@types/q@^0.0.32":
+ version "0.0.32"
+ resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5"
+ integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU=
+
+"@types/selenium-webdriver@^3.0.0":
+ version "3.0.17"
+ resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz#50bea0c3c2acc31c959c5b1e747798b3b3d06d4b"
+ integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==
+
+adm-zip@^0.4.9:
+ version "0.4.16"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
+ integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
+
+agent-base@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
+ integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
+ dependencies:
+ es6-promisify "^5.0.0"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
+app-root-path@^2.0.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.2.1.tgz#d0df4a682ee408273583d43f6f79e9892624bc9a"
+ integrity sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+ integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
+
+arrify@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+blocking-proxy@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2"
+ integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==
+ dependencies:
+ minimist "^1.2.0"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browserstack@^1.5.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.6.1.tgz#e051f9733ec3b507659f395c7a4765a1b1e358b3"
+ integrity sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==
+ dependencies:
+ https-proxy-agent "^2.2.1"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer@^5.1.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+cli-highlight@^2.0.0:
+ version "2.1.11"
+ resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf"
+ integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==
+ dependencies:
+ chalk "^4.0.0"
+ highlight.js "^10.7.1"
+ mz "^2.4.0"
+ parse5 "^5.1.1"
+ parse5-htmlparser2-tree-adapter "^6.0.0"
+ yargs "^16.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-fns@1.30.1:
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
+ integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.1:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+ integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+del@^2.2.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+dotenv@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-6.2.0.tgz#941c0410535d942c8becf28d3f357dbd9d476064"
+ integrity sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+ dependencies:
+ es6-promise "^4.0.3"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+figlet@^1.1.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.5.0.tgz#2db4d00a584e5155a96080632db919213c3e003c"
+ integrity sha512-ZQJM4aifMpz6H19AW1VqvZ7l4pOE9p7i/3LyxgO2kp+PO/VcDYNqIHEMtkccqIhTXMKci4kjueJr/iCQEaT/Ww==
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.6, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6:
+ version "7.1.7"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+highlight.js@^10.7.1:
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360"
+ integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg==
+
+html-insert-assets@0.14.2:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/html-insert-assets/-/html-insert-assets-0.14.2.tgz#134ccfbfcc847ddc37b4e4a610c29ccfd846eea8"
+ integrity sha512-6jx1Btu9D1iGlSTLMEHsqSqt0c1WJVhGNz4bEjDQ9y17JpB+GVUzr8M0MXjwPpQHDtiWdTdQ3qvPMlLzNmDXaw==
+ dependencies:
+ mkdirp "^1.0.3"
+ parse5 "^6.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-proxy-agent@^2.2.1:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b"
+ integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==
+ dependencies:
+ agent-base "^4.3.0"
+ debug "^3.1.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@~3.0.5:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+ integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+ integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+ integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+ integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+jasmine-core@~2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e"
+ integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=
+
+jasmine-core@~3.7.0:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.7.1.tgz#0401327f6249eac993d47bbfa18d4e8efacfb561"
+ integrity sha512-DH3oYDS/AUvvr22+xUBW62m1Xoy7tUlY1tsxKEJvl5JeJ7q8zd1K5bUwiOxdH+erj6l2vAMM3hV25Xs9/WrmuQ==
+
+jasmine@2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e"
+ integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4=
+ dependencies:
+ exit "^0.1.2"
+ glob "^7.0.6"
+ jasmine-core "~2.8.0"
+
+jasmine@3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.7.0.tgz#d36638c0c815e6ad5666676e386d79e2ccb70835"
+ integrity sha512-wlzGQ+cIFzMEsI+wDqmOwvnjTvolLFwlcpYLCqSPPH0prOQaW3P+IzMhHYn934l1imNvw07oCyX+vGUv3wmtSQ==
+ dependencies:
+ glob "^7.1.6"
+ jasmine-core "~3.7.0"
+
+jasminewd2@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e"
+ integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+jszip@^3.1.3:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.6.0.tgz#839b72812e3f97819cc13ac4134ffced95dd6af9"
+ integrity sha512-jgnQoG9LKnWO3mnVNBnfhkh0QknICd1FGSrXcgrl67zioyJ4wgx25o9ZqwNtrROSflGBCGYnJfjrIyRIby1OoQ==
+ dependencies:
+ lie "~3.3.0"
+ pako "~1.0.2"
+ readable-stream "~2.3.6"
+ set-immediate-shim "~1.0.1"
+
+lie@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
+ integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
+ dependencies:
+ immediate "~3.0.5"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+mime-db@1.47.0:
+ version "1.47.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+ integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.30"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
+ integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ dependencies:
+ mime-db "1.47.0"
+
+minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mkdirp@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mz@^2.4.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+ integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+os-tmpdir@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parent-require@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977"
+ integrity sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=
+
+parse5-htmlparser2-tree-adapter@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
+ integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
+ dependencies:
+ parse5 "^6.0.1"
+
+parse5@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+ integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
+
+parse5@^6.0.0, parse5@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-is-inside@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+ integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+protobufjs@6.8.8:
+ version "6.8.8"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.8.8.tgz#c8b4f1282fd7a90e6f5b109ed11c84af82908e7c"
+ integrity sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.0"
+ "@types/node" "^10.1.0"
+ long "^4.0.0"
+
+protractor@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/protractor/-/protractor-7.0.0.tgz#c3e263608bd72e2c2dc802b11a772711a4792d03"
+ integrity sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==
+ dependencies:
+ "@types/q" "^0.0.32"
+ "@types/selenium-webdriver" "^3.0.0"
+ blocking-proxy "^1.0.0"
+ browserstack "^1.5.1"
+ chalk "^1.1.3"
+ glob "^7.0.3"
+ jasmine "2.8.0"
+ jasminewd2 "^2.1.0"
+ q "1.4.1"
+ saucelabs "^1.5.0"
+ selenium-webdriver "3.6.0"
+ source-map-support "~0.4.0"
+ webdriver-js-extender "2.1.0"
+ webdriver-manager "^12.1.7"
+ yargs "^15.3.1"
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+q@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e"
+ integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=
+
+q@^1.4.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+ integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+readable-stream@~2.3.6:
+ version "2.3.7"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+reflect-metadata@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
+ integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
+
+request@^2.87.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rxjs@7.1.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.1.0.tgz#94202d27b19305ef7b1a4f330277b2065df7039e"
+ integrity sha512-gCFO5iHIbRPwznl6hAYuwNFld8W4S2shtSJIqG27ReWXo9IWrCyEICxUA+6vJHwSR/OakoenC4QsDxq50tzYmw==
+ dependencies:
+ tslib "~2.1.0"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+saucelabs@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d"
+ integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==
+ dependencies:
+ https-proxy-agent "^2.2.1"
+
+sax@>=0.6.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+ integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc"
+ integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==
+ dependencies:
+ jszip "^3.1.3"
+ rimraf "^2.5.4"
+ tmp "0.0.30"
+ xml2js "^0.4.17"
+
+semver@5.6.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+ integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
+
+semver@^5.3.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-immediate-shim@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+ integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=
+
+source-map-support@0.5.9:
+ version "0.5.9"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
+ integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@~0.4.0:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+ integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+ integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ dependencies:
+ any-promise "^1.0.0"
+
+tmp@0.0.30:
+ version "0.0.30"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed"
+ integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=
+ dependencies:
+ os-tmpdir "~1.0.1"
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tslib@2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+ integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
+tslib@^1.8.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
+ integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
+
+tslib@^1.9.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
+ integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
+
+tsutils@2.27.2:
+ version "2.27.2"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.27.2.tgz#60ba88a23d6f785ec4b89c6e8179cac9b431f1c7"
+ integrity sha512-qf6rmT84TFMuxAKez2pIfR8UCai49iQsfB7YWVjV1bKpy/d0PWT5rEOSM6La9PiHZ0k1RRZQiwVdVJfQ3BPHgg==
+ dependencies:
+ tslib "^1.8.1"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+typeorm@0.2.17:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.17.tgz#eb98e9eeb2ce0dfc884620f49de0aeca3dc4e027"
+ integrity sha512-a2Yi6aG7qcSQNyYHjAZtRwhuMKt/ZPmNQg8PvpgF52Z3AgJ4LL4T5mtpfTzKgNzM4o4wP0JQcZNoGGlaRovKpw==
+ dependencies:
+ app-root-path "^2.0.1"
+ buffer "^5.1.0"
+ chalk "^2.4.2"
+ cli-highlight "^2.0.0"
+ debug "^4.1.1"
+ dotenv "^6.2.0"
+ glob "^7.1.2"
+ js-yaml "^3.13.1"
+ mkdirp "^0.5.1"
+ reflect-metadata "^0.1.13"
+ tslib "^1.9.0"
+ xml2js "^0.4.17"
+ yargonaut "^1.1.2"
+ yargs "^13.2.1"
+
+typescript@3.9.9:
+ version "3.9.9"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674"
+ integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+webdriver-js-extender@2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7"
+ integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==
+ dependencies:
+ "@types/selenium-webdriver" "^3.0.0"
+ selenium-webdriver "^3.0.1"
+
+webdriver-manager@^12.1.7:
+ version "12.1.8"
+ resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4"
+ integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==
+ dependencies:
+ adm-zip "^0.4.9"
+ chalk "^1.1.1"
+ del "^2.2.0"
+ glob "^7.0.3"
+ ini "^1.3.4"
+ minimist "^1.2.0"
+ q "^1.4.1"
+ request "^2.87.0"
+ rimraf "^2.5.2"
+ semver "^5.3.0"
+ xml2js "^0.4.17"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+ integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+xml2js@^0.4.17:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66"
+ integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yargonaut@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.4.tgz#c64f56432c7465271221f53f5cc517890c3d6e0c"
+ integrity sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==
+ dependencies:
+ chalk "^1.1.1"
+ figlet "^1.1.1"
+ parent-require "^1.0.0"
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^20.2.2:
+ version "20.2.7"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.7.tgz#61df85c113edfb5a7a4e36eb8aa60ef423cbc90a"
+ integrity sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==
+
+yargs@^13.2.1:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yargs@^15.3.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yargs@^16.0.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
diff --git a/examples/BUILD.bazel b/examples/BUILD.bazel
index dc52fc0760..319bba55e2 100644
--- a/examples/BUILD.bazel
+++ b/examples/BUILD.bazel
@@ -154,6 +154,12 @@ example_integration_test(
example_integration_test(
name = "examples_webapp",
+ bazel_commands = [
+ "info",
+ # enable runfiles explicitly so it is on for Windows since directory
+ # artifacts requires runfiles
+ "test ... --enable_runfiles",
+ ],
npm_packages = {
"//packages/protractor:npm_package": "@bazel/protractor",
"//packages/rollup:npm_package": "@bazel/rollup",
diff --git a/examples/parcel/WORKSPACE b/examples/parcel/WORKSPACE
index fb13df53e5..fa2d0a3d1a 100644
--- a/examples/parcel/WORKSPACE
+++ b/examples/parcel/WORKSPACE
@@ -29,6 +29,7 @@ load("@build_bazel_rules_nodejs//:index.bzl", "npm_install")
npm_install(
name = "npm",
+ exports_directories_only = True,
package_json = "//:package.json",
package_lock_json = "//:package-lock.json",
)
diff --git a/examples/webapp/BUILD.bazel b/examples/webapp/BUILD.bazel
index f125b72503..4a5cc9ef49 100644
--- a/examples/webapp/BUILD.bazel
+++ b/examples/webapp/BUILD.bazel
@@ -19,6 +19,7 @@ protractor_web_test_suite(
name = "server_test",
srcs = ["app.spec.js"],
on_prepare = ":protractor.on-prepare.js",
+ protractor_entry_point = {"@npm_deps//:node_modules/protractor": "bin/protractor"},
server = ":server",
)
diff --git a/examples/webapp/WORKSPACE b/examples/webapp/WORKSPACE
index 444a7614cf..376286ec47 100644
--- a/examples/webapp/WORKSPACE
+++ b/examples/webapp/WORKSPACE
@@ -29,6 +29,7 @@ load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install")
yarn_install(
name = "npm_deps",
+ exports_directories_only = True,
package_json = "//:package.json",
yarn_lock = "//:yarn.lock",
)
diff --git a/internal/js_library/js_library.bzl b/internal/js_library/js_library.bzl
index fea085a492..6b5341e27c 100644
--- a/internal/js_library/js_library.bzl
+++ b/internal/js_library/js_library.bzl
@@ -216,7 +216,7 @@ def _impl(ctx):
),
]
- if ctx.attr.package_name == "$node_modules$":
+ if ctx.attr.package_name == "$node_modules$" or ctx.attr.package_name == "$node_modules_dir$":
# special case for external npm deps
workspace_name = ctx.label.workspace_name if ctx.label.workspace_name else ctx.workspace_name
providers.append(ExternalNpmPackageInfo(
@@ -224,6 +224,7 @@ def _impl(ctx):
sources = depset(transitive = npm_sources_depsets),
workspace = workspace_name,
path = ctx.attr.package_path,
+ has_directories = (ctx.attr.package_name == "$node_modules_dir$"),
))
else:
providers.append(LinkablePackageInfo(
@@ -233,15 +234,24 @@ def _impl(ctx):
files = depset(transitive = direct_sources_depsets),
))
- # Don't provide DeclarationInfo if there are no typings to provide.
- # Improves error messaging downstream if DeclarationInfo is required.
if len(typings) or len(typings_depsets) > 1:
+ # Don't provide DeclarationInfo if there are no typings to provide.
+ # Improves error messaging downstream if DeclarationInfo is required.
decls = depset(transitive = typings_depsets)
providers.append(declaration_info(
declarations = decls,
deps = ctx.attr.deps,
))
providers.append(OutputGroupInfo(types = decls))
+ elif ctx.attr.package_name == "$node_modules_dir$":
+ # If this is directory artifacts npm package then always provide declaration_info
+ # since we can't scan through files
+ decls = depset(transitive = files_depsets)
+ providers.append(declaration_info(
+ declarations = decls,
+ deps = ctx.attr.deps,
+ ))
+ providers.append(OutputGroupInfo(types = decls))
return providers
@@ -401,7 +411,7 @@ def js_library(
# module_name for legacy ts_library module_mapping support
# which is still being used in a couple of tests
# TODO: remove once legacy module_mapping is removed
- module_name = package_name if package_name != "$node_modules$" else None,
+ module_name = package_name if package_name != "$node_modules$" and package_name != "$node_modules_dir$" else None,
is_windows = select({
"@bazel_tools//src/conditions:host_windows": True,
"//conditions:default": False,
diff --git a/internal/node/test/BUILD.bazel b/internal/node/test/BUILD.bazel
index 1bfe3a58d2..8c16858177 100644
--- a/internal/node/test/BUILD.bazel
+++ b/internal/node/test/BUILD.bazel
@@ -511,3 +511,29 @@ nodejs_test(
data = [":main_lib"],
entry_point = ":main.js",
)
+
+# Test that we can run a nodejs_binary with --bazel_patch_module_resolver with exports_directories_only = True
+nodejs_binary(
+ name = "protractor_directory_artifacts_version",
+ data = ["@npm_directory_artifacts//protractor"],
+ entry_point = {"@npm_directory_artifacts//:node_modules/protractor": "bin/protractor"},
+ tags = ["requires-runfiles"],
+ templated_args = [
+ "--bazel_patch_module_resolver",
+ "--version",
+ ],
+)
+
+npm_package_bin(
+ name = "protractor_directory_artifacts_version_output",
+ stdout = "protractor_directory_artifacts_version.out",
+ tags = ["requires-runfiles"],
+ tool = ":protractor_directory_artifacts_version",
+)
+
+generated_file_test(
+ name = "protractor_directory_artifacts_version_test",
+ src = "protractor_directory_artifacts_version.golden",
+ generated = ":protractor_directory_artifacts_version.out",
+ tags = ["requires-runfiles"],
+)
diff --git a/internal/node/test/directory_artifacts_ts_project/BUILD.bazel b/internal/node/test/directory_artifacts_ts_project/BUILD.bazel
new file mode 100644
index 0000000000..5fd18a8c0c
--- /dev/null
+++ b/internal/node/test/directory_artifacts_ts_project/BUILD.bazel
@@ -0,0 +1,10 @@
+load("//packages/typescript:index.bzl", "ts_project")
+
+ts_project(
+ name = "tsconfig",
+ srcs = ["main.ts"],
+ tags = ["requires-runfiles"],
+ tsc = "@npm_directory_artifacts//typescript/bin:tsc",
+ typescript_package = "@npm_directory_artifacts//typescript",
+ deps = ["@npm_directory_artifacts//@types/node"],
+)
diff --git a/internal/node/test/directory_artifacts_ts_project/main.ts b/internal/node/test/directory_artifacts_ts_project/main.ts
new file mode 100644
index 0000000000..ee5e348f16
--- /dev/null
+++ b/internal/node/test/directory_artifacts_ts_project/main.ts
@@ -0,0 +1 @@
+console.log('hello world' as string);
\ No newline at end of file
diff --git a/internal/node/test/directory_artifacts_ts_project/tsconfig.json b/internal/node/test/directory_artifacts_ts_project/tsconfig.json
new file mode 100644
index 0000000000..7812f071fb
--- /dev/null
+++ b/internal/node/test/directory_artifacts_ts_project/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "types": ["node"]
+ }
+}
diff --git a/internal/node/test/directory_artifacts_tsc/BUILD.bazel b/internal/node/test/directory_artifacts_tsc/BUILD.bazel
new file mode 100644
index 0000000000..ded85b5ba3
--- /dev/null
+++ b/internal/node/test/directory_artifacts_tsc/BUILD.bazel
@@ -0,0 +1,21 @@
+load("@npm_directory_artifacts//typescript:index.bzl", "tsc")
+
+tsc(
+ name = "main_lib",
+ outs = [
+ "main.js",
+ ],
+ args = [
+ "-p",
+ "$(execpath tsconfig.json)",
+ "--outDir",
+ # $(RULEDIR) is a shorthand for the dist/bin directory where Bazel requires we write outputs
+ "$(RULEDIR)",
+ ],
+ data = [
+ "main.ts",
+ "tsconfig.json",
+ "@npm_directory_artifacts//@types/node",
+ ],
+ tags = ["requires-runfiles"],
+)
diff --git a/internal/node/test/directory_artifacts_tsc/main.ts b/internal/node/test/directory_artifacts_tsc/main.ts
new file mode 100644
index 0000000000..d34fe7ba11
--- /dev/null
+++ b/internal/node/test/directory_artifacts_tsc/main.ts
@@ -0,0 +1 @@
+export const a: string = require('./src/some').a;
diff --git a/internal/node/test/directory_artifacts_tsc/tsconfig.json b/internal/node/test/directory_artifacts_tsc/tsconfig.json
new file mode 100644
index 0000000000..7812f071fb
--- /dev/null
+++ b/internal/node/test/directory_artifacts_tsc/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "compilerOptions": {
+ "types": ["node"]
+ }
+}
diff --git a/internal/node/test/protractor_directory_artifacts_version.golden b/internal/node/test/protractor_directory_artifacts_version.golden
new file mode 100644
index 0000000000..cce116e5a4
--- /dev/null
+++ b/internal/node/test/protractor_directory_artifacts_version.golden
@@ -0,0 +1 @@
+Version 5.4.2
diff --git a/internal/npm_install/generate_build_file.ts b/internal/npm_install/generate_build_file.ts
index da9bd9f748..0533060462 100644
--- a/internal/npm_install/generate_build_file.ts
+++ b/internal/npm_install/generate_build_file.ts
@@ -49,18 +49,21 @@ function log_verbose(...m: any[]) {
const PUBLIC_VISIBILITY = '//visibility:public';
+let NODE_MODULES_PACKAGE_NAME = '$node_modules$';
+
// Default values for unit testing; overridden in main()
let config: any = {
+ exports_directories_only: false,
generate_local_modules_build_files: false,
included_files: [],
- deps: {},
+ links: {},
package_json: 'package.json',
package_lock: 'yarn.lock',
package_path: '',
rule_type: 'yarn_install',
strict_visibility: true,
- workspace: '',
workspace_root_prefix: '',
+ workspace: '',
};
function generateBuildFileHeader(visibility = PUBLIC_VISIBILITY): string {
@@ -113,6 +116,10 @@ export function main() {
config.workspace_root_base = config.workspace_root_prefix?.split('/')[0];
config.limited_visibility = `@${config.workspace}//:__subpackages__`;
+ if (config.exports_directories_only) {
+ NODE_MODULES_PACKAGE_NAME = '$node_modules_dir$';
+ }
+
// get a set of all the direct dependencies for visibility
const deps = getDirectDependencySet(config.package_json);
@@ -175,9 +182,12 @@ function flattenDependencies(pkgs: Dep[]) {
function generateRootBuildFile(pkgs: Dep[]) {
let pkgFilesStarlark = '';
if (pkgs.length) {
- const list = pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__files",
- "//${pkg._dir}:${pkg._name}__nested_node_modules",`)
- .join('\n ');
+ let list = ''
+ list = pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__files",`).join('\n ');
+ if (!config.exports_directories_only) {
+ list += '\n ';
+ list += pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__nested_node_modules",`).join('\n ');
+ }
pkgFilesStarlark = `
# direct sources listed for strict deps support
srcs = [
@@ -196,9 +206,13 @@ function generateRootBuildFile(pkgs: Dep[]) {
}
let exportsStarlark = '';
- pkgs.forEach(pkg => {pkg._files.forEach(f => {
- exportsStarlark += ` "node_modules/${pkg._dir}/${f}",\n`;
- })});
+ if (config.exports_directories_only) {
+ pkgs.forEach(pkg => exportsStarlark += ` "node_modules/${pkg._dir}",\n`);
+ } else {
+ pkgs.forEach(pkg => {pkg._files.forEach(f => {
+ exportsStarlark += ` "node_modules/${pkg._dir}/${f}",\n`;
+ })});
+ }
let buildFile =
generateBuildFileHeader() + `load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
@@ -212,7 +226,7 @@ ${exportsStarlark}])
# See https://github.com/bazelbuild/bazel/issues/5153.
js_library(
name = "node_modules",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${pkgFilesStarlark}${depsStarlark}
)
@@ -257,7 +271,9 @@ function generatePackageBuildFiles(pkg: Dep) {
}
// The following won't be used in a symlink build file case
- let buildFile = printPackage(pkg);
+ let buildFile = config.exports_directories_only ?
+ printPackageExperimentalDirectoryArtifacts(pkg) :
+ printPackage(pkg);
if (buildFilePath) {
buildFile = buildFile + '\n' +
fs.readFileSync(path.join('node_modules', pkg._dir, buildFilePath), 'utf-8');
@@ -479,6 +495,16 @@ function listFiles(rootDir: string, subDir: string = ''): string[] {
if (isSymbolicLink) {
// Filter out broken symbolic links. These cause fs.statSync(fullPath)
// to fail with `ENOENT: no such file or directory ...`
+ if (config.exports_directories_only) {
+ // Delete the symlink if we are exporting directory artifacts so the problematic symlink
+ // doesn't show up in runfiles. These problematic symlinks cause bazel failures such as
+ // ERROR: internal/npm_install/test/BUILD.bazel:118:19:
+ // Testing //internal/npm_install/test:test_yarn_directory_artifacts
+ // failed: Exec failed due to IOException: The file type of
+ // 'bazel-out/darwin-fastbuild/bin/internal/npm_install/test/test_yarn_directory_artifacts.sh.runfiles/fine_grained_deps_yarn_directory_artifacts/node_modules/ecstatic/test/public/containsSymlink/problematic'
+ // is not supported.
+ fs.unlinkSync(fullPath);
+ }
return files;
}
throw e;
@@ -491,6 +517,16 @@ function listFiles(rootDir: string, subDir: string = ''): string[] {
// See https://github.com/bazelbuild/rules_nodejs/issues/428 and
// https://github.com/bazelbuild/rules_nodejs/issues/438.
// This is tested in /e2e/fine_grained_symlinks.
+ if (config.exports_directories_only) {
+ // Delete the symlink if we are exporting directory artifacts so the problematic symlink
+ // doesn't show up in runfiles. These problematic symlinks cause bazel failures such as
+ // ERROR: internal/npm_install/test/BUILD.bazel:118:19:
+ // Testing //internal/npm_install/test:test_yarn_directory_artifacts
+ // failed: Exec failed due to IOException: The file type of
+ // 'bazel-out/darwin-fastbuild/bin/internal/npm_install/test/test_yarn_directory_artifacts.sh.runfiles/fine_grained_deps_yarn_directory_artifacts/node_modules/ecstatic/test/public/containsSymlink/problematic'
+ // is not supported.
+ fs.unlinkSync(fullPath);
+ }
return files;
}
return isDirectory ? files.concat(listFiles(rootDir, relPath)) : files.concat(relPath);
@@ -928,6 +964,84 @@ function findFile(pkg: Dep, m: string) {
return undefined;
}
+/**
+ * Given a pkg, return the skylark `js_library` targets for the package.
+ */
+function printPackageExperimentalDirectoryArtifacts(pkg: Dep) {
+ function starlarkFiles(attr: string, files: string[], comment: string = '') {
+ return `
+ ${comment ? comment + '\n ' : ''}${attr} = [
+ ${files.map((f: string) => `"//:node_modules/${pkg._dir}/${f}",`).join('\n ')}
+ ],`;
+ }
+
+ // Flattened list of direct and transitive dependencies hoisted to root by the package manager
+ const deps = [pkg].concat(pkg._dependencies.filter(dep => dep !== pkg && !dep._isNested));
+ const depsStarlark =
+ deps.map(dep => `"//${dep._dir}:${dep._name}__contents",`).join('\n ');
+
+ let result = `load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+
+# Generated targets for npm package "${pkg._dir}"
+${printJson(pkg)}
+
+# Files that are part of the npm package
+filegroup(
+ name = "${pkg._name}__files",
+ srcs = ["//:node_modules/${pkg._dir}"],
+)
+
+# The primary target for this package for use in rule deps
+js_library(
+ name = "${pkg._name}",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
+ package_path = "${config.package_path}",
+ # direct sources listed for strict deps support
+ srcs = [":${pkg._name}__files"],
+ # nested node_modules for this package plus flattened list of direct and transitive dependencies
+ # hoisted to root by the package manager
+ deps = [
+ ${depsStarlark}
+ ],
+)
+
+# Target is used as dep for main targets to prevent circular dependencies errors
+js_library(
+ name = "${pkg._name}__contents",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
+ package_path = "${config.package_path}",
+ srcs = [":${pkg._name}__files"],
+ visibility = ["//:__subpackages__"],
+)
+
+# For ts_library backward compat which uses @npm//typescript:typescript__typings
+alias(
+ name = "${pkg._name}__typings",
+ actual = "${pkg._name}__contents",
+)
+`;
+
+ let mainEntryPoint = resolvePkgMainFile(pkg)
+
+ // add an `npm_umd_bundle` target to generate an UMD bundle if one does
+ // not exists
+ if (mainEntryPoint && !findFile(pkg, `${pkg._name}.umd.js`)) {
+ result +=
+ `load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+
+npm_umd_bundle(
+ name = "${pkg._name}__umd",
+ package_name = "${pkg._moduleName}",
+ entry_point = { "@${config.workspace}//:node_modules/${pkg._dir}": "${mainEntryPoint}" },
+ package = ":${pkg._name}",
+)
+
+`;
+ }
+
+ return result;
+}
+
/**
* Given a pkg, return the skylark `js_library` targets for the package.
*/
@@ -1024,7 +1138,7 @@ filegroup(
# The primary target for this package for use in rule deps
js_library(
name = "${pkg._name}",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",
# direct sources listed for strict deps support
srcs = [":${pkg._name}__files"],
@@ -1038,7 +1152,7 @@ js_library(
# Target is used as dep for main targets to prevent circular dependencies errors
js_library(
name = "${pkg._name}__contents",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",
srcs = [":${pkg._name}__files", ":${pkg._name}__nested_node_modules"],${namedSourcesStarlark}
visibility = ["//:__subpackages__"],
@@ -1047,7 +1161,7 @@ js_library(
# Typings files that are part of the npm package not including nested node_modules
js_library(
name = "${pkg._name}__typings",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${dtsStarlark}
)
@@ -1064,7 +1178,7 @@ js_library(
npm_umd_bundle(
name = "${pkg._name}__umd",
package_name = "${pkg._moduleName}",
- entry_point = "//:node_modules/${pkg._dir}/${mainEntryPoint}",
+ entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${mainEntryPoint}",
package = ":${pkg._name}",
)
@@ -1140,10 +1254,13 @@ export function printPackageBin(pkg: Dep) {
}
for (const [name, path] of executables.entries()) {
+ const entryPoint = config.exports_directories_only ?
+ `{ "@${config.workspace}//:node_modules/${pkg._dir}": "${path}" }` :
+ `"@${config.workspace}//:node_modules/${pkg._dir}/${path}"`;
result += `# Wire up the \`bin\` entry \`${name}\`
nodejs_binary(
name = "${name}",
- entry_point = "//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}],${additionalAttributes(pkg, name)}
)
`;
@@ -1167,6 +1284,9 @@ export function printIndexBzl(pkg: Dep) {
}
for (const [name, path] of executables.entries()) {
+ const entryPoint = config.exports_directories_only ?
+ `{ "@${config.workspace}//:node_modules/${pkg._dir}": "${path}" }` :
+ `"@${config.workspace}//:node_modules/${pkg._dir}/${path}"`;
result = `${result}
# Generated helper macro to call ${name}
@@ -1177,7 +1297,7 @@ def ${name.replace(/-/g, '_')}(**kwargs):
name}", output_dir = output_dir, **kwargs)
else:
nodejs_binary(
- entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}] + kwargs.pop("data", []),${
additionalAttributes(pkg, name)}
**kwargs
@@ -1186,7 +1306,7 @@ def ${name.replace(/-/g, '_')}(**kwargs):
# Just in case ${name} is a test runner, also make a test rule for it
def ${name.replace(/-/g, '_')}_test(**kwargs):
nodejs_test(
- entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}] + kwargs.pop("data", []),${
additionalAttributes(pkg, name)}
**kwargs
@@ -1244,7 +1364,7 @@ function printScope(scope: string, pkgs: Dep[]) {
# Generated target for npm scope ${scope}
js_library(
name = "${scope}",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${pkgFilesStarlark}${depsStarlark}
)
diff --git a/internal/npm_install/index.js b/internal/npm_install/index.js
index 1e75203a6f..0a2d83293b 100644
--- a/internal/npm_install/index.js
+++ b/internal/npm_install/index.js
@@ -9,17 +9,19 @@ function log_verbose(...m) {
console.error('[generate_build_file.ts]', ...m);
}
const PUBLIC_VISIBILITY = '//visibility:public';
+let NODE_MODULES_PACKAGE_NAME = '$node_modules$';
let config = {
+ exports_directories_only: false,
generate_local_modules_build_files: false,
included_files: [],
- deps: {},
+ links: {},
package_json: 'package.json',
package_lock: 'yarn.lock',
package_path: '',
rule_type: 'yarn_install',
strict_visibility: true,
- workspace: '',
workspace_root_prefix: '',
+ workspace: '',
};
function generateBuildFileHeader(visibility = PUBLIC_VISIBILITY) {
return `# Generated file from ${config.rule_type} rule.
@@ -51,6 +53,9 @@ function main() {
config = require('./generate_config.json');
config.workspace_root_base = (_a = config.workspace_root_prefix) === null || _a === void 0 ? void 0 : _a.split('/')[0];
config.limited_visibility = `@${config.workspace}//:__subpackages__`;
+ if (config.exports_directories_only) {
+ NODE_MODULES_PACKAGE_NAME = '$node_modules_dir$';
+ }
const deps = getDirectDependencySet(config.package_json);
const pkgs = findPackages('node_modules', deps);
flattenDependencies(pkgs);
@@ -88,9 +93,12 @@ function flattenDependencies(pkgs) {
function generateRootBuildFile(pkgs) {
let pkgFilesStarlark = '';
if (pkgs.length) {
- const list = pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__files",
- "//${pkg._dir}:${pkg._name}__nested_node_modules",`)
- .join('\n ');
+ let list = '';
+ list = pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__files",`).join('\n ');
+ if (!config.exports_directories_only) {
+ list += '\n ';
+ list += pkgs.map(pkg => `"//${pkg._dir}:${pkg._name}__nested_node_modules",`).join('\n ');
+ }
pkgFilesStarlark = `
# direct sources listed for strict deps support
srcs = [
@@ -107,11 +115,16 @@ function generateRootBuildFile(pkgs) {
],`;
}
let exportsStarlark = '';
- pkgs.forEach(pkg => {
- pkg._files.forEach(f => {
- exportsStarlark += ` "node_modules/${pkg._dir}/${f}",\n`;
+ if (config.exports_directories_only) {
+ pkgs.forEach(pkg => exportsStarlark += ` "node_modules/${pkg._dir}",\n`);
+ }
+ else {
+ pkgs.forEach(pkg => {
+ pkg._files.forEach(f => {
+ exportsStarlark += ` "node_modules/${pkg._dir}/${f}",\n`;
+ });
});
- });
+ }
let buildFile = generateBuildFileHeader() + `load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
exports_files([
@@ -123,7 +136,7 @@ ${exportsStarlark}])
# See https://github.com/bazelbuild/bazel/issues/5153.
js_library(
name = "node_modules",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${pkgFilesStarlark}${depsStarlark}
)
@@ -147,7 +160,9 @@ function generatePackageBuildFiles(pkg) {
if (isPkgDirASymlink && !buildFilePath && !config.generate_local_modules_build_files) {
console.log(`[yarn_install/npm_install]: package ${nodeModulesPkgDir} is local symlink and as such a BUILD file for it is expected but none was found. Please add one at ${fs.realpathSync(nodeModulesPkgDir)}`);
}
- let buildFile = printPackage(pkg);
+ let buildFile = config.exports_directories_only ?
+ printPackageExperimentalDirectoryArtifacts(pkg) :
+ printPackage(pkg);
if (buildFilePath) {
buildFile = buildFile + '\n' +
fs.readFileSync(path.join('node_modules', pkg._dir, buildFilePath), 'utf-8');
@@ -293,12 +308,18 @@ function listFiles(rootDir, subDir = '') {
}
catch (e) {
if (isSymbolicLink) {
+ if (config.exports_directories_only) {
+ fs.unlinkSync(fullPath);
+ }
return files;
}
throw e;
}
const isDirectory = stat.isDirectory();
if (isDirectory && isSymbolicLink) {
+ if (config.exports_directories_only) {
+ fs.unlinkSync(fullPath);
+ }
return files;
}
return isDirectory ? files.concat(listFiles(rootDir, relPath)) : files.concat(relPath);
@@ -532,6 +553,71 @@ function findFile(pkg, m) {
}
return undefined;
}
+function printPackageExperimentalDirectoryArtifacts(pkg) {
+ function starlarkFiles(attr, files, comment = '') {
+ return `
+ ${comment ? comment + '\n ' : ''}${attr} = [
+ ${files.map((f) => `"//:node_modules/${pkg._dir}/${f}",`).join('\n ')}
+ ],`;
+ }
+ const deps = [pkg].concat(pkg._dependencies.filter(dep => dep !== pkg && !dep._isNested));
+ const depsStarlark = deps.map(dep => `"//${dep._dir}:${dep._name}__contents",`).join('\n ');
+ let result = `load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+
+# Generated targets for npm package "${pkg._dir}"
+${printJson(pkg)}
+
+# Files that are part of the npm package
+filegroup(
+ name = "${pkg._name}__files",
+ srcs = ["//:node_modules/${pkg._dir}"],
+)
+
+# The primary target for this package for use in rule deps
+js_library(
+ name = "${pkg._name}",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
+ package_path = "${config.package_path}",
+ # direct sources listed for strict deps support
+ srcs = [":${pkg._name}__files"],
+ # nested node_modules for this package plus flattened list of direct and transitive dependencies
+ # hoisted to root by the package manager
+ deps = [
+ ${depsStarlark}
+ ],
+)
+
+# Target is used as dep for main targets to prevent circular dependencies errors
+js_library(
+ name = "${pkg._name}__contents",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
+ package_path = "${config.package_path}",
+ srcs = [":${pkg._name}__files"],
+ visibility = ["//:__subpackages__"],
+)
+
+# For ts_library backward compat which uses @npm//typescript:typescript__typings
+alias(
+ name = "${pkg._name}__typings",
+ actual = "${pkg._name}__contents",
+)
+`;
+ let mainEntryPoint = resolvePkgMainFile(pkg);
+ if (mainEntryPoint && !findFile(pkg, `${pkg._name}.umd.js`)) {
+ result +=
+ `load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+
+npm_umd_bundle(
+ name = "${pkg._name}__umd",
+ package_name = "${pkg._moduleName}",
+ entry_point = { "@${config.workspace}//:node_modules/${pkg._dir}": "${mainEntryPoint}" },
+ package = ":${pkg._name}",
+)
+
+`;
+ }
+ return result;
+}
function printPackage(pkg) {
function starlarkFiles(attr, files, comment = '') {
return `
@@ -595,7 +681,7 @@ filegroup(
# The primary target for this package for use in rule deps
js_library(
name = "${pkg._name}",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",
# direct sources listed for strict deps support
srcs = [":${pkg._name}__files"],
@@ -609,7 +695,7 @@ js_library(
# Target is used as dep for main targets to prevent circular dependencies errors
js_library(
name = "${pkg._name}__contents",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",
srcs = [":${pkg._name}__files", ":${pkg._name}__nested_node_modules"],${namedSourcesStarlark}
visibility = ["//:__subpackages__"],
@@ -618,7 +704,7 @@ js_library(
# Typings files that are part of the npm package not including nested node_modules
js_library(
name = "${pkg._name}__typings",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${dtsStarlark}
)
@@ -631,7 +717,7 @@ js_library(
npm_umd_bundle(
name = "${pkg._name}__umd",
package_name = "${pkg._moduleName}",
- entry_point = "//:node_modules/${pkg._dir}/${mainEntryPoint}",
+ entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${mainEntryPoint}",
package = ":${pkg._name}",
)
@@ -687,10 +773,13 @@ function printPackageBin(pkg) {
data.push(...pkg._dynamicDependencies);
}
for (const [name, path] of executables.entries()) {
+ const entryPoint = config.exports_directories_only ?
+ `{ "@${config.workspace}//:node_modules/${pkg._dir}": "${path}" }` :
+ `"@${config.workspace}//:node_modules/${pkg._dir}/${path}"`;
result += `# Wire up the \`bin\` entry \`${name}\`
nodejs_binary(
name = "${name}",
- entry_point = "//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}],${additionalAttributes(pkg, name)}
)
`;
@@ -712,6 +801,9 @@ function printIndexBzl(pkg) {
data.push(...pkg._dynamicDependencies);
}
for (const [name, path] of executables.entries()) {
+ const entryPoint = config.exports_directories_only ?
+ `{ "@${config.workspace}//:node_modules/${pkg._dir}": "${path}" }` :
+ `"@${config.workspace}//:node_modules/${pkg._dir}/${path}"`;
result = `${result}
# Generated helper macro to call ${name}
@@ -721,7 +813,7 @@ def ${name.replace(/-/g, '_')}(**kwargs):
npm_package_bin(tool = "@${config.workspace}//${pkg._dir}/bin:${name}", output_dir = output_dir, **kwargs)
else:
nodejs_binary(
- entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}] + kwargs.pop("data", []),${additionalAttributes(pkg, name)}
**kwargs
)
@@ -729,7 +821,7 @@ def ${name.replace(/-/g, '_')}(**kwargs):
# Just in case ${name} is a test runner, also make a test rule for it
def ${name.replace(/-/g, '_')}_test(**kwargs):
nodejs_test(
- entry_point = "@${config.workspace}//:node_modules/${pkg._dir}/${path}",
+ entry_point = ${entryPoint},
data = [${data.map(p => `"${p}"`).join(', ')}] + kwargs.pop("data", []),${additionalAttributes(pkg, name)}
**kwargs
)
@@ -769,7 +861,7 @@ function printScope(scope, pkgs) {
# Generated target for npm scope ${scope}
js_library(
name = "${scope}",
- package_name = "$node_modules$",
+ package_name = "${NODE_MODULES_PACKAGE_NAME}",
package_path = "${config.package_path}",${pkgFilesStarlark}${depsStarlark}
)
diff --git a/internal/npm_install/npm_install.bzl b/internal/npm_install/npm_install.bzl
index 5b466096a0..56ede6d104 100644
--- a/internal/npm_install/npm_install.bzl
+++ b/internal/npm_install/npm_install.bzl
@@ -44,6 +44,65 @@ repository so all files that the package manager depends on must be listed.
doc = """Environment variables to set before calling the package manager.""",
default = {},
),
+ "exports_directories_only": attr.bool(
+ default = False,
+ doc = """Export only top-level package directory artifacts from node_modules.
+
+Turning this on will decrease the time it takes for Bazel to setup runfiles and sandboxing when
+there are a large number of npm dependencies as inputs to an action.
+
+This breaks compatibility for label that reference files within npm packages such as `@npm//:node_modules/prettier/bin-prettier.js`.
+To reference files within npm packages, you can use the `directory_file_path` rule and/or `DirectoryFilePathInfo` provider.
+Note, some rules still need upgrading to support consuming `DirectoryFilePathInfo` where needed.
+
+NB: This feature requires runfiles be enabled due to an issue in Bazel which we are still investigating.
+ On Windows runfiles are off by default and must be enabled with the `--enable_runfiles` flag when
+ using this feature.
+
+NB: `ts_library` does not support directory artifact npm deps due to internal dependency on having all input sources files explicitly specified
+
+NB: `protractor_web_test` and `protractor_web_test_suite` do not support directory artifact npm deps
+
+For the `nodejs_binary` & `nodejs_test` `entry_point` attribute (which often needs to reference a file within
+an npm package) you can set the entry_point to a dict with a single entry, where the key corresponds to the directory artifact
+label and the value corresponds to the path within that directory to the entry point.
+
+For example,
+
+```
+nodejs_binary(
+ name = "prettier",
+ data = ["@npm//prettier"],
+ entry_point = "@npm//:node_modules/prettier/bin-prettier.js",
+)
+```
+
+becomes,
+
+```
+nodejs_binary(
+ name = "prettier",
+ data = ["@npm//prettier"],
+ entry_point = { "@npm//:node_modules/prettier": "bin-prettier.js" },
+)
+```
+
+For other labels that are passed to `$(rootpath)`, `$(execpath)`, or `$(location)` you can simply break these apart into
+the directory artifact label that gets passed to the expander & path part to follows it.
+
+For example,
+
+```
+$(rootpath @npm//:node_modules/prettier/bin-prettier.js")
+```
+
+becomes,
+
+```
+$(rootpath @npm//:node_modules/prettier)/bin-prettier.js
+```
+""",
+ ),
"generate_local_modules_build_files": attr.bool(
default = True,
doc = """Enables the BUILD files auto generation for local modules installed with `file:` (npm) or `link:` (yarn)
@@ -70,6 +129,9 @@ When False, the rule will not auto generate BUILD files for `node_modules` that
"included_files": attr.string_list(
doc = """List of file extensions to be included in the npm package targets.
+NB: This option has no effect when exports_directories_only is True as all files are
+automatically included in the export directory artifact targets for each npm package.
+
For example, [".js", ".d.ts", ".proto", ".json", ""].
This option is useful to limit the number of files that are inputs
@@ -278,6 +340,7 @@ def _create_build_files(repository_ctx, rule_type, node, lock_file, generate_loc
fail("link target must be label of form '@wksp//path/to:target', '@//path/to:target' or '//path/to:target'")
validated_links[k] = v
generate_config_json = struct(
+ exports_directories_only = repository_ctx.attr.exports_directories_only,
generate_local_modules_build_files = generate_local_modules_build_files,
included_files = repository_ctx.attr.included_files,
links = validated_links,
diff --git a/internal/npm_install/npm_umd_bundle.bzl b/internal/npm_install/npm_umd_bundle.bzl
index be99a547b0..31462bcc68 100644
--- a/internal/npm_install/npm_umd_bundle.bzl
+++ b/internal/npm_install/npm_umd_bundle.bzl
@@ -45,13 +45,17 @@ def _impl(ctx):
sources = ctx.attr.package[ExternalNpmPackageInfo].sources.to_list()
- # Only pass .js and package.json files as inputs to browserify.
- # The latter is required for module resolution in some cases.
- inputs = [
- f
- for f in sources
- if f.path.endswith(".js") or f.path.endswith(".json")
- ]
+ if ctx.attr.package[ExternalNpmPackageInfo].has_directories:
+ # If sources contain directories then we cannot filter by extension
+ inputs = sources
+ else:
+ # Only pass .js and package.json files as inputs to browserify.
+ # The latter is required for module resolution in some cases.
+ inputs = [
+ f
+ for f in sources
+ if f.path.endswith(".js") or f.path.endswith(".json")
+ ]
ctx.actions.run(
progress_message = "Generated UMD bundle for %s npm package [browserify]" % ctx.attr.package_name,
diff --git a/internal/npm_install/test/BUILD.bazel b/internal/npm_install/test/BUILD.bazel
index feb065ee42..96b1117832 100644
--- a/internal/npm_install/test/BUILD.bazel
+++ b/internal/npm_install/test/BUILD.bazel
@@ -7,6 +7,11 @@ filegroup(
srcs = glob(["golden/**"]),
)
+filegroup(
+ name = "goldens_directory_artifacts",
+ srcs = glob(["golden_directory_artifacts/**"]),
+)
+
filegroup(
name = "goldens_multi_linked",
srcs = glob(["golden_multi_linked/**"]),
@@ -19,8 +24,10 @@ jasmine_node_test(
"package.spec.json",
":check.js",
":goldens",
+ ":goldens_directory_artifacts",
":goldens_multi_linked",
"//internal/npm_install:compile_generate_build_file",
+ "@fine_grained_directory_artifacts_goldens//:golden_files",
"@fine_grained_goldens//:golden_files",
"@fine_grained_goldens_multi_linked//:golden_files",
"@npm//unidiff",
@@ -35,8 +42,10 @@ nodejs_binary(
data = [
":check.js",
":goldens",
+ ":goldens_directory_artifacts",
":goldens_multi_linked",
":update_golden.js",
+ "@fine_grained_directory_artifacts_goldens//:golden_files",
"@fine_grained_goldens//:golden_files",
"@fine_grained_goldens_multi_linked//:golden_files",
"@npm//jasmine",
@@ -123,6 +132,8 @@ sh_test(
) for pkgmgr in [
"yarn",
"npm",
+ "yarn_directory_artifacts",
+ "npm_directory_artifacts",
]]
# Test what happens when only certain NPM packages are in our dependencies.
@@ -151,6 +162,8 @@ sh_test(
) for pkgmgr in [
"yarn",
"npm",
+ "yarn_directory_artifacts",
+ "npm_directory_artifacts",
]]
# A target to run that ensures yarn_install works for the case that there is
diff --git a/internal/npm_install/test/generate_build_file.spec.js b/internal/npm_install/test/generate_build_file.spec.js
index 2dc981ff88..6ddeb8e8ac 100644
--- a/internal/npm_install/test/generate_build_file.spec.js
+++ b/internal/npm_install/test/generate_build_file.spec.js
@@ -14,6 +14,17 @@ describe('build file generator', () => {
});
});
+ describe('fine_grained_directory_artifacts_goldens integration test', () => {
+ // golden files are checked in at internal/npm_install/test/golden_directory_artifacts
+ // and compared against the files generated by @fine_grained_directory_artifacts_goldens yarn_install
+ // rule
+ files.forEach(file => {
+ it(`@fine_grained_directory_artifacts_goldens should produce a BUILD file for ${file}`, () => {
+ check('fine_grained_directory_artifacts_goldens', 'golden_directory_artifacts', file);
+ });
+ });
+ });
+
describe('fine_grained_goldens_multi_linked integration test', () => {
// golden files are checked in at internal/npm_install/test/golden_multi_linked
// and compared against the files generated by @fine_grained_goldens_multi_linked yarn_install
diff --git a/internal/npm_install/test/golden/@angular/core/BUILD.bazel.golden b/internal/npm_install/test/golden/@angular/core/BUILD.bazel.golden
index 60ac6b02ba..ab0a7b5f82 100644
--- a/internal/npm_install/test/golden/@angular/core/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/@angular/core/BUILD.bazel.golden
@@ -772,6 +772,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "core__umd",
package_name = "@angular/core",
- entry_point = "//:node_modules/@angular/core/fesm5/core.js",
+ entry_point = "@fine_grained_goldens//:node_modules/@angular/core/fesm5/core.js",
package = ":core",
)
diff --git a/internal/npm_install/test/golden/@gregmagolan/test-a/BUILD.bazel.golden b/internal/npm_install/test/golden/@gregmagolan/test-a/BUILD.bazel.golden
index 2ea40a029f..e6ec0c982d 100644
--- a/internal/npm_install/test/golden/@gregmagolan/test-a/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/@gregmagolan/test-a/BUILD.bazel.golden
@@ -50,7 +50,7 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "test-a__umd",
package_name = "@gregmagolan/test-a",
- entry_point = "//:node_modules/@gregmagolan/test-a/main.js",
+ entry_point = "@fine_grained_goldens//:node_modules/@gregmagolan/test-a/main.js",
package = ":test-a",
)
exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden/@gregmagolan/test-a/bin/BUILD.bazel.golden b/internal/npm_install/test/golden/@gregmagolan/test-a/bin/BUILD.bazel.golden
index b78ca2cd65..69357f3faf 100644
--- a/internal/npm_install/test/golden/@gregmagolan/test-a/bin/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/@gregmagolan/test-a/bin/BUILD.bazel.golden
@@ -3,6 +3,6 @@ package(default_visibility = ["//visibility:public"])
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
name = "test",
- entry_point = "//:node_modules/@gregmagolan/test-a/@bin/test.js",
+ entry_point = "@fine_grained_goldens//:node_modules/@gregmagolan/test-a/@bin/test.js",
data = ["//@gregmagolan/test-a:test-a"],
)
diff --git a/internal/npm_install/test/golden/@gregmagolan/test-b/BUILD.bazel.golden b/internal/npm_install/test/golden/@gregmagolan/test-b/BUILD.bazel.golden
index 24dd1615e5..3818128ec5 100644
--- a/internal/npm_install/test/golden/@gregmagolan/test-b/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/@gregmagolan/test-b/BUILD.bazel.golden
@@ -49,6 +49,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "test-b__umd",
package_name = "@gregmagolan/test-b",
- entry_point = "//:node_modules/@gregmagolan/test-b/main.js",
+ entry_point = "@fine_grained_goldens//:node_modules/@gregmagolan/test-b/main.js",
package = ":test-b",
)
diff --git a/internal/npm_install/test/golden/BUILD.bazel.golden b/internal/npm_install/test/golden/BUILD.bazel.golden
index b7ac11ee5e..d6fce746ef 100644
--- a/internal/npm_install/test/golden/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/BUILD.bazel.golden
@@ -4730,56 +4730,56 @@ js_library(
package_path = "",
srcs = [
"//ajv:ajv__files",
- "//ajv:ajv__nested_node_modules",
"//balanced-match:balanced-match__files",
- "//balanced-match:balanced-match__nested_node_modules",
"//brace-expansion:brace-expansion__files",
- "//brace-expansion:brace-expansion__nested_node_modules",
"//co:co__files",
- "//co:co__nested_node_modules",
"//concat-map:concat-map__files",
- "//concat-map:concat-map__nested_node_modules",
"//diff:diff__files",
- "//diff:diff__nested_node_modules",
"//fast-deep-equal:fast-deep-equal__files",
- "//fast-deep-equal:fast-deep-equal__nested_node_modules",
"//fast-json-stable-stringify:fast-json-stable-stringify__files",
- "//fast-json-stable-stringify:fast-json-stable-stringify__nested_node_modules",
"//fs.realpath:fs.realpath__files",
- "//fs.realpath:fs.realpath__nested_node_modules",
"//glob:glob__files",
- "//glob:glob__nested_node_modules",
"//inflight:inflight__files",
- "//inflight:inflight__nested_node_modules",
"//inherits:inherits__files",
- "//inherits:inherits__nested_node_modules",
"//jasmine:jasmine__files",
- "//jasmine:jasmine__nested_node_modules",
"//jasmine-core:jasmine-core__files",
- "//jasmine-core:jasmine-core__nested_node_modules",
"//json-schema-traverse:json-schema-traverse__files",
- "//json-schema-traverse:json-schema-traverse__nested_node_modules",
"//minimatch:minimatch__files",
- "//minimatch:minimatch__nested_node_modules",
"//once:once__files",
- "//once:once__nested_node_modules",
"//path-is-absolute:path-is-absolute__files",
- "//path-is-absolute:path-is-absolute__nested_node_modules",
"//rxjs:rxjs__files",
- "//rxjs:rxjs__nested_node_modules",
"//tslib:tslib__files",
- "//tslib:tslib__nested_node_modules",
"//unidiff:unidiff__files",
- "//unidiff:unidiff__nested_node_modules",
"//wrappy:wrappy__files",
- "//wrappy:wrappy__nested_node_modules",
"//zone.js:zone.js__files",
- "//zone.js:zone.js__nested_node_modules",
"//@angular/core:core__files",
- "//@angular/core:core__nested_node_modules",
"//@gregmagolan/test-a:test-a__files",
- "//@gregmagolan/test-a:test-a__nested_node_modules",
"//@gregmagolan/test-b:test-b__files",
+ "//ajv:ajv__nested_node_modules",
+ "//balanced-match:balanced-match__nested_node_modules",
+ "//brace-expansion:brace-expansion__nested_node_modules",
+ "//co:co__nested_node_modules",
+ "//concat-map:concat-map__nested_node_modules",
+ "//diff:diff__nested_node_modules",
+ "//fast-deep-equal:fast-deep-equal__nested_node_modules",
+ "//fast-json-stable-stringify:fast-json-stable-stringify__nested_node_modules",
+ "//fs.realpath:fs.realpath__nested_node_modules",
+ "//glob:glob__nested_node_modules",
+ "//inflight:inflight__nested_node_modules",
+ "//inherits:inherits__nested_node_modules",
+ "//jasmine:jasmine__nested_node_modules",
+ "//jasmine-core:jasmine-core__nested_node_modules",
+ "//json-schema-traverse:json-schema-traverse__nested_node_modules",
+ "//minimatch:minimatch__nested_node_modules",
+ "//once:once__nested_node_modules",
+ "//path-is-absolute:path-is-absolute__nested_node_modules",
+ "//rxjs:rxjs__nested_node_modules",
+ "//tslib:tslib__nested_node_modules",
+ "//unidiff:unidiff__nested_node_modules",
+ "//wrappy:wrappy__nested_node_modules",
+ "//zone.js:zone.js__nested_node_modules",
+ "//@angular/core:core__nested_node_modules",
+ "//@gregmagolan/test-a:test-a__nested_node_modules",
"//@gregmagolan/test-b:test-b__nested_node_modules",
],
deps = [
diff --git a/internal/npm_install/test/golden/ajv/BUILD.bazel.golden b/internal/npm_install/test/golden/ajv/BUILD.bazel.golden
index 9ccf975a09..460fa0bdf1 100644
--- a/internal/npm_install/test/golden/ajv/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/ajv/BUILD.bazel.golden
@@ -140,6 +140,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "ajv__umd",
package_name = "ajv",
- entry_point = "//:node_modules/ajv/lib/ajv.js",
+ entry_point = "@fine_grained_goldens//:node_modules/ajv/lib/ajv.js",
package = ":ajv",
)
diff --git a/internal/npm_install/test/golden/jasmine/BUILD.bazel.golden b/internal/npm_install/test/golden/jasmine/BUILD.bazel.golden
index aeb8a8abe3..f0d31f2bfb 100644
--- a/internal/npm_install/test/golden/jasmine/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/jasmine/BUILD.bazel.golden
@@ -91,7 +91,7 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "jasmine__umd",
package_name = "jasmine",
- entry_point = "//:node_modules/jasmine/lib/jasmine.js",
+ entry_point = "@fine_grained_goldens//:node_modules/jasmine/lib/jasmine.js",
package = ":jasmine",
)
exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden/jasmine/bin/BUILD.bazel.golden b/internal/npm_install/test/golden/jasmine/bin/BUILD.bazel.golden
index 9748049b8a..b19ffd4c72 100644
--- a/internal/npm_install/test/golden/jasmine/bin/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/jasmine/bin/BUILD.bazel.golden
@@ -3,6 +3,6 @@ package(default_visibility = ["//visibility:public"])
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
name = "jasmine",
- entry_point = "//:node_modules/jasmine/bin/jasmine.js",
+ entry_point = "@fine_grained_goldens//:node_modules/jasmine/bin/jasmine.js",
data = ["//jasmine:jasmine"],
)
diff --git a/internal/npm_install/test/golden/rxjs/BUILD.bazel.golden b/internal/npm_install/test/golden/rxjs/BUILD.bazel.golden
index 7785ead772..4edca273f4 100644
--- a/internal/npm_install/test/golden/rxjs/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/rxjs/BUILD.bazel.golden
@@ -4323,6 +4323,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "rxjs__umd",
package_name = "rxjs",
- entry_point = "//:node_modules/rxjs/_esm5/index.js",
+ entry_point = "@fine_grained_goldens//:node_modules/rxjs/_esm5/index.js",
package = ":rxjs",
)
diff --git a/internal/npm_install/test/golden/unidiff/BUILD.bazel.golden b/internal/npm_install/test/golden/unidiff/BUILD.bazel.golden
index 78e53952f6..103171bc2d 100644
--- a/internal/npm_install/test/golden/unidiff/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/unidiff/BUILD.bazel.golden
@@ -56,6 +56,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "unidiff__umd",
package_name = "unidiff",
- entry_point = "//:node_modules/unidiff/unidiff.js",
+ entry_point = "@fine_grained_goldens//:node_modules/unidiff/unidiff.js",
package = ":unidiff",
)
diff --git a/internal/npm_install/test/golden/zone.js/BUILD.bazel.golden b/internal/npm_install/test/golden/zone.js/BUILD.bazel.golden
index a7e667b41d..45b723ae7e 100644
--- a/internal/npm_install/test/golden/zone.js/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden/zone.js/BUILD.bazel.golden
@@ -176,6 +176,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "zone.js__umd",
package_name = "zone.js",
- entry_point = "//:node_modules/zone.js/dist/zone.js",
+ entry_point = "@fine_grained_goldens//:node_modules/zone.js/dist/zone.js",
package = ":zone.js",
)
diff --git a/internal/npm_install/test/golden_directory_artifacts/@angular/core/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@angular/core/BUILD.bazel.golden
new file mode 100644
index 0000000000..1b5fb657fa
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@angular/core/BUILD.bazel.golden
@@ -0,0 +1,37 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "core__files",
+ srcs = ["//:node_modules/@angular/core"],
+)
+js_library(
+ name = "core",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":core__files"],
+ deps = [
+ "//@angular/core:core__contents",
+ "//tslib:tslib__contents",
+ "//rxjs:rxjs__contents",
+ "//zone.js:zone.js__contents",
+ ],
+)
+js_library(
+ name = "core__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":core__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "core__typings",
+ actual = "core__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "core__umd",
+ package_name = "@angular/core",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@angular/core": "fesm5/core.js" },
+ package = ":core",
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/BUILD.bazel.golden
new file mode 100644
index 0000000000..5dfc9ee4ec
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/BUILD.bazel.golden
@@ -0,0 +1,16 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+js_library(
+ name = "@gregmagolan",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [
+ "//@gregmagolan/test-a:test-a__files",
+ "//@gregmagolan/test-b:test-b__files",
+ ],
+ deps = [
+ "//@gregmagolan/test-a:test-a__contents",
+ "//@gregmagolan/test-b:test-b__contents",
+ ],
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/BUILD.bazel.golden
new file mode 100644
index 0000000000..2e801b627a
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/BUILD.bazel.golden
@@ -0,0 +1,35 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "test-a__files",
+ srcs = ["//:node_modules/@gregmagolan/test-a"],
+)
+js_library(
+ name = "test-a",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":test-a__files"],
+ deps = [
+ "//@gregmagolan/test-a:test-a__contents",
+ ],
+)
+js_library(
+ name = "test-a__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":test-a__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "test-a__typings",
+ actual = "test-a__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "test-a__umd",
+ package_name = "@gregmagolan/test-a",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@gregmagolan/test-a": "main.js" },
+ package = ":test-a",
+)
+exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/bin/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/bin/BUILD.bazel.golden
new file mode 100644
index 0000000000..1de86e18ce
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/bin/BUILD.bazel.golden
@@ -0,0 +1,8 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
+nodejs_binary(
+ name = "test",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@gregmagolan/test-a": "@bin/test.js" },
+ data = ["//@gregmagolan/test-a:test-a"],
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/index.bzl.golden b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/index.bzl.golden
new file mode 100644
index 0000000000..43a37b2c2a
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-a/index.bzl.golden
@@ -0,0 +1,17 @@
+load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary", "nodejs_test", "npm_package_bin")
+def test(**kwargs):
+ output_dir = kwargs.pop("output_dir", False)
+ if "outs" in kwargs or output_dir:
+ npm_package_bin(tool = "@fine_grained_directory_artifacts_goldens//@gregmagolan/test-a/bin:test", output_dir = output_dir, **kwargs)
+ else:
+ nodejs_binary(
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@gregmagolan/test-a": "@bin/test.js" },
+ data = ["@fine_grained_directory_artifacts_goldens//@gregmagolan/test-a:test-a"] + kwargs.pop("data", []),
+ **kwargs
+ )
+def test_test(**kwargs):
+ nodejs_test(
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@gregmagolan/test-a": "@bin/test.js" },
+ data = ["@fine_grained_directory_artifacts_goldens//@gregmagolan/test-a:test-a"] + kwargs.pop("data", []),
+ **kwargs
+ )
diff --git a/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-b/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-b/BUILD.bazel.golden
new file mode 100644
index 0000000000..b0c43fe7c3
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@gregmagolan/test-b/BUILD.bazel.golden
@@ -0,0 +1,34 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "test-b__files",
+ srcs = ["//:node_modules/@gregmagolan/test-b"],
+)
+js_library(
+ name = "test-b",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":test-b__files"],
+ deps = [
+ "//@gregmagolan/test-b:test-b__contents",
+ ],
+)
+js_library(
+ name = "test-b__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":test-b__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "test-b__typings",
+ actual = "test-b__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "test-b__umd",
+ package_name = "@gregmagolan/test-b",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/@gregmagolan/test-b": "main.js" },
+ package = ":test-b",
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b/BUILD.bazel.golden
new file mode 100644
index 0000000000..747845c49e
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b/BUILD.bazel.golden
@@ -0,0 +1,9 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//internal/linker:npm_link.bzl", "npm_link")
+npm_link(
+ name = "some-target-b",
+ target = "@//some/target/b",
+ package_name = "@some-scope/some-target-b",
+ package_path = "",
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b2/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b2/BUILD.bazel.golden
new file mode 100644
index 0000000000..47e4ac9507
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/@some-scope/some-target-b2/BUILD.bazel.golden
@@ -0,0 +1,9 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//internal/linker:npm_link.bzl", "npm_link")
+npm_link(
+ name = "some-target-b2",
+ target = "@//some/target/b",
+ package_name = "@some-scope/some-target-b2",
+ package_path = "",
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/BUILD.bazel.golden
new file mode 100644
index 0000000000..563320ff89
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/BUILD.bazel.golden
@@ -0,0 +1,117 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+exports_files([
+ "node_modules/ajv",
+ "node_modules/balanced-match",
+ "node_modules/brace-expansion",
+ "node_modules/co",
+ "node_modules/concat-map",
+ "node_modules/diff",
+ "node_modules/fast-deep-equal",
+ "node_modules/fast-json-stable-stringify",
+ "node_modules/fs.realpath",
+ "node_modules/glob",
+ "node_modules/inflight",
+ "node_modules/inherits",
+ "node_modules/jasmine",
+ "node_modules/jasmine-core",
+ "node_modules/json-schema-traverse",
+ "node_modules/minimatch",
+ "node_modules/once",
+ "node_modules/path-is-absolute",
+ "node_modules/rxjs",
+ "node_modules/tslib",
+ "node_modules/unidiff",
+ "node_modules/wrappy",
+ "node_modules/zone.js",
+ "node_modules/@angular/core",
+ "node_modules/@gregmagolan/test-a",
+ "node_modules/@gregmagolan/test-b",
+])
+js_library(
+ name = "node_modules",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [
+ "//ajv:ajv__files",
+ "//balanced-match:balanced-match__files",
+ "//brace-expansion:brace-expansion__files",
+ "//co:co__files",
+ "//concat-map:concat-map__files",
+ "//diff:diff__files",
+ "//fast-deep-equal:fast-deep-equal__files",
+ "//fast-json-stable-stringify:fast-json-stable-stringify__files",
+ "//fs.realpath:fs.realpath__files",
+ "//glob:glob__files",
+ "//inflight:inflight__files",
+ "//inherits:inherits__files",
+ "//jasmine:jasmine__files",
+ "//jasmine-core:jasmine-core__files",
+ "//json-schema-traverse:json-schema-traverse__files",
+ "//minimatch:minimatch__files",
+ "//once:once__files",
+ "//path-is-absolute:path-is-absolute__files",
+ "//rxjs:rxjs__files",
+ "//tslib:tslib__files",
+ "//unidiff:unidiff__files",
+ "//wrappy:wrappy__files",
+ "//zone.js:zone.js__files",
+ "//@angular/core:core__files",
+ "//@gregmagolan/test-a:test-a__files",
+ "//@gregmagolan/test-b:test-b__files",
+ ],
+ deps = [
+ "//ajv:ajv__contents",
+ "//balanced-match:balanced-match__contents",
+ "//brace-expansion:brace-expansion__contents",
+ "//co:co__contents",
+ "//concat-map:concat-map__contents",
+ "//diff:diff__contents",
+ "//fast-deep-equal:fast-deep-equal__contents",
+ "//fast-json-stable-stringify:fast-json-stable-stringify__contents",
+ "//fs.realpath:fs.realpath__contents",
+ "//glob:glob__contents",
+ "//inflight:inflight__contents",
+ "//inherits:inherits__contents",
+ "//jasmine:jasmine__contents",
+ "//jasmine-core:jasmine-core__contents",
+ "//json-schema-traverse:json-schema-traverse__contents",
+ "//minimatch:minimatch__contents",
+ "//once:once__contents",
+ "//path-is-absolute:path-is-absolute__contents",
+ "//rxjs:rxjs__contents",
+ "//tslib:tslib__contents",
+ "//unidiff:unidiff__contents",
+ "//wrappy:wrappy__contents",
+ "//zone.js:zone.js__contents",
+ "//@angular/core:core__contents",
+ "//@gregmagolan/test-a:test-a__contents",
+ "//@gregmagolan/test-b:test-b__contents",
+ ],
+)
+filegroup(
+ name = "golden_files",
+ srcs = [
+ "//:BUILD.bazel",
+ "//:manual_build_file_contents",
+ "//:WORKSPACE",
+ "//@angular/core:BUILD.bazel",
+ "//@gregmagolan:BUILD.bazel",
+ "//@gregmagolan/test-a/bin:BUILD.bazel",
+ "//@gregmagolan/test-a:BUILD.bazel",
+ "//@gregmagolan/test-a:index.bzl",
+ "//@gregmagolan/test-b:BUILD.bazel",
+ "//ajv:BUILD.bazel",
+ "//jasmine/bin:BUILD.bazel",
+ "//jasmine:BUILD.bazel",
+ "//jasmine:index.bzl",
+ "//rxjs:BUILD.bazel",
+ "//unidiff:BUILD.bazel",
+ "//zone.js:BUILD.bazel",
+ "//some-target-a:BUILD.bazel",
+ "//some-target-a2:BUILD.bazel",
+ "//@some-scope/some-target-b:BUILD.bazel",
+ "//@some-scope/some-target-b2:BUILD.bazel",
+ ],
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/WORKSPACE.golden b/internal/npm_install/test/golden_directory_artifacts/WORKSPACE.golden
new file mode 100644
index 0000000000..d291c99ffa
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/WORKSPACE.golden
@@ -0,0 +1 @@
+workspace(name = "fine_grained_directory_artifacts_goldens")
diff --git a/internal/npm_install/test/golden_directory_artifacts/ajv/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/ajv/BUILD.bazel.golden
new file mode 100644
index 0000000000..cbca06fe14
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/ajv/BUILD.bazel.golden
@@ -0,0 +1,38 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "ajv__files",
+ srcs = ["//:node_modules/ajv"],
+)
+js_library(
+ name = "ajv",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":ajv__files"],
+ deps = [
+ "//ajv:ajv__contents",
+ "//co:co__contents",
+ "//fast-deep-equal:fast-deep-equal__contents",
+ "//fast-json-stable-stringify:fast-json-stable-stringify__contents",
+ "//json-schema-traverse:json-schema-traverse__contents",
+ ],
+)
+js_library(
+ name = "ajv__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":ajv__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "ajv__typings",
+ actual = "ajv__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "ajv__umd",
+ package_name = "ajv",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/ajv": "lib/ajv.js" },
+ package = ":ajv",
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/jasmine/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/jasmine/BUILD.bazel.golden
new file mode 100644
index 0000000000..d5778ff38a
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/jasmine/BUILD.bazel.golden
@@ -0,0 +1,46 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "jasmine__files",
+ srcs = ["//:node_modules/jasmine"],
+)
+js_library(
+ name = "jasmine",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":jasmine__files"],
+ deps = [
+ "//jasmine:jasmine__contents",
+ "//glob:glob__contents",
+ "//fs.realpath:fs.realpath__contents",
+ "//inflight:inflight__contents",
+ "//once:once__contents",
+ "//wrappy:wrappy__contents",
+ "//inherits:inherits__contents",
+ "//minimatch:minimatch__contents",
+ "//brace-expansion:brace-expansion__contents",
+ "//balanced-match:balanced-match__contents",
+ "//concat-map:concat-map__contents",
+ "//path-is-absolute:path-is-absolute__contents",
+ ],
+)
+js_library(
+ name = "jasmine__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":jasmine__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "jasmine__typings",
+ actual = "jasmine__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "jasmine__umd",
+ package_name = "jasmine",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/jasmine": "lib/jasmine.js" },
+ package = ":jasmine",
+)
+exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden_directory_artifacts/jasmine/bin/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/jasmine/bin/BUILD.bazel.golden
new file mode 100644
index 0000000000..5838043f2e
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/jasmine/bin/BUILD.bazel.golden
@@ -0,0 +1,8 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
+nodejs_binary(
+ name = "jasmine",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/jasmine": "bin/jasmine.js" },
+ data = ["//jasmine:jasmine"],
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/jasmine/index.bzl.golden b/internal/npm_install/test/golden_directory_artifacts/jasmine/index.bzl.golden
new file mode 100644
index 0000000000..06565b507d
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/jasmine/index.bzl.golden
@@ -0,0 +1,17 @@
+load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary", "nodejs_test", "npm_package_bin")
+def jasmine(**kwargs):
+ output_dir = kwargs.pop("output_dir", False)
+ if "outs" in kwargs or output_dir:
+ npm_package_bin(tool = "@fine_grained_directory_artifacts_goldens//jasmine/bin:jasmine", output_dir = output_dir, **kwargs)
+ else:
+ nodejs_binary(
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/jasmine": "bin/jasmine.js" },
+ data = ["@fine_grained_directory_artifacts_goldens//jasmine:jasmine"] + kwargs.pop("data", []),
+ **kwargs
+ )
+def jasmine_test(**kwargs):
+ nodejs_test(
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/jasmine": "bin/jasmine.js" },
+ data = ["@fine_grained_directory_artifacts_goldens//jasmine:jasmine"] + kwargs.pop("data", []),
+ **kwargs
+ )
diff --git a/internal/npm_install/test/golden_directory_artifacts/manual_build_file_contents.golden b/internal/npm_install/test/golden_directory_artifacts/manual_build_file_contents.golden
new file mode 100755
index 0000000000..682ed9819b
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/manual_build_file_contents.golden
@@ -0,0 +1,26 @@
+
+filegroup(
+ name = "golden_files",
+ srcs = [
+ "//:BUILD.bazel",
+ "//:manual_build_file_contents",
+ "//:WORKSPACE",
+ "//@angular/core:BUILD.bazel",
+ "//@gregmagolan:BUILD.bazel",
+ "//@gregmagolan/test-a/bin:BUILD.bazel",
+ "//@gregmagolan/test-a:BUILD.bazel",
+ "//@gregmagolan/test-a:index.bzl",
+ "//@gregmagolan/test-b:BUILD.bazel",
+ "//ajv:BUILD.bazel",
+ "//jasmine/bin:BUILD.bazel",
+ "//jasmine:BUILD.bazel",
+ "//jasmine:index.bzl",
+ "//rxjs:BUILD.bazel",
+ "//unidiff:BUILD.bazel",
+ "//zone.js:BUILD.bazel",
+ "//some-target-a:BUILD.bazel",
+ "//some-target-a2:BUILD.bazel",
+ "//@some-scope/some-target-b:BUILD.bazel",
+ "//@some-scope/some-target-b2:BUILD.bazel",
+ ],
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/rxjs/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/rxjs/BUILD.bazel.golden
new file mode 100644
index 0000000000..5e631c7411
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/rxjs/BUILD.bazel.golden
@@ -0,0 +1,35 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "rxjs__files",
+ srcs = ["//:node_modules/rxjs"],
+)
+js_library(
+ name = "rxjs",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":rxjs__files"],
+ deps = [
+ "//rxjs:rxjs__contents",
+ "//tslib:tslib__contents",
+ ],
+)
+js_library(
+ name = "rxjs__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":rxjs__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "rxjs__typings",
+ actual = "rxjs__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "rxjs__umd",
+ package_name = "rxjs",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/rxjs": "_esm5/index.js" },
+ package = ":rxjs",
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/some-target-a/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/some-target-a/BUILD.bazel.golden
new file mode 100644
index 0000000000..24cbd09f8e
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/some-target-a/BUILD.bazel.golden
@@ -0,0 +1,9 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//internal/linker:npm_link.bzl", "npm_link")
+npm_link(
+ name = "some-target-a",
+ target = "@//some/target/a",
+ package_name = "some-target-a",
+ package_path = "",
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/some-target-a2/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/some-target-a2/BUILD.bazel.golden
new file mode 100644
index 0000000000..0904beb52d
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/some-target-a2/BUILD.bazel.golden
@@ -0,0 +1,9 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//internal/linker:npm_link.bzl", "npm_link")
+npm_link(
+ name = "some-target-a2",
+ target = "@//some/target/a",
+ package_name = "some-target-a2",
+ package_path = "",
+)
\ No newline at end of file
diff --git a/internal/npm_install/test/golden_directory_artifacts/unidiff/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/unidiff/BUILD.bazel.golden
new file mode 100644
index 0000000000..1dbd1b7f3a
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/unidiff/BUILD.bazel.golden
@@ -0,0 +1,35 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "unidiff__files",
+ srcs = ["//:node_modules/unidiff"],
+)
+js_library(
+ name = "unidiff",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":unidiff__files"],
+ deps = [
+ "//unidiff:unidiff__contents",
+ "//diff:diff__contents",
+ ],
+)
+js_library(
+ name = "unidiff__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":unidiff__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "unidiff__typings",
+ actual = "unidiff__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "unidiff__umd",
+ package_name = "unidiff",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/unidiff": "unidiff.js" },
+ package = ":unidiff",
+)
diff --git a/internal/npm_install/test/golden_directory_artifacts/zone.js/BUILD.bazel.golden b/internal/npm_install/test/golden_directory_artifacts/zone.js/BUILD.bazel.golden
new file mode 100644
index 0000000000..3af886727a
--- /dev/null
+++ b/internal/npm_install/test/golden_directory_artifacts/zone.js/BUILD.bazel.golden
@@ -0,0 +1,34 @@
+
+package(default_visibility = ["//visibility:public"])
+load("@build_bazel_rules_nodejs//:index.bzl", "js_library")
+filegroup(
+ name = "zone.js__files",
+ srcs = ["//:node_modules/zone.js"],
+)
+js_library(
+ name = "zone.js",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":zone.js__files"],
+ deps = [
+ "//zone.js:zone.js__contents",
+ ],
+)
+js_library(
+ name = "zone.js__contents",
+ package_name = "$node_modules_dir$",
+ package_path = "",
+ srcs = [":zone.js__files"],
+ visibility = ["//:__subpackages__"],
+)
+alias(
+ name = "zone.js__typings",
+ actual = "zone.js__contents",
+)
+load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle")
+npm_umd_bundle(
+ name = "zone.js__umd",
+ package_name = "zone.js",
+ entry_point = { "@fine_grained_directory_artifacts_goldens//:node_modules/zone.js": "dist/zone.js" },
+ package = ":zone.js",
+)
diff --git a/internal/npm_install/test/golden_multi_linked/@angular/core/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/@angular/core/BUILD.bazel.golden
index e4a03a3672..118d2fde67 100644
--- a/internal/npm_install/test/golden_multi_linked/@angular/core/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/@angular/core/BUILD.bazel.golden
@@ -772,6 +772,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "core__umd",
package_name = "@angular/core",
- entry_point = "//:node_modules/@angular/core/fesm5/core.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/@angular/core/fesm5/core.js",
package = ":core",
)
diff --git a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/BUILD.bazel.golden
index dec421040c..fec2ef950a 100644
--- a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/BUILD.bazel.golden
@@ -50,7 +50,7 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "test-a__umd",
package_name = "@gregmagolan/test-a",
- entry_point = "//:node_modules/@gregmagolan/test-a/main.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/@gregmagolan/test-a/main.js",
package = ":test-a",
)
exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/bin/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/bin/BUILD.bazel.golden
index b78ca2cd65..a46480cdb2 100644
--- a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/bin/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-a/bin/BUILD.bazel.golden
@@ -3,6 +3,6 @@ package(default_visibility = ["//visibility:public"])
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
name = "test",
- entry_point = "//:node_modules/@gregmagolan/test-a/@bin/test.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/@gregmagolan/test-a/@bin/test.js",
data = ["//@gregmagolan/test-a:test-a"],
)
diff --git a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-b/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-b/BUILD.bazel.golden
index f404e45b0c..faa9caa398 100644
--- a/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-b/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/@gregmagolan/test-b/BUILD.bazel.golden
@@ -49,6 +49,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "test-b__umd",
package_name = "@gregmagolan/test-b",
- entry_point = "//:node_modules/@gregmagolan/test-b/main.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/@gregmagolan/test-b/main.js",
package = ":test-b",
)
diff --git a/internal/npm_install/test/golden_multi_linked/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/BUILD.bazel.golden
index cb81b496b0..3871391ded 100644
--- a/internal/npm_install/test/golden_multi_linked/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/BUILD.bazel.golden
@@ -4730,56 +4730,56 @@ js_library(
package_path = "tools/fine_grained_goldens",
srcs = [
"//ajv:ajv__files",
- "//ajv:ajv__nested_node_modules",
"//balanced-match:balanced-match__files",
- "//balanced-match:balanced-match__nested_node_modules",
"//brace-expansion:brace-expansion__files",
- "//brace-expansion:brace-expansion__nested_node_modules",
"//co:co__files",
- "//co:co__nested_node_modules",
"//concat-map:concat-map__files",
- "//concat-map:concat-map__nested_node_modules",
"//diff:diff__files",
- "//diff:diff__nested_node_modules",
"//fast-deep-equal:fast-deep-equal__files",
- "//fast-deep-equal:fast-deep-equal__nested_node_modules",
"//fast-json-stable-stringify:fast-json-stable-stringify__files",
- "//fast-json-stable-stringify:fast-json-stable-stringify__nested_node_modules",
"//fs.realpath:fs.realpath__files",
- "//fs.realpath:fs.realpath__nested_node_modules",
"//glob:glob__files",
- "//glob:glob__nested_node_modules",
"//inflight:inflight__files",
- "//inflight:inflight__nested_node_modules",
"//inherits:inherits__files",
- "//inherits:inherits__nested_node_modules",
"//jasmine:jasmine__files",
- "//jasmine:jasmine__nested_node_modules",
"//jasmine-core:jasmine-core__files",
- "//jasmine-core:jasmine-core__nested_node_modules",
"//json-schema-traverse:json-schema-traverse__files",
- "//json-schema-traverse:json-schema-traverse__nested_node_modules",
"//minimatch:minimatch__files",
- "//minimatch:minimatch__nested_node_modules",
"//once:once__files",
- "//once:once__nested_node_modules",
"//path-is-absolute:path-is-absolute__files",
- "//path-is-absolute:path-is-absolute__nested_node_modules",
"//rxjs:rxjs__files",
- "//rxjs:rxjs__nested_node_modules",
"//tslib:tslib__files",
- "//tslib:tslib__nested_node_modules",
"//unidiff:unidiff__files",
- "//unidiff:unidiff__nested_node_modules",
"//wrappy:wrappy__files",
- "//wrappy:wrappy__nested_node_modules",
"//zone.js:zone.js__files",
- "//zone.js:zone.js__nested_node_modules",
"//@angular/core:core__files",
- "//@angular/core:core__nested_node_modules",
"//@gregmagolan/test-a:test-a__files",
- "//@gregmagolan/test-a:test-a__nested_node_modules",
"//@gregmagolan/test-b:test-b__files",
+ "//ajv:ajv__nested_node_modules",
+ "//balanced-match:balanced-match__nested_node_modules",
+ "//brace-expansion:brace-expansion__nested_node_modules",
+ "//co:co__nested_node_modules",
+ "//concat-map:concat-map__nested_node_modules",
+ "//diff:diff__nested_node_modules",
+ "//fast-deep-equal:fast-deep-equal__nested_node_modules",
+ "//fast-json-stable-stringify:fast-json-stable-stringify__nested_node_modules",
+ "//fs.realpath:fs.realpath__nested_node_modules",
+ "//glob:glob__nested_node_modules",
+ "//inflight:inflight__nested_node_modules",
+ "//inherits:inherits__nested_node_modules",
+ "//jasmine:jasmine__nested_node_modules",
+ "//jasmine-core:jasmine-core__nested_node_modules",
+ "//json-schema-traverse:json-schema-traverse__nested_node_modules",
+ "//minimatch:minimatch__nested_node_modules",
+ "//once:once__nested_node_modules",
+ "//path-is-absolute:path-is-absolute__nested_node_modules",
+ "//rxjs:rxjs__nested_node_modules",
+ "//tslib:tslib__nested_node_modules",
+ "//unidiff:unidiff__nested_node_modules",
+ "//wrappy:wrappy__nested_node_modules",
+ "//zone.js:zone.js__nested_node_modules",
+ "//@angular/core:core__nested_node_modules",
+ "//@gregmagolan/test-a:test-a__nested_node_modules",
"//@gregmagolan/test-b:test-b__nested_node_modules",
],
deps = [
diff --git a/internal/npm_install/test/golden_multi_linked/ajv/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/ajv/BUILD.bazel.golden
index 7e7be35ac6..4321881966 100644
--- a/internal/npm_install/test/golden_multi_linked/ajv/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/ajv/BUILD.bazel.golden
@@ -140,6 +140,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "ajv__umd",
package_name = "ajv",
- entry_point = "//:node_modules/ajv/lib/ajv.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/ajv/lib/ajv.js",
package = ":ajv",
)
diff --git a/internal/npm_install/test/golden_multi_linked/jasmine/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/jasmine/BUILD.bazel.golden
index 92cae69c60..fc056109a0 100644
--- a/internal/npm_install/test/golden_multi_linked/jasmine/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/jasmine/BUILD.bazel.golden
@@ -91,7 +91,7 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "jasmine__umd",
package_name = "jasmine",
- entry_point = "//:node_modules/jasmine/lib/jasmine.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/jasmine/lib/jasmine.js",
package = ":jasmine",
)
exports_files(["index.bzl"])
diff --git a/internal/npm_install/test/golden_multi_linked/jasmine/bin/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/jasmine/bin/BUILD.bazel.golden
index 9748049b8a..16a4b2efeb 100644
--- a/internal/npm_install/test/golden_multi_linked/jasmine/bin/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/jasmine/bin/BUILD.bazel.golden
@@ -3,6 +3,6 @@ package(default_visibility = ["//visibility:public"])
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
nodejs_binary(
name = "jasmine",
- entry_point = "//:node_modules/jasmine/bin/jasmine.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/jasmine/bin/jasmine.js",
data = ["//jasmine:jasmine"],
)
diff --git a/internal/npm_install/test/golden_multi_linked/rxjs/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/rxjs/BUILD.bazel.golden
index e1aa5fb180..2c62abe3d5 100644
--- a/internal/npm_install/test/golden_multi_linked/rxjs/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/rxjs/BUILD.bazel.golden
@@ -4323,6 +4323,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "rxjs__umd",
package_name = "rxjs",
- entry_point = "//:node_modules/rxjs/_esm5/index.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/rxjs/_esm5/index.js",
package = ":rxjs",
)
diff --git a/internal/npm_install/test/golden_multi_linked/unidiff/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/unidiff/BUILD.bazel.golden
index 27141b1c74..4558897433 100644
--- a/internal/npm_install/test/golden_multi_linked/unidiff/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/unidiff/BUILD.bazel.golden
@@ -56,6 +56,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "unidiff__umd",
package_name = "unidiff",
- entry_point = "//:node_modules/unidiff/unidiff.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/unidiff/unidiff.js",
package = ":unidiff",
)
diff --git a/internal/npm_install/test/golden_multi_linked/zone.js/BUILD.bazel.golden b/internal/npm_install/test/golden_multi_linked/zone.js/BUILD.bazel.golden
index 0dfdc45230..28a1c8a714 100644
--- a/internal/npm_install/test/golden_multi_linked/zone.js/BUILD.bazel.golden
+++ b/internal/npm_install/test/golden_multi_linked/zone.js/BUILD.bazel.golden
@@ -176,6 +176,6 @@ load("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_
npm_umd_bundle(
name = "zone.js__umd",
package_name = "zone.js",
- entry_point = "//:node_modules/zone.js/dist/zone.js",
+ entry_point = "@fine_grained_goldens_multi_linked//:node_modules/zone.js/dist/zone.js",
package = ":zone.js",
)
diff --git a/internal/npm_install/test/update_golden.js b/internal/npm_install/test/update_golden.js
index 18432ac74e..1adc1da75e 100644
--- a/internal/npm_install/test/update_golden.js
+++ b/internal/npm_install/test/update_golden.js
@@ -3,3 +3,6 @@ const {check, files} = require('./check');
files.forEach(file => check('fine_grained_goldens', 'golden', file, true));
files.forEach(
file => check('fine_grained_goldens_multi_linked', 'golden_multi_linked', file, true));
+ files.forEach(
+ file => check('fine_grained_directory_artifacts_goldens', 'golden_directory_artifacts', file, true));
+
\ No newline at end of file
diff --git a/internal/providers/external_npm_package_info.bzl b/internal/providers/external_npm_package_info.bzl
index c0a8b36c09..39527a407a 100644
--- a/internal/providers/external_npm_package_info.bzl
+++ b/internal/providers/external_npm_package_info.bzl
@@ -22,6 +22,7 @@ ExternalNpmPackageInfo = provider(
doc = "Provides information about one or more external npm packages",
fields = {
"direct_sources": "Depset of direct source files in these external npm package(s)",
+ "has_directories": "True if any sources are directory artifacts",
"path": "The local workspace path that these external npm deps should be linked at. If empty, they will be linked at the root.",
"sources": "Depset of direct & transitive source files in these external npm package(s) and transitive dependencies",
"workspace": "The workspace name that these external npm package(s) are provided from",
@@ -37,9 +38,14 @@ def _node_modules_aspect_impl(target, ctx):
# map of 'path' to [workspace, sources_depsets]
paths = {}
+
+ # if any deps have has_directories then has_directories will be true
+ has_directories = False
+
if hasattr(ctx.rule.attr, "deps"):
for dep in ctx.rule.attr.deps:
if ExternalNpmPackageInfo in dep:
+ has_directories = has_directories or dep[ExternalNpmPackageInfo].has_directories
path = dep[ExternalNpmPackageInfo].path
workspace = dep[ExternalNpmPackageInfo].workspace
sources_depsets = []
@@ -56,6 +62,7 @@ def _node_modules_aspect_impl(target, ctx):
sources = depset(transitive = path_entry[1]),
workspace = path_entry[0],
path = path,
+ has_directories = has_directories,
)])
return providers
diff --git a/internal/providers/tree_artifacts.bzl b/internal/providers/tree_artifacts.bzl
index 80257cc985..8ce59eeafd 100644
--- a/internal/providers/tree_artifacts.bzl
+++ b/internal/providers/tree_artifacts.bzl
@@ -29,8 +29,8 @@ DirectoryFilePathInfo = provider(
)
def _directory_file_path(ctx):
- if not ctx.file.directory.is_directory:
- fail("directory attribute must be created with Bazel declare_directory (TreeArtifact)")
+ if not ctx.file.directory.is_source and not ctx.file.directory.is_directory:
+ fail("directory attribute must be a source directory or created with Bazel declare_directory (TreeArtifact)")
return [DirectoryFilePathInfo(path = ctx.attr.path, directory = ctx.file.directory)]
directory_file_path = rule(
diff --git a/npm_deps.bzl b/npm_deps.bzl
index aa2c497674..04ffeeeb6e 100644
--- a/npm_deps.bzl
+++ b/npm_deps.bzl
@@ -10,6 +10,27 @@ def npm_deps():
data = [
"//:patches/jest-haste-map+25.3.0.patch",
"//internal/npm_install/test:postinstall.js",
+ "//tools/npm_packages/bazel_workspaces_consistent:BUILD.bazel",
+ "//tools/npm_packages/bazel_workspaces_consistent:index.bzl",
+ "//tools/npm_packages/bazel_workspaces_consistent:package.json",
+ "//:tools/npm_packages/hello/package.json",
+ "//:tools/npm_packages/hello/index.js",
+ "//:tools/npm_packages/node_resolve_index/index.js",
+ "//:tools/npm_packages/node_resolve_index_2/index.js",
+ "//:tools/npm_packages/node_resolve_index_2/package.json",
+ "//:tools/npm_packages/node_resolve_index_3/index.js",
+ "//:tools/npm_packages/node_resolve_index_3/package.json",
+ "//:tools/npm_packages/node_resolve_index_4/index.js",
+ "//:tools/npm_packages/node_resolve_index_4/package.json",
+ "//:tools/npm_packages/node_resolve_main/main.js",
+ "//:tools/npm_packages/node_resolve_main/package.json",
+ "//:tools/npm_packages/node_resolve_main_2/main.js",
+ "//:tools/npm_packages/node_resolve_main_2/package.json",
+ "//:tools/npm_packages/node_resolve_nested_main/package.json",
+ "//:tools/npm_packages/node_resolve_nested_main/nested/main.js",
+ "//:tools/npm_packages/node_resolve_nested_main/nested/package.json",
+ "//:tools/npm_packages/testy/index.js",
+ "//:tools/npm_packages/testy/package.json",
],
environment = {
"SOME_USER_ENV": "yarn is great!",
@@ -28,6 +49,52 @@ def npm_deps():
yarn_lock = "//:yarn.lock",
)
+ yarn_install(
+ name = "npm_directory_artifacts",
+ data = [
+ "//:patches/jest-haste-map+25.3.0.patch",
+ "//internal/npm_install/test:postinstall.js",
+ "//tools/npm_packages/bazel_workspaces_consistent:BUILD.bazel",
+ "//tools/npm_packages/bazel_workspaces_consistent:index.bzl",
+ "//tools/npm_packages/bazel_workspaces_consistent:package.json",
+ "//:tools/npm_packages/hello/package.json",
+ "//:tools/npm_packages/hello/index.js",
+ "//:tools/npm_packages/node_resolve_index/index.js",
+ "//:tools/npm_packages/node_resolve_index_2/index.js",
+ "//:tools/npm_packages/node_resolve_index_2/package.json",
+ "//:tools/npm_packages/node_resolve_index_3/index.js",
+ "//:tools/npm_packages/node_resolve_index_3/package.json",
+ "//:tools/npm_packages/node_resolve_index_4/index.js",
+ "//:tools/npm_packages/node_resolve_index_4/package.json",
+ "//:tools/npm_packages/node_resolve_main/main.js",
+ "//:tools/npm_packages/node_resolve_main/package.json",
+ "//:tools/npm_packages/node_resolve_main_2/main.js",
+ "//:tools/npm_packages/node_resolve_main_2/package.json",
+ "//:tools/npm_packages/node_resolve_nested_main/package.json",
+ "//:tools/npm_packages/node_resolve_nested_main/nested/main.js",
+ "//:tools/npm_packages/node_resolve_nested_main/nested/package.json",
+ "//:tools/npm_packages/testy/index.js",
+ "//:tools/npm_packages/testy/package.json",
+ ],
+ environment = {
+ "SOME_USER_ENV": "yarn is great!",
+ },
+ links = {
+ "@test_multi_linker/lib-a": "//internal/linker/test/multi_linker/lib_a",
+ "@test_multi_linker/lib-a2": "//internal/linker/test/multi_linker/lib_a",
+ "@test_multi_linker/lib-b": "@//internal/linker/test/multi_linker/lib_b",
+ "@test_multi_linker/lib-b2": "@//internal/linker/test/multi_linker/lib_b",
+ "@test_multi_linker/lib-c": "@build_bazel_rules_nodejs//internal/linker/test/multi_linker/lib_c",
+ "@test_multi_linker/lib-c2": "@build_bazel_rules_nodejs//internal/linker/test/multi_linker/lib_c",
+ "@test_multi_linker/lib-d": "@build_bazel_rules_nodejs//internal/linker/test/multi_linker/lib_d",
+ "@test_multi_linker/lib-d2": "@build_bazel_rules_nodejs//internal/linker/test/multi_linker/lib_d",
+ },
+ symlink_node_modules = False,
+ exports_directories_only = True,
+ package_json = "//:package.json",
+ yarn_lock = "//:yarn.lock",
+ )
+
yarn_install(
name = "internal_test_multi_linker_deps",
links = {
@@ -204,6 +271,39 @@ def npm_deps():
symlink_node_modules = False,
)
+ yarn_install(
+ name = "fine_grained_deps_yarn_directory_artifacts",
+ data = [
+ "//:tools/npm_packages/local_module/yarn/index.js",
+ "//:tools/npm_packages/local_module/yarn/package.json",
+ "//internal/npm_install/test:postinstall.js",
+ ],
+ environment = {
+ "SOME_USER_ENV": "yarn is great!",
+ },
+ exports_directories_only = True,
+ package_json = "//:tools/fine_grained_deps_yarn/package.json",
+ symlink_node_modules = False,
+ yarn_lock = "//:tools/fine_grained_deps_yarn/yarn.lock",
+ )
+
+ npm_install(
+ name = "fine_grained_deps_npm_directory_artifacts",
+ data = [
+ "//:tools/npm_packages/local_module/npm/index.js",
+ "//:tools/npm_packages/local_module/npm/package.json",
+ "//internal/npm_install/test:postinstall.js",
+ ],
+ environment = {
+ "SOME_USER_ENV": "npm is cool!",
+ },
+ exports_directories_only = True,
+ npm_command = "install",
+ package_json = "//:tools/fine_grained_deps_npm/package.json",
+ package_lock_json = "//:tools/fine_grained_deps_npm/package-lock.json",
+ symlink_node_modules = False,
+ )
+
yarn_install(
name = "fine_grained_no_bin",
package_json = "//:tools/fine_grained_no_bin/package.json",
@@ -260,6 +360,46 @@ filegroup(
yarn_lock = "//:tools/fine_grained_goldens/yarn.lock",
)
+ yarn_install(
+ name = "fine_grained_directory_artifacts_goldens",
+ links = {
+ "@some-scope/some-target-b": "@//some/target/b",
+ "@some-scope/some-target-b2": "@//some/target/b",
+ "some-target-a": "//some/target/a",
+ "some-target-a2": "//some/target/a",
+ },
+ manual_build_file_contents = """
+filegroup(
+ name = "golden_files",
+ srcs = [
+ "//:BUILD.bazel",
+ "//:manual_build_file_contents",
+ "//:WORKSPACE",
+ "//@angular/core:BUILD.bazel",
+ "//@gregmagolan:BUILD.bazel",
+ "//@gregmagolan/test-a/bin:BUILD.bazel",
+ "//@gregmagolan/test-a:BUILD.bazel",
+ "//@gregmagolan/test-a:index.bzl",
+ "//@gregmagolan/test-b:BUILD.bazel",
+ "//ajv:BUILD.bazel",
+ "//jasmine/bin:BUILD.bazel",
+ "//jasmine:BUILD.bazel",
+ "//jasmine:index.bzl",
+ "//rxjs:BUILD.bazel",
+ "//unidiff:BUILD.bazel",
+ "//zone.js:BUILD.bazel",
+ "//some-target-a:BUILD.bazel",
+ "//some-target-a2:BUILD.bazel",
+ "//@some-scope/some-target-b:BUILD.bazel",
+ "//@some-scope/some-target-b2:BUILD.bazel",
+ ],
+)""",
+ exports_directories_only = True,
+ package_json = "//:tools/fine_grained_goldens/package.json",
+ symlink_node_modules = False,
+ yarn_lock = "//:tools/fine_grained_goldens/yarn.lock",
+ )
+
yarn_install(
name = "internal_npm_install_test_patches_yarn",
package_json = "//internal/npm_install/test/patches_yarn:package.json",
diff --git a/packages/protractor/protractor_web_test.bzl b/packages/protractor/protractor_web_test.bzl
index 76eeefbfa2..f25bcfaa86 100644
--- a/packages/protractor/protractor_web_test.bzl
+++ b/packages/protractor/protractor_web_test.bzl
@@ -242,7 +242,7 @@ def protractor_web_test(
server = None,
tags = [],
peer_deps = _PROTRACTOR_PEER_DEPS,
- protractor_entry_point = _PROTRACTOR_ENTRY_POINT,
+ protractor_entry_point = Label(_PROTRACTOR_ENTRY_POINT),
**kwargs):
"""Runs a protractor test in a browser.
@@ -267,7 +267,7 @@ def protractor_web_test(
nodejs_binary(
name = protractor_bin_name,
- entry_point = Label(protractor_entry_point),
+ entry_point = protractor_entry_point,
data = srcs + deps + data + [Label(d) for d in peer_deps],
testonly = 1,
# TODO: make protractor binary not depend on monkey-patched require()
diff --git a/packages/terser/index.js b/packages/terser/index.js
index 99ffefa43a..682550b083 100644
--- a/packages/terser/index.js
+++ b/packages/terser/index.js
@@ -168,6 +168,7 @@ function main() {
// and strip the /package.json and add /bin/terser in its place. This has now been
// fixed upstream in https://github.com/terser/terser/pull/971 but this code should remain
// so we support all versions of terser.
+ // NB: slice(0,-13) trims the '/pacakge.json' from the end of the resolved path.
const terserNpmPath = require.resolve('terser/package.json').slice(0,-13);
terserBinary = `${terserNpmPath}/bin/terser`;
if (!fs.existsSync(terserBinary)) {