diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 904bd88d87..e735c48a22 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -382,29 +382,37 @@ tasks: # Disabled due to https://github.com/bazelbuild/rules_nodejs/issues/1486 #- "@fine_grained_deps_yarn//typescript/bin:tsc" build_flags: - - "--build_tag_filters=-e2e,-examples,-fix-windows,-manual" + - "--build_tag_filters=-e2e,-examples,-manual,-fix-windows,-no-bazelci-windows,-requires-runfiles" build_targets: - "//..." test_flags: # Firefox not supported on Windows with rules_webtesting (if run it exit with success) # See https://github.com/bazelbuild/rules_webtesting/blob/0.3.3/browsers/BUILD.bazel#L66. - - "--test_tag_filters=-e2e,-examples,-fix-windows,-no-bazelci-windows,-manual,-browser:firefox-local,-cypress" + - "--test_tag_filters=-e2e,-examples,-fix-windows,-no-bazelci-windows,-requires-runfiles,-manual,-browser:firefox-local,-cypress" test_targets: - "//..." # //internal/node/test:nodejs_toolchain_windows_amd64_test is a "manual" test that must be run # explicitly; it should pass when running on Windows with no --platform set. - "//internal/node/test:nodejs_toolchain_windows_amd64_test" + windows_runfiles_enabled: + name: windows_runfiles_enabled + platform: windows + test_flags: + - "--test_tag_filters=requires-runfiles" + - "--enable_runfiles" + test_targets: + - "//..." windows_e2e: name: windows_e2e platform: windows build_flags: - - "--build_tag_filters=e2e,-fix-windows" + - "--build_tag_filters=e2e,-fix-windows,-no-bazelci-windows,-requires-runfiles" build_targets: - "//..." # We control Bazel version in integration tests, so we don't need USE_BAZEL_VERSION for tests. skip_use_bazel_version_for_test: true test_flags: - - "--test_tag_filters=e2e,-fix-windows,-no-bazelci-windows" + - "--test_tag_filters=e2e,-fix-windows,-no-bazelci-windows,-requires-runfiles" - "--local_ram_resources=792" # test_args will be passed to the nested bazel process - "--test_arg=--local_ram_resources=13288" @@ -412,20 +420,20 @@ tasks: # See https://github.com/bazelbuild/rules_webtesting/blob/0.3.3/browsers/BUILD.bazel#L66. # Chrome fails to launch on Windows inside bazel-in-bazel with: [17:12:04] E/launcher - # spawn D:\...\external\io_bazel_rules_webtesting\third_party\chromedriver\chromedriver.out\chromedriver_win32\chromedriver.exe ENOENT - - "--test_arg=--test_tag_filters=-fix-windows,-manual,-browser:chromium-local,-browser:firefox-local" + - "--test_arg=--test_tag_filters=-fix-windows,-no-bazelci-windows,-requires-runfiles,-manual,-browser:chromium-local,-browser:firefox-local" test_targets: - "//..." windows_examples: name: windows_examples platform: windows build_flags: - - "--build_tag_filters=examples,-fix-windows" + - "--build_tag_filters=examples,-fix-windows,-no-bazelci-windows,-requires-runfiles" build_targets: - "//..." # We control Bazel version in integration tests, so we don't need USE_BAZEL_VERSION for tests. skip_use_bazel_version_for_test: true test_flags: - - "--test_tag_filters=examples,-manual,-fix-windows,-no-bazelci-windows,-cypress" + - "--test_tag_filters=examples,-manual,-fix-windows,-no-bazelci-windows,-requires-runfiles,-cypress" - "--local_ram_resources=792" # test_args will be passed to the nested bazel process - "--test_arg=--local_ram_resources=13288" @@ -433,14 +441,15 @@ tasks: # See https://github.com/bazelbuild/rules_webtesting/blob/0.3.3/browsers/BUILD.bazel#L66. # Chrome fails to launch on Windows inside bazel-in-bazel with: [17:12:04] E/launcher - # spawn D:\...\external\io_bazel_rules_webtesting\third_party\chromedriver\chromedriver.out\chromedriver_win32\chromedriver.exe ENOENT - - "--test_arg=--test_tag_filters=-no-bazelci-windows,-fix-windows,-manual,-browser:chromium-local,-browser:firefox-local,-cypress" + - "--test_arg=--test_tag_filters=-fix-windows,-no-bazelci-windows,-requires-runfiles,-manual,-browser:chromium-local,-browser:firefox-local,-cypress" test_targets: - "//..." windows_cross_compile_linux: name: windows_cross_compile_linux platform: windows - # Build on windows with the node --platform set to linux build_flags: + - "--build_tag_filters=-fix-windows,-no-bazelci-windows,-requires-runfiles" + # Build on windows with the node --platform set to linux - "--platforms=@build_bazel_rules_nodejs//toolchains/node:linux_amd64" build_targets: - "//internal/..." diff --git a/.bazelrc b/.bazelrc index 3fba9c4323..1b4a440e20 100644 --- a/.bazelrc +++ b/.bazelrc @@ -5,8 +5,8 @@ import %workspace%/common.bazelrc # This lets us glob() up all the files inside the examples to make them inputs to tests # To update these lines, just run `yarn bazel:update-deleted-packages` # (Note, we cannot use common --deleted_packages because the bazel version command doesn't support it) -build --deleted_packages=examples/angular,examples/angular/e2e,examples/angular/src/app/home,examples/angular/src/app/hello-world,examples/angular/src/app,examples/angular/src/app/todos,examples/angular/src/app/todos/reducers,examples/angular/src/shared/material,examples/angular/src/lib/shorten,examples/angular/src,examples/angular/src/assets,examples/angular/tools,examples/angular_bazel_architect,examples/angular_bazel_architect/projects/frontend-lib,examples/angular_view_engine,examples/angular_view_engine/e2e,examples/angular_view_engine/src/app/home,examples/angular_view_engine/src/app/hello-world,examples/angular_view_engine/src/app,examples/angular_view_engine/src/app/todos,examples/angular_view_engine/src/app/todos/reducers,examples/angular_view_engine/src/shared/material,examples/angular_view_engine/src/lib/typography,examples/angular_view_engine/src/lib/shorten,examples/angular_view_engine/src,examples/angular_view_engine/src/assets,examples/app,examples/app/styles,examples/app/test,examples/closure,examples/create-react-app,examples/cypress,examples/esbuild,examples/esbuild/src,examples/from_source,examples/jest,examples/jest/ts/test,examples/jest/ts,examples/jest/ts/src,examples/kotlin,examples/kotlin/node_modules/@bazel/rollup,examples/kotlin/node_modules/@bazel/terser,examples/nestjs,examples/nestjs/src,examples/parcel,examples/protobufjs,examples/protocol_buffers,examples/react_webpack,examples/user_managed_deps,examples/vendored_node,examples/vendored_node_and_yarn,examples/vue,examples/vue/src,examples/web_testing,examples/webapp,examples/worker,e2e/bazel_managed_deps,e2e/concatjs_devserver,e2e/concatjs_devserver/genrule,e2e/concatjs_devserver/subpackage,e2e/coverage,e2e/fine_grained_symlinks,e2e/jasmine,e2e/node_loader_no_preserve_symlinks,e2e/node_loader_preserve_symlinks,e2e/nodejs_image,e2e/nodejs_image/foolib,e2e/nodejs_repository,e2e/packages,e2e/symlinked_node_modules_npm,e2e/symlinked_node_modules_yarn,e2e/typescript,e2e/webapp -query --deleted_packages=examples/angular,examples/angular/e2e,examples/angular/src/app/home,examples/angular/src/app/hello-world,examples/angular/src/app,examples/angular/src/app/todos,examples/angular/src/app/todos/reducers,examples/angular/src/shared/material,examples/angular/src/lib/shorten,examples/angular/src,examples/angular/src/assets,examples/angular/tools,examples/angular_bazel_architect,examples/angular_bazel_architect/projects/frontend-lib,examples/angular_view_engine,examples/angular_view_engine/e2e,examples/angular_view_engine/src/app/home,examples/angular_view_engine/src/app/hello-world,examples/angular_view_engine/src/app,examples/angular_view_engine/src/app/todos,examples/angular_view_engine/src/app/todos/reducers,examples/angular_view_engine/src/shared/material,examples/angular_view_engine/src/lib/typography,examples/angular_view_engine/src/lib/shorten,examples/angular_view_engine/src,examples/angular_view_engine/src/assets,examples/app,examples/app/styles,examples/app/test,examples/closure,examples/create-react-app,examples/cypress,examples/esbuild,examples/esbuild/src,examples/from_source,examples/jest,examples/jest/ts/test,examples/jest/ts,examples/jest/ts/src,examples/kotlin,examples/kotlin/node_modules/@bazel/rollup,examples/kotlin/node_modules/@bazel/terser,examples/nestjs,examples/nestjs/src,examples/parcel,examples/protobufjs,examples/protocol_buffers,examples/react_webpack,examples/user_managed_deps,examples/vendored_node,examples/vendored_node_and_yarn,examples/vue,examples/vue/src,examples/web_testing,examples/webapp,examples/worker,e2e/bazel_managed_deps,e2e/concatjs_devserver,e2e/concatjs_devserver/genrule,e2e/concatjs_devserver/subpackage,e2e/coverage,e2e/fine_grained_symlinks,e2e/jasmine,e2e/node_loader_no_preserve_symlinks,e2e/node_loader_preserve_symlinks,e2e/nodejs_image,e2e/nodejs_image/foolib,e2e/nodejs_repository,e2e/packages,e2e/symlinked_node_modules_npm,e2e/symlinked_node_modules_yarn,e2e/typescript,e2e/webapp +build --deleted_packages=examples/angular,examples/angular/e2e,examples/angular/src/app/home,examples/angular/src/app/hello-world,examples/angular/src/app,examples/angular/src/app/todos,examples/angular/src/app/todos/reducers,examples/angular/src/shared/material,examples/angular/src/lib/shorten,examples/angular/src,examples/angular/src/assets,examples/angular/tools,examples/angular_bazel_architect,examples/angular_bazel_architect/projects/frontend-lib,examples/angular_view_engine,examples/angular_view_engine/e2e,examples/angular_view_engine/src/app/home,examples/angular_view_engine/src/app/hello-world,examples/angular_view_engine/src/app,examples/angular_view_engine/src/app/todos,examples/angular_view_engine/src/app/todos/reducers,examples/angular_view_engine/src/shared/material,examples/angular_view_engine/src/lib/typography,examples/angular_view_engine/src/lib/shorten,examples/angular_view_engine/src,examples/angular_view_engine/src/assets,examples/app,examples/app/styles,examples/app/test,examples/closure,examples/create-react-app,examples/cypress,examples/esbuild,examples/esbuild/src,examples/from_source,examples/jest,examples/jest/ts/test,examples/jest/ts,examples/jest/ts/src,examples/kotlin,examples/nestjs,examples/nestjs/src,examples/parcel,examples/protobufjs,examples/protocol_buffers,examples/react_webpack,examples/user_managed_deps,examples/vendored_node,examples/vendored_node_and_yarn,examples/vue,examples/vue/src,examples/web_testing,examples/webapp,examples/worker,e2e/bazel_managed_deps,e2e/concatjs_devserver,e2e/concatjs_devserver/genrule,e2e/concatjs_devserver/subpackage,e2e/concatjs_devserver_directory_artifacts,e2e/concatjs_devserver_directory_artifacts/genrule,e2e/concatjs_devserver_directory_artifacts/subpackage,e2e/coverage,e2e/fine_grained_symlinks,e2e/jasmine,e2e/node_loader_no_preserve_symlinks,e2e/node_loader_preserve_symlinks,e2e/nodejs_image,e2e/nodejs_image/foolib,e2e/nodejs_repository,e2e/packages,e2e/symlinked_node_modules_npm,e2e/symlinked_node_modules_yarn,e2e/typescript,e2e/webapp +query --deleted_packages=examples/angular,examples/angular/e2e,examples/angular/src/app/home,examples/angular/src/app/hello-world,examples/angular/src/app,examples/angular/src/app/todos,examples/angular/src/app/todos/reducers,examples/angular/src/shared/material,examples/angular/src/lib/shorten,examples/angular/src,examples/angular/src/assets,examples/angular/tools,examples/angular_bazel_architect,examples/angular_bazel_architect/projects/frontend-lib,examples/angular_view_engine,examples/angular_view_engine/e2e,examples/angular_view_engine/src/app/home,examples/angular_view_engine/src/app/hello-world,examples/angular_view_engine/src/app,examples/angular_view_engine/src/app/todos,examples/angular_view_engine/src/app/todos/reducers,examples/angular_view_engine/src/shared/material,examples/angular_view_engine/src/lib/typography,examples/angular_view_engine/src/lib/shorten,examples/angular_view_engine/src,examples/angular_view_engine/src/assets,examples/app,examples/app/styles,examples/app/test,examples/closure,examples/create-react-app,examples/cypress,examples/esbuild,examples/esbuild/src,examples/from_source,examples/jest,examples/jest/ts/test,examples/jest/ts,examples/jest/ts/src,examples/kotlin,examples/nestjs,examples/nestjs/src,examples/parcel,examples/protobufjs,examples/protocol_buffers,examples/react_webpack,examples/user_managed_deps,examples/vendored_node,examples/vendored_node_and_yarn,examples/vue,examples/vue/src,examples/web_testing,examples/webapp,examples/worker,e2e/bazel_managed_deps,e2e/concatjs_devserver,e2e/concatjs_devserver/genrule,e2e/concatjs_devserver/subpackage,e2e/concatjs_devserver_directory_artifacts,e2e/concatjs_devserver_directory_artifacts/genrule,e2e/concatjs_devserver_directory_artifacts/subpackage,e2e/coverage,e2e/fine_grained_symlinks,e2e/jasmine,e2e/node_loader_no_preserve_symlinks,e2e/node_loader_preserve_symlinks,e2e/nodejs_image,e2e/nodejs_image/foolib,e2e/nodejs_repository,e2e/packages,e2e/symlinked_node_modules_npm,e2e/symlinked_node_modules_yarn,e2e/typescript,e2e/webapp # Mock versioning command to test the --stamp behavior build --workspace_status_command="echo BUILD_SCM_VERSION 1.2.3" diff --git a/docs/Built-ins.html b/docs/Built-ins.html index f98f6d7b3f..85dc5ee2b1 100755 --- a/docs/Built-ins.html +++ b/docs/Built-ins.html @@ -1872,7 +1872,7 @@

