diff --git a/WORKSPACE b/WORKSPACE index e3e0a4d374d..2c409ee5eb0 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -76,7 +76,6 @@ yarn_install( data = [ YARN_LABEL, "//:.yarnrc", - "//:scripts/puppeteer-chromedriver-versions.js", "//tools:postinstall-patches.js", "//tools/esm-interop:patches/npm/@angular+build-tooling+0.0.0-246cebbf2a78566ff1fe9b88fdde2459606568dc.patch", "//tools/esm-interop:patches/npm/@bazel+concatjs+5.7.1.patch", diff --git a/aio/package.json b/aio/package.json index 44565f76877..c41059d8940 100644 --- a/aio/package.json +++ b/aio/package.json @@ -26,6 +26,7 @@ "test-a11y-score-localhost": "bazel test //aio:test-a11y-score-localhost", "test-pwa-score": "sh -c 'bazel run //aio/scripts:audit-web-app ${0} all:0,pwa:${1}'", "test-pwa-score-localhost": "bazel test //aio:test-pwa-score-localhost", + "test-production-url": "bazel test //aio/tests/deployment/e2e", "example-e2e": "node --experimental-import-meta-resolve tools/examples/run-filtered-example-e2es.mjs", "example-list-overrides": "bazel run //aio/tools/examples:example-boilerplate list-overrides", "example-lint": "eslint content/examples", diff --git a/aio/scripts/test-production.sh b/aio/scripts/test-production.sh index bd5b5346807..4de1f5427c0 100755 --- a/aio/scripts/test-production.sh +++ b/aio/scripts/test-production.sh @@ -14,13 +14,12 @@ set +x -eu -o pipefail # Install dependencies. echo -e "\nInstalling dependencies in '$aioDir'...\n-----" yarn install --frozen-lockfile --non-interactive - yarn update-webdriver # Run checks for target URL. echo -e "\nChecking '$targetUrl'...\n-----" # Run basic e2e and deployment config tests. - yarn protractor "$protractorConf" --baseUrl "$targetUrl" + yarn test-production-url --test_env=TARGET_URL="$targetUrl" # Run PWA-score tests. yarn test-pwa-score "$targetUrl" "$minPwaScore" diff --git a/aio/tests/deployment/e2e/BUILD.bazel b/aio/tests/deployment/e2e/BUILD.bazel new file mode 100644 index 00000000000..7fec704ca54 --- /dev/null +++ b/aio/tests/deployment/e2e/BUILD.bazel @@ -0,0 +1,32 @@ +load("//tools:defaults.bzl", "protractor_web_test_suite", "ts_library") + +ts_library( + name = "e2e_lib", + testonly = True, + srcs = glob(["*.ts"]), + deps = ["@npm//protractor"], +) + +TEST_TAGS = [ + # Test is run manually in `test-production.sh`, + "manual", + # Cannot run remotely because `protractor_web_test_suite` does not support `exec_properties`. + "no-remote-exec", + # This test requires an external host. If running in sandbox, allow network access. + "requires-network", +] + +protractor_web_test_suite( + name = "e2e", + data = [ + "//aio/tests/deployment/shared", + "@aio_npm//cjson", + ], + on_prepare = "on-prepare.js", + tags = TEST_TAGS, + test_suite_tags = TEST_TAGS, + wrapped_test_tags = TEST_TAGS, + deps = [ + ":e2e_lib", + ], +) diff --git a/aio/tests/deployment/e2e/on-prepare.js b/aio/tests/deployment/e2e/on-prepare.js new file mode 100644 index 00000000000..b2739a70afb --- /dev/null +++ b/aio/tests/deployment/e2e/on-prepare.js @@ -0,0 +1,35 @@ +/** + * @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.io/license + */ + +module.exports = async function () { + const targetUrl = process.env.TARGET_URL; + if (!targetUrl) { + throw new Error('No target URL via `TARGET_URL` environment variable set.'); + } + + protractor.browser.baseUrl = targetUrl; + + const {loadLegacyUrls, loadRemoteSitemapUrls} = await import('../shared/helpers.mjs'); + const [sitemapUrls, legacyUrls] = await Promise.all([ + loadRemoteSitemapUrls(browser.baseUrl), + loadLegacyUrls(), + ]); + + console.info('Determined testing URLs', {sitemapUrls, legacyUrls}); + + if (sitemapUrls.length <= 100) { + throw new Error(`Too few sitemap URLs. (Expected: >100 | Found: ${sitemapUrls.length})`); + } else if (legacyUrls.length <= 100) { + throw new Error(`Too few legacy URLs. (Expected: >100 | Found: ${legacyUrls.length})`); + } + + protractor.browser.params = { + sitemapUrls: sitemapUrls, + legacyUrls: legacyUrls, + }; +}; diff --git a/aio/tests/deployment/e2e/protractor.conf.js b/aio/tests/deployment/e2e/protractor.conf.js deleted file mode 100644 index 82a9399af7a..00000000000 --- a/aio/tests/deployment/e2e/protractor.conf.js +++ /dev/null @@ -1,65 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - suites: { - full: './*.e2e-spec.ts', - smoke: './smoke-tests.e2e-spec.ts', - }, - suite: 'full', - capabilities: { - browserName: 'chrome', - chromeOptions: { - binary: require('puppeteer').executablePath(), - // See /integration/README.md#browser-tests for more info on these args - args: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-dev-shm-usage', '--hide-scrollbars', '--mute-audio'], - }, - }, - directConnect: true, - SELENIUM_PROMISE_MANAGER: false, - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - params: { - sitemapUrls: [], - legacyUrls: [], - }, - beforeLaunch() { - const {join} = require('path'); - const {register} = require('ts-node'); - - register({project: join(__dirname, './tsconfig.json')}); - }, - onPrepare() { - const {SpecReporter, StacktraceOption} = require('jasmine-spec-reporter'); - const {browser} = require('protractor'); - const {loadLegacyUrls, loadRemoteSitemapUrls} = require('../shared/helpers'); - - return Promise.all([ - browser.getProcessedConfig(), - loadRemoteSitemapUrls(browser.baseUrl), - loadLegacyUrls(), - ]).then(([config, sitemapUrls, legacyUrls]) => { - if (sitemapUrls.length <= 100) { - throw new Error(`Too few sitemap URLs. (Expected: >100 | Found: ${sitemapUrls.length})`); - } else if (legacyUrls.length <= 100) { - throw new Error(`Too few legacy URLs. (Expected: >100 | Found: ${legacyUrls.length})`); - } - - Object.assign(config.params, {sitemapUrls, legacyUrls}); - jasmine.getEnv().addReporter(new SpecReporter({ - spec: { - displayStacktrace: StacktraceOption.PRETTY, - }, - })); - }); - } -}; diff --git a/aio/tests/deployment/shared/BUILD.bazel b/aio/tests/deployment/shared/BUILD.bazel index a679a06e4db..cc10ad4f317 100644 --- a/aio/tests/deployment/shared/BUILD.bazel +++ b/aio/tests/deployment/shared/BUILD.bazel @@ -1,10 +1,18 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = ["//aio/tests/deployment:__subpackages__"]) -filegroup( +ts_library( name = "shared", - srcs = [ + testonly = True, + srcs = glob(["*.ts"]), + data = [ "URLS_TO_REDIRECT.txt", - "cjson.d.ts", - "helpers.ts", + "@aio_npm//cjson", + ], + deps = [ + "//aio/tools/firebase-test-utils", + "//packages/service-worker/config", + "@npm//canonical-path", ], ) diff --git a/aio/tests/deployment/shared/helpers.ts b/aio/tests/deployment/shared/helpers.ts index d9033f7fb04..05ea1ec4c84 100644 --- a/aio/tests/deployment/shared/helpers.ts +++ b/aio/tests/deployment/shared/helpers.ts @@ -1,18 +1,21 @@ // tslint:disable-next-line: no-reference /// -import { resolve as resolvePath } from 'canonical-path'; -import { load as loadJson } from 'cjson'; -import { readFileSync } from 'fs'; -import { get as httpGet } from 'http'; -import { get as httpsGet } from 'https'; +import canonicalPath from 'canonical-path'; +import {load as loadJson} from 'cjson'; +import {readFileSync} from 'fs'; +import {get as httpGet} from 'http'; +import {get as httpsGet} from 'https'; +import {fileURLToPath} from 'url'; -import { processNavigationUrls } from '../../../../packages/service-worker/config/src/generator'; -import { FirebaseRedirector, FirebaseRedirectConfig } from '../../../tools/firebase-test-utils/FirebaseRedirector'; +import {processNavigationUrls} from '../../../../packages/service-worker/config/src/generator'; +import {FirebaseRedirectConfig, FirebaseRedirector} from '../../../tools/firebase-test-utils/FirebaseRedirector'; -const AIO_DIR = resolvePath('aio'); -export const PATH_TO_LEGACY_URLS = resolvePath(__dirname, 'URLS_TO_REDIRECT.txt'); +const AIO_DIR = canonicalPath.resolve('aio'); +const containingDir = canonicalPath.dirname(fileURLToPath(import.meta.url)); + +export const PATH_TO_LEGACY_URLS = canonicalPath.resolve(containingDir, 'URLS_TO_REDIRECT.txt'); export function getRedirector() { return new FirebaseRedirector(loadRedirects()); @@ -22,16 +25,13 @@ export function getSwNavigationUrlChecker() { const config = loadJson(`${AIO_DIR}/src/generated/ngsw-config.json`); const navigationUrlSpecs = processNavigationUrls('', config.navigationUrls); - const includePatterns = navigationUrlSpecs - .filter(spec => spec.positive) - .map(spec => new RegExp(spec.regex)); - const excludePatterns = navigationUrlSpecs - .filter(spec => !spec.positive) - .map(spec => new RegExp(spec.regex)); + const includePatterns = + navigationUrlSpecs.filter(spec => spec.positive).map(spec => new RegExp(spec.regex)); + const excludePatterns = + navigationUrlSpecs.filter(spec => !spec.positive).map(spec => new RegExp(spec.regex)); - return (url: string) => - includePatterns.some(regex => regex.test(url)) - && !excludePatterns.some(regex => regex.test(url)); + return (url: string) => includePatterns.some(regex => regex.test(url)) && + !excludePatterns.some(regex => regex.test(url)); } export function loadRedirects(): FirebaseRedirectConfig[] { @@ -42,9 +42,9 @@ export function loadRedirects(): FirebaseRedirectConfig[] { export function loadLegacyUrls() { const urls = readFileSync(PATH_TO_LEGACY_URLS, 'utf8') - .split('\n') - .filter(line => line.trim() !== '') - .map(line => line.split(/\s*-->\s*/)); + .split('\n') + .filter(line => line.trim() !== '') + .map(line => line.split(/\s*-->\s*/)); return urls; } @@ -61,10 +61,10 @@ export async function loadRemoteSitemapUrls(host: string) { const xml = await new Promise((resolve, reject) => { let responseText = ''; - get(urlToSiteMap, res => res - .on('data', chunk => responseText += chunk) - .on('end', () => resolve(responseText)) - .on('error', reject)); + get(urlToSiteMap, + res => res.on('data', chunk => responseText += chunk) + .on('end', () => resolve(responseText)) + .on('error', reject)); }); return extractSitemapUrls(xml); diff --git a/aio/tests/deployment/unit/BUILD.bazel b/aio/tests/deployment/unit/BUILD.bazel index 127823ec29d..992e2ef5dc5 100644 --- a/aio/tests/deployment/unit/BUILD.bazel +++ b/aio/tests/deployment/unit/BUILD.bazel @@ -1,27 +1,22 @@ -load("//tools:defaults.bzl", "nodejs_test") +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") -nodejs_test( +package(default_visibility = ["//aio/tests/deployment:__subpackages__"]) + +ts_library( + name = "unit_lib", + testonly = True, + srcs = glob(["*.ts"]), + deps = [ + "//aio/tests/deployment/shared", + ], +) + +jasmine_node_test( name = "test", data = [ - "testFirebaseRedirection.spec.ts", - "testServiceWorkerRoutes.spec.ts", - "tsconfig.json", "//aio:dgeni", "//aio:firebase.json", - "//aio:tsconfig.json", "//aio/src/generated:ngsw-config", - "//aio/tests/deployment/shared", - "//aio/tools/firebase-test-utils:sources", - "//packages/service-worker/config:sources", - "@aio_npm//@types/jasmine", - "@aio_npm//canonical-path", - "@aio_npm//cjson", - "@aio_npm//jasmine", - "@aio_npm//ts-node", - "@aio_npm//xregexp", ], - # This test script runs ts-node which seems to bypass rules_nodejs require - # patching and cannot find deps. Enable the linker for this target. - enable_linker = True, - entry_point = "test.js", + deps = [":unit_lib"], ) diff --git a/aio/tests/deployment/unit/test.js b/aio/tests/deployment/unit/test.js deleted file mode 100644 index 2745b96cc7b..00000000000 --- a/aio/tests/deployment/unit/test.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Use this script to run the tests for redirects. - * - * We cannot use `jasmine-ts`, because it does not support passing a glob pattern any more (see - * https://github.com/svi3c/jasmine-ts/issues/33#issuecomment-511374288) and thus requires a - * `jasmine.json` config file, which does not allow us to set the `projectBaseDir`. This in turn - * means that you have to run the command from a specific directory (so that the spec paths are - * resolved correctly). - * - * Using a file like this gives us full control. - */ - -const Jasmine = require('jasmine'); -const {join} = require('path'); -const {register} = require('ts-node'); - -const runfilesRoot = process.cwd(); -const dirname = join(runfilesRoot, 'aio', 'tests', 'deployment', 'unit'); - -register({project: join(dirname, 'tsconfig.json')}); - -const runner = new Jasmine({projectBaseDir: dirname}); -runner.loadConfig({spec_files: ['**/*.spec.ts']}); -runner.execute().catch((error) => { - // Something broke so non-zero exit to prevent the process from succeeding. - console.error(error); - process.exit(1); -}); diff --git a/aio/tests/deployment/unit/testServiceWorkerRoutes.spec.ts b/aio/tests/deployment/unit/testServiceWorkerRoutes.spec.ts index a56db2ea09f..5ff6373cb90 100644 --- a/aio/tests/deployment/unit/testServiceWorkerRoutes.spec.ts +++ b/aio/tests/deployment/unit/testServiceWorkerRoutes.spec.ts @@ -1,4 +1,4 @@ -import { getSwNavigationUrlChecker, loadLegacyUrls, loadLocalSitemapUrls } from '../shared/helpers'; +import {getSwNavigationUrlChecker, loadLegacyUrls, loadLocalSitemapUrls} from '../shared/helpers'; describe('ServiceWorker navigation URLs', () => { const isNavigationUrl = getSwNavigationUrlChecker(); diff --git a/aio/tools/examples/shared/package.json b/aio/tools/examples/shared/package.json index 4ae4f327dee..7997a02313a 100644 --- a/aio/tools/examples/shared/package.json +++ b/aio/tools/examples/shared/package.json @@ -76,7 +76,6 @@ "lite-server": "^2.6.1", "lodash": "^4.16.2", "protractor": "~7.0.0", - "puppeteer": "10.2.0", "rimraf": "^4.0.0", "rollup": "^2.70.1", "rollup-plugin-terser": "^7.0.2", diff --git a/aio/tools/examples/shared/yarn.lock b/aio/tools/examples/shared/yarn.lock index 4b14295e28c..bca6c7aeafc 100644 --- a/aio/tools/examples/shared/yarn.lock +++ b/aio/tools/examples/shared/yarn.lock @@ -2049,13 +2049,6 @@ dependencies: "@types/node" "*" -"@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== - dependencies: - "@types/node" "*" - "@webassemblyjs/ast@1.11.1": version "1.11.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" @@ -2636,7 +2629,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bl@^4.0.3, bl@^4.1.0: +bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -2841,17 +2834,12 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== - buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.2.1, buffer@^5.5.0: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3016,11 +3004,6 @@ chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.5.1, cho optionalDependencies: fsevents "~2.3.2" -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - chownr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" @@ -3486,13 +3469,6 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, d dependencies: ms "2.1.2" -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - debug@4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" @@ -3617,11 +3593,6 @@ dev-ip@^1.0.1: resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== -devtools-protocol@0.0.901419: - version "0.0.901419" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.901419.tgz#79b5459c48fe7e1c5563c02bd72f8fec3e0cebcd" - integrity sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ== - di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -3791,13 +3762,6 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - engine.io-client@~6.2.1: version "6.2.2" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.2.2.tgz#c6c5243167f5943dcd9c4abee1bfc634aa2cbdd0" @@ -4227,17 +4191,6 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-zip@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" - integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - dependencies: - debug "^4.1.1" - get-stream "^5.1.0" - yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" - extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -4288,13 +4241,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -fd-slicer@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" - integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== - dependencies: - pend "~1.2.0" - figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -4429,11 +4375,6 @@ fresh@0.5.2, fresh@^0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" @@ -4517,13 +4458,6 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" @@ -4853,14 +4787,6 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -6106,11 +6032,6 @@ node-addon-api@^3.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -6339,7 +6260,7 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -6577,11 +6498,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -6630,7 +6546,7 @@ piscina@3.2.0, piscina@~3.2.0: optionalDependencies: nice-napi "^1.0.2" -pkg-dir@4.2.0, pkg-dir@^4.1.0: +pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -6747,11 +6663,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" - integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== - promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -6794,11 +6705,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-from-env@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6809,37 +6715,11 @@ psl@^1.1.28, psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -puppeteer@10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-10.2.0.tgz#7d8d7fda91e19a7cfd56986e0275448e6351849e" - integrity sha512-OR2CCHRashF+f30+LBOtAjK6sNtz2HEyTr5FqAvhf8lR/qB3uBRoIZOwQKgwoyZnMBsxX7ZdazlyBgGjpnkiMw== - dependencies: - debug "4.3.1" - devtools-protocol "0.0.901419" - extract-zip "2.0.1" - https-proxy-agent "5.0.0" - node-fetch "2.6.1" - pkg-dir "4.2.0" - progress "2.0.1" - proxy-from-env "1.1.0" - rimraf "3.0.2" - tar-fs "2.0.0" - unbzip2-stream "1.3.3" - ws "7.4.6" - q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -6942,7 +6822,7 @@ readable-stream@^2.0.1, readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7143,13 +7023,6 @@ rfdc@^1.3.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -7157,6 +7030,13 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4: dependencies: glob "^7.1.3" +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.0.4.tgz#8d0a91709fdc294d40f59c773f63c44e8dc878f1" @@ -7898,27 +7778,6 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" - integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== - dependencies: - chownr "^1.1.1" - mkdirp "^0.5.1" - pump "^3.0.0" - tar-stream "^2.0.0" - -tar-stream@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^6.1.11, tar@^6.1.2: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -8000,7 +7859,7 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6, through@^2.3.8: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -8180,14 +8039,6 @@ ua-parser-js@^0.7.30: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== -unbzip2-stream@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz#d156d205e670d8d8c393e1c02ebd506422873f6a" - integrity sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg== - dependencies: - buffer "^5.2.1" - through "^2.3.8" - unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -8679,11 +8530,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - ws@^7.4.6: version "7.5.8" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" @@ -8854,14 +8700,6 @@ yargs@^17.2.1, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" -yauzl@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" - integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.1.0" - yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" diff --git a/aio/tools/firebase-test-utils/BUILD.bazel b/aio/tools/firebase-test-utils/BUILD.bazel index 5256a9373b6..87c88c3c01e 100644 --- a/aio/tools/firebase-test-utils/BUILD.bazel +++ b/aio/tools/firebase-test-utils/BUILD.bazel @@ -1,4 +1,29 @@ -load("//tools:defaults.bzl", "nodejs_test") +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +package(default_visibility = ["//aio/tests/deployment:__subpackages__"]) + +ts_library( + name = "firebase-test-utils", + srcs = glob( + ["*.ts"], + exclude = ["*.spec.ts"], + ), + deps = [ + "@npm//@types/xregexp", + "@npm//xregexp", + ], +) + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob( + ["*.spec.ts"], + ), + deps = [ + ":firebase-test-utils", + ], +) filegroup( name = "sources", @@ -6,19 +31,9 @@ filegroup( visibility = ["//aio/tests/deployment/unit:__pkg__"], ) -nodejs_test( +jasmine_node_test( name = "test", - data = [ - "tsconfig.json", - ":sources", - "//aio:tsconfig.json", - "@aio_npm//@types/jasmine", - "@aio_npm//jasmine", - "@aio_npm//ts-node", - "@aio_npm//xregexp", + deps = [ + ":test_lib", ], - # This test script runs ts-node which seems to bypass rules_nodejs require - # patching and cannot find deps. Enable the linker for this target. - enable_linker = True, - entry_point = "test.js", ) diff --git a/aio/tools/firebase-test-utils/FirebaseRedirect.ts b/aio/tools/firebase-test-utils/FirebaseRedirect.ts index 71b5837bed3..8a468f36c59 100644 --- a/aio/tools/firebase-test-utils/FirebaseRedirect.ts +++ b/aio/tools/firebase-test-utils/FirebaseRedirect.ts @@ -1,6 +1,7 @@ -import * as XRegExp from 'xregexp'; -import { FirebaseRedirectConfig } from './FirebaseRedirector'; -import { FirebaseRedirectSource } from './FirebaseRedirectSource'; +import XRegExp from 'xregexp'; + +import {FirebaseRedirectConfig} from './FirebaseRedirector'; +import {FirebaseRedirectSource} from './FirebaseRedirectSource'; export class FirebaseRedirect { source: FirebaseRedirectSource; @@ -8,25 +9,27 @@ export class FirebaseRedirect { constructor(readonly rawConfig: FirebaseRedirectConfig) { this.source = (rawConfig.regex === undefined) ? - FirebaseRedirectSource.fromGlobPattern(rawConfig.source) : - FirebaseRedirectSource.fromRegexPattern(rawConfig.regex); + FirebaseRedirectSource.fromGlobPattern(rawConfig.source) : + FirebaseRedirectSource.fromRegexPattern(rawConfig.regex); this.destination = rawConfig.destination; } - replace(url: string): string | undefined { + replace(url: string): string|undefined { const match = this.source.match(url); if (!match) { return undefined; } - const namedReplacers = this.source.namedGroups.map<[RegExp, string]>((name) => [ - XRegExp(`:${name}`, 'g'), - match[name], + const namedReplacers = this.source.namedGroups.map<[RegExp, string]>( + (name) => + [XRegExp(`:${name}`, 'g'), + match[name], ]); - const restReplacers = this.source.restNamedGroups.map<[RegExp, string]>((name) => [ - XRegExp(`:${name}\\*`, 'g'), - match[name], + const restReplacers = this.source.restNamedGroups.map<[RegExp, string]>( + (name) => + [XRegExp(`:${name}\\*`, 'g'), + match[name], ]); return XRegExp.replaceEach(this.destination, [...namedReplacers, ...restReplacers]); } diff --git a/aio/tools/firebase-test-utils/FirebaseRedirectSource.ts b/aio/tools/firebase-test-utils/FirebaseRedirectSource.ts index 5a963535a0e..86bfd902468 100644 --- a/aio/tools/firebase-test-utils/FirebaseRedirectSource.ts +++ b/aio/tools/firebase-test-utils/FirebaseRedirectSource.ts @@ -1,4 +1,4 @@ -import * as XRegExp from 'xregexp'; +import XRegExp from 'xregexp'; // The `XRegExp` typings are not accurate. interface XRegExp extends RegExp { @@ -44,7 +44,7 @@ export class FirebaseRedirectSource { }) .replace(namedParam, '$1(?<$2>[^/]+)') .replace(doubleStar, '$1.🐷$2') // use the pig to avoid replacing ** in next rule - .replace(star, '[^/]*') // match a single segment + .replace(star, '[^/]*') // match a single segment .replace(possiblyEmptyInitialSegments, '(?:.*)') // deal with **/ special cases .replace(possiblyEmptySegments, '(?:/|/.*/)') // deal with /**/ special cases .replace(willBeStar, '*'); // other ** matches diff --git a/aio/tools/firebase-test-utils/test.js b/aio/tools/firebase-test-utils/test.js deleted file mode 100644 index 951b874af73..00000000000 --- a/aio/tools/firebase-test-utils/test.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Use this script to run the tests for Firebase test utils. - * - * We cannot use `jasmine-ts`, because it does not support passing a glob pattern any more (see - * https://github.com/svi3c/jasmine-ts/issues/33#issuecomment-511374288) and thus requires a - * `jasmine.json` config file, which does not allow us to set the `projectBaseDir`. This in turn - * means that you have to run the command from a specific directory (so that the spec paths are - * resolved correctly). - * - * Using a file like this gives us full control. - */ - -const Jasmine = require('jasmine'); -const {join} = require('path'); -const {register} = require('ts-node'); - -const runfilesRoot = process.cwd(); -const dirname = join(runfilesRoot, 'aio', 'tools', 'firebase-test-utils'); - -register({project: join(dirname, 'tsconfig.json')}); - -const runner = new Jasmine({projectBaseDir: dirname}); -runner.loadConfig({spec_files: ['**/*.spec.ts']}); -runner.execute().catch((error) => { - // Something broke so non-zero exit to prevent the process from succeeding. - console.error(error); - process.exit(1); -}); diff --git a/aio/tools/firebase-test-utils/tsconfig.json b/aio/tools/firebase-test-utils/tsconfig.json index cd8070eb689..a48b87610a5 100644 --- a/aio/tools/firebase-test-utils/tsconfig.json +++ b/aio/tools/firebase-test-utils/tsconfig.json @@ -1,9 +1,8 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "module": "commonjs" + "esModuleInterop": true, + "module": "ES2020" }, - "include": [ - "**/*.ts" - ] + "include": ["**/*.ts"] } diff --git a/package.json b/package.json index 6dc1865e22b..e2ddfc7b715 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,6 @@ "@types/chrome": "^0.0.208", "@types/convert-source-map": "^1.5.1", "@types/diff": "^5.0.0", - "@types/events": "3.0.0", "@types/filesystem": "^0.0.32", "@types/hammerjs": "2.0.41", "@types/jasmine": "^4.0.0", @@ -148,7 +147,6 @@ "ngx-flamegraph": "0.0.11", "nodejs-websocket": "^1.7.2", "protractor": "^7.0.0", - "puppeteer": "18.0.5", "reflect-metadata": "^0.1.3", "requirejs": "^2.3.6", "rollup": "~2.79.0", @@ -184,6 +182,7 @@ "@octokit/graphql": "^5.0.0", "@types/cldrjs": "^0.4.22", "@types/cli-progress": "^3.4.2", + "@types/xregexp": "^4.4.0", "@yarnpkg/lockfile": "^1.1.0", "check-side-effects": "0.0.23", "cldr": "7.3.0", @@ -208,7 +207,8 @@ "tslint-no-toplevel-property-access": "0.0.2", "typed-graphqlify": "^3.1.1", "vlq": "2.0.4", - "vrsource-tslint-rules": "6.0.0" + "vrsource-tslint-rules": "6.0.0", + "xregexp": "^5.1.1" }, "// 4": "Overwrite graceful-fs to a version that does not rely on the 'natives' package. This fixes gulp for >= 10.13, more information: #28213", "// 5": "Ensure that transitive dependencies on `https-proxy-agent` are at minimum v5 as older versions patch NodeJS directly, breaking tools like webdriver which is used by the karma-sauce-launcher as an example.", diff --git a/renovate.json b/renovate.json index 8c2c19d85f1..8dcef0ca272 100644 --- a/renovate.json +++ b/renovate.json @@ -15,9 +15,7 @@ "timezone": "America/Tijuana", "lockFileMaintenance": {"enabled": true}, "labels": ["target: patch", "area: build & ci", "action: review"], - "ignorePaths": [ - "aio/content/demos/first-app/package.json" - ], + "ignorePaths": ["aio/content/demos/first-app/package.json"], "ignoreDeps": [ "@angular/animations-12", "@angular/common-12", @@ -37,7 +35,6 @@ "angular-mocks-1.6", "angular-mocks-1.7", "angular-mocks-1.8", - "puppeteer", "remark", "remark-html", "selenium-webdriver", diff --git a/scripts/puppeteer-chromedriver-versions.js b/scripts/puppeteer-chromedriver-versions.js deleted file mode 100644 index 5f3ff29a2ed..00000000000 --- a/scripts/puppeteer-chromedriver-versions.js +++ /dev/null @@ -1,18 +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.io/license - */ - - -// Mapping of puppeteer releases to their default Chrome version -// derived from https://github.com/puppeteer/puppeteer/blob/master/docs/api.md. -// The puppeteer package.json file contains the compatible Chrome revision such as -// "chromium_revision": "722234" but this does not map easily to the Chrome version -// so we use this mapping here instead. -module.exports = { - '18.0.5' : '106.0.5249.21', - '10.2.0' : '93.0.4577.63', -}; diff --git a/tools/defaults.bzl b/tools/defaults.bzl index f48430ce288..edb9a80329f 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -110,7 +110,6 @@ def ts_library( # Match the types[] in //packages:tsconfig-test.json deps.append("@npm//@types/jasmine") deps.append("@npm//@types/node") - deps.append("@npm//@types/events") if not tsconfig and testonly: tsconfig = _DEFAULT_TSCONFIG_TEST @@ -154,7 +153,6 @@ def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps # Match the types[] in //packages:tsconfig-test.json deps.append("@npm//@types/jasmine") deps.append("@npm//@types/node") - deps.append("@npm//@types/events") if not tsconfig and testonly: tsconfig = _DEFAULT_TSCONFIG_TEST diff --git a/yarn.lock b/yarn.lock index 86a4c16e225..795d844136a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -236,7 +236,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#f7d26a0b0d6bd2043f2d32c2a99db903539d0c07": version "0.0.0-07b0f6423e0c5266b3792d8f4af43b8fd3f3d41b" - uid f7d26a0b0d6bd2043f2d32c2a99db903539d0c07 resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#f7d26a0b0d6bd2043f2d32c2a99db903539d0c07" dependencies: "@angular-devkit/build-angular" "15.2.0-next.3" @@ -391,7 +390,6 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#8aa60413b3e14daf2f33a29fe9d09faa3e5bcb75": version "0.0.0-07b0f6423e0c5266b3792d8f4af43b8fd3f3d41b" - uid "8aa60413b3e14daf2f33a29fe9d09faa3e5bcb75" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#8aa60413b3e14daf2f33a29fe9d09faa3e5bcb75" dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -1908,6 +1906,14 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/runtime-corejs3@^7.16.5": + version "7.20.13" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.20.13.tgz#ad012857db412ab0b5ccf184b67be2cfcc2a1dcf" + integrity sha512-p39/6rmY9uvlzRiLZBIB3G9/EBr66LBMcYm7fIDeSBNdRjF2AGD3rFZucUyAgGHC2N+7DdLvVi33uTjSE44FIw== + dependencies: + core-js-pure "^3.25.1" + regenerator-runtime "^0.13.11" + "@babel/runtime@7.20.13": version "7.20.13" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b" @@ -4097,11 +4103,6 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/events@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" - integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== - "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": version "4.17.29" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz#2a1795ea8e9e9c91b4a4bbe475034b20c1ec711c" @@ -4445,6 +4446,13 @@ dependencies: "@types/node" "*" +"@types/xregexp@^4.4.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@types/xregexp/-/xregexp-4.4.0.tgz#84ce998f45f1a651e0971b942b951ad1e5b7d4fc" + integrity sha512-RJJHNci1sRRq8nZjWxzCbQdLhJVq+JcDHpsdzoTtFAR9qdsMhAWqKQ1NHsNcenKDtLsOwCBe/kfSKM82yXtocg== + dependencies: + xregexp "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -6888,6 +6896,11 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" +core-js-pure@^3.25.1: + version "3.27.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.27.2.tgz#47e9cc96c639eefc910da03c3ece26c5067c7553" + integrity sha512-Cf2jqAbXgWH3VVzjyaaFkY1EBazxugUepGymDoeteyYr9ByX51kD2jdHZlsEF/xnJMyN3Prua7mQuzwMg6Zc9A== + core-js@^3.6.5: version "3.23.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.4.tgz#92d640faa7f48b90bbd5da239986602cfc402aa6" @@ -6971,13 +6984,6 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-fetch@3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -7344,7 +7350,7 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@4.3.4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -7784,11 +7790,6 @@ dev-ip@^1.0.1: resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== -devtools-protocol@0.0.1036444: - version "0.0.1036444" - resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1036444.tgz#a570d3cdde61527c82f9b03919847b8ac7b1c2b9" - integrity sha512-0y4f/T8H9lsESV9kKP1HDUXgHxCdniFeJh6Erq+FbdOEvp/Ydp9t8kcAAM5gOd17pMrTDlFWntoHtzzeTUWKNw== - devtools-protocol@0.0.818844: version "0.0.818844" resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.818844.tgz#d1947278ec85b53e4c8ca598f607a28fa785ba9e" @@ -8614,7 +8615,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@2.0.1, extract-zip@^2.0.0: +extract-zip@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -12569,7 +12570,7 @@ node-emoji@^1.11.0: dependencies: lodash "^4.17.21" -node-fetch@2.6.7, node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== @@ -13739,7 +13740,7 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -progress@2.0.3, progress@^2.0.1, progress@^2.0.3: +progress@^2.0.1, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== @@ -13850,7 +13851,7 @@ proxy-agent@^5.0.0: proxy-from-env "^1.0.0" socks-proxy-agent "^5.0.0" -proxy-from-env@1.1.0, proxy-from-env@^1.0.0: +proxy-from-env@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -13932,23 +13933,6 @@ puppeteer-core@^5.1.0: unbzip2-stream "^1.3.3" ws "^7.2.3" -puppeteer@18.0.5: - version "18.0.5" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-18.0.5.tgz#873223b17b92345182c5b5e8cfbd6f3117f1547d" - integrity sha512-s4erjxU0VtKojPvF+KvLKG6OHUPw7gO2YV1dtOsoryyCbhrs444fXb4QZqGWuTv3V/rgSCUzeixxu34g0ZkSMA== - dependencies: - cross-fetch "3.1.5" - debug "4.3.4" - devtools-protocol "0.0.1036444" - extract-zip "2.0.1" - https-proxy-agent "5.0.1" - progress "2.0.3" - proxy-from-env "1.1.0" - rimraf "3.0.2" - tar-fs "2.1.1" - unbzip2-stream "1.4.3" - ws "8.8.1" - q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -14558,7 +14542,7 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.3: dependencies: glob "^7.1.3" -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -15816,7 +15800,7 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tar-fs@2.1.1, tar-fs@^2.0.0: +tar-fs@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== @@ -16424,7 +16408,7 @@ uglify-js@^3.1.4: resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.2.tgz#0481e1dbeed343ad1c2ddf3c6d42e89b7a6d4def" integrity sha512-AaQNokTNgExWrkEYA24BTNMSjyqEXPSfhqoS0AxmHkCJ4U+Dyy5AvbGV/sqxuxficEfGGoX3zWw9R7QpLFfEsg== -unbzip2-stream@1.4.3, unbzip2-stream@^1.0.9, unbzip2-stream@^1.3.3: +unbzip2-stream@^1.0.9, unbzip2-stream@^1.3.3: version "1.4.3" resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== @@ -16946,7 +16930,7 @@ webdriver-js-extender@2.1.0: "@types/selenium-webdriver" "^3.0.0" selenium-webdriver "^3.0.1" -webdriver-manager@12.1.8, webdriver-manager@^12.1.7: +webdriver-manager@^12.1.7: version "12.1.8" resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.8.tgz#5e70e73eaaf53a0767d5745270addafbc5905fd4" integrity sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg== @@ -17291,11 +17275,6 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@8.8.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" - integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== - ws@>=8.7.0, ws@^8.4.2: version "8.8.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.0.tgz#8e71c75e2f6348dbf8d78005107297056cb77769" @@ -17344,6 +17323,13 @@ xpath@^0.0.32: resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== +xregexp@*, xregexp@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-5.1.1.tgz#6d3fe18819e3143aaf52f9284d34f49a59583ebb" + integrity sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg== + dependencies: + "@babel/runtime-corejs3" "^7.16.5" + xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"