diff --git a/.bazelrc b/.bazelrc index 415b7ec6005..9a8dbfd1cce 100644 --- a/.bazelrc +++ b/.bazelrc @@ -159,16 +159,6 @@ common --incompatible_allow_tags_propagation # ) build --nosandbox_default_allow_network -################################## -# Saucelabs tests settings # -# Turn on these settings with # -# --config=saucelabs # -################################## - -# For saucelabs tests we don't want to enable flaky test attempts. Karma has its own integrated -# retry mechanism and we do not want to retry unnecessarily if Karma already tried multiple times. -test:saucelabs --flaky_test_attempts=1 - ################ # Flag Aliases # ################ diff --git a/.github/actions/saucelabs-legacy/action.yml b/.github/actions/saucelabs-legacy/action.yml deleted file mode 100644 index e5113c90e2e..00000000000 --- a/.github/actions/saucelabs-legacy/action.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: 'Saucelabs legacy test job' -description: 'Runs tests against Saucelabs (outside of Bazel)' - -runs: - using: 'composite' - steps: - - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Starting Saucelabs tunnel service - shell: bash - run: ./tools/saucelabs/sauce-service.sh run & - # Build test fixtures for a test that rely on Bazel-generated fixtures. Note that disabling - # specific tests which are reliant on such generated fixtures is not an option as SystemJS - # in the Saucelabs legacy job always fetches referenced files, even if the imports would be - # guarded by an check to skip in the Saucelabs legacy job. We should be good running such - # test in all supported browsers on Saucelabs anyway until this job can be removed. - - name: Preparing Bazel-generated fixtures required in legacy tests - shell: bash - run: | - # Locale files are needed for i18n tests running within Saucelabs. These are added - # directly as sources so that the TypeScript compilation of `/packages/tsconfig.json` - # can succeed. Note that the base locale and currencies files are checked-in, so - # we do not need to re-generate those through Bazel. - mkdir -p packages/common/locales/extra - cp dist/bin/packages/common/locales/*.ts packages/common/locales - cp dist/bin/packages/common/locales/extra/*.ts packages/common/locales/extra - - name: Build bundle of tests to run on Saucelabs - shell: bash - run: node tools/legacy-saucelabs/build-saucelabs-test-bundle.mjs - - name: Wait and confirm Saucelabs tunnel has connected - shell: bash - run: ./tools/saucelabs/sauce-service.sh ready-wait - - name: Running tests on Saucelabs. - shell: bash - run: KARMA_WEB_TEST_MODE=SL_REQUIRED pnpm karma start ./karma-js.conf.js --single-run - - name: Stop Saucelabs tunnel service - shell: bash - run: ./tools/saucelabs/sauce-service.sh stop diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8ea70cef9a..27a872672df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -191,17 +191,6 @@ jobs: - run: pnpm -C packages/zone.js electrontest - run: pnpm -C packages/zone.js/test/typings test - # saucelabs: - # runs-on: ubuntu-latest - # env: - # SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} - # steps: - # - name: Initialize environment - # uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b5a3609f89c06eb4037dce22a93641213a5d1508 - # - name: Install node modules - # run: pnpm install --frozen-lockfile - # - uses: ./.github/actions/saucelabs-legacy - adev-deploy: needs: [adev] if: needs.adev.result == 'success' diff --git a/.github/workflows/manual.yml b/.github/workflows/manual.yml deleted file mode 100644 index a40a990ab57..00000000000 --- a/.github/workflows/manual.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Manual jobs - -on: - workflow_dispatch: - inputs: {} - -jobs: - # Bazel saucelabs job resides in `manual.yml` because it's currently unstable, but - # kept as "runnable" for debugging/stabilization effort purposes. - bazel-saucelabs: - runs-on: ubuntu-latest - env: - JOBS: 2 - steps: - - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Install node modules - run: pnpm install --frozen-lockfile - - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Setup Saucelabs Variables - uses: angular/dev-infra/github-actions/saucelabs@ba726e7bca0b08b125ccc6f93c233749e1213c17 - - name: Set up Sauce Tunnel Daemon - run: pnpm bazel run //tools/saucelabs-daemon/background-service -- $JOBS & - env: - SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} - - name: Run all saucelabs bazel tests - run: | - TESTS=$(./node_modules/.bin/bazelisk query --output label '(kind(karma_web_test, ...) intersect attr("tags", "saucelabs", ...)) except attr("tags", "fixme-saucelabs", ...)') - pnpm bazel test --config=saucelabs --jobs=$JOBS ${TESTS} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index bfde1dbe38c..bcfc1237bcf 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -176,14 +176,3 @@ jobs: - run: pnpm -C packages/zone.js vitest:test - run: pnpm -C packages/zone.js electrontest - run: pnpm -C packages/zone.js/test/typings test - - # saucelabs: - # runs-on: ubuntu-latest - # env: - # SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} - # steps: - # - name: Initialize environment - # uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@b5a3609f89c06eb4037dce22a93641213a5d1508 - # - name: Install node modules - # run: pnpm install --frozen-lockfile - # - uses: ./.github/actions/saucelabs-legacy diff --git a/.pullapprove.yml b/.pullapprove.yml index 3a2a034abf3..0e8cd90b5de 100644 --- a/.pullapprove.yml +++ b/.pullapprove.yml @@ -323,12 +323,9 @@ groups: 'third_party/**/{*,.*}', 'tools/contributing-stats/**/{*,.*}', 'tools/gulp-tasks/**/{*,.*}', - 'tools/legacy-saucelabs/**/{*,.*}', 'tools/manual_api_docs/**/{*,.*}', 'tools/pnpm-patches/**/{*,.*}', 'tools/rxjs/**/{*,.*}', - 'tools/saucelabs-daemon/**/{*,.*}', - 'tools/saucelabs/**/{*,.*}', 'tools/symbol-extractor/**/{*,.*}', 'tools/testing/**/{*,.*}', 'tools/tslint/**/{*,.*}', diff --git a/BUILD.bazel b/BUILD.bazel index cfdc620a594..33945d0c251 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,4 +1,3 @@ -load("@aspect_rules_js//js:defs.bzl", "js_library") load("@bazel_skylib//rules:common_settings.bzl", "bool_flag") load("@devinfra//bazel/validation:defs.bzl", "validate_ts_version_matching") load("@npm//:defs.bzl", "npm_link_all_packages") @@ -9,7 +8,6 @@ package(default_visibility = ["//visibility:public"]) exports_files([ "LICENSE", "karma-js.conf.js", - "browser-providers.conf.js", "package.json", ]) @@ -34,14 +32,6 @@ alias( actual = "//packages:tsconfig-build.json", ) -js_library( - name = "browser-providers", - srcs = [ - "browser-providers.conf.d.ts", - "browser-providers.conf.js", - ], -) - copy_to_bin( name = "angularjs_scripts", srcs = [ @@ -64,15 +54,6 @@ config_setting( values = {"stamp": "true"}, ) -alias( - name = "sauce_connect", - actual = select({ - "@devinfra//bazel/constraints:linux_x64": "@sauce_connect_linux_amd64//:bin/sc", - "@devinfra//bazel/constraints:macos_x64": "@sauce_connect_mac//:bin/sc", - "@devinfra//bazel/constraints:macos_arm64": "@sauce_connect_mac//:bin/sc", - }), -) - # When enabled, this flag substitutes dependency versions with snapshot repositories # for all packages in this repository. Note that this does not apply to peer # dependencies, as they must be installed directly. diff --git a/MODULE.bazel b/MODULE.bazel index 1b8c0da0006..c05d9345fd1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -158,22 +158,3 @@ cldr_xml_data( "https://github.com/unicode-org/cldr/releases/download/release-%s/core.zip" % CLDR_VERSION: "d5ee2abac64158c04884a722f8ef4830ea22b6c74aac20185be2838db8eda788", }, ) - -http_archive = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -# Fetch sauce connect (tool to open Saucelabs tunnel for Saucelabs browser tests) -http_archive( - name = "sauce_connect_linux_amd64", - build_file_content = """exports_files(["bin/sc"], visibility = ["//visibility:public"])""", - sha256 = "26b9c3630f441b47854b6032f7eca6f1d88d3f62e50ee44c27015d71a5155c36", - strip_prefix = "sc-4.8.2-linux", - url = "https://saucelabs.com/downloads/sc-4.8.2-linux.tar.gz", -) - -http_archive( - name = "sauce_connect_mac", - build_file_content = """exports_files(["bin/sc"], visibility = ["//visibility:public"])""", - sha256 = "28277ce81ef9ab84f5b87b526258920a8ead44789a5034346e872629bbf38089", - strip_prefix = "sc-4.8.2-osx", - url = "https://saucelabs.com/downloads/sc-4.8.2-osx.zip", -) diff --git a/browser-providers.conf.d.ts b/browser-providers.conf.d.ts deleted file mode 100644 index eae2795e973..00000000000 --- a/browser-providers.conf.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -type CustomLauncher = { - base: string; - browserName: string; - platformName: string; - platformVersion: string; - deviceName: string; - appiumVersion: string; - extendedDebugging: boolean; -} - -type CustomLaunchers = { - [string]: CustomLauncher; -}; - -type SauceAliases = { - [string]: string[]; -}; - -export const customLaunchers: CustomLaunchers; -export const sauceAliases: SauceAliases; diff --git a/browser-providers.conf.js b/browser-providers.conf.js deleted file mode 100644 index 049e8dbf0fa..00000000000 --- a/browser-providers.conf.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -// Unique place to configure the browsers which are used in the different CI jobs in Sauce Labs (SL) -// If the target is set to null, then the browser is not run anywhere during CI. -// If a category becomes empty (e.g. BS and required), then the corresponding job must be commented -// out in the CI configuration. -const config = { - 'Android13': {unitTest: {target: 'SL', required: true}}, - 'Android14': {unitTest: {target: 'SL', required: true}}, -}; - -/** Whether browsers should be remotely acquired in debug mode. */ -const debugMode = false; - -// Karma-sauce-launcher isn't really maintained and doesn't support officially appium2 -// Looking at the source code https://github.com/karma-runner/karma-sauce-launcher/blob/69dcb822a45d29e57297b0eda7af4123ae55aafd/src/process-config.ts#L60 -// We can force the config to be recognized as W3C by setting a browserVersion property -const browserVersion = 'latest'; - -// Specific platform configuration can be found at: -// https://saucelabs.com/platform/platform-configurator -const customLaunchers = { - 'SL_ANDROID13': { - base: 'SauceLabs', - platformName: 'Android', - browserName: 'Chrome', - browserVersion, - 'appium:deviceName': 'Google Pixel 5a GoogleAPI Emulator', - 'appium:platformVersion': '13.0', - 'appium:automationName': 'uiautomator2', - 'sauce:options': { - appiumVersion: '2.0.0', - extendedDebugging: debugMode, - }, - }, - - 'SL_ANDROID14': { - base: 'SauceLabs', - platformName: 'Android', - browserName: 'Chrome', - browserVersion, - 'appium:deviceName': 'Google Pixel 6 Pro GoogleAPI Emulator', - 'appium:platformVersion': '14.0', - 'appium:automationName': 'uiautomator2', - 'sauce:options': { - appiumVersion: '2.0.0', - extendedDebugging: debugMode, - }, - }, -}; - -const sauceAliases = { - 'CI_REQUIRED': buildConfiguration('unitTest', 'SL', true), - 'CI_OPTIONAL': buildConfiguration('unitTest', 'SL', false), -}; - -module.exports = { - customLaunchers: customLaunchers, - sauceAliases: sauceAliases, -}; - -function buildConfiguration(type, target, required) { - return Object.keys(config) - .filter((item) => { - const conf = config[item][type]; - return conf.required === required && conf.target === target; - }) - .map((item) => target + '_' + item.toUpperCase()); -} diff --git a/contributing-docs/commit-message-guidelines.md b/contributing-docs/commit-message-guidelines.md index bdee1c87d4d..1a858d80b9d 100644 --- a/contributing-docs/commit-message-guidelines.md +++ b/contributing-docs/commit-message-guidelines.md @@ -45,7 +45,7 @@ Must be one of the following: | Type | Description | | ------------ | --------------------------------------------------------------------------------------------------- | | **build** | Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm) | -| **ci** | Changes to our CI configuration files and scripts (examples: GitHub Actions, SauceLabs) | +| **ci** | Changes to our CI configuration files and scripts (examples: GitHub Actions) | | **docs** | Documentation only changes | | **feat** | A new feature | | **fix** | A bug fix | diff --git a/karma-js.conf.js b/karma-js.conf.js index db4bdd95e27..9575a482092 100644 --- a/karma-js.conf.js +++ b/karma-js.conf.js @@ -14,11 +14,6 @@ console.info(`Jasmine random seed: ${seed}`); const isBazel = !!process.env.TEST_TARGET; -if (!process.env.KARMA_WEB_TEST_MODE && isBazel && process.env.TEST_TARGET.includes('_saucelabs')) { - console.info(`Saucelabs target detected: ${process.env.TEST_TARGET}`); - process.env.KARMA_WEB_TEST_MODE = 'SL_REQUIRED'; -} - module.exports = function (config) { const conf = { frameworks: ['jasmine'], @@ -70,17 +65,6 @@ module.exports = function (config) { '/base/npm/': '/base/', }, - sauceLabs: { - testName: 'Angular2', - retryLimit: 3, - startConnect: false, - recordVideo: false, - recordScreenshots: false, - idleTimeout: 600, - commandTimeout: 600, - maxDuration: 5400, - }, - // Always use `polling` for increased communication stability. transports: ['polling'], @@ -99,63 +83,10 @@ module.exports = function (config) { set: () => {}, }); - if (isBazel) { - // Add the custom Saucelabs daemon to the plugins - const saucelabsDaemonLauncher = require('./tools/saucelabs-daemon/launcher/index.cjs').default; - conf.plugins.push(saucelabsDaemonLauncher); - } else { - conf.plugins.push('karma-sauce-launcher'); + conf.hostname = hostname(); - if (process.env['SAUCE_TUNNEL_IDENTIFIER']) { - console.log(`SAUCE_TUNNEL_IDENTIFIER: ${process.env.SAUCE_TUNNEL_IDENTIFIER}`); - - const tunnelIdentifier = process.env['SAUCE_TUNNEL_IDENTIFIER']; - - // Setup the Saucelabs plugin so that it can launch browsers using the proper tunnel. - conf.sauceLabs.build = tunnelIdentifier; - conf.sauceLabs.tunnelIdentifier = tunnelIdentifier; - - // Patch the `saucelabs` package so that `karma-sauce-launcher` does not attempt downloading - // the test logs from upstream and tries re-uploading them with the Karma enhanced details. - // This slows-down tests/browser restarting and can decrease stability. - // https://github.com/karma-runner/karma-sauce-launcher/blob/59b0c5c877448e064ad56449cd906743721c6b62/src/launcher/launcher.ts#L72-L79. - require('saucelabs').default.prototype.downloadJobAsset = () => - Promise.resolve(''); - } - } - - // For SauceLabs jobs, we set up a domain which resolves to the machine which launched - // the tunnel. We do this because devices are sometimes not able to properly resolve - // `localhost` or `127.0.0.1` through the SauceLabs tunnel. Using a domain that does not - // resolve to anything on SauceLabs VMs ensures that such requests are always resolved through - // the tunnel, and resolve to the actual tunnel host machine (commonly the GHA VMs). - // More context can be found in: https://github.com/angular/angular/pull/35171. - if (process.env.SAUCE_LOCALHOST_ALIAS_DOMAIN) { - conf.hostname = process.env.SAUCE_LOCALHOST_ALIAS_DOMAIN; - } else { - conf.hostname = hostname(); - } - - if (process.env.KARMA_WEB_TEST_MODE) { - // KARMA_WEB_TEST_MODE is used to setup karma to run in SauceLabs. - console.log(`KARMA_WEB_TEST_MODE: ${process.env.KARMA_WEB_TEST_MODE}`); - - switch (process.env.KARMA_WEB_TEST_MODE) { - case 'SL_REQUIRED': - conf.browsers = browserProvidersConf.sauceAliases.CI_REQUIRED; - break; - case 'SL_OPTIONAL': - conf.browsers = browserProvidersConf.sauceAliases.CI_OPTIONAL; - break; - default: - throw new Error( - `Unrecognized process.env.KARMA_WEB_TEST_MODE: ${process.env.KARMA_WEB_TEST_MODE}`, - ); - } - } else { - // Run the test locally - conf.browsers = [process.env['DISPLAY'] ? 'Chrome' : 'ChromeHeadless']; - } + // Run the test locally + conf.browsers = [process.env['DISPLAY'] ? 'Chrome' : 'ChromeHeadless']; config.set(conf); }; diff --git a/package.json b/package.json index d611123a6b6..ff5191783ff 100644 --- a/package.json +++ b/package.json @@ -100,7 +100,6 @@ "@types/jasminewd2": "^2.0.8", "@types/node": "^20.14.8", "@types/selenium-webdriver": "3.0.7", - "@types/selenium-webdriver4": "npm:@types/selenium-webdriver@4.35.5", "@types/semver": "^7.3.4", "@types/systemjs": "6.15.4", "@types/yargs": "^17.0.3", @@ -138,7 +137,6 @@ "rollup-plugin-dts": "^6.1.1", "rxjs": "^7.0.0", "selenium-webdriver": "3.5.0", - "selenium-webdriver4": "npm:selenium-webdriver@4.43.0", "semver-dsl": "^1.0.1", "source-map": "0.7.6", "source-map-support": "0.5.21", @@ -186,7 +184,6 @@ "husky": "9.1.7", "karma-coverage": "^2.2.1", "karma-jasmine-html-reporter": "^2.2.0", - "karma-sauce-launcher": "^4.3.6", "prettier": "^3.8.0", "rollup-plugin-sourcemaps2": "^0.5.1", "semver": "^7.3.5", @@ -198,7 +195,6 @@ "zod": "^4.0.10" }, "resolutions": { - "saucelabs": "9.0.2", "typescript": "6.0.2" }, "pnpm": { diff --git a/packages/common/http/test/BUILD.bazel b/packages/common/http/test/BUILD.bazel index b3e1fd52c2f..52e391861ac 100644 --- a/packages/common/http/test/BUILD.bazel +++ b/packages/common/http/test/BUILD.bazel @@ -6,7 +6,6 @@ ts_project( srcs = glob( ["**/*.ts"], ), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/common/http/testing/test/BUILD.bazel b/packages/common/http/testing/test/BUILD.bazel index aff75365ef8..41887d51b8e 100644 --- a/packages/common/http/testing/test/BUILD.bazel +++ b/packages/common/http/testing/test/BUILD.bazel @@ -6,7 +6,6 @@ ts_project( srcs = glob( ["**/*.ts"], ), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/common/test/BUILD.bazel b/packages/common/test/BUILD.bazel index 0d2ba4245cb..4eb35a9c35c 100644 --- a/packages/common/test/BUILD.bazel +++ b/packages/common/test/BUILD.bazel @@ -6,7 +6,6 @@ ts_project( srcs = glob( ["**/*.ts"], ), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel index e10bcf61937..2917169db71 100644 --- a/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel +++ b/packages/core/primitives/dom-navigation/testing/test/BUILD.bazel @@ -6,7 +6,6 @@ ts_project( srcs = glob( ["**/*.ts"], ), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//packages/core/primitives/dom-navigation/testing", diff --git a/packages/core/test/BUILD.bazel b/packages/core/test/BUILD.bazel index 8cefa027353..b1e52a0f0f5 100644 --- a/packages/core/test/BUILD.bazel +++ b/packages/core/test/BUILD.bazel @@ -25,7 +25,6 @@ ts_project( "**/*_node_only_spec.ts", ], ), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ ":test_utils", diff --git a/packages/core/test/acceptance/BUILD.bazel b/packages/core/test/acceptance/BUILD.bazel index 519b3c6faf5..9179e00a3dd 100644 --- a/packages/core/test/acceptance/BUILD.bazel +++ b/packages/core/test/acceptance/BUILD.bazel @@ -13,7 +13,6 @@ ts_project( ["**/*.ts"], exclude = SPEC_FILES_WITH_FORWARD_REFS, ), - # Visible to //:saucelabs_unit_tests visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/forms/test/BUILD.bazel b/packages/forms/test/BUILD.bazel index 1773b3de526..d31a24a1e8a 100644 --- a/packages/forms/test/BUILD.bazel +++ b/packages/forms/test/BUILD.bazel @@ -4,7 +4,6 @@ ts_project( name = "test_lib", testonly = True, srcs = glob(["**/*.ts"]), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", @@ -29,15 +28,6 @@ zoneless_jasmine_test( zoneless_web_test_suite( name = "test_web", - tags = [ - # disabled on 2020-04-14 due to failure on saucelabs monitor job - # https://app.circleci.com/pipelines/github/angular/angular/13320/workflows/9ca3527a-d448-4a64-880a-fb4de9d1fece/jobs/680645 - # ``` - # IE 11.0.0 (Windows 8.1.0.0) template-driven forms integration tests basic functionality should report properties which are written outside of template bindings FAILED - # InvalidStateError: InvalidStateError - # ``` - "fixme-saucelabs", - ], deps = [ ":test_lib", ], diff --git a/packages/misc/angular-in-memory-web-api/test/BUILD.bazel b/packages/misc/angular-in-memory-web-api/test/BUILD.bazel index baf7710152b..a67cafa3338 100644 --- a/packages/misc/angular-in-memory-web-api/test/BUILD.bazel +++ b/packages/misc/angular-in-memory-web-api/test/BUILD.bazel @@ -4,7 +4,6 @@ ts_project( name = "test_lib", testonly = True, srcs = glob(["**/*.ts"]), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/jasmine-core", diff --git a/packages/platform-browser-dynamic/test/testing_public_browser_spec.ts b/packages/platform-browser-dynamic/test/testing_public_browser_spec.ts index ded3ad6105f..7ed7210ea48 100644 --- a/packages/platform-browser-dynamic/test/testing_public_browser_spec.ts +++ b/packages/platform-browser-dynamic/test/testing_public_browser_spec.ts @@ -15,11 +15,11 @@ import { provideZonelessChangeDetection, } from '@angular/core'; import {fakeAsync, inject, TestBed, tick, waitForAsync} from '@angular/core/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {BrowserTestingModule, platformBrowserTesting} from '@angular/platform-browser/testing'; +import {isBrowser} from '@angular/private/testing'; import {ResourceLoaderImpl} from '../src/resource_loader/resource_loader_impl'; import {BrowserDynamicTestingModule, platformBrowserDynamicTesting} from '../testing'; -import {BrowserTestingModule, platformBrowserTesting} from '@angular/platform-browser/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {isBrowser} from '@angular/private/testing'; @NgModule({ providers: [provideZonelessChangeDetection()], }) @@ -128,7 +128,7 @@ if (isBrowser) { describe('errors', () => { describe('should fail when an ResourceLoader fails', () => { - // TODO(alxhub): figure out why this is failing on saucelabs + // TODO(alxhub): figure out why this is failing on browsers xit('should fail with an error from a promise', async () => { @Component({ selector: 'bad-template-comp', diff --git a/packages/platform-browser/test/dom/dom_renderer_spec.ts b/packages/platform-browser/test/dom/dom_renderer_spec.ts index 9dfd1456eae..0d6c05d6658 100644 --- a/packages/platform-browser/test/dom/dom_renderer_spec.ts +++ b/packages/platform-browser/test/dom/dom_renderer_spec.ts @@ -316,12 +316,9 @@ describe('DefaultDomRendererV2', () => { }); it('should create MathML elements', () => { - // MathMLElement is fairly recent and doesn't exist on our Saucelabs test environments - if (typeof MathMLElement !== 'undefined') { - expect( - document.createElementNS(NAMESPACE_URIS['math'], 'math') instanceof MathMLElement, - ).toBeTrue(); - } + expect( + document.createElementNS(NAMESPACE_URIS['math'], 'math') instanceof MathMLElement, + ).toBeTrue(); }); }); diff --git a/packages/router/test/BUILD.bazel b/packages/router/test/BUILD.bazel index a56d9ee1031..afa6272123a 100644 --- a/packages/router/test/BUILD.bazel +++ b/packages/router/test/BUILD.bazel @@ -14,7 +14,6 @@ ts_project( testonly = True, srcs = glob(["**/*.ts"]), tsconfig = ":tsconfig_test", - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/router/test/bootstrap.spec.ts b/packages/router/test/bootstrap.spec.ts index 01362e77e0b..c05e85e2124 100644 --- a/packages/router/test/bootstrap.spec.ts +++ b/packages/router/test/bootstrap.spec.ts @@ -7,11 +7,11 @@ */ import { - DOCUMENT, - PlatformLocation, - ɵgetDOM as getDOM, BrowserPlatformLocation, + DOCUMENT, + ɵgetDOM as getDOM, ɵNullViewportScroller as NullViewportScroller, + PlatformLocation, ViewportScroller, } from '@angular/common'; import {MockPlatformLocation} from '@angular/common/testing'; @@ -26,8 +26,8 @@ import { NgModule, } from '@angular/core'; import {TestBed} from '@angular/core/testing'; -import {isNode, useAutoTick} from '@angular/private/testing'; import {BrowserModule, platformBrowser} from '@angular/platform-browser'; +import {isNode, useAutoTick} from '@angular/private/testing'; import { NavigationEnd, provideRouter, @@ -37,16 +37,6 @@ import { withEnabledBlockingInitialNavigation, } from '../index'; -// This is needed, because all files under `packages/` are compiled together as part of the -// [legacy-unit-tests-saucelabs][1] CI job, including the `lib.webworker.d.ts` typings brought in by -// [service-worker/worker/src/service-worker.d.ts][2]. -// -// [1]: -// https://github.com/angular/angular/blob/ffeea63f43e6a7fd46be4a8cd5a5d254c98dea08/.circleci/config.yml#L681 -// [2]: -// https://github.com/angular/angular/blob/316dc2f12ce8931f5ff66fa5f8da21c0d251a337/packages/service-worker/worker/src/service-worker.d.ts#L9 -declare var window: Window; - describe('bootstrap', () => { useAutoTick(); let log: any[] = []; diff --git a/packages/router/testing/test/BUILD.bazel b/packages/router/testing/test/BUILD.bazel index eb40d51af38..da7412b08ba 100644 --- a/packages/router/testing/test/BUILD.bazel +++ b/packages/router/testing/test/BUILD.bazel @@ -4,7 +4,6 @@ ts_project( name = "test_lib", testonly = True, srcs = glob(["**/*.ts"]), - # Visible to //:saucelabs_unit_tests_poc target visibility = ["//:__pkg__"], deps = [ "//:node_modules/rxjs", diff --git a/packages/tsconfig-legacy-saucelabs.json b/packages/tsconfig-legacy-saucelabs.json index 7717a660553..a0da97376d3 100644 --- a/packages/tsconfig-legacy-saucelabs.json +++ b/packages/tsconfig-legacy-saucelabs.json @@ -27,10 +27,6 @@ "elements/schematics", "examples/**", "http/**", - "platform-server/integrationtest", - - // Additional exclusion since tests for the language-service never run within the - // Saucelabs job and the package is not compatible with ESM TS compilation anyway. - "language-service/**" + "platform-server/integrationtest" ] } diff --git a/packages/zone.js/DEVELOPER.md b/packages/zone.js/DEVELOPER.md index 8fce2d55e49..8917a0cfc3e 100644 --- a/packages/zone.js/DEVELOPER.md +++ b/packages/zone.js/DEVELOPER.md @@ -51,18 +51,6 @@ pnpm webdriver-http pnpm webdriver-test ``` -2. run locally with sauce connect - -``` -// export SAUCE_USERNAME and SAUCE_ACCESS_KEY -export SAUCE_USERNAME=XXXX -export SAUCE_ACCESS_KEY=XXX - -sc -u $SAUCE_USERNAME -k $SAUCE_ACCESS_KEY -pnpm webdriver-http -pnpm webdriver-sauce-test -``` - ## Releasing Releasing `zone.js` is a two step process. diff --git a/packages/zone.js/karma-build-sauce-mocha.conf.js b/packages/zone.js/karma-build-sauce-mocha.conf.js deleted file mode 100644 index 081ca7b0a96..00000000000 --- a/packages/zone.js/karma-build-sauce-mocha.conf.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-dist-mocha.conf.js')(config); - require('./sauce.conf')(config); -}; diff --git a/packages/zone.js/karma-build-sauce-selenium3-mocha.conf.js b/packages/zone.js/karma-build-sauce-selenium3-mocha.conf.js deleted file mode 100644 index 9edd67369e7..00000000000 --- a/packages/zone.js/karma-build-sauce-selenium3-mocha.conf.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-dist-mocha.conf.js')(config); - require('./sauce-selenium3.conf')(config); -}; diff --git a/packages/zone.js/karma-dist-sauce-jasmine.conf.js b/packages/zone.js/karma-dist-sauce-jasmine.conf.js deleted file mode 100644 index 5772a5746a4..00000000000 --- a/packages/zone.js/karma-dist-sauce-jasmine.conf.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-dist-jasmine.conf.js')(config); - require('./sauce.conf')(config, ['SL_IOS9']); -}; diff --git a/packages/zone.js/karma-dist-sauce-jasmine.es2015.conf.js b/packages/zone.js/karma-dist-sauce-jasmine.es2015.conf.js deleted file mode 100644 index 983b91ee1a0..00000000000 --- a/packages/zone.js/karma-dist-sauce-jasmine.es2015.conf.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = function (config) { - require('./karma-dist-jasmine.conf.js')(config); - require('./sauce.es2015.conf')(config); - config.files.push('build/test/wtf_mock.js'); - config.files.push('build/test/test_fake_polyfill.js'); - config.files.push('build/test/custom_error.js'); - config.files.push({pattern: 'dist/zone-evergreen.js', type: 'module'}); - config.files.push('dist/zone-patch-canvas.js'); - config.files.push('dist/zone-patch-fetch.js'); - config.files.push('dist/webapis-media-query.js'); - config.files.push('dist/webapis-notification.js'); - config.files.push('dist/zone-patch-user-media.js'); - config.files.push('dist/zone-patch-resize-observer.js'); - config.files.push('dist/task-tracking.js'); - config.files.push('dist/wtf.js'); - config.files.push('dist/zone-testing.js'); - config.files.push('build/test/test-env-setup-jasmine.js'); - config.files.push('build/lib/common/error-rewrite.js'); - config.files.push('build/test/browser/custom-element.spec.js'); -}; diff --git a/packages/zone.js/karma-dist-sauce-jasmine3.conf.js b/packages/zone.js/karma-dist-sauce-jasmine3.conf.js deleted file mode 100644 index 53a32df0524..00000000000 --- a/packages/zone.js/karma-dist-sauce-jasmine3.conf.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-dist-jasmine.conf.js')(config); - require('./sauce.conf')(config, [ - 'SL_IOS9', - 'SL_CHROME', - 'SL_FIREFOX_54', - 'SL_SAFARI8', - 'SL_SAFARI9', - 'SL_SAFARI10', - 'SL_IOS8', - 'SL_IOS9', - 'SL_IOS10', - 'SL_ANDROID4.4', - 'SL_ANDROID5.1', - ]); -}; diff --git a/packages/zone.js/karma-dist-sauce-selenium3-jasmine.conf.js b/packages/zone.js/karma-dist-sauce-selenium3-jasmine.conf.js deleted file mode 100644 index cdb342a4d96..00000000000 --- a/packages/zone.js/karma-dist-sauce-selenium3-jasmine.conf.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-dist-jasmine.conf.js')(config); - require('./sauce-selenium3.conf')(config); -}; diff --git a/packages/zone.js/karma-evergreen-dist-sauce-jasmine.conf.js b/packages/zone.js/karma-evergreen-dist-sauce-jasmine.conf.js deleted file mode 100644 index 0af56929d78..00000000000 --- a/packages/zone.js/karma-evergreen-dist-sauce-jasmine.conf.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -module.exports = function (config) { - require('./karma-evergreen-dist-jasmine.conf.js')(config); - require('./sauce-evergreen.conf')(config); -}; diff --git a/packages/zone.js/sauce-evergreen.conf.js b/packages/zone.js/sauce-evergreen.conf.js deleted file mode 100644 index ee96241a6b0..00000000000 --- a/packages/zone.js/sauce-evergreen.conf.js +++ /dev/null @@ -1,70 +0,0 @@ -// Sauce configuration - -module.exports = function (config, ignoredLaunchers) { - // The WS server is not available with Sauce - config.files.unshift('test/saucelabs.js'); - - var basicLaunchers = { - 'SL_CHROME': {base: 'SauceLabs', browserName: 'chrome', version: '72'}, - 'SL_CHROME_60': {base: 'SauceLabs', browserName: 'chrome', version: '60'}, - 'SL_ANDROID8.0': { - base: 'SauceLabs', - browserName: 'Chrome', - appiumVersion: '1.9.1', - platformName: 'Android', - deviceName: 'Android GoogleAPI Emulator', - platformVersion: '8.0', - }, - }; - - var customLaunchers = {}; - if (!ignoredLaunchers) { - customLaunchers = basicLaunchers; - } else { - Object.keys(basicLaunchers).forEach(function (key) { - if ( - ignoredLaunchers.filter(function (ignore) { - return ignore === key; - }).length === 0 - ) { - customLaunchers[key] = basicLaunchers[key]; - } - }); - } - - config.set({ - captureTimeout: 120000, - browserNoActivityTimeout: 240000, - - sauceLabs: { - testName: 'Zone.js', - startConnect: false, - recordVideo: false, - recordScreenshots: false, - options: { - 'selenium-version': '3.4.0', - 'command-timeout': 600, - 'idle-timeout': 600, - 'max-duration': 5400, - }, - }, - - customLaunchers: customLaunchers, - - browsers: Object.keys(customLaunchers), - - reporters: ['dots', 'saucelabs'], - - singleRun: true, - - plugins: ['karma-*'], - }); - - if (process.env.TRAVIS) { - config.sauceLabs.build = - 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); - } -}; diff --git a/packages/zone.js/sauce-selenium3.conf.js b/packages/zone.js/sauce-selenium3.conf.js deleted file mode 100644 index 4500358c4c6..00000000000 --- a/packages/zone.js/sauce-selenium3.conf.js +++ /dev/null @@ -1,57 +0,0 @@ -// Sauce configuration with Welenium drivers 3+ - -module.exports = function (config) { - // The WS server is not available with Sauce - config.files.unshift('test/saucelabs.js'); - - var customLaunchers = { - 'SL_CHROME60': { - base: 'SauceLabs', - browserName: 'Chrome', - platform: 'Windows 10', - version: '60.0', - }, - 'SL_SAFARI11': { - base: 'SauceLabs', - browserName: 'safari', - platform: 'macOS 10.13', - version: '11.1', - }, - }; - - config.set({ - captureTimeout: 120000, - browserNoActivityTimeout: 240000, - - sauceLabs: { - testName: 'Zone.js', - startConnect: false, - recordVideo: false, - recordScreenshots: false, - options: { - 'selenium-version': '3.5.0', - 'command-timeout': 600, - 'idle-timeout': 600, - 'max-duration': 5400, - }, - }, - - customLaunchers: customLaunchers, - - browsers: Object.keys(customLaunchers), - - reporters: ['dots', 'saucelabs'], - - singleRun: true, - - plugins: ['karma-*'], - }); - - if (process.env.TRAVIS) { - config.sauceLabs.build = - 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); - } -}; diff --git a/packages/zone.js/sauce.conf.js b/packages/zone.js/sauce.conf.js deleted file mode 100644 index febc9cf3503..00000000000 --- a/packages/zone.js/sauce.conf.js +++ /dev/null @@ -1,133 +0,0 @@ -// Sauce configuration - -module.exports = function (config, ignoredLaunchers) { - // The WS server is not available with Sauce - config.files.unshift('test/saucelabs.js'); - - var basicLaunchers = { - 'SL_CHROME': {base: 'SauceLabs', browserName: 'chrome', version: '48'}, - 'SL_CHROME_65': {base: 'SauceLabs', browserName: 'chrome', version: '60'}, - 'SL_FIREFOX': {base: 'SauceLabs', browserName: 'firefox', version: '52'}, - 'SL_FIREFOX_59': {base: 'SauceLabs', browserName: 'firefox', version: '54'}, - /*'SL_SAFARI7': { - base: 'SauceLabs', - browserName: 'safari', - platform: 'OS X 10.9', - version: '7.0' - },*/ - //'SL_SAFARI8': - // {base: 'SauceLabs', browserName: 'safari', platform: 'OS X 10.10', version: '8.0'}, - 'SL_SAFARI9': { - base: 'SauceLabs', - browserName: 'safari', - platform: 'OS X 10.11', - version: '9.0', - }, - 'SL_SAFARI10': { - base: 'SauceLabs', - browserName: 'safari', - platform: 'OS X 10.11', - version: '10.0', - }, - /* - no longer supported in SauceLabs - 'SL_IOS7': { - base: 'SauceLabs', - browserName: 'iphone', - platform: 'OS X 10.10', - version: '7.1' - },*/ - /*'SL_IOS8': { - base: 'SauceLabs', - browserName: 'iphone', - platform: 'OS X 10.10', - version: '8.4' - },*/ - // 'SL_IOS9': {base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.10', version: - // '9.3'}, - 'SL_IOS10': {base: 'SauceLabs', browserName: 'iphone', platform: 'OS X 10.10', version: '10.3'}, - /* - fix issue #584, Android 4.1~4.3 are not supported - 'SL_ANDROID4.1': { - base: 'SauceLabs', - browserName: 'android', - platform: 'Linux', - version: '4.1' - }, - 'SL_ANDROID4.2': { - base: 'SauceLabs', - browserName: 'android', - platform: 'Linux', - version: '4.2' - }, - 'SL_ANDROID4.3': { - base: 'SauceLabs', - browserName: 'android', - platform: 'Linux', - version: '4.3' - },*/ - // 'SL_ANDROID4.4': {base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: - // '4.4'}, - 'SL_ANDROID5.1': {base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '5.1'}, - 'SL_ANDROID6.0': {base: 'SauceLabs', browserName: 'android', platform: 'Linux', version: '6.0'}, - 'SL_ANDROID8.0': { - base: 'SauceLabs', - browserName: 'Chrome', - appiumVersion: '1.12.1', - platformName: 'Android', - deviceName: 'Android GoogleAPI Emulator', - platformVersion: '8.0', - }, - }; - - var customLaunchers = {}; - if (!ignoredLaunchers) { - customLaunchers = basicLaunchers; - } else { - Object.keys(basicLaunchers).forEach(function (key) { - if ( - ignoredLaunchers.filter(function (ignore) { - return ignore === key; - }).length === 0 - ) { - customLaunchers[key] = basicLaunchers[key]; - } - }); - } - - config.set({ - captureTimeout: 120000, - browserNoActivityTimeout: 240000, - - sauceLabs: { - testName: 'Zone.js', - startConnect: false, - recordVideo: false, - recordScreenshots: false, - options: { - 'selenium-version': '2.53.0', - 'command-timeout': 600, - 'idle-timeout': 600, - 'max-duration': 5400, - }, - }, - - customLaunchers: customLaunchers, - - browsers: Object.keys(customLaunchers), - - reporters: ['dots', 'saucelabs'], - - singleRun: true, - - plugins: ['karma-*'], - }); - - if (process.env.TRAVIS) { - config.sauceLabs.build = - 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); - } -}; diff --git a/packages/zone.js/sauce.es2015.conf.js b/packages/zone.js/sauce.es2015.conf.js deleted file mode 100644 index 5b56979e6c9..00000000000 --- a/packages/zone.js/sauce.es2015.conf.js +++ /dev/null @@ -1,61 +0,0 @@ -// Sauce configuration - -module.exports = function (config, ignoredLaunchers) { - // The WS server is not available with Sauce - config.files.unshift('test/saucelabs.js'); - - var basicLaunchers = { - 'SL_CHROME_66': {base: 'SauceLabs', browserName: 'chrome', version: '66'}, - }; - - var customLaunchers = {}; - if (!ignoredLaunchers) { - customLaunchers = basicLaunchers; - } else { - Object.keys(basicLaunchers).forEach(function (key) { - if ( - ignoredLaunchers.filter(function (ignore) { - return ignore === key; - }).length === 0 - ) { - customLaunchers[key] = basicLaunchers[key]; - } - }); - } - - config.set({ - captureTimeout: 120000, - browserNoActivityTimeout: 240000, - - sauceLabs: { - testName: 'Zone.js', - startConnect: false, - recordVideo: false, - recordScreenshots: false, - options: { - 'selenium-version': '2.53.0', - 'command-timeout': 600, - 'idle-timeout': 600, - 'max-duration': 5400, - }, - }, - - customLaunchers: customLaunchers, - - browsers: Object.keys(customLaunchers), - - reporters: ['dots', 'saucelabs'], - - singleRun: true, - - plugins: ['karma-*'], - }); - - if (process.env.TRAVIS) { - config.sauceLabs.build = - 'TRAVIS #' + process.env.TRAVIS_BUILD_NUMBER + ' (' + process.env.TRAVIS_BUILD_ID + ')'; - config.sauceLabs.tunnelIdentifier = process.env.TRAVIS_JOB_NUMBER; - - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); - } -}; diff --git a/packages/zone.js/scripts/sauce/sauce_connect_block.sh b/packages/zone.js/scripts/sauce/sauce_connect_block.sh deleted file mode 100755 index ebda1fccb08..00000000000 --- a/packages/zone.js/scripts/sauce/sauce_connect_block.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -# Wait for Connect to be ready before exiting -printf "Connecting to Sauce." -while [ ! -f $BROWSER_PROVIDER_READY_FILE ]; do - printf "." - #dart2js takes longer than the travis 10 min timeout to complete - sleep .5 -done -echo "Connected" \ No newline at end of file diff --git a/packages/zone.js/scripts/sauce/sauce_connect_setup.sh b/packages/zone.js/scripts/sauce/sauce_connect_setup.sh deleted file mode 100755 index 5a88eaa53f2..00000000000 --- a/packages/zone.js/scripts/sauce/sauce_connect_setup.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -set -e -o pipefail - -# Setup and start Sauce Connect for your TravisCI build -# This script requires your .travis.yml to include the following two private env variables: -# SAUCE_USERNAME -# SAUCE_ACCESS_KEY -# Follow the steps at https://saucelabs.com/opensource/travis to set that up. -# -# Curl and run this script as part of your .travis.yml before_script section: -# before_script: -# - curl https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash - -CONNECT_URL="https://saucelabs.com/downloads/sc-4.3.14-linux.tar.gz" -CONNECT_DIR="/tmp/sauce-connect-$RANDOM" -CONNECT_DOWNLOAD="sc-latest-linux.tar.gz" - -CONNECT_LOG="$LOGS_DIR/sauce-connect" -CONNECT_STDOUT="$LOGS_DIR/sauce-connect.stdout" -CONNECT_STDERR="$LOGS_DIR/sauce-connect.stderr" - -# Get Connect and start it -mkdir -p $CONNECT_DIR -cd $CONNECT_DIR -curl $CONNECT_URL -o $CONNECT_DOWNLOAD 2> /dev/null 1> /dev/null -mkdir sauce-connect -tar --extract --file=$CONNECT_DOWNLOAD --strip-components=1 --directory=sauce-connect > /dev/null -rm $CONNECT_DOWNLOAD - -SAUCE_ACCESS_KEY=`echo $SAUCE_ACCESS_KEY | rev` - -ARGS="" - -# Set tunnel-id only on Travis, to make local testing easier. -if [ ! -z "$TRAVIS_JOB_NUMBER" ]; then - ARGS="$ARGS --tunnel-identifier $TRAVIS_JOB_NUMBER" -fi -if [ ! -z "$BROWSER_PROVIDER_READY_FILE" ]; then - ARGS="$ARGS --readyfile $BROWSER_PROVIDER_READY_FILE" -fi - - -echo "Starting Sauce Connect in the background, logging into:" -echo " $CONNECT_LOG" -echo " $CONNECT_STDOUT" -echo " $CONNECT_STDERR" -sauce-connect/bin/sc -u $SAUCE_USERNAME -k $SAUCE_ACCESS_KEY $ARGS \ - --reconnect 100 --no-ssl-bump-domains all --logfile $CONNECT_LOG 2> $CONNECT_STDERR 1> $CONNECT_STDOUT & diff --git a/packages/zone.js/test/browser/WebSocket.spec.ts b/packages/zone.js/test/browser/WebSocket.spec.ts index 30305fff64b..5df6055ce40 100644 --- a/packages/zone.js/test/browser/WebSocket.spec.ts +++ b/packages/zone.js/test/browser/WebSocket.spec.ts @@ -11,154 +11,150 @@ declare const window: any; const TIMEOUT = 5000; -if (!window['saucelabs']) { - // sauceLabs does not support WebSockets; skip these tests +xdescribe( + 'WebSocket', + ifEnvSupports('WebSocket', function () { + let socket: WebSocket; + const TEST_SERVER_URL = 'ws://localhost:8001'; + const testZone = Zone.current.fork({name: 'test'}); - xdescribe( - 'WebSocket', - ifEnvSupports('WebSocket', function () { - let socket: WebSocket; - const TEST_SERVER_URL = 'ws://localhost:8001'; - const testZone = Zone.current.fork({name: 'test'}); + beforeEach(function (done) { + socket = new WebSocket(TEST_SERVER_URL); + socket.addEventListener('open', function () { + done(); + }); + socket.addEventListener('error', function () { + fail( + "Can't establish socket to " + + TEST_SERVER_URL + + '! do you have test/ws-server.js running?', + ); + done(); + }); + }, TIMEOUT); - beforeEach(function (done) { - socket = new WebSocket(TEST_SERVER_URL); - socket.addEventListener('open', function () { - done(); - }); - socket.addEventListener('error', function () { - fail( - "Can't establish socket to " + - TEST_SERVER_URL + - '! do you have test/ws-server.js running?', - ); - done(); - }); - }, TIMEOUT); + afterEach(function (done) { + socket.addEventListener('close', function () { + done(); + }); + socket.close(); + }, TIMEOUT); - afterEach(function (done) { - socket.addEventListener('close', function () { - done(); - }); - socket.close(); - }, TIMEOUT); + xit('should be patched in a Web Worker', (done) => { + const worker = new Worker('/base/test/ws-webworker-context.js'); + worker.onmessage = (e: MessageEvent) => { + if (e.data !== 'pass' && e.data !== 'fail') { + fail(`web worker ${e.data}`); + return; + } + expect(e.data).toBe('pass'); + done(); + }; + }, 10000); - xit('should be patched in a Web Worker', (done) => { - const worker = new Worker('/base/test/ws-webworker-context.js'); - worker.onmessage = (e: MessageEvent) => { - if (e.data !== 'pass' && e.data !== 'fail') { - fail(`web worker ${e.data}`); - return; - } - expect(e.data).toBe('pass'); - done(); - }; - }, 10000); - - it( - 'should work with addEventListener', - function (done) { - testZone.run(function () { - socket.addEventListener('message', function (event) { - expect(Zone.current).toBe(testZone); - expect(event['data']).toBe('hi'); - done(); - }); - }); - socket.send('hi'); - }, - TIMEOUT, - ); - - it( - 'should respect removeEventListener', - function (done) { - let log = ''; - - function logOnMessage() { - log += 'a'; - - expect(log).toEqual('a'); - - socket.removeEventListener('message', logOnMessage); - socket.send('hi'); - - setTimeout(function () { - expect(log).toEqual('a'); - done(); - }, 10); - } - - socket.addEventListener('message', logOnMessage); - socket.send('hi'); - }, - TIMEOUT, - ); - - it( - 'should work with onmessage', - function (done) { - testZone.run(function () { - socket.onmessage = function (contents) { - expect(Zone.current).toBe(testZone); - expect(contents.data).toBe('hi'); - done(); - }; - }); - socket.send('hi'); - }, - TIMEOUT, - ); - - it( - 'should only allow one onmessage handler', - function (done) { - let log = ''; - - socket.onmessage = function () { - log += 'a'; - expect(log).toEqual('b'); + it( + 'should work with addEventListener', + function (done) { + testZone.run(function () { + socket.addEventListener('message', function (event) { + expect(Zone.current).toBe(testZone); + expect(event['data']).toBe('hi'); done(); - }; + }); + }); + socket.send('hi'); + }, + TIMEOUT, + ); - socket.onmessage = function () { - log += 'b'; - expect(log).toEqual('b'); - done(); - }; + it( + 'should respect removeEventListener', + function (done) { + let log = ''; - socket.send('hi'); - }, - TIMEOUT, - ); + function logOnMessage() { + log += 'a'; - it( - 'should handler removing onmessage', - function (done) { - let log = ''; - - socket.onmessage = function () { - log += 'a'; - }; - - socket.onmessage = null as any; + expect(log).toEqual('a'); + socket.removeEventListener('message', logOnMessage); socket.send('hi'); setTimeout(function () { - expect(log).toEqual(''); + expect(log).toEqual('a'); done(); - }, 100); - }, - TIMEOUT, - ); + }, 10); + } - it('should have constants', function () { - expect(Object.keys(WebSocket)).toContain('CONNECTING'); - expect(Object.keys(WebSocket)).toContain('OPEN'); - expect(Object.keys(WebSocket)).toContain('CLOSING'); - expect(Object.keys(WebSocket)).toContain('CLOSED'); - }); - }), - ); -} + socket.addEventListener('message', logOnMessage); + socket.send('hi'); + }, + TIMEOUT, + ); + + it( + 'should work with onmessage', + function (done) { + testZone.run(function () { + socket.onmessage = function (contents) { + expect(Zone.current).toBe(testZone); + expect(contents.data).toBe('hi'); + done(); + }; + }); + socket.send('hi'); + }, + TIMEOUT, + ); + + it( + 'should only allow one onmessage handler', + function (done) { + let log = ''; + + socket.onmessage = function () { + log += 'a'; + expect(log).toEqual('b'); + done(); + }; + + socket.onmessage = function () { + log += 'b'; + expect(log).toEqual('b'); + done(); + }; + + socket.send('hi'); + }, + TIMEOUT, + ); + + it( + 'should handler removing onmessage', + function (done) { + let log = ''; + + socket.onmessage = function () { + log += 'a'; + }; + + socket.onmessage = null as any; + + socket.send('hi'); + + setTimeout(function () { + expect(log).toEqual(''); + done(); + }, 100); + }, + TIMEOUT, + ); + + it('should have constants', function () { + expect(Object.keys(WebSocket)).toContain('CONNECTING'); + expect(Object.keys(WebSocket)).toContain('OPEN'); + expect(Object.keys(WebSocket)).toContain('CLOSING'); + expect(Object.keys(WebSocket)).toContain('CLOSED'); + }); + }), +); diff --git a/packages/zone.js/test/saucelabs.js b/packages/zone.js/test/saucelabs.js deleted file mode 100644 index b4e540303ca..00000000000 --- a/packages/zone.js/test/saucelabs.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -window.saucelabs = true; diff --git a/packages/zone.js/test/webdriver/test.sauce.es2015.js b/packages/zone.js/test/webdriver/test.sauce.es2015.js deleted file mode 100644 index e6cfa293c58..00000000000 --- a/packages/zone.js/test/webdriver/test.sauce.es2015.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -const webdriverio = require('webdriverio'); -const desiredCapabilities = { - android60: { - deviceName: 'Android GoogleAPI Emulator', - browserName: 'Chrome', - platformName: 'Android', - platformVersion: '6.0', - deviceOrientation: 'portrait', - appiumVersion: '1.12.1', - }, - android71: { - deviceName: 'Android GoogleAPI Emulator', - browserName: 'Chrome', - platformName: 'Android', - platformVersion: '7.1', - deviceOrientation: 'portrait', - appiumVersion: '1.12.1', - }, -}; - -const errors = []; -const tasks = []; - -if (process.env.TRAVIS) { - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); -} - -Object.keys(desiredCapabilities).forEach((key) => { - console.log('begin webdriver test', key); - if (process.env.TRAVIS) { - desiredCapabilities[key]['tunnel-identifier'] = process.env.TRAVIS_JOB_NUMBER; - } - const client = require('webdriverio').remote({ - user: process.env.SAUCE_USERNAME, - key: process.env.SAUCE_ACCESS_KEY, - host: 'localhost', - port: 4445, - desiredCapabilities: desiredCapabilities[key], - }); - - const p = client - .init() - .timeouts('script', 60000) - .url('http://localhost:8080/test/webdriver/test-es2015.html') - .executeAsync(function (done) { - window.setTimeout(done, 1000); - }) - .execute(function () { - const elem = document.getElementById('thetext'); - const zone = window['Zone'] ? Zone.current.fork({name: 'webdriver'}) : null; - if (zone) { - zone.run(function () { - elem.addEventListener('click', function (e) { - e.target.innerText = 'clicked' + Zone.current.name; - }); - }); - } else { - elem.addEventListener('click', function (e) { - e.target.innerText = 'clicked'; - }); - } - }) - .click('#thetext') - .getText('#thetext') - .then( - (text) => { - if (text !== 'clickedwebdriver') { - errors.push(`Env: ${key}, expected clickedwebdriver, get ${text}`); - } - }, - (error) => { - errors.push(`Env: ${key}, error occurs: ${error}`); - }, - ) - .end(); - tasks.push(p); -}); - -function exit(exitCode) { - const http = require('http'); - http.get('http://localhost:8080/close', () => { - process.exit(exitCode); - }); -} - -Promise.all(tasks).then(() => { - if (errors.length > 0) { - let nonTimeoutError = false; - errors.forEach((error) => { - console.log(error); - if (error.toString().lastIndexOf('timeout') === -1) { - nonTimeoutError = true; - } - }); - if (nonTimeoutError) { - exit(1); - } else { - exit(0); - } - } else { - exit(0); - } -}); diff --git a/packages/zone.js/test/webdriver/test.sauce.js b/packages/zone.js/test/webdriver/test.sauce.js deleted file mode 100644 index 11b5b317e6d..00000000000 --- a/packages/zone.js/test/webdriver/test.sauce.js +++ /dev/null @@ -1,106 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -const desiredCapabilities = { - firefox52Win7: {browserName: 'firefox', platform: 'Windows 7', version: '52'}, - firefox53Win7: {browserName: 'firefox', platform: 'Windows 7', version: '53'}, - chrome48: {browserName: 'chrome', version: '48'}, - safari8: {browserName: 'safari', platform: 'OS X 10.10', version: '8.0'}, - safari9: {browserName: 'safari', platform: 'OS X 10.11', version: '9.0'}, - safari10: {browserName: 'safari', platform: 'OS X 10.11', version: '10.0'}, - safari11: {browserName: 'safari', platform: 'macOS 10.13', version: '11.1'}, - /*ios84: {browserName: 'iphone', platform: 'OS X 10.10', version: '8.4'},*/ - ios10: {browserName: 'iphone', platform: 'OS X 10.10', version: '10.3'}, - ios11: {browserName: 'iphone', platform: 'OS X 10.12', version: '11.2'}, - // andriod44: {browserName: 'android', platform: 'Linux', version: '4.4'}, - android51: {browserName: 'android', platform: 'Linux', version: '5.1'}, -}; - -const errors = []; -const tasks = []; - -if (process.env.TRAVIS) { - process.env.SAUCE_ACCESS_KEY = process.env.SAUCE_ACCESS_KEY.split('').reverse().join(''); -} - -Object.keys(desiredCapabilities).forEach((key) => { - console.log('begin webdriver test', key); - if (process.env.TRAVIS) { - desiredCapabilities[key]['tunnel-identifier'] = process.env.TRAVIS_JOB_NUMBER; - } - const client = require('webdriverio').remote({ - user: process.env.SAUCE_USERNAME, - key: process.env.SAUCE_ACCESS_KEY, - host: 'localhost', - port: 4445, - desiredCapabilities: desiredCapabilities[key], - }); - - const p = client - .init() - .timeouts('script', 60000) - .url('http://localhost:8080/test/webdriver/test.html') - .executeAsync(function (done) { - window.setTimeout(done, 1000); - }) - .execute(function () { - const elem = document.getElementById('thetext'); - const zone = window['Zone'] ? Zone.current.fork({name: 'webdriver'}) : null; - if (zone) { - zone.run(function () { - elem.addEventListener('click', function (e) { - e.target.innerText = 'clicked' + Zone.current.name; - }); - }); - } else { - elem.addEventListener('click', function (e) { - e.target.innerText = 'clicked'; - }); - } - }) - .click('#thetext') - .getText('#thetext') - .then( - (text) => { - if (text !== 'clickedwebdriver') { - errors.push(`Env: ${key}, expected clickedwebdriver, get ${text}`); - } - }, - (error) => { - errors.push(`Env: ${key}, error occurs: ${error}`); - }, - ) - .end(); - tasks.push(p); -}); - -function exit(exitCode) { - const http = require('http'); - http.get('http://localhost:8080/close', () => { - process.exit(exitCode); - }); -} - -Promise.all(tasks).then(() => { - if (errors.length > 0) { - let nonTimeoutError = false; - errors.forEach((error) => { - console.log(error); - if (error.toString().lastIndexOf('timeout') === -1) { - nonTimeoutError = true; - } - }); - if (nonTimeoutError) { - exit(1); - } else { - exit(0); - } - } else { - exit(0); - } -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79f1b143ca4..2d82cc8c719 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - saucelabs: 9.0.2 typescript: 6.0.2 packageExtensionsChecksum: sha256-3L73Fw32UVtE6x5BJxJPBtQtH/mgsr31grNpdhHP1IY= @@ -151,9 +150,6 @@ importers: '@types/selenium-webdriver': specifier: 3.0.7 version: 3.0.7 - '@types/selenium-webdriver4': - specifier: npm:@types/selenium-webdriver@4.35.5 - version: '@types/selenium-webdriver@4.35.5' '@types/semver': specifier: ^7.3.4 version: 7.7.1 @@ -265,9 +261,6 @@ importers: selenium-webdriver: specifier: 3.5.0 version: 3.5.0 - selenium-webdriver4: - specifier: npm:selenium-webdriver@4.43.0 - version: selenium-webdriver@4.43.0(bufferutil@4.1.0) semver-dsl: specifier: ^1.0.1 version: 1.0.1 @@ -401,9 +394,6 @@ importers: karma-jasmine-html-reporter: specifier: ^2.2.0 version: 2.2.0(jasmine-core@6.2.0)(karma-jasmine@5.1.0(karma@6.4.4(bufferutil@4.1.0)))(karma@6.4.4(bufferutil@4.1.0)) - karma-sauce-launcher: - specifier: ^4.3.6 - version: 4.3.6(bufferutil@4.1.0)(encoding@0.1.13)(typescript@6.0.2) prettier: specifier: ^3.8.0 version: 3.8.3 @@ -2479,9 +2469,6 @@ packages: resolution: {integrity: sha512-8WV3Uulai7afTG0OLo7Kf72actI0N6WK4a89i0kClO0WVlY2DguKyBPR/Xs//Sn/U4c4V93b0HS1ufUv3aTxbA==} hasBin: true - '@bazel/runfiles@6.5.0': - resolution: {integrity: sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==} - '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2645,9 +2632,6 @@ packages: resolution: {integrity: sha512-dDlz3W405VMFO4w5kIP9DOmELBcvFQGmLoKSdIRstBDubKFYwaNHV1NnlzMCQpXQFGWVALmeMORAuiLx18AvZQ==} engines: {node: '>=14.17.0'} - '@eggjs/yauzl@2.11.0': - resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} - '@electric-sql/pglite-tools@0.2.21': resolution: {integrity: sha512-kv8Z7UmmBVECHud63VblgQLp4A+qSklNP7H22VQqFQGrWFTodc73bubcjgmBqThFsIIiEeAEQQYwWGaK2lSDtA==} peerDependencies: @@ -4672,11 +4656,6 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@puppeteer/browsers@2.13.0': - resolution: {integrity: sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==} - engines: {node: '>=18'} - hasBin: true - '@rolldown/binding-android-arm64@1.0.0-rc.12': resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5227,10 +5206,6 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - '@textlint/ast-node-types@15.5.4': resolution: {integrity: sha512-bVtB6VEy9U9DpW8cTt25k5T+lz86zV5w6ImePZqY1AXzSuPhqQNT77lkMPxonXzUducEIlSvUu3o7sKw3y9+Sw==} @@ -5302,9 +5277,6 @@ packages: '@types/bonjour@3.5.13': resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -5476,9 +5448,6 @@ packages: '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-cache-semantics@4.2.0': - resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -5512,9 +5481,6 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -5533,13 +5499,6 @@ packages: '@types/pumpify@1.4.5': resolution: {integrity: sha512-BGVAQyK5yJdfIII230fVYGY47V63hUNAhryuuS3b4lEN2LNwxUXFKsEf8QLDCjmZuimlj23BHppJgcrGvNtqKg==} - '@types/puppeteer-core@5.4.0': - resolution: {integrity: sha512-yqRPuv4EFcSkTyin6Yy17pN6Qz2vwVwTCJIDYMXbE3j8vTPhv0nCQlZOl5xfi0WHUkqvQsjAR8hAfjeMCoetwg==} - - '@types/puppeteer@7.0.4': - resolution: {integrity: sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==} - deprecated: This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed. - '@types/q@0.0.32': resolution: {integrity: sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==} @@ -5552,9 +5511,6 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/responselike@1.0.3': - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -5567,9 +5523,6 @@ packages: '@types/selenium-webdriver@3.0.7': resolution: {integrity: sha512-tHdDdGUBKTbiLLwf5mF78EP35F31UZekG+GRNowl8G5rMQoupAT4qWn/7AaGOvmaqvROdqC3Io/hP1ZyO58QkA==} - '@types/selenium-webdriver@4.35.5': - resolution: {integrity: sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==} - '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -5621,9 +5574,6 @@ packages: '@types/vscode@1.116.0': resolution: {integrity: sha512-sYHp4MO6BqJ2PD7Hjt0hlIS3tMaYsVPJrd0RUjDJ8HtOYnyJIEej0bLSccM8rE77WrC+Xox/kdBwEFDO8MsxNA==} - '@types/which@1.3.2': - resolution: {integrity: sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==} - '@types/which@3.0.4': resolution: {integrity: sha512-liyfuo/106JdlgSchJzXEQCVArk0CvevqPote8F8HgWgJ3dRCcTHgJIsLDuee0kxk/mhbInzIZk3QWSZJ8R+2w==} @@ -5855,26 +5805,6 @@ packages: engines: {node: '>= 20'} hasBin: true - '@wdio/config@6.12.1': - resolution: {integrity: sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ==} - engines: {node: '>=10.0.0'} - - '@wdio/logger@6.10.10': - resolution: {integrity: sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==} - engines: {node: '>=10.0.0'} - - '@wdio/protocols@6.12.0': - resolution: {integrity: sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A==} - engines: {node: '>=10.0.0'} - - '@wdio/repl@6.11.0': - resolution: {integrity: sha512-FxrFKiTkFyELNGGVEH1uijyvNY7lUpmff6x+FGskFGZB4uSRs0rxkOMaEjxnxw7QP1zgQKr2xC7GyO03gIGRGg==} - engines: {node: '>=10.0.0'} - - '@wdio/utils@6.11.0': - resolution: {integrity: sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==} - engines: {node: '>=10.0.0'} - '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -5988,10 +5918,6 @@ packages: resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} engines: {node: '>= 4.0.0'} - agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -6147,22 +6073,10 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - - archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} - archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - archiver@7.0.1: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} @@ -6279,11 +6193,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - autoprefixer@10.4.27: resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} engines: {node: ^10 || ^12 || >=14} @@ -6485,9 +6394,6 @@ packages: resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} engines: {node: '>=4'} - bl@1.2.3: - resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -6519,10 +6425,6 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - bottleneck@2.19.5: resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} @@ -6561,12 +6463,6 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - buffer-alloc-unsafe@1.1.0: - resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} - - buffer-alloc@1.2.0: - resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==} - buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} @@ -6577,9 +6473,6 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-fill@1.0.0: - resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -6613,14 +6506,6 @@ packages: resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} engines: {node: ^20.17.0 || >=22.9.0} - cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - - cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} engines: {node: '>=6'} @@ -6644,9 +6529,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -6662,9 +6544,6 @@ packages: caniuse-lite@1.0.30001788: resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -6694,9 +6573,6 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -6748,18 +6624,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - chrome-launcher@0.13.4: - resolution: {integrity: sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==} - chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} - chromium-bidi@14.0.0: - resolution: {integrity: sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==} - peerDependencies: - devtools-protocol: '*' - ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} @@ -6851,9 +6719,6 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} - clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -6976,10 +6841,6 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} @@ -6988,10 +6849,6 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compressing@1.10.5: - resolution: {integrity: sha512-kmVGoqpCTZLy36T8XeYexmyJ8YhZhgjGzkPr2iCGHdfZg7IkelF5DEf5Xyzeo7hwSSEW6ifZuv0IeRAkee5NcA==} - engines: {node: '>= 4.0.0'} - compression@1.8.1: resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} @@ -7021,9 +6878,6 @@ packages: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -7137,9 +6991,6 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - core-js@3.49.0: - resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -7174,10 +7025,6 @@ packages: engines: {node: '>=0.8'} hasBin: true - crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - crc32-stream@6.0.0: resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} engines: {node: '>= 14'} @@ -7219,16 +7066,10 @@ packages: css-select@6.0.0: resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} - css-shorthand-properties@1.1.2: - resolution: {integrity: sha512-C2AugXIpRGQTxaCW0N7n5jD/p5irUmCrwl03TrnMFBHDbdq44CFWR2zO7rK9xPN4Eo3pUxC4vQzQgbIpzrD1PQ==} - css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-value@0.0.1: - resolution: {integrity: sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==} - css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} @@ -7506,10 +7347,6 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -7550,10 +7387,6 @@ packages: defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -7619,16 +7452,6 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - devtools-protocol@0.0.1595872: - resolution: {integrity: sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==} - - devtools-protocol@0.0.818844: - resolution: {integrity: sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==} - - devtools@6.12.1: - resolution: {integrity: sha512-JyG46suEiZmld7/UVeogkCWM0zYGt+2ML/TI+SkEp+bTv9cs46cDb0pKF3glYZJA7wVVL2gC07Ic0iCxyJEnCQ==} - engines: {node: '>=10.0.0'} - di@0.0.1: resolution: {integrity: sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==} @@ -7680,9 +7503,6 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -7710,9 +7530,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - edge-paths@2.2.1: - resolution: {integrity: sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==} - editions@6.22.0: resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} engines: {ecmascript: '>= es5', node: '>=4'} @@ -7846,9 +7663,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - es6-module-loader@0.17.11: resolution: {integrity: sha512-6u2nrCQQ0fg7llO02vHAg8MZSxE+Y+fjy+9906ICIR5qaZLUlx7CePFvEJf1Fz7CnUUkKDt7woYtYTYpy9jVQQ==} engines: {node: '>=0.8.0'} @@ -8060,9 +7874,6 @@ packages: fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8108,9 +7919,6 @@ packages: fd-package-json@2.0.0: resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} - fd-slicer2@1.2.0: - resolution: {integrity: sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==} - fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} @@ -8145,10 +7953,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-obj@1.1.0: - resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} - engines: {node: '>=0.10.0'} - finalhandler@1.1.2: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} @@ -8204,9 +8008,6 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - flushwritable@1.0.0: - resolution: {integrity: sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==} - fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -8365,17 +8166,10 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-ready@1.0.0: - resolution: {integrity: sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==} - get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -8461,10 +8255,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - global-agent@2.2.0: - resolution: {integrity: sha512-+20KpaW6DDLqhG7JDiJpD1JvNvb8ts+TNl7BPOYcURqCrXqnN1Vf+XVOrkKJAFPqfX+oEhsdzOj1hLWkBTdNJg==} - engines: {node: '>=10.0'} - global-dirs@3.0.1: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} @@ -8521,19 +8311,12 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -8628,9 +8411,6 @@ packages: resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} engines: {node: '>=8'} - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - hasha@5.2.2: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} @@ -8652,9 +8432,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - heap-js@2.7.1: resolution: {integrity: sha512-EQfezRg0NCZGNlhlDR3Evrw1FVL2G3LhU7EgPoxufQKruNBSYA8MiRPHeWbU+36o+Fhel0wMwM+sLEiBAlNLJA==} engines: {node: '>=10.0.0'} @@ -8764,18 +8541,10 @@ packages: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} - http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - https-proxy-agent@2.2.4: resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==} engines: {node: '>= 4.5.0'} - https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -8805,10 +8574,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - iconv-lite@0.5.2: - resolution: {integrity: sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -9516,9 +9281,6 @@ packages: json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -9613,10 +9375,6 @@ packages: peerDependencies: karma: ^6.0.0 - karma-sauce-launcher@4.3.6: - resolution: {integrity: sha512-Ej62q4mUPFktyAm8g0g8J5qhwEkXwdHrwtiV4pZjKNHNnSs+4qgDyzs3VkpOy3AmNTsTqQXUN/lpiy0tZpDJZQ==} - engines: {node: '>= 10.0.0'} - karma-source-map-support@1.4.0: resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} @@ -9635,9 +9393,6 @@ packages: keytar@7.9.0: resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} @@ -9716,9 +9471,6 @@ packages: resolution: {integrity: sha512-wwLXMbuxSF8gMvubFcFRp56lkFV69twvbU5vDPbaw+Q+/rF8j0HKjGbIdlSi+LuJm9jf7k9PB+nTxnsLMPcv2Q==} engines: {node: '>=10.13.0'} - lighthouse-logger@1.4.2: - resolution: {integrity: sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==} - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -9849,21 +9601,9 @@ packages: lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -9879,18 +9619,12 @@ packages: lodash.isobject@2.4.1: resolution: {integrity: sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==} - lodash.isobject@3.0.2: - resolution: {integrity: sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==} - lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} @@ -9900,12 +9634,6 @@ packages: lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - - lodash.zip@4.2.0: - resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==} - lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -9937,23 +9665,9 @@ packages: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} - loglevel-plugin-prefix@0.8.4: - resolution: {integrity: sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==} - - loglevel@1.9.2: - resolution: {integrity: sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==} - engines: {node: '>= 0.6.0'} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -10033,13 +9747,6 @@ packages: engines: {node: '>= 20'} hasBin: true - marky@1.3.0: - resolution: {integrity: sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==} - - matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -10147,10 +9854,6 @@ packages: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -10226,9 +9929,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -10380,9 +10080,6 @@ packages: '@angular/core': '>=17.3.0' rxjs: '>=7.0.0' - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - nock@14.0.12: resolution: {integrity: sha512-kZM3bHV0KzhHH6E2eRszHyML/w87AUzLBwupNTHohtYWP9fZYgUPmCbSKq6ITfEEmHqN4/p0MscvUipT4P5Qsg==} engines: {node: '>=18.20.0 <20 || >=20.12.1'} @@ -10466,10 +10163,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - now-and-later@3.0.0: resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} engines: {node: '>= 10.13.0'} @@ -10648,10 +10341,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} engines: {node: '>=8'} @@ -10730,9 +10419,6 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -10791,15 +10477,9 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - passerror@1.1.1: resolution: {integrity: sha512-PwrEQJBkJMxnxG+tdraz95vTstYnCRqiURNbGtg/vZHLgcAODc9hbiD5ZumGUoh3bpw0F0qKLje7Vd2Fd5Lx3g==} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} @@ -11223,19 +10903,6 @@ packages: resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} engines: {node: '>=8'} - puppeteer-core@24.42.0: - resolution: {integrity: sha512-T4zXokk/izH01fYPhyyev1A4piWiOKrYq7CUFpdoYQxmOnXoV6YjUabmfIjCYkNspSoAXIxRid3Tw+Vg0fthYg==} - engines: {node: '>=18'} - - puppeteer-core@5.5.0: - resolution: {integrity: sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ==} - engines: {node: '>=10.18.1'} - - puppeteer@24.42.0: - resolution: {integrity: sha512-94MoPfFp2eY3eYIMdINkez4IOP5TMHntlZbVx06fHlQTtiQiYgaY0L2Zzfod8PVUkPqP7m3Qlre2v8YS8cudPA==} - engines: {node: '>=18'} - hasBin: true - pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} @@ -11270,17 +10937,9 @@ packages: resolution: {integrity: sha512-mzR4sElr1bfCaPJe7m8ilJ6ZXdDaGoObcYR0ZHSsktM/Lt21MVHj5De30GQH2eiZ1qGRTO7LCAzQsUeXTNexWQ==} engines: {node: '>=0.6'} - query-string@7.1.3: - resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} - engines: {node: '>=6'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - railroad-diagrams@1.0.0: resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} @@ -11443,9 +11102,6 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -11478,12 +11134,6 @@ packages: engines: {node: '>= 0.4'} hasBin: true - responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - - resq@1.11.0: - resolution: {integrity: sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==} - restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -11511,9 +11161,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rgb2hex@0.2.3: - resolution: {integrity: sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ==} - rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -11528,10 +11175,6 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - robust-predicates@3.0.3: resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} @@ -11646,9 +11289,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - saucelabs@9.0.2: - resolution: {integrity: sha512-37QGEOgp9BP1re6S06qpNcBZ0Hw+ZSkZkDepbXHT9VjYoRQwRzUoLtKqE4yyVeK7dzcQXQapmTGF1kp1jO2VDw==} - hasBin: true + saucelabs@1.5.0: + resolution: {integrity: sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==} sax@1.6.0: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} @@ -11681,17 +11323,10 @@ packages: resolution: {integrity: sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==} engines: {node: '>= 6.9.0'} - selenium-webdriver@4.43.0: - resolution: {integrity: sha512-dV4zBTT37or3Z3/8uD6rS8zvd4ZxPuG4EJVlqYIbZCGZCYttZm7xb9rlFLSk4rrsQHAeDYvudl7cquo0vWpHjg==} - engines: {node: '>= 20.0.0'} - selfsigned@5.5.0: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} - semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - semver-diff@3.1.1: resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} engines: {node: '>=8'} @@ -11724,20 +11359,9 @@ packages: resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - seq@0.3.5: resolution: {integrity: sha512-sisY2Ln1fj43KBkRtXkesnRHYNdswIkIibvNe/0UKm2GZxjMbqmccpiatoKr/k2qX5VKiLU8xm+tz/74LAho4g==} - serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - - serialize-error@8.1.0: - resolution: {integrity: sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==} - engines: {node: '>=10'} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -11874,9 +11498,6 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - socket.io-adapter@2.5.6: resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} @@ -11969,10 +11590,6 @@ packages: split-array-stream@2.0.0: resolution: {integrity: sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==} - split-on-first@1.1.0: - resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} - engines: {node: '>=6'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -11980,9 +11597,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - sql-formatter@15.7.3: resolution: {integrity: sha512-5+zl9Nqg5aNjss0tb1G+StpC4dJKbjv3+g8CL/+V+00PfZop+2RKGyi53ScFl0dr+Dkx1LjmUO54Q3N7K3EtMw==} hasBin: true @@ -12051,10 +11665,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamifier@0.1.1: - resolution: {integrity: sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==} - engines: {node: '>=0.10'} - streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} @@ -12065,10 +11675,6 @@ packages: strict-event-emitter@0.5.1: resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} - strict-uri-encode@2.0.0: - resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} - engines: {node: '>=4'} - string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -12230,13 +11836,6 @@ packages: tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - tar-fs@3.1.2: - resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} - - tar-stream@1.6.2: - resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==} - engines: {node: '>= 0.8.0'} - tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -12372,10 +11971,6 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-buffer@1.2.2: - resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} - engines: {node: '>= 0.4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -12534,10 +12129,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -12584,9 +12175,6 @@ packages: typed-graphqlify@3.1.6: resolution: {integrity: sha512-Snlg1ZrokbkQuemOb4xjWWCJrNcOMeb2Ii0/BwMfwLCcJVNjygyqhrFkrYNvi4gDrwWFrGE0TvxxM+Slym2JMg==} - typed-query-selector@2.12.1: - resolution: {integrity: sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==} - typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} @@ -12624,9 +12212,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} engines: {node: '>=0.10.0'} @@ -12752,12 +12337,6 @@ packages: resolution: {integrity: sha512-eZWTh8F+VCEoC4UIh0pKmh8h4izj65VvLhCpJpVefUxdYe0fU3GBrC4Sbh1AoWA/miNPAb6UVlp2fUQNsfp+3g==} engines: {node: '>=14'} - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -13062,9 +12641,6 @@ packages: web-vitals@4.2.4: resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} - webdriver-bidi-protocol@0.4.1: - resolution: {integrity: sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==} - webdriver-js-extender@2.1.0: resolution: {integrity: sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==} engines: {node: '>=6.9.x'} @@ -13074,14 +12650,6 @@ packages: engines: {node: '>=6.9.x'} hasBin: true - webdriver@6.12.1: - resolution: {integrity: sha512-3rZgAj9o2XHp16FDTzvUYaHelPMSPbO1TpLIMUT06DfdZjNYIzZiItpIb/NbQDTPmNhzd9cuGmdI56WFBGY2BA==} - engines: {node: '>=10.0.0'} - - webdriverio@6.12.1: - resolution: {integrity: sha512-Nx7ge0vTWHVIRUbZCT+IuMwB5Q0Q5nLlYdgnmmJviUKLuc3XtaEBkYPTbhHWHgSBXsPZMIc023vZKNkn+6iyeQ==} - engines: {node: '>=10.0.0'} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -13459,10 +13027,6 @@ packages: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - zip-stream@6.0.1: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} @@ -15092,8 +14656,6 @@ snapshots: '@bazel/ibazel@0.28.0': {} - '@bazel/runfiles@6.5.0': {} - '@bcoe/v8-coverage@0.2.3': {} '@braintree/sanitize-url@7.1.2': {} @@ -15307,11 +14869,6 @@ snapshots: '@discoveryjs/json-ext@1.0.0': {} - '@eggjs/yauzl@2.11.0': - dependencies: - buffer-crc32: 0.2.13 - fd-slicer2: 1.2.0 - '@electric-sql/pglite-tools@0.2.21(@electric-sql/pglite@0.3.16)': dependencies: '@electric-sql/pglite': 0.3.16 @@ -17586,21 +17143,6 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@puppeteer/browsers@2.13.0': - dependencies: - debug: 4.4.3(supports-color@10.2.2) - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.7.4 - tar-fs: 3.1.2 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - supports-color - '@rolldown/binding-android-arm64@1.0.0-rc.12': optional: true @@ -18047,10 +17589,6 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@szmarczak/http-timer@4.0.6': - dependencies: - defer-to-connect: 2.0.1 - '@textlint/ast-node-types@15.5.4': {} '@textlint/linter-formatter@15.5.4': @@ -18142,13 +17680,6 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@types/cacheable-request@6.0.3': - dependencies: - '@types/http-cache-semantics': 4.2.0 - '@types/keyv': 3.1.4 - '@types/node': 24.12.2 - '@types/responselike': 1.0.3 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -18355,8 +17886,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/http-cache-semantics@4.2.0': {} - '@types/http-errors@2.0.5': {} '@types/http-proxy@1.17.17': @@ -18398,10 +17927,6 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/keyv@3.1.4': - dependencies: - '@types/node': 24.12.2 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -18423,30 +17948,6 @@ snapshots: '@types/duplexify': 3.6.5 '@types/node': 24.12.2 - '@types/puppeteer-core@5.4.0(bufferutil@4.1.0)(typescript@6.0.2)': - dependencies: - '@types/puppeteer': 7.0.4(bufferutil@4.1.0)(typescript@6.0.2) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - - '@types/puppeteer@7.0.4(bufferutil@4.1.0)(typescript@6.0.2)': - dependencies: - puppeteer: 24.42.0(bufferutil@4.1.0)(typescript@6.0.2) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - '@types/q@0.0.32': {} '@types/qs@6.15.0': {} @@ -18455,10 +17956,6 @@ snapshots: '@types/resolve@1.20.2': {} - '@types/responselike@1.0.3': - dependencies: - '@types/node': 24.12.2 - '@types/retry@0.12.0': {} '@types/retry@0.12.2': {} @@ -18467,11 +17964,6 @@ snapshots: '@types/selenium-webdriver@3.0.7': {} - '@types/selenium-webdriver@4.35.5': - dependencies: - '@types/node': 24.12.2 - '@types/ws': 8.18.1 - '@types/semver@7.7.1': {} '@types/send@0.17.6': @@ -18520,8 +18012,6 @@ snapshots: '@types/vscode@1.116.0': {} - '@types/which@1.3.2': {} - '@types/which@3.0.4': {} '@types/ws@8.18.1': @@ -18767,29 +18257,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@wdio/config@6.12.1': - dependencies: - '@wdio/logger': 6.10.10 - deepmerge: 4.3.1 - glob: 7.2.3 - - '@wdio/logger@6.10.10': - dependencies: - chalk: 4.1.2 - loglevel: 1.9.2 - loglevel-plugin-prefix: 0.8.4 - strip-ansi: 6.0.1 - - '@wdio/protocols@6.12.0': {} - - '@wdio/repl@6.11.0': - dependencies: - '@wdio/utils': 6.11.0 - - '@wdio/utils@6.11.0': - dependencies: - '@wdio/logger': 6.10.10 - '@webassemblyjs/ast@1.14.1': dependencies: '@webassemblyjs/helper-numbers': 1.13.2 @@ -18919,8 +18386,6 @@ snapshots: dependencies: es6-promisify: 5.0.0 - agent-base@5.1.1: {} - agent-base@7.1.4: {} agent-base@9.0.0: {} @@ -19069,32 +18534,6 @@ snapshots: arch@2.2.0: {} - archiver-utils@2.1.0: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - - archiver-utils@3.0.4: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - archiver-utils@5.0.2: dependencies: glob: 10.5.0 @@ -19105,16 +18544,6 @@ snapshots: normalize-path: 3.0.0 readable-stream: 4.7.0 - archiver@5.3.2: - dependencies: - archiver-utils: 2.1.0 - async: 3.2.6 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - archiver@7.0.1: dependencies: archiver-utils: 5.0.2 @@ -19222,8 +18651,6 @@ snapshots: at-least-node@1.0.0: {} - atob@2.1.2: {} - autoprefixer@10.4.27(postcss@8.5.8): dependencies: browserslist: 4.28.2 @@ -19442,11 +18869,6 @@ snapshots: dependencies: editions: 6.22.0 - bl@1.2.3: - dependencies: - readable-stream: 2.3.8 - safe-buffer: 5.2.1 - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -19505,8 +18927,6 @@ snapshots: boolbase@1.0.0: {} - boolean@3.2.0: {} - bottleneck@2.19.5: {} boundary@2.0.0: {} @@ -19559,21 +18979,12 @@ snapshots: dependencies: node-int64: 0.4.0 - buffer-alloc-unsafe@1.1.0: {} - - buffer-alloc@1.2.0: - dependencies: - buffer-alloc-unsafe: 1.1.0 - buffer-fill: 1.0.0 - buffer-crc32@0.2.13: {} buffer-crc32@1.0.0: {} buffer-equal-constant-time@1.0.1: {} - buffer-fill@1.0.0: {} - buffer-from@1.1.2: {} buffer@5.7.1: @@ -19613,18 +19024,6 @@ snapshots: p-map: 7.0.4 ssri: 13.0.1 - cacheable-lookup@5.0.4: {} - - cacheable-request@7.0.4: - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.2.0 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - cachedir@2.4.0: {} call-bind-apply-helpers@1.0.2: @@ -19648,11 +19047,6 @@ snapshots: callsites@3.1.0: {} - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.8.1 - camelcase-css@2.0.1: {} camelcase@5.3.1: {} @@ -19661,12 +19055,6 @@ snapshots: caniuse-lite@1.0.30001788: {} - capital-case@1.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case-first: 2.0.2 - caseless@0.12.0: {} ccount@2.0.1: {} @@ -19698,21 +19086,6 @@ snapshots: chalk@5.6.2: {} - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.8.1 - char-regex@1.0.2: {} character-entities-html4@2.1.0: {} @@ -19785,29 +19158,13 @@ snapshots: dependencies: readdirp: 5.0.0 - chownr@1.1.4: {} + chownr@1.1.4: + optional: true chownr@3.0.0: {} - chrome-launcher@0.13.4: - dependencies: - '@types/node': 24.12.2 - escape-string-regexp: 1.0.5 - is-wsl: 2.2.0 - lighthouse-logger: 1.4.2 - mkdirp: 0.5.6 - rimraf: 3.0.2 - transitivePeerDependencies: - - supports-color - chrome-trace-event@1.0.4: {} - chromium-bidi@14.0.0(devtools-protocol@0.0.1595872): - dependencies: - devtools-protocol: 0.0.1595872 - mitt: 3.0.1 - zod: 3.25.76 - ci-info@2.0.0: {} ci-info@4.4.0: {} @@ -19915,10 +19272,6 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 - clone-response@1.0.3: - dependencies: - mimic-response: 1.0.1 - clone@1.0.4: {} clone@2.1.2: {} @@ -20002,13 +19355,6 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - compress-commons@4.1.2: - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - compress-commons@6.0.2: dependencies: crc-32: 1.2.2 @@ -20021,18 +19367,6 @@ snapshots: dependencies: mime-db: 1.54.0 - compressing@1.10.5: - dependencies: - '@eggjs/yauzl': 2.11.0 - flushwritable: 1.0.0 - get-ready: 1.0.0 - iconv-lite: 0.5.2 - mkdirp: 0.5.6 - pump: 3.0.4 - streamifier: 0.1.1 - tar-stream: 1.6.2 - yazl: 2.5.1 - compression@1.8.1: dependencies: bytes: 3.1.2 @@ -20081,12 +19415,6 @@ snapshots: transitivePeerDependencies: - supports-color - constant-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case: 2.0.2 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -20213,8 +19541,6 @@ snapshots: dependencies: browserslist: 4.28.2 - core-js@3.49.0: {} - core-util-is@1.0.2: {} core-util-is@1.0.3: {} @@ -20245,11 +19571,6 @@ snapshots: crc-32@1.2.2: {} - crc32-stream@4.0.3: - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - crc32-stream@6.0.0: dependencies: crc-32: 1.2.2 @@ -20300,15 +19621,11 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-shorthand-properties@1.1.2: {} - css-tree@3.2.1: dependencies: mdn-data: 2.27.1 source-map-js: 1.2.1 - css-value@0.0.1: {} - css-what@6.2.2: {} css-what@7.0.0: {} @@ -20634,11 +19951,10 @@ snapshots: decimal.js@10.6.0: {} - decode-uri-component@0.2.2: {} - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true dedent@1.7.2: {} @@ -20665,8 +19981,6 @@ snapshots: dependencies: clone: 1.0.4 - defer-to-connect@2.0.1: {} - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -20725,27 +20039,6 @@ snapshots: dependencies: dequal: 2.0.3 - devtools-protocol@0.0.1595872: {} - - devtools-protocol@0.0.818844: {} - - devtools@6.12.1(bufferutil@4.1.0)(encoding@0.1.13): - dependencies: - '@wdio/config': 6.12.1 - '@wdio/logger': 6.10.10 - '@wdio/protocols': 6.12.0 - '@wdio/utils': 6.11.0 - chrome-launcher: 0.13.4 - edge-paths: 2.2.1 - puppeteer-core: 5.5.0(bufferutil@4.1.0)(encoding@0.1.13) - ua-parser-js: 0.7.41 - uuid: 8.3.2 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - di@0.0.1: {} didyoumean@1.2.2: {} @@ -20795,11 +20088,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - dot-prop@5.3.0: dependencies: is-obj: 2.0.0 @@ -20840,11 +20128,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - edge-paths@2.2.1: - dependencies: - '@types/which': 1.3.2 - which: 2.0.2 - editions@6.22.0: dependencies: version-range: 4.15.0 @@ -21023,8 +20306,6 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es6-error@4.1.1: {} - es6-module-loader@0.17.11: dependencies: when: 3.7.8 @@ -21352,16 +20633,6 @@ snapshots: extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3(supports-color@10.2.2) - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - extract-zip@2.0.1(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -21380,8 +20651,6 @@ snapshots: fast-content-type-parse@3.0.0: {} - fast-deep-equal@2.0.1: {} - fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -21430,10 +20699,6 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fd-slicer2@1.2.0: - dependencies: - pend: 1.2.0 - fd-slicer@1.1.0: dependencies: pend: 1.2.0 @@ -21461,8 +20726,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - filter-obj@1.1.0: {} - finalhandler@1.1.2: dependencies: debug: 2.6.9 @@ -21662,8 +20925,6 @@ snapshots: flatted@3.4.2: {} - flushwritable@1.0.0: {} - fn.name@1.1.0: {} folder-hash@4.1.2(supports-color@10.2.2): @@ -21720,7 +20981,8 @@ snapshots: fresh@2.0.0: {} - fs-constants@1.0.0: {} + fs-constants@1.0.0: + optional: true fs-extra@10.1.0: dependencies: @@ -21842,15 +21104,11 @@ snapshots: get-package-type@0.1.0: {} - get-port@5.1.1: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-ready@1.0.0: {} - get-stream@5.2.0: dependencies: pump: 3.0.4 @@ -21972,16 +21230,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - global-agent@2.2.0: - dependencies: - boolean: 3.2.0 - core-js: 3.49.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.7.4 - serialize-error: 7.0.1 - global-dirs@3.0.1: dependencies: ini: 2.0.0 @@ -22082,26 +21330,10 @@ snapshots: gopd@1.2.0: {} - got@11.8.6: - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - graphql-tag@2.12.6(graphql@16.13.2): dependencies: graphql: 16.13.2 @@ -22207,11 +21439,6 @@ snapshots: has-yarn@2.1.0: {} - hash.js@1.1.7: - dependencies: - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - hasha@5.2.2: dependencies: is-stream: 2.0.1 @@ -22245,11 +21472,6 @@ snapshots: he@1.2.0: {} - header-case@2.0.4: - dependencies: - capital-case: 1.0.4 - tslib: 2.8.1 - heap-js@2.7.1: {} highlight.js@10.7.3: {} @@ -22401,11 +21623,6 @@ snapshots: jsprim: 2.0.2 sshpk: 1.18.0 - http2-wrapper@1.0.3: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - https-proxy-agent@2.2.4: dependencies: agent-base: 4.3.0 @@ -22413,13 +21630,6 @@ snapshots: transitivePeerDependencies: - supports-color - https-proxy-agent@4.0.0: - dependencies: - agent-base: 5.1.1 - debug: 4.4.3(supports-color@10.2.2) - transitivePeerDependencies: - - supports-color - https-proxy-agent@7.0.6(supports-color@10.2.2): dependencies: agent-base: 7.1.4 @@ -22446,10 +21656,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.5.2: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -23307,8 +22513,6 @@ snapshots: dependencies: bignumber.js: 9.3.1 - json-buffer@3.0.1: {} - json-parse-even-better-errors@2.3.1: {} json-parse-even-better-errors@5.0.0: {} @@ -23423,21 +22627,6 @@ snapshots: jasmine-core: 4.6.1 karma: 6.4.4(bufferutil@4.1.0)(utf-8-validate@6.0.6) - karma-sauce-launcher@4.3.6(bufferutil@4.1.0)(encoding@0.1.13)(typescript@6.0.2): - dependencies: - global-agent: 2.2.0 - saucelabs: 9.0.2 - webdriverio: 6.12.1(bufferutil@4.1.0)(encoding@0.1.13)(typescript@6.0.2) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - encoding - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - karma-source-map-support@1.4.0: dependencies: source-map-support: 0.5.21 @@ -23488,10 +22677,6 @@ snapshots: prebuild-install: 7.1.3 optional: true - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - khroma@2.1.0: {} kind-of@6.0.3: {} @@ -23571,13 +22756,6 @@ snapshots: rechoir: 0.8.0 resolve: 1.22.12 - lighthouse-logger@1.4.2: - dependencies: - debug: 2.6.9 - marky: 1.3.0 - transitivePeerDependencies: - - supports-color - lightningcss-android-arm64@1.32.0: optional: true @@ -23698,16 +22876,8 @@ snapshots: lodash.camelcase@4.3.0: {} - lodash.clonedeep@4.5.0: {} - lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} - - lodash.difference@4.5.0: {} - - lodash.flatten@4.4.0: {} - lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -23720,24 +22890,16 @@ snapshots: dependencies: lodash._objecttypes: 2.4.1 - lodash.isobject@3.0.2: {} - lodash.isplainobject@4.0.6: {} lodash.isstring@4.0.1: {} - lodash.merge@4.6.2: {} - lodash.once@4.1.1: {} lodash.snakecase@4.1.1: {} lodash.truncate@4.4.2: {} - lodash.union@4.6.0: {} - - lodash.zip@4.2.0: {} - lodash@4.18.1: {} log-symbols@4.1.0: @@ -23789,18 +22951,8 @@ snapshots: safe-stable-stringify: 2.5.0 triple-beam: 1.4.1 - loglevel-plugin-prefix@0.8.4: {} - - loglevel@1.9.2: {} - long@5.3.2: {} - lower-case@2.0.2: - dependencies: - tslib: 2.8.1 - - lowercase-keys@2.0.0: {} - lru-cache@10.4.3: {} lru-cache@11.3.5: {} @@ -23887,12 +23039,6 @@ snapshots: marked@18.0.0: {} - marky@1.3.0: {} - - matcher@3.0.0: - dependencies: - escape-string-regexp: 4.0.0 - math-intrinsics@1.1.0: {} mdast-util-to-hast@13.2.1: @@ -24015,9 +23161,8 @@ snapshots: mimic-function@5.0.1: {} - mimic-response@1.0.1: {} - - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true mini-css-extract-plugin@2.10.2(webpack@5.105.4(esbuild@0.27.3)): dependencies: @@ -24091,9 +23236,8 @@ snapshots: dependencies: minipass: 7.1.3 - mitt@3.0.1: {} - - mkdirp-classic@0.5.3: {} + mkdirp-classic@0.5.3: + optional: true mkdirp@0.5.6: dependencies: @@ -24277,11 +23421,6 @@ snapshots: rxjs: 7.8.2 tslib: 2.8.1 - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.8.1 - nock@14.0.12: dependencies: '@mswjs/interceptors': 0.41.4 @@ -24376,8 +23515,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-url@6.1.0: {} - now-and-later@3.0.0: dependencies: once: 1.4.0 @@ -24600,8 +23737,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-cancelable@2.1.1: {} - p-defer@3.0.0: {} p-finally@1.0.0: {} @@ -24698,11 +23833,6 @@ snapshots: pako@1.0.11: {} - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -24771,18 +23901,8 @@ snapshots: parseurl@1.3.3: {} - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - passerror@1.1.1: {} - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - path-data-parser@0.1.0: {} path-exists@4.0.0: {} @@ -25119,7 +24239,7 @@ snapshots: jasmine: 2.8.0 jasminewd2: 2.2.0 q: 1.4.1 - saucelabs: 9.0.2 + saucelabs: 1.5.0 selenium-webdriver: 3.6.0 source-map-support: 0.4.18 webdriver-js-extender: 2.1.0 @@ -25183,60 +24303,6 @@ snapshots: dependencies: escape-goat: 2.1.1 - puppeteer-core@24.42.0(bufferutil@4.1.0): - dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) - debug: 4.4.3(supports-color@10.2.2) - devtools-protocol: 0.0.1595872 - typed-query-selector: 2.12.1 - webdriver-bidi-protocol: 0.4.1 - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - utf-8-validate - - puppeteer-core@5.5.0(bufferutil@4.1.0)(encoding@0.1.13): - dependencies: - debug: 4.4.3(supports-color@10.2.2) - devtools-protocol: 0.0.818844 - extract-zip: 2.0.1 - https-proxy-agent: 4.0.0 - node-fetch: 2.7.0(encoding@0.1.13) - pkg-dir: 4.2.0 - progress: 2.0.3 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.4 - unbzip2-stream: 1.4.3 - ws: 7.5.10(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - puppeteer@24.42.0(bufferutil@4.1.0)(typescript@6.0.2): - dependencies: - '@puppeteer/browsers': 2.13.0 - chromium-bidi: 14.0.0(devtools-protocol@0.0.1595872) - cosmiconfig: 9.0.1(typescript@6.0.2) - devtools-protocol: 0.0.1595872 - puppeteer-core: 24.42.0(bufferutil@4.1.0) - typed-query-selector: 2.12.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - pure-rand@7.0.1: {} pvtsutils@1.3.6: @@ -25259,17 +24325,8 @@ snapshots: qs@6.5.5: {} - query-string@7.1.3: - dependencies: - decode-uri-component: 0.2.2 - filter-obj: 1.1.0 - split-on-first: 1.1.0 - strict-uri-encode: 2.0.0 - queue-microtask@1.2.3: {} - quick-lru@5.1.1: {} - railroad-diagrams@1.0.0: {} randexp@0.4.6: @@ -25490,8 +24547,6 @@ snapshots: requires-port@1.0.0: {} - resolve-alpn@1.2.1: {} - resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -25526,14 +24581,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - responselike@2.0.1: - dependencies: - lowercase-keys: 2.0.0 - - resq@1.11.0: - dependencies: - fast-deep-equal: 2.0.1 - restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -25559,8 +24606,6 @@ snapshots: rfdc@1.4.1: {} - rgb2hex@0.2.3: {} - rimraf@2.7.1: dependencies: glob: 7.2.3 @@ -25573,15 +24618,6 @@ snapshots: dependencies: glob: 10.5.0 - roarr@2.15.4: - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.4 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.3 - robust-predicates@3.0.3: {} rolldown@1.0.0-rc.12(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0): @@ -25759,16 +24795,11 @@ snapshots: optionalDependencies: '@parcel/watcher': 2.5.6 - saucelabs@9.0.2: + saucelabs@1.5.0: dependencies: - change-case: 4.1.2 - compressing: 1.10.5 - form-data: 4.0.5 - got: 11.8.6 - hash.js: 1.1.7 - query-string: 7.1.3 - tunnel: 0.0.6 - yargs: 17.7.2 + https-proxy-agent: 2.2.4 + transitivePeerDependencies: + - supports-color sax@1.6.0: {} @@ -25813,23 +24844,11 @@ snapshots: tmp: 0.0.30 xml2js: 0.4.23 - selenium-webdriver@4.43.0(bufferutil@4.1.0): - dependencies: - '@bazel/runfiles': 6.5.0 - jszip: 3.10.1 - tmp: 0.2.5 - ws: 8.20.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - selfsigned@5.5.0: dependencies: '@peculiar/x509': 1.14.3 pkijs: 3.4.0 - semver-compare@1.0.0: {} - semver-diff@3.1.1: dependencies: semver: 6.3.1 @@ -25882,25 +24901,11 @@ snapshots: transitivePeerDependencies: - supports-color - sentence-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.8.1 - upper-case-first: 2.0.2 - seq@0.3.5: dependencies: chainsaw: 0.0.9 hashish: 0.0.4 - serialize-error@7.0.1: - dependencies: - type-fest: 0.13.1 - - serialize-error@8.1.0: - dependencies: - type-fest: 0.20.2 - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -26082,11 +25087,6 @@ snapshots: smart-buffer@4.2.0: {} - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.8.1 - socket.io-adapter@2.5.6(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: debug: 4.4.3(supports-color@10.2.2) @@ -26219,14 +25219,10 @@ snapshots: dependencies: is-stream-ended: 0.1.4 - split-on-first@1.1.0: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} - sprintf-js@1.1.3: {} - sql-formatter@15.7.3: dependencies: argparse: 2.0.1 @@ -26296,8 +25292,6 @@ snapshots: stream-shift@1.0.3: {} - streamifier@0.1.1: {} - streamroller@3.1.5: dependencies: date-format: 4.0.14 @@ -26317,8 +25311,6 @@ snapshots: strict-event-emitter@0.5.1: {} - strict-uri-encode@2.0.0: {} - string-argv@0.3.2: {} string-length@4.0.2: @@ -26536,28 +25528,7 @@ snapshots: mkdirp-classic: 0.5.3 pump: 3.0.4 tar-stream: 2.2.0 - - tar-fs@3.1.2: - dependencies: - pump: 3.0.4 - tar-stream: 3.1.8 - optionalDependencies: - bare-fs: 4.7.1 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - - tar-stream@1.6.2: - dependencies: - bl: 1.2.3 - buffer-alloc: 1.2.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - readable-stream: 2.3.8 - to-buffer: 1.2.2 - xtend: 4.0.2 + optional: true tar-stream@2.2.0: dependencies: @@ -26566,6 +25537,7 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true tar-stream@3.1.8: dependencies: @@ -26714,12 +25686,6 @@ snapshots: tmpl@1.0.5: {} - to-buffer@1.2.2: - dependencies: - isarray: 2.0.5 - safe-buffer: 5.2.1 - typed-array-buffer: 1.0.3 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -26894,8 +25860,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.13.1: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -26952,8 +25916,6 @@ snapshots: typed-graphqlify@3.1.6: {} - typed-query-selector@2.12.1: {} - typed-rest-client@1.8.11: dependencies: qs: 6.15.1 @@ -26995,11 +25957,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 - unc-path-regex@0.1.2: {} underscore@1.13.8: {} @@ -27143,14 +26100,6 @@ snapshots: transitivePeerDependencies: - encoding - upper-case-first@2.0.2: - dependencies: - tslib: 2.8.1 - - upper-case@2.0.2: - dependencies: - tslib: 2.8.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -27511,8 +26460,6 @@ snapshots: web-vitals@4.2.4: {} - webdriver-bidi-protocol@0.4.1: {} - webdriver-js-extender@2.1.0: dependencies: '@types/selenium-webdriver': 3.0.7 @@ -27532,50 +26479,6 @@ snapshots: semver: 5.7.2 xml2js: 0.4.23 - webdriver@6.12.1: - dependencies: - '@wdio/config': 6.12.1 - '@wdio/logger': 6.10.10 - '@wdio/protocols': 6.12.0 - '@wdio/utils': 6.11.0 - got: 11.8.6 - lodash.merge: 4.6.2 - - webdriverio@6.12.1(bufferutil@4.1.0)(encoding@0.1.13)(typescript@6.0.2): - dependencies: - '@types/puppeteer-core': 5.4.0(bufferutil@4.1.0)(typescript@6.0.2) - '@wdio/config': 6.12.1 - '@wdio/logger': 6.10.10 - '@wdio/repl': 6.11.0 - '@wdio/utils': 6.11.0 - archiver: 5.3.2 - atob: 2.1.2 - css-shorthand-properties: 1.1.2 - css-value: 0.0.1 - devtools: 6.12.1(bufferutil@4.1.0)(encoding@0.1.13) - fs-extra: 9.1.0 - get-port: 5.1.1 - grapheme-splitter: 1.0.4 - lodash.clonedeep: 4.5.0 - lodash.isobject: 3.0.2 - lodash.isplainobject: 4.0.6 - lodash.zip: 4.2.0 - minimatch: 3.1.5 - puppeteer-core: 5.5.0(bufferutil@4.1.0)(encoding@0.1.13) - resq: 1.11.0 - rgb2hex: 0.2.3 - serialize-error: 8.1.0 - webdriver: 6.12.1 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - bufferutil - - encoding - - react-native-b4a - - supports-color - - typescript - - utf-8-validate - webidl-conversions@3.0.1: {} webidl-conversions@7.0.0: {} @@ -28021,12 +26924,6 @@ snapshots: yoctocolors@2.1.2: {} - zip-stream@4.1.1: - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 - zip-stream@6.0.1: dependencies: archiver-utils: 5.0.2 diff --git a/tools/saucelabs-daemon/BUILD.bazel b/tools/saucelabs-daemon/BUILD.bazel deleted file mode 100644 index 4ed0ce1a586..00000000000 --- a/tools/saucelabs-daemon/BUILD.bazel +++ /dev/null @@ -1,12 +0,0 @@ -load("//tools:defaults.bzl", "ts_project") - -package(default_visibility = ["//visibility:public"]) - -ts_project( - name = "saucelabs-daemon", - srcs = [ - "browser.ts", - "ipc-defaults.ts", - "ipc-messages.ts", - ], -) diff --git a/tools/saucelabs-daemon/README.md b/tools/saucelabs-daemon/README.md deleted file mode 100644 index 64ee2c0d205..00000000000 --- a/tools/saucelabs-daemon/README.md +++ /dev/null @@ -1,84 +0,0 @@ -# Saucelabs testing with Bazel - -## Local testing - -1. Set up your `SAUCE_USERNAME`, `SAUCE_ACCESS_KEY` & `SAUCE_TUNNEL_IDENTIFIER` environment variables. - These are required. You can find the values for `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` on your Saucelabs account. `SAUCE_TUNNEL_IDENTIFIER` can be set to any unique value. - -If you are having trouble running Saucelabs tests locally you can contact [Joey Perrott](https://github.com/josephperrott) or [Paul Gschwendtner](https://github.com/devversion) for support. - -2. Once you have your environment variables set up, run the setup task in the root of the repo: - -```bash -pnpm bazel run //tools/saucelabs-daemon/background-service -- -``` - -This will start a daemon process that will connect to Saucelabs and provision browsers -once you start running your first test target. - -3. In another terminal, you can run a particular test target through SauceLabs by suffixing the target name with "\_saucelabs". - -For example, `packages/core/test:test_web` becomes `packages/core/test:test_web_saucelabs`. - -``` -pnpm bazel test //packages/core/test:test_web_saucelabs -``` - -## Additional test features - -To see the test output while the tests are running (as these are long tests), add the `--test_output=streamed` option. -Note, this option will also prevent bazel from using the test cache and will force the test to run. - -For running all Saucelabs tests in the project, `bazel query` is used to gather up all karma Saucelabs test labels because they are otherwise hidden by the `manual` tag. - -Running all karma tests in Saucelabs: - -```bash -./scripts/test/run-saucelabs-tests.sh -``` - -to override the default number of parallel browsers to acquire on Saucelabs you -pass an optional configuration parameters. For example, - -```bash -./scripts/test/run-saucelabs-tests.sh 5 -``` - -## Under the hood - -The `//tools/saucelabs-daemon/background-service` target does not start the Sauce Connect proxy at start-up, but instead listens for the start signal from the saucelabs karma launcher. -This signal is sent by saucelabs-daemon custom karma launcher `tools/saucelabs-daemon/launcher/launcher.ts`. -This is necessary as the Sauce Connect Proxy process must be started outside of `bazel test` as Bazel will automatically kill any processes spawned during a test when that tests completes, which would prevent the tunnel & provisioned browsers from being shared by multiple tests. - -The karma_web_test rule for saucelabs must have a few important tags: - -- `no-remote-exec` as they cannot be executed remotely since tests need to communicate with the daemon. -- `manual` so they are not automatically tested with `//...` -- `saucelabs` so that they can be easily gathered up for testing in a `bazel query` - -These are added automatically the by `karma_web_test_suite` macro in `tools/defaults.bzl`. - -## Debugging - -**Q: How do I get the tests to run on IE? I only see Chromium.** - -If you see something like this at the end of your test output, it means you're not actually running SauceLabs: - -``` -INFO: Build completed successfully, 43 total actions -/packages/core/test:test_web_chromium -``` - -This is a common error caused by forgetting to suffix your test target with "\_saucelabs". - -For example, `/packages/core/test:test_web` becomes `/packages/core/test:test_web_saucelabs`. - -**Q: How can I tell that the SauceLabs connection was successfully made?** - -There is a dashboard at saucelabs.com where you can see active tunnel connections (Angular has an account). -As soon as you actually run the test target (not after the setup task), you should see an active tunnel connection under the SAUCE_TUNNEL_IDENTIFICATION_KEY you entered. -If a tunnel connection is not there, you are not actually connecting with SauceLabs. - -Note: It may _look_ like the tests are running because of the Bazel output. -The progress Bazel is showing does not mean that SauceLabs is connected. -If the tests are actually running, you should see the "..." test report for passing tests. diff --git a/tools/saucelabs-daemon/background-service/BUILD.bazel b/tools/saucelabs-daemon/background-service/BUILD.bazel deleted file mode 100644 index aeec568d4a6..00000000000 --- a/tools/saucelabs-daemon/background-service/BUILD.bazel +++ /dev/null @@ -1,31 +0,0 @@ -load("//tools:defaults.bzl", "js_binary", "ts_project") - -package(default_visibility = ["//visibility:public"]) - -ts_project( - name = "background-service_lib", - srcs = glob(["*.ts"]), - deps = [ - "//:browser-providers", - "//:node_modules/@types/node", - "//:node_modules/@types/selenium-webdriver4", - "//:node_modules/chalk", - "//:node_modules/selenium-webdriver4", - "//tools/saucelabs-daemon", - ], -) - -js_binary( - name = "background-service", - data = [ - ":background-service_lib", - "//:sauce_connect", - ], - entry_point = ":cli.js", - fixed_args = [ - "$(rootpath //:sauce_connect)", - ], - no_copy_to_bin = [ - "//:sauce_connect", - ], -) diff --git a/tools/saucelabs-daemon/background-service/cli.ts b/tools/saucelabs-daemon/background-service/cli.ts deleted file mode 100644 index feafd980b53..00000000000 --- a/tools/saucelabs-daemon/background-service/cli.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {customLaunchers} from '../../../browser-providers.conf'; -import {Browser} from '../browser'; - -import {SaucelabsDaemon} from './saucelabs-daemon'; - -const args = process.argv.slice(2); -const username = process.env['SAUCE_USERNAME']; -const accessKey = process.env['SAUCE_ACCESS_KEY']; -const tunnelIdentifier = process.env['SAUCE_TUNNEL_IDENTIFIER']; - -if (!username || !accessKey) { - throw Error('Please set the `SAUCE_USERNAME` and `SAUCE_ACCESS_KEY` variables.'); -} - -if (!tunnelIdentifier) { - throw Error('No tunnel set up. Please set the `SAUCE_TUNNEL_IDENTIFIER` variable.'); -} - -// First argument is the path to the sauce connect binary. This argument is templated into the bazel -// binary. -if (args.length < 1) { - throw Error(`Path to the sauce connect binary expected as first argument`); -} -const sauceConnect = args[0]; - -// Second argument is the number of parallel browsers to start. This argument is user supplied and -// required. -if (args.length != 2) { - throw Error(`Please specify the number of parallel browsers to start on the command line.`); -} -const parallelExecutions = parseInt(args[1]); -if (!parallelExecutions) { - throw Error(`Please specify a non-zero number of parallel browsers to start.`); -} - -// Start the daemon and launch the given browser -const daemon = new SaucelabsDaemon( - username, - accessKey, - process.env['CIRCLE_BUILD_NUM']!, - Object.values(customLaunchers) as Browser[], - parallelExecutions, - sauceConnect, - {tunnelIdentifier}, -); - -if (args.includes('--connect')) { - daemon.connectTunnel().catch((err) => { - console.error(`Failed to connect to Saucelabs: ${err}`); - process.exit(1); - }); -} diff --git a/tools/saucelabs-daemon/background-service/ipc.ts b/tools/saucelabs-daemon/background-service/ipc.ts deleted file mode 100644 index 499264df8ee..00000000000 --- a/tools/saucelabs-daemon/background-service/ipc.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {createServer, Server, Socket} from 'net'; - -import {IPC_PORT} from '../ipc-defaults'; -import { - BackgroundServiceReceiveMessages, - InternalErrorMessage, - NoAvailableBrowserMessage, -} from '../ipc-messages'; - -import {SaucelabsDaemon} from './saucelabs-daemon'; - -let nextSocketId = 0; - -/** - * The IPC server for the Saucelabs background service. This server - * listens on the port IPC_PORT for `start-test` and `end-test` messages - * from karma tests. These messages are handled and requests are passed - * forward to the service SaucelabsDaemon class. - */ -export class IpcServer { - private readonly _server: Server; - private _connections = new Map(); - - constructor(private _service: SaucelabsDaemon) { - this._server = createServer(this._connectionHandler.bind(this)); - this._server.listen(IPC_PORT, () => - console.info(`Daemon IPC server listening (pid ${process.pid}).`), - ); - } - - private _connectionHandler(socket: Socket) { - const socketId = nextSocketId++; - this._connections.set(socketId, socket); - socket.on('data', (b) => { - this._processMessage( - socket, - socketId, - JSON.parse(b.toString()) as BackgroundServiceReceiveMessages, - ).catch((err) => { - console.error(err); - this._sendInternalError(socket, err.toString()); - }); - }); - } - - private async _processMessage( - socket: Socket, - socketId: number, - message: BackgroundServiceReceiveMessages, - ) { - switch (message.type) { - case 'start-test': - console.debug(`Requesting test browser: SID#${socketId}: ${message.testDescription}`); - const started = await this._service.startTest({ - testId: socketId, - pageUrl: message.url, - requestedBrowserId: message.browserId, - }); - if (!started) { - console.debug(' > Browser not available.'); - this._sendUnavailableBrowserMessage(socket); - } else { - console.debug(' > Browser available. Test can start.'); - } - break; - case 'end-test': - console.debug(`Ending tests for SID#${socketId}`); - this._service.endTest(socketId); - break; - default: - throw new Error(`Unsupported msg type: ${(message as any).type}`); - } - } - - private _sendUnavailableBrowserMessage(socket: Socket) { - socket.write(JSON.stringify(new NoAvailableBrowserMessage())); - } - - private _sendInternalError(socket: Socket, msg: string) { - socket.write(JSON.stringify(new InternalErrorMessage(msg))); - } -} diff --git a/tools/saucelabs-daemon/background-service/sauce-connect-tunnel.ts b/tools/saucelabs-daemon/background-service/sauce-connect-tunnel.ts deleted file mode 100644 index 602137bd133..00000000000 --- a/tools/saucelabs-daemon/background-service/sauce-connect-tunnel.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {spawn} from 'node:child_process'; -import fs from 'node:fs/promises'; -import path from 'node:path'; - -/** - * Establishes the Saucelabs connect tunnel. - **/ -export async function openSauceConnectTunnel(tunnelIdentifier: string, sauceConnect: string) { - console.debug('Starting sauce connect tunnel...'); - - const tmpFolder = await fs.mkdtemp('saucelabs-daemon-'); - - await new Promise((resolve, reject) => { - // First we need to start the sauce connect tunnel - const sauceConnectArgs = [ - '--readyfile', - `${tmpFolder}/readyfile`, - '--pidfile', - `${tmpFolder}/pidfile`, - '--tunnel-identifier', - tunnelIdentifier || path.basename(tmpFolder), - ]; - const sc = spawn(sauceConnect, sauceConnectArgs); - - sc.stdout!.on('data', (data) => { - if (data.includes('Sauce Connect is up, you may start your tests.')) { - resolve(); - } - }); - - sc.on('close', (code) => { - reject(new Error(`sauce connect closed all stdio with code ${code}`)); - }); - - sc.on('exit', (code) => { - reject(new Error(`sauce connect exited with code ${code}`)); - }); - }); - - console.debug('Starting sauce connect tunnel established'); -} diff --git a/tools/saucelabs-daemon/background-service/saucelabs-daemon.ts b/tools/saucelabs-daemon/background-service/saucelabs-daemon.ts deleted file mode 100644 index 199d8e4dbce..00000000000 --- a/tools/saucelabs-daemon/background-service/saucelabs-daemon.ts +++ /dev/null @@ -1,354 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import chalk from 'chalk'; -import {Builder, WebDriver} from 'selenium-webdriver4'; - -import {Browser, getUniqueId} from '../browser'; - -import {openSauceConnectTunnel} from './sauce-connect-tunnel'; - -const defaultCapabilities = { - // TODO: Turn off long-term. Right now this is just for debugging. - recordVideo: true, - recordScreenshots: false, - idleTimeout: 1000, - // These represent the maximum values supported by Saucelabs. - // See: https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options - commandTimeout: 600, - maxDuration: 10800, - extendedDebugging: true, -}; - -interface RemoteBrowser { - id: string; - state: 'claimed' | 'free' | 'launching'; - driver: WebDriver | null; - sessionUrl: string | null; -} - -interface BrowserTest { - testId: number; - pageUrl: string; - requestedBrowserId: string; -} - -/** - * The SaucelabsDaemon daemon service class. This class handles the logic of connecting - * to the Saucelabs tunnel and provisioning browsers for tests. Provisioned browsers - * are re-used for subsequent tests. Their states are tracked so that new test - * requests are assigned to browsers that are currently `free` or `launching`. - */ -export class SaucelabsDaemon { - /** - * Map of browsers and their pending tests. If a browser is acquired on the - * remote selenium server, the browser is not immediately ready. If the browser - * becomes active, the pending tests will be started. - */ - private _pendingTests = new Map(); - - /** List of active browsers that are managed by the daemon. */ - private _activeBrowsers: RemoteBrowser[] = []; - - /** Map that contains test ids with their claimed browser. */ - private _runningTests = new Map(); - - private _baseCapabilities; - - /** Id of the keep alive interval that ensures no remote browsers time out. */ - private _keepAliveIntervalId: NodeJS.Timeout | null = null; - - /* Promise indicating whether we the tunnel is active, or if we are still connecting. */ - private _connection: Promise | undefined = undefined; - - /* Number of parallel executions started */ - private _parallelExecutions: number = 0; - - constructor( - private _username: string, - private _accessKey: string, - private _buildName: string, - private _browsers: Browser[], - private _maxParallelExecutions: number, - private _sauceConnect: string, - private _userCapabilities: object = {}, - ) { - // Starts the keep alive loop for all active browsers, running every 15 seconds. - this._keepAliveIntervalId = setInterval(() => this._keepAliveBrowsers(), 15_000); - - /** Base selenium capabilities that will be added to each browser. */ - this._baseCapabilities = {...defaultCapabilities, ...this._userCapabilities}; - } - - /** - * Connects the daemon to Saucelabs. - * This is typically done when the first test is started so that no connection is made - * if all tests are cache hits. - */ - async connectTunnel() { - if (!this._connection) { - this._connection = this._connect(); - } - return this._connection; - } - - /** - * Quits all active browsers. - */ - async quitAllBrowsers() { - let quitBrowsers: Promise[] = []; - this._activeBrowsers.forEach((b) => { - if (b.driver) { - quitBrowsers.push(b.driver.quit()); - } - }); - await Promise.all(quitBrowsers); - this._activeBrowsers = []; - this._runningTests.clear(); - this._pendingTests.clear(); - } - - /** - * Shutdown the daemon. - * - * Awaits the shutdown of browsers. - */ - async shutdown() { - await this.quitAllBrowsers(); - if (this._keepAliveIntervalId !== null) { - clearInterval(this._keepAliveIntervalId); - } - } - - /** - * End a browser test if it is running. - */ - endTest(testId: number) { - if (!this._runningTests.has(testId)) { - return; - } - - const browser = this._runningTests.get(testId)!; - browser.state = 'free'; - this._runningTests.delete(testId); - } - - /** - * Start a test on a remote browser. - * - * If the daemon has not yet initiated the saucelabs tunnel creation and browser launching then - * this initiates that process and awaits until it succeeds or fails. - * - * If the daemon has already initiated the saucelabs tunnel creation and browser launching - * but it is not yet complete then this blocks until that succeeds or fails. - * - * If all matching browsers are occupied with other tests then test is not run. Promise returns - * false. - * - * If there is a matching browser that are still launching then the test is scheduled to run - * on the browser when it is ready. Promise returns true. - * - * If there is a matching browser that is available the test it started. Promise returns true. - */ - async startTest(test: BrowserTest): Promise { - await this.connectTunnel(); - - if (this._parallelExecutions < this._maxParallelExecutions) { - // Start additional browsers on each test start until the max parallel executions are - // reached to avoid the race condition of starting a browser and then having another test - // start steal it before is claimed by this test. - await this.launchBrowserSet(); - } - - const browser = this._findAvailableBrowser(test.requestedBrowserId); - if (!browser) { - console.error(`No available browser ${test.requestedBrowserId} for test ${test.testId}!`); - return false; - } - - if (browser.state == 'launching') { - this._pendingTests.set(browser, test); - } else { - this._startBrowserTest(browser, test); - } - - return true; - } - - /** - * @internal - * Connects the daemon to Saucelabs. - * This is typically done when the first test is started so that no connection is made - * if all tests are cache hits. - **/ - private async _connect() { - await openSauceConnectTunnel( - (this._userCapabilities as any).tunnelIdentifier, - this._sauceConnect, - ); - } - - /** - * @internal - * Launches a set of browsers and increments the count of parallel browser started. If there are - * pending tests waiting for a particular browser to launch before they can start, those tests are - * started once the browser is launched. - **/ - private async launchBrowserSet() { - this._parallelExecutions++; - console.debug( - `Launching browsers set ${this._parallelExecutions} of ${this._maxParallelExecutions}...`, - ); - - // Once the tunnel is established we can launch browsers - await Promise.all( - this._browsers.map(async (browser, id) => { - const browserId = getUniqueId(browser); - const launched: RemoteBrowser = { - state: 'launching', - driver: null, - sessionUrl: null, - id: browserId, - }; - const browserDescription = `${this._buildName} - ${browser.browserName} - #${id + 1}`; - - const capabilities: any = { - 'browserName': browser.browserName, - 'sauce:options': {...this._baseCapabilities, ...browser}, - }; - - // Set `sauce:options` to provide a build name for the remote browser instances. - // This helps with debugging. Also ensures the W3C protocol is used. - // See. https://wiki.saucelabs.com/display/DOCS/Test+Configuration+Options - capabilities['sauce:options']['name'] = browserDescription; - capabilities['sauce:options']['build'] = browserDescription; - - console.debug( - `Capabilities for ${browser.browserName}:`, - JSON.stringify(capabilities, null, 2), - ); - console.debug(` > Browser-ID: `, browserId); - console.debug(` > Browser-Description: `, browserDescription); - - // Keep track of the launched browser. We do this before it even completed the - // launch as we can then handle scheduled tests when the browser is still launching. - this._activeBrowsers.push(launched); - - // See the following link for public API of the selenium server. - // https://wiki.saucelabs.com/display/DOCS/Instant+Selenium+Node.js+Tests - const driver = await new Builder() - .withCapabilities(capabilities) - .usingServer( - `http://${this._username}:${this._accessKey}@ondemand.saucelabs.com:80/wd/hub`, - ) - .build(); - - // Only wait 30 seconds to load a test page. - await driver.manage().setTimeouts({pageLoad: 30000}); - - const sessionId = (await driver.getSession()).getId(); - - // Mark the browser as available after launch completion. - launched.state = 'free'; - launched.driver = driver; - launched.sessionUrl = `https://saucelabs.com/tests/${sessionId}`; - - console.info( - chalk.yellow( - `Started browser ${browser.browserName} on Saucelabs: ${launched.sessionUrl}`, - ), - ); - - // If a test has been scheduled before the browser completed launching, run - // it now given that the browser is ready now. - if (this._pendingTests.has(launched)) { - const test = this._pendingTests.get(launched)!; - this._pendingTests.delete(launched); - this._startBrowserTest(launched, test); - } - }), - ); - } - - /** - * @internal - * Starts a browser test on a browser. - * This sets the browser's state to "claimed" and navigates the browser to the test URL. - **/ - private _startBrowserTest(browser: RemoteBrowser, test: BrowserTest) { - // We're not interested in awaiting on starting the browser test since that would delay - // starting additional browsers. Failures in browser test starts are silently ignored in - // the daemon. The karma test itself should fail or timeout if there are issues starting - // the browser test. - (async () => { - this._runningTests.set(test.testId, browser); - browser.state = 'claimed'; - - try { - console.debug(`Opening test url for #${test.testId}: ${test.pageUrl}`); - console.debug(` > Instance URL: ${browser.sessionUrl}`); - await browser.driver!.get(test.pageUrl); - const pageTitle = await browser.driver!.getTitle(); - console.debug(`Test page loaded for #${test.testId}: "${pageTitle}".`); - } catch (e) { - console.error('Could not start browser test with id', test.testId, test.pageUrl); - } - })(); - } - - /** - * @internal - * Given a browserId, returns a browser that matches the browserId and is free - * or launching with no pending test. If no such browser if found, returns - * null. - **/ - private _findAvailableBrowser(browserId: string): RemoteBrowser | null { - for (const browser of this._activeBrowsers) { - // If the browser ID doesn't match, continue searching. - if (browser.id !== browserId) { - continue; - } - - // If the browser is claimed, continue searching. - if (browser.state === 'claimed') { - continue; - } - - // If the browser is launching, check if it can be pre-claimed so that - // the test starts once the browser is ready. If it's already claimed, - // continue searching. - if (browser.state === 'launching' && this._pendingTests.has(browser)) { - continue; - } - - return browser; - } - return null; - } - - /** - * @internal - * Implements a heartbeat for Saucelabs browsers as they could end up not receiving any - * commands when the daemon is unused (i.e. Bazel takes a while to start tests). - * https://saucelabs.com/blog/selenium-tips-how-to-coordinate-multiple-browsers-in-sauce-ondemand. - **/ - private async _keepAliveBrowsers() { - const pendingCommands: Promise[] = []; - this._activeBrowsers.forEach((b) => { - if (b.driver !== null) { - pendingCommands.push(b.driver.getTitle() as Promise); - } - }); - await Promise.all(pendingCommands); - console.debug( - `${Date().toLocaleString()}: Refreshed ${pendingCommands.length} browsers (pid ${ - process.pid - }).`, - ); - } -} diff --git a/tools/saucelabs-daemon/browser.ts b/tools/saucelabs-daemon/browser.ts deleted file mode 100644 index 11c7ea0f73d..00000000000 --- a/tools/saucelabs-daemon/browser.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** Definition of a test browser. */ -export interface Browser { - browserName: string; - browserVersion?: string; - platformName?: string; - platformVersion?: string; - deviceName?: string; -} - -/** - * Gets a unique id for the specified browser. This id can be shared - * across the background service and launcher using IPC. - */ -export function getUniqueId(browser: Browser): string { - let result = Object.keys(browser) - .sort() - .map((key) => `${key}=${browser[key as keyof Browser]}`); - return result.join(':'); -} diff --git a/tools/saucelabs-daemon/ipc-defaults.ts b/tools/saucelabs-daemon/ipc-defaults.ts deleted file mode 100644 index faf04695320..00000000000 --- a/tools/saucelabs-daemon/ipc-defaults.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -export const IPC_PORT = 5324; diff --git a/tools/saucelabs-daemon/ipc-messages.ts b/tools/saucelabs-daemon/ipc-messages.ts deleted file mode 100644 index d982ca3aacf..00000000000 --- a/tools/saucelabs-daemon/ipc-messages.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -/** Message that can be sent to the daemon to start a given test. */ -export class StartTestMessage { - readonly type = 'start-test'; - constructor( - public url: string, - public browserId: string, - public testDescription: string, - ) {} -} - -/** Message that can be sent to the daemon if a test completed. */ -export class EndTestMessage { - readonly type = 'end-test'; -} - -/** Message being sent from the daemon if a request browser is not available. */ -export class NoAvailableBrowserMessage { - readonly type = 'browser-not-ready'; -} - -/** Message that indicates an internal error in background service. */ -export class InternalErrorMessage { - readonly type = 'internal-error'; - constructor(public msg: string) {} -} - -/** Type of messages the background service can receive. */ -export type BackgroundServiceReceiveMessages = StartTestMessage | EndTestMessage; - -/** Type of messages the background services can send to clients. */ -export type BackgroundServiceSendMessages = NoAvailableBrowserMessage | InternalErrorMessage; diff --git a/tools/saucelabs-daemon/launcher/BUILD.bazel b/tools/saucelabs-daemon/launcher/BUILD.bazel deleted file mode 100644 index 7754b47b6c1..00000000000 --- a/tools/saucelabs-daemon/launcher/BUILD.bazel +++ /dev/null @@ -1,28 +0,0 @@ -load("@aspect_rules_esbuild//esbuild:defs.bzl", "esbuild") -load("//tools:defaults.bzl", "ts_project") - -package(default_visibility = ["//visibility:public"]) - -ts_project( - name = "launcher", - srcs = [ - "index.ts", - "launcher.ts", - ], - deps = [ - "//:node_modules/@types/node", - "//tools/saucelabs-daemon", - ], -) - -# We need a commonjs version of the launcher that can be required from the -# root karma-js.conf.js. -esbuild( - name = "launcher_cjs", - entry_point = "index.ts", - format = "cjs", - metafile = False, - output = "index.cjs", - platform = "node", - deps = [":launcher"], -) diff --git a/tools/saucelabs-daemon/launcher/index.ts b/tools/saucelabs-daemon/launcher/index.ts deleted file mode 100644 index 6fb69f11470..00000000000 --- a/tools/saucelabs-daemon/launcher/index.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {SaucelabsLauncher} from './launcher'; - -export default { - 'launcher:SauceLabs': ['type', SaucelabsLauncher], -}; diff --git a/tools/saucelabs-daemon/launcher/launcher.ts b/tools/saucelabs-daemon/launcher/launcher.ts deleted file mode 100644 index e5ef5f60fa5..00000000000 --- a/tools/saucelabs-daemon/launcher/launcher.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.dev/license - */ - -import {createConnection, Socket} from 'net'; - -import {Browser, getUniqueId} from '../browser'; -import {IPC_PORT} from '../ipc-defaults'; -import {BackgroundServiceSendMessages, EndTestMessage, StartTestMessage} from '../ipc-messages'; - -export function SaucelabsLauncher( - this: any, - args: Browser, - config: unknown, - logger: any, - baseLauncherDecorator: any, - captureTimeoutLauncherDecorator: any, - retryLauncherDecorator: any, -) { - // Apply base class mixins. This would be nice to have typed, but this is a low-priority now. - baseLauncherDecorator(this); - captureTimeoutLauncherDecorator(this); - retryLauncherDecorator(this); - - const log = logger.create('SaucelabsLauncher'); - const browserDisplayName = - args.browserName + - (args.browserVersion ? ' ' + args.browserVersion : '') + - (args.platformName ? ' (' + args.platformName + ')' : ''); - const testSuiteDescription = process.env['TEST_TARGET'] ?? ''; - - let daemonConnection: Socket | null = null; - - // Setup Browser name that will be printed out by Karma. - this.name = browserDisplayName + ' on SauceLabs (daemon)'; - - this.on('start', (pageUrl: string) => { - daemonConnection = createConnection({port: IPC_PORT}, () => _startBrowserTest(pageUrl, args)); - - daemonConnection.on('data', (b) => - _processMessage(JSON.parse(b.toString()) as BackgroundServiceSendMessages), - ); - daemonConnection.on('error', (err) => { - log.error(err); - - // Notify karma about the failure. - this._done('failure'); - }); - }); - - this.on('kill', async (doneFn: () => void) => { - _endBrowserTest(); - daemonConnection?.end(); - doneFn(); - }); - - const _processMessage = (message: BackgroundServiceSendMessages) => { - switch (message.type) { - case 'browser-not-ready': - log.error( - 'Browser %s is not ready in the Saucelabs background service.', - browserDisplayName, - ); - this._done('failure'); - } - }; - - const _startBrowserTest = (pageUrl: string, browser: Browser) => { - log.info('Starting browser %s test in daemon with URL: %s', browserDisplayName, pageUrl); - daemonConnection!.write( - JSON.stringify(new StartTestMessage(pageUrl, getUniqueId(browser), testSuiteDescription)), - ); - }; - - const _endBrowserTest = () => { - log.info('Test for browser %s completed', browserDisplayName); - daemonConnection!.write(JSON.stringify(new EndTestMessage())); - }; -} diff --git a/tools/saucelabs/BUILD.bazel b/tools/saucelabs/BUILD.bazel deleted file mode 100644 index 91f41165183..00000000000 --- a/tools/saucelabs/BUILD.bazel +++ /dev/null @@ -1,71 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -sh_binary( - name = "sauce_service_setup", - srcs = ["sauce-service.sh"], - args = ["setup"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_start", - srcs = ["sauce-service.sh"], - args = ["start"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_start_ready_wait", - srcs = ["sauce-service.sh"], - args = ["start-ready-wait"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_ready_wait", - srcs = ["sauce-service.sh"], - args = ["ready-wait"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_stop", - srcs = ["sauce-service.sh"], - args = ["stop"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_tail", - srcs = ["sauce-service.sh"], - args = ["tail"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) - -sh_binary( - name = "sauce_service_log", - srcs = ["sauce-service.sh"], - args = ["log"], - data = ["//:sauce_connect"], - env = { - "SAUCE_CONNECT": "$(rootpath //:sauce_connect)", - }, -) diff --git a/tools/saucelabs/README.md b/tools/saucelabs/README.md deleted file mode 100644 index d5df5af012c..00000000000 --- a/tools/saucelabs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Saucelabs testing with Bazel - -Moved to tools/saucelabs-daemon/README.md. diff --git a/tools/saucelabs/sauce-service.sh b/tools/saucelabs/sauce-service.sh deleted file mode 100755 index a3a5215fc5c..00000000000 --- a/tools/saucelabs/sauce-service.sh +++ /dev/null @@ -1,471 +0,0 @@ -#!/usr/bin/env bash - -set -u -e -o pipefail - -#################################################################################################### -# Some helper funtions - -@echo() { - echo "# $*" -} - -@warn() { - @echo "Warning: $*" >&2 -} - -@fail() { - @echo "Error! $*" >&2 - exit 1 -} - -@remove() { - local f="$1" - if [[ -f ${f} ]]; then - @echo "Removing ${f}" - rm -f "${f}" || @fail "Can not delete ${f} file" - fi -} - -@kill() { - for p in $1; do - if kill -0 ${p} >/dev/null 2>&1; then - kill ${p} - sleep 2 - if kill -0 ${p} >/dev/null 2>&1; then - kill -9 ${p} - sleep 2 - fi - fi - done -} - -@wait_for() { - local m="$1" - local f="$2" - if [[ ! -f "${f}" ]]; then - printf "# ${m} (${f})" - while [[ ! -f "${f}" ]]; do - printf "." - sleep 0.5 - done - printf "\n" - fi -} - -#################################################################################################### -# Sauce service functions - -readonly SCRIPT_DIR=$(cd $(dirname $0); pwd) -readonly TMP_DIR="/tmp/angular/sauce-service" -mkdir -p ${TMP_DIR} - -# Location for the saucelabs log file. -readonly SAUCE_LOG_FILE="${TMP_DIR}/sauce-connect.log" - -# Location for the saucelabs ready to connection process id lock file. -readonly SAUCE_PID_FILE="${TMP_DIR}/sauce-connect.pid" - -# Location for the saucelabs ready to connect lock file. -readonly SAUCE_READY_FILE="${TMP_DIR}/sauce-connect.lock" - -# Location for the saucelabs params file for use by test runner. -readonly SAUCE_PARAMS_JSON_FILE="${TMP_DIR}/sauce-connect-params.json" - -# Amount of seconds we wait for sauceconnect to establish a tunnel instance. In order to not -# acquire CI instances for too long if sauceconnect fails, we need a connect timeout. -readonly SAUCE_READY_FILE_TIMEOUT=120 - -readonly SERVICE_LOCK_FILE="${TMP_DIR}/service.lock" -readonly SERVICE_START_FILE="${TMP_DIR}/service.start" -readonly SERVICE_PID_FILE="${TMP_DIR}/service.pid" -readonly SERVICE_LOG_FILE="${TMP_DIR}/service.log" - -service-setup-command() { - if [[ -z "${SAUCE_USERNAME:-}" ]]; then - @fail "SAUCE_USERNAME environment variable required" - fi - - if [[ -z "${SAUCE_ACCESS_KEY:-}" ]]; then - @fail "SAUCE_ACCESS_KEY environment variable required" - fi - - if [[ -z "${SAUCE_TUNNEL_IDENTIFIER:-}" ]]; then - @fail "SAUCE_TUNNEL_IDENTIFIER environment variable required" - fi - - if [[ -z "${SAUCE_CONNECT:-}" ]]; then - local unameOut="$(uname -s)" - case "${unameOut}" in - Linux*) local machine=linux ;; - Darwin*) local machine=darwin ;; - CYGWIN*) local machine=windows ;; - MINGW*) local machine=windows ;; - MSYS_NT*) local machine=windows ;; - *) local machine=linux - printf "\nUnrecongized uname '${unameOut}'; defaulting to use node for linux.\n" >&2 - printf "Please file an issue to https://github.com/bazelbuild/rules_nodejs/issues if \n" >&2 - printf "you would like to add your platform to the supported rules_nodejs node platforms.\n\n" >&2 - ;; - esac - - case "${machine}" in - # Path to sauce connect executable - linux) - if [[ -z "${BUILD_WORKSPACE_DIRECTORY:-}" ]]; then - # Started manually - - readonly connectVersion="sc-4.9.2-linux" - readonly connectHash="2f8a3f87e1da4dc9a41bc45ec7c3a2ecdba4c72d72b7d0193f04ad66c5809104" - - echo "Downloading Sauce Connect" - - curl https://saucelabs.com/downloads/${connectVersion}.tar.gz -o ${SCRIPT_DIR}/${connectVersion}.tar.gz - echo "${connectHash} ${SCRIPT_DIR}/${connectVersion}.tar.gz" | shasum -a 256 -c - tar -xzf ${SCRIPT_DIR}/${connectVersion}.tar.gz -C ${SCRIPT_DIR} - - SAUCE_CONNECT="${SCRIPT_DIR}/${connectVersion}/bin/sc" - else - # Started via `bazel run` - SAUCE_CONNECT="${BUILD_WORKSPACE_DIRECTORY}/node_modules/sauce-connect/bin/sc" - fi - ;; - *) - if [[ -z "${SAUCE_CONNECT:-}" ]]; then - @fail "SAUCE_CONNECT environment variable is required on non-linux environments" - exit 1 - fi - ;; - esac - fi - - if [[ ! -f ${SAUCE_CONNECT} ]]; then - @fail "sc binary not found at ${SAUCE_CONNECT}" - fi - - echo "{ \"SAUCE_USERNAME\": \"${SAUCE_USERNAME}\", \"SAUCE_ACCESS_KEY\": \"${SAUCE_ACCESS_KEY}\", \"SAUCE_TUNNEL_IDENTIFIER\": \"${SAUCE_TUNNEL_IDENTIFIER}\", \"SAUCE_LOCALHOST_ALIAS_DOMAIN\": \"${SAUCE_LOCALHOST_ALIAS_DOMAIN:-}\" }" > ${SAUCE_PARAMS_JSON_FILE} - - # Command arguments that will be passed to sauce-connect. - # By default we disable SSL bumping for all requests. This is because SSL bumping is - # not needed for our test setup and in order to perform the SSL bumping, Saucelabs - # intercepts all HTTP requests in the tunnel VM and modifies them. This can cause - # flakiness as it makes all requests dependent on the SSL bumping middleware. - # See: https://wiki.saucelabs.com/display/DOCS/Troubleshooting+Sauce+Connect#TroubleshootingSauceConnect-DisablingSSLBumping - local sauce_args=( - "--no-ssl-bump-domains all" - "--logfile ${SAUCE_LOG_FILE}" - "--pidfile ${SAUCE_PID_FILE}" - "--readyfile ${SAUCE_READY_FILE}" - "--tunnel-identifier ${SAUCE_TUNNEL_IDENTIFIER}" - "--user ${SAUCE_USERNAME}" - # Don't add the --api-key here so we don't echo it out in service-pre-start - ) - - if [[ -n "${SAUCE_LOCALHOST_ALIAS_DOMAIN:-}" ]]; then - # Ensures that requests to the localhost alias domain are always resolved through the tunnel. - # This environment variable is usually configured on CI, and refers to a domain that has been - # locally configured in the current machine's hosts file (e.g. `/etc/hosts`). The domain should - # resolve to the current machine in Saucelabs VMs, so we need to ensure that it is resolved - # through the tunnel we going to create. - sauce_args+=("--tunnel-domains ${SAUCE_LOCALHOST_ALIAS_DOMAIN}") - fi - - @echo "Sauce connect will be started with:" - echo " ${SAUCE_CONNECT} ${sauce_args[@]}" - SERVICE_COMMAND="${SAUCE_CONNECT} ${sauce_args[@]} --api-key ${SAUCE_ACCESS_KEY}" -} - -# Called by pre-start & post-stop -service-cleanup() { - if [[ -f "${SAUCE_PID_FILE}" ]]; then - local p=$(cat "${SAUCE_PID_FILE}") - @echo "Stopping Sauce Connect (pid $p)..." - @kill $p - fi - @remove "${SAUCE_PID_FILE}" - @remove "${SAUCE_READY_FILE}" - @remove "${SAUCE_PARAMS_JSON_FILE}" -} - -# Called before service is setup -service-pre-setup() { - service-cleanup -} - -# Called after service is setup -service-post-setup() { - @echo " sauce params : ${SAUCE_PARAMS_JSON_FILE}" -} - -# Called before service is started -service-pre-start() { - return -} - -# Called after service is started -service-post-start() { - if [[ ! -f "${SAUCE_PID_FILE}" ]]; then - printf "# Waiting for Sauce Connect Proxy process (${SAUCE_PID_FILE})" - while [[ ! -f "${SAUCE_PID_FILE}" ]]; do - if ! @serviceStatus >/dev/null 2>&1; then - printf "\n" - @serviceStop - @echo "Service failed to start!" - service-failed-setup - exit 1 - fi - printf "." - sleep 0.5 - done - printf "\n" - fi - @echo "Sauce Connect Proxy started (pid $(cat "${SAUCE_PID_FILE}"))" -} - -# Called if service fails to start -service-failed-setup() { - if [[ -f "${SERVICE_LOG_FILE}" ]]; then - @echo "tail ${SERVICE_LOG_FILE}:" - echo "--------------------------------------------------------------------------------" - tail "${SERVICE_LOG_FILE}" - echo "--------------------------------------------------------------------------------" - echo "^^^^^ ${SERVICE_LOG_FILE} ^^^^^" - fi -} - -# Called by ready-wait action -service-ready-wait() { - if [[ ! -f "${SAUCE_PID_FILE}" ]]; then - @fail "Sauce Connect not running" - fi - if [[ ! -f "${SAUCE_READY_FILE}" ]]; then - # Wait for saucelabs tunnel to connect - printf "# Waiting for saucelabs tunnel to connect (${SAUCE_READY_FILE})" - counter=0 - while [[ ! -f "${SAUCE_READY_FILE}" ]]; do - counter=$((counter + 1)) - - # Counter needs to be multiplied by two because the while loop only sleeps a half second. - # This has been made in favor of better progress logging (printing dots every half second) - if [ $counter -gt $[${SAUCE_READY_FILE_TIMEOUT} * 2] ]; then - @echo "Timed out after ${SAUCE_READY_FILE_TIMEOUT} seconds waiting for tunnel ready file." - if [[ -f "${SAUCE_LOG_FILE}" ]]; then - echo "================================================================================" - echo "${SAUCE_LOG_FILE}:" - cat "${SAUCE_LOG_FILE}" - fi - exit 5 - fi - - printf "." - sleep 0.5 - done - printf "\n" - @echo "Saucelabs tunnel connected" - else - @echo "Saucelabs tunnel already connected" - fi -} - -# Called before service is stopped -service-pre-stop() { - return -} - -# Called after service is stopped -service-post-stop() { - service-cleanup -} - -#################################################################################################### -# Generic service functions -# This uses functions setup above but nothing below should be specific to saucelabs - -@serviceLock() { - # Check is Lock File exists, if not create it and set trap on exit - printf "# Waiting for service action lock (${SERVICE_LOCK_FILE})" - while true; do - if { set -C; 2>/dev/null >"${SERVICE_LOCK_FILE}"; }; then - trap "rm -f \"${SERVICE_LOCK_FILE}\"" EXIT - printf "\n" - break - fi - printf "." - sleep 0.5 - done - @echo "Acquired service action lock" -} - -@serviceStatus() { - if [ -f "${SERVICE_PID_FILE}" ] && [ ! -z "$(cat "${SERVICE_PID_FILE}")" ]; then - local p=$(cat "${SERVICE_PID_FILE}") - - if kill -0 $p >/dev/null 2>&1; then - @echo "Service is running (pid $p)" - return 0 - else - @echo "Service is not running (process PID $p not exists)" - return 1 - fi - else - @echo "Service is not running" - return 2 - fi -} - -@serviceSetup() { - if @serviceStatus >/dev/null 2>&1; then - @echo "Service already running (pid $(cat "${SERVICE_PID_FILE}"))" - return 0 - fi - - @echo "Setting up service..." - @remove "${SERVICE_PID_FILE}" - @remove "${SERVICE_START_FILE}" - touch "${SERVICE_LOG_FILE}" >/dev/null 2>&1 || @fail "Can not create ${SERVICE_LOG_FILE} file" - @echo " service pid : ${SERVICE_PID_FILE}" - @echo " service logs : ${SERVICE_LOG_FILE}" - service-pre-setup - service-setup-command - - ( - ( - if [[ -z "${SERVICE_COMMAND:-}" ]]; then - @fail "No SERVICE_COMMAND is set" - fi - @wait_for "Waiting for start file" "${SERVICE_START_FILE}" - ${SERVICE_COMMAND} - ) >>"${SERVICE_LOG_FILE}" 2>&1 - ) & - echo $! >"${SERVICE_PID_FILE}" - - if @serviceStatus >/dev/null 2>&1; then - @echo "Service setup (pid $(cat "${SERVICE_PID_FILE}"))" - service-post-setup - else - @echo "Error setting up Service!" - service-failed-setup - exit 1 - fi - - return $? -} - -@serviceStart() { - if @serviceStatus >/dev/null 2>&1; then - @echo "Service already setup (pid $(cat "${SERVICE_PID_FILE}"))" - else - @serviceSetup - fi - if [[ -f "${SERVICE_START_FILE}" ]]; then - @echo "Service already started" - else - @echo "Starting service..." - service-pre-start - touch "${SERVICE_START_FILE}" >/dev/null 2>&1 || @err "Can not create ${SERVICE_START_FILE} file" - service-post-start - @echo "Service started" - fi -} - -@serviceStop() { - if @serviceStatus >/dev/null 2>&1; then - touch "${SERVICE_PID_FILE}" >/dev/null 2>&1 || @fail "Can not touch ${SERVICE_PID_FILE} file" - - service-pre-stop - @echo "Stopping service (pid $(cat "${SERVICE_PID_FILE}"))..." - @kill $(cat "${SERVICE_PID_FILE}") - - if @serviceStatus >/dev/null 2>&1; then - @fail "Error stopping Service! Service already running with PID $(cat "${SERVICE_PID_FILE}")" - else - @echo "Service stopped" - @remove "${SERVICE_PID_FILE}" - @remove "${SERVICE_START_FILE}" - service-post-stop - fi - - return 0 - else - @warn "Service is not running" - @remove "${SERVICE_PID_FILE}" - @remove "${SERVICE_START_FILE}" - service-post-stop - fi -} - -@serviceStartReadyWait() { - @serviceStart - @serviceReadyWait -} - -@serviceReadyWait() { - service-ready-wait -} - -@serviceRestart() { - @serviceStop - @serviceStart -} - -@serviceTail() { - @echo "tail ${SERVICE_LOG_FILE}:" - tail -f "${SERVICE_LOG_FILE}" -} - -@serviceLog() { - @echo "cat ${SERVICE_LOG_FILE}:" - echo "--------------------------------------------------------------------------------" - cat "${SERVICE_LOG_FILE}" - echo "--------------------------------------------------------------------------------" - echo "^^^^^ ${SERVICE_LOG_FILE} ^^^^^" -} - -case "${1:-}" in - setup) - @serviceLock - @serviceSetup - ;; - start) - @serviceLock - @serviceStart - ;; - start-ready-wait) - @serviceLock - @serviceStartReadyWait - ;; - ready-wait) - @serviceLock - @serviceReadyWait - ;; - stop) - @serviceLock - @serviceStop - ;; - restart) - @serviceLock - @serviceRestart - ;; - status) - @serviceLock - @serviceStatus - ;; - run) - ( - service-setup-command - if [[ -z "${SERVICE_COMMAND:-}" ]]; then - @fail "No SERVICE_COMMAND is set" - fi - ${SERVICE_COMMAND} - ) - ;; - log) - @serviceLog - ;; - tail) - @serviceTail - ;; - *) - @echo "Actions: [setup|start|start-read-wait|ready-wait|stop|restart|status|run|tail]" - exit 1 - ;; -esac