package_name

The name it will be imported by. Should match the “name” field in the package.json file.

-

If package_name == “$node_modules$” this indictates that this js_library target is one or more external npm +

If package_name is “$node_modules$” or “$node_modules_dir$” this indictates that this js_library target is one or more external npm packages in node_modules. This is a special case that used be covered by the internal only external_npm_package attribute. NB: ‘$’ is an illegal character for npm packages names so this reserved name will not conflict with any valid package_name values

diff --git a/docs/Built-ins.md b/docs/Built-ins.md index 08428d8a46..d5bd0b071a 100755 --- a/docs/Built-ins.md +++ b/docs/Built-ins.md @@ -1777,7 +1777,7 @@ Defaults to `[]` The name it will be imported by. Should match the "name" field in the package.json file. -If package_name == "$node_modules$" this indictates that this js_library target is one or more external npm +If package_name is “$node_modules$” or “$node_modules_dir$” this indictates that this js_library target is one or more external npm packages in node_modules. This is a special case that used be covered by the internal only `external_npm_package` attribute. NB: '$' is an illegal character for npm packages names so this reserved name will not conflict with any valid package_name values diff --git a/e2e/BUILD.bazel b/e2e/BUILD.bazel index ba64f0205d..cb09bfe8d0 100644 --- a/e2e/BUILD.bazel +++ b/e2e/BUILD.bazel @@ -122,6 +122,21 @@ e2e_integration_test( }, ) +e2e_integration_test( + name = "e2e_concatjs_devserver_directory_artifacts", + bazel_commands = [ + "info", + # enable runfiles explicitly so it is on for Windows since directory + # artifacts requires runfiles + "test ... --enable_runfiles", + ], + npm_packages = { + "//packages/concatjs:npm_package": "@bazel/concatjs", + "//packages/protractor:npm_package": "@bazel/protractor", + "//packages/typescript:npm_package": "@bazel/typescript", + }, +) + [e2e_integration_test( name = "e2e_typescript_%s" % tsc_version.replace(".", "_"), npm_packages = { diff --git a/e2e/concatjs_devserver_directory_artifacts/.bazelignore b/e2e/concatjs_devserver_directory_artifacts/.bazelignore new file mode 100644 index 0000000000..b512c09d47 --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/.bazelignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/e2e/concatjs_devserver_directory_artifacts/.bazelrc b/e2e/concatjs_devserver_directory_artifacts/.bazelrc new file mode 100644 index 0000000000..3431057af6 --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/.bazelrc @@ -0,0 +1 @@ +import %workspace%/../../common.bazelrc diff --git a/e2e/concatjs_devserver_directory_artifacts/BUILD.bazel b/e2e/concatjs_devserver_directory_artifacts/BUILD.bazel new file mode 100644 index 0000000000..d983153c9f --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/BUILD.bazel @@ -0,0 +1,85 @@ +# 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("@build_bazel_rules_nodejs//internal/npm_install:npm_umd_bundle.bzl", "npm_umd_bundle") +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") + +exports_files([ + "red-body-style.css", + "tsconfig.json", + "protractor.on-prepare.js", +]) + +ts_project( + name = "compile", + srcs = [ + "app.ts", + "app_e2e-spec.ts", + ], + declaration = True, + tsconfig = ":tsconfig.json", + validate = False, + deps = [ + "@npm//@types", + "@npm//date-fns", + "@npm//protractor", + "@npm//rxjs", + "@npm//typeorm", + ], +) + +js_library( + name = "lib", + named_module_srcs = [":compile"], + deps = [":compile"], +) + +# typeorm is a special case for npm_umd_bundle as we need to excluded +# the `react-native-sqlite-storage` dynamic require from the umd bundle +npm_umd_bundle( + name = "typeorm_umd", + package_name = "typeorm", + entry_point = {"@npm//:node_modules/typeorm": "browser/index.js"}, + excluded = ["react-native-sqlite-storage"], + package = "@npm//typeorm", +) + +concatjs_devserver( + name = "devserver", + entry_module = "concatjs_devserver_directory_artifacts/app", + scripts = [ + "@npm//date-fns:date-fns.umd.js", + "@npm//rxjs:rxjs.umd.js", + ":typeorm.umd.js", + ], + # We'll collect all the devmode JS sources from these TypeScript libraries + deps = [":lib"], +) + +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"], +) + +# Just a dummy test so that we have a test target for //... on certain bazelci platforms with bazel_integration_test +sh_test( + name = "dummy_test", + srcs = ["dummy_test.sh"], +) diff --git a/e2e/concatjs_devserver_directory_artifacts/WORKSPACE b/e2e/concatjs_devserver_directory_artifacts/WORKSPACE new file mode 100644 index 0000000000..e9a48a44e9 --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/WORKSPACE @@ -0,0 +1,51 @@ +# 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. + +workspace( + name = "concatjs_devserver_directory_artifacts", + managed_directories = {"@npm": ["node_modules"]}, +) + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "4a5d654a4ccd4a4c24eca5d319d85a88a650edf119601550c95bf400c8cc897e", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/3.5.1/rules_nodejs-3.5.1.tar.gz"], +) + +load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install") + +yarn_install( + name = "npm", + exports_directories_only = True, + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) + +load("@npm//@bazel/protractor:package.bzl", "npm_bazel_protractor_dependencies") + +npm_bazel_protractor_dependencies() + +# Setup the rules_webtesting toolchain +load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories") + +web_test_repositories() + +load("@io_bazel_rules_webtesting//web/versioned:browsers-0.3.2.bzl", "browser_repositories") + +browser_repositories( + chromium = True, + firefox = True, +) diff --git a/e2e/concatjs_devserver_directory_artifacts/app.ts b/e2e/concatjs_devserver_directory_artifacts/app.ts new file mode 100644 index 0000000000..7245b8e515 --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/app.ts @@ -0,0 +1,46 @@ +/// + +import {format} from 'date-fns'; +import {of} from 'rxjs'; +import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; + +function appendText(text: string, className: string) { + const el: HTMLDivElement = document.createElement('div'); + el.innerText = text; + el.className = className; + document.body.appendChild(el); +} + +function testDateFns() { + const date: string = format(new Date(2019, 4, 7), 'MMMM D, YYYY'); + appendText(`Hello, TypeScript today is ${date}`, 'ts1'); +} + + +@Entity() +export class User { + @PrimaryGeneratedColumn() + id: number; + @Column() + firstName: string; + @Column() + lastName: string; + @Column() + isActive: boolean; +} + +function testBrowserEntryPoint() { + // this script will throw if the browser entryPoint in typeorm wasn't resolved correctly + const user = new User(); + user.firstName = 'foo'; + appendText(`firstname: ${user.firstName}`, 'entrypoint-browser'); +} + +function testModuleEntryPoint() { + // rxjs uses the module entrypoint to resolve to some import/export + of('rxjs works with modules!').subscribe(value => appendText(String(value), 'entrypoint-module')) +} + +testDateFns(); +testBrowserEntryPoint(); +testModuleEntryPoint(); \ No newline at end of file diff --git a/e2e/concatjs_devserver_directory_artifacts/app_e2e-spec.ts b/e2e/concatjs_devserver_directory_artifacts/app_e2e-spec.ts new file mode 100644 index 0000000000..f1431f2479 --- /dev/null +++ b/e2e/concatjs_devserver_directory_artifacts/app_e2e-spec.ts @@ -0,0 +1,34 @@ +/// + +import {browser, by, element, ExpectedConditions} from 'protractor'; + +// This test uses Protractor without Angular, so disable Angular features +browser.waitForAngularEnabled(false); + +const timeoutMs = 10 * 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); + }, 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)) {