From 068b38a05d03d50e3051add0aca5ec1cffa2cf4d Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 2 Oct 2023 22:08:13 +0000 Subject: [PATCH 01/57] build: update cross-repo angular dependencies (#51996) See associated pull request for more information. (cherry picked from commit e169b2da2e16aac5bb8d4e19ad99a1cb0406fee7) PR Close #51996 --- .github/workflows/aio-preview-build.yml | 4 +- .github/workflows/aio-preview-deploy.yml | 2 +- .../assistant-to-the-branch-manager.yml | 2 +- .github/workflows/benchmark-compare.yml | 2 +- .github/workflows/ci-privileged.yml | 4 +- .github/workflows/ci.yml | 44 +- .github/workflows/dev-infra.yml | 4 +- .github/workflows/feature-requests.yml | 2 +- .github/workflows/google-internal-tests.yml | 2 +- .github/workflows/merge-ready-status.yml | 2 +- .github/workflows/monitoring.yml | 8 +- .github/workflows/update-cli-help.yml | 2 +- .github/workflows/update-events.yml | 2 +- aio/package.json | 34 +- .../shared/boilerplate/cli-ajs/package.json | 22 +- .../shared/boilerplate/cli/package.json | 22 +- .../shared/boilerplate/elements/package.json | 24 +- .../shared/boilerplate/i18n/package.json | 24 +- .../boilerplate/service-worker/package.json | 24 +- .../shared/boilerplate/systemjs/package.json | 20 +- .../shared/boilerplate/universal/package.json | 24 +- aio/tools/examples/shared/package.json | 32 +- aio/tools/examples/shared/yarn.lock | 566 +++-- aio/yarn.lock | 2134 ++++++++--------- package.json | 20 +- packages/zone.js/package.json | 2 +- packages/zone.js/test/typings/package.json | 2 +- packages/zone.js/yarn.lock | 7 +- yarn.lock | 2004 +++++++--------- 29 files changed, 2393 insertions(+), 2648 deletions(-) diff --git a/.github/workflows/aio-preview-build.yml b/.github/workflows/aio-preview-build.yml index 714806bb617bc4..4dbb78d85379c1 100644 --- a/.github/workflows/aio-preview-build.yml +++ b/.github/workflows/aio-preview-build.yml @@ -25,7 +25,7 @@ jobs: - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - uses: ./.github/actions/yarn-install - - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: bazelrc: ./.bazelrc.user @@ -34,7 +34,7 @@ jobs: # the number of concurrent actions is determined based on the host resources. - run: bazel build //aio:build --jobs=32 --announce_rc --verbose_failures - - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: workflow-artifact-name: 'aio' pull-number: '${{github.event.pull_request.number}}' diff --git a/.github/workflows/aio-preview-deploy.yml b/.github/workflows/aio-preview-deploy.yml index 2bfafb7fa10b07..8d2462949f8f03 100644 --- a/.github/workflows/aio-preview-deploy.yml +++ b/.github/workflows/aio-preview-deploy.yml @@ -34,7 +34,7 @@ jobs: npx -y firebase-tools@latest target:clear --project ${{env.PREVIEW_PROJECT}} hosting aio npx -y firebase-tools@latest target:apply --project ${{env.PREVIEW_PROJECT}} hosting aio ${{env.PREVIEW_SITE}} - - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: github-token: '${{secrets.GITHUB_TOKEN}}' workflow-artifact-name: 'aio' diff --git a/.github/workflows/assistant-to-the-branch-manager.yml b/.github/workflows/assistant-to-the-branch-manager.yml index 18fef58de38f9c..5f886729a76e8d 100644 --- a/.github/workflows/assistant-to-the-branch-manager.yml +++ b/.github/workflows/assistant-to-the-branch-manager.yml @@ -16,6 +16,6 @@ jobs: - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 with: persist-credentials: false - - uses: angular/dev-infra/github-actions/branch-manager@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/branch-manager@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/benchmark-compare.yml b/.github/workflows/benchmark-compare.yml index 0bcedda234ce76..ce55bff500467a 100644 --- a/.github/workflows/benchmark-compare.yml +++ b/.github/workflows/benchmark-compare.yml @@ -38,7 +38,7 @@ jobs: - uses: ./.github/actions/yarn-install - - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: bazelrc: ./.bazelrc.user diff --git a/.github/workflows/ci-privileged.yml b/.github/workflows/ci-privileged.yml index 4fd980c33c0221..3e908e5f93b455 100644 --- a/.github/workflows/ci-privileged.yml +++ b/.github/workflows/ci-privileged.yml @@ -23,7 +23,7 @@ jobs: SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true # Checking out the pull request commit is intended here as we need to run the changed code tests. @@ -31,7 +31,7 @@ jobs: - name: Install node modules run: yarn install --frozen-lockfile - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Starting Saucelabs tunnel service run: ./tools/saucelabs/sauce-service.sh run & # Build test fixtures for a test that rely on Bazel-generated fixtures. Note that disabling diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 195f1af3ea540b..7ee7c4820a913e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | @@ -60,13 +60,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules run: yarn install --frozen-lockfile - name: Run unit tests @@ -78,13 +78,13 @@ jobs: runs-on: windows-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Test all windows CI targets @@ -97,13 +97,13 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel Remote Caching - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules run: yarn install --frozen-lockfile --network-timeout 100000 - name: Run CI tests for framework @@ -113,15 +113,15 @@ jobs: runs-on: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | ./aio/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules for aio run: yarn install --cwd aio --frozen-lockfile - name: Run AIO tests with upstream packages @@ -134,15 +134,15 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | ./aio/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules run: yarn install --cwd aio --frozen-lockfile - name: Run AIO tests with local packages @@ -157,15 +157,15 @@ jobs: labels: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | ./aio/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules for aio run: yarn install --cwd aio --frozen-lockfile - name: Set the stable branch environment variable @@ -200,7 +200,7 @@ jobs: labels: ubuntu-latest-4core steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | @@ -208,9 +208,9 @@ jobs: ./packages/zone.js/node_modules ./packages/zone.js/test/typings/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules run: yarn install --frozen-lockfile - run: | diff --git a/.github/workflows/dev-infra.yml b/.github/workflows/dev-infra.yml index 2a3dfb97f148ed..d50f1a3046cd36 100644 --- a/.github/workflows/dev-infra.yml +++ b/.github/workflows/dev-infra.yml @@ -13,13 +13,13 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - - uses: angular/dev-infra/github-actions/commit-message-based-labels@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/commit-message-based-labels@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} post_approval_changes: runs-on: ubuntu-latest steps: - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - - uses: angular/dev-infra/github-actions/post-approval-changes@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/post-approval-changes@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/feature-requests.yml b/.github/workflows/feature-requests.yml index d50817ca6b260c..e8811cddf0a72b 100644 --- a/.github/workflows/feature-requests.yml +++ b/.github/workflows/feature-requests.yml @@ -14,6 +14,6 @@ jobs: if: github.repository == 'angular/angular' runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/feature-request@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/feature-request@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/google-internal-tests.yml b/.github/workflows/google-internal-tests.yml index 54b7dbdff1979f..dc93ba6f8dbdb2 100644 --- a/.github/workflows/google-internal-tests.yml +++ b/.github/workflows/google-internal-tests.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 - - uses: angular/dev-infra/github-actions/google-internal-tests@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/google-internal-tests@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: run-tests-guide-url: http://go/angular-g3sync-start github-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/merge-ready-status.yml b/.github/workflows/merge-ready-status.yml index 5ecd6832162500..c45b97079ae03a 100644 --- a/.github/workflows/merge-ready-status.yml +++ b/.github/workflows/merge-ready-status.yml @@ -9,6 +9,6 @@ jobs: status: runs-on: ubuntu-latest steps: - - uses: angular/dev-infra/github-actions/unified-status-check@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - uses: angular/dev-infra/github-actions/unified-status-check@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: angular-robot-key: ${{ secrets.ANGULAR_ROBOT_PRIVATE_KEY }} diff --git a/.github/workflows/monitoring.yml b/.github/workflows/monitoring.yml index f2ef6184dcd653..c5598dc242a343 100644 --- a/.github/workflows/monitoring.yml +++ b/.github/workflows/monitoring.yml @@ -22,15 +22,15 @@ jobs: version: ['https://next.angular.io/', 'https://angular.io/'] steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | ./aio/node_modules - name: Setup Bazel - uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/setup@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Setup Bazel RBE - uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/bazel/configure-remote@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b - name: Install node modules in aio run: yarn install --frozen-lockfile --cwd aio - name: Run basic e2e and deployment config tests. @@ -44,7 +44,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Initialize environment - uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: cache-node-modules: true node-module-directories: | diff --git a/.github/workflows/update-cli-help.yml b/.github/workflows/update-cli-help.yml index b1e0651b9ce9e6..a064ba9226d5f0 100644 --- a/.github/workflows/update-cli-help.yml +++ b/.github/workflows/update-cli-help.yml @@ -32,7 +32,7 @@ jobs: env: ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN: ${{ secrets.ANGULAR_CLI_BUILDS_READONLY_GITHUB_TOKEN }} - name: Create a PR (if necessary) - uses: angular/dev-infra/github-actions/create-pr-for-changes@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/create-pr-for-changes@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: branch-prefix: update-cli-help pr-title: 'docs: update Angular CLI help [${{github.ref_name}}]' diff --git a/.github/workflows/update-events.yml b/.github/workflows/update-events.yml index ccd2fbccedccc4..a569333a10b4eb 100644 --- a/.github/workflows/update-events.yml +++ b/.github/workflows/update-events.yml @@ -35,7 +35,7 @@ jobs: - name: Generate `events.json` run: node aio/scripts/generate-events/index.mjs --ignore-invalid-dates - name: Create a PR (if necessary) - uses: angular/dev-infra/github-actions/create-pr-for-changes@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + uses: angular/dev-infra/github-actions/create-pr-for-changes@9b1adb2ad5a049ea9985734f197dca43dd4d3f1b with: branch-prefix: docs-update-events pr-title: 'docs: update events' diff --git a/aio/package.json b/aio/package.json index 651f1eb3fe9b53..c99fc753f4fef9 100644 --- a/aio/package.json +++ b/aio/package.json @@ -61,33 +61,33 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/cdk": "17.0.0-next.3", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/elements": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/material": "17.0.0-next.3", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", - "@angular/service-worker": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/cdk": "17.0.0-next.5", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/elements": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/material": "17.0.0-next.5", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", + "@angular/service-worker": "17.0.0-next.6", "rxjs": "~7.8.0", "safevalues": "^0.4.2", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/architect-cli": "0.1700.0-next.4", - "@angular-devkit/build-angular": "17.0.0-next.4", + "@angular-devkit/architect-cli": "0.1700.0-next.6", + "@angular-devkit/build-angular": "17.0.0-next.6", "@angular-eslint/builder": "16.0.3", "@angular-eslint/eslint-plugin": "16.0.3", "@angular-eslint/eslint-plugin-template": "16.0.3", "@angular-eslint/template-parser": "^16.0.3", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@bazel/bazelisk": "^1.7.5", "@bazel/buildozer": "^6.0.0", "@bazel/ibazel": "^0.16.2", diff --git a/aio/tools/examples/shared/boilerplate/cli-ajs/package.json b/aio/tools/examples/shared/boilerplate/cli-ajs/package.json index c4330e79b7791a..ac85e00e202fc8 100644 --- a/aio/tools/examples/shared/boilerplate/cli-ajs/package.json +++ b/aio/tools/examples/shared/boilerplate/cli-ajs/package.json @@ -13,14 +13,14 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", "angular": "^1.8.3", "angular-in-memory-web-api": "~0.16.0", "angular-route": "1.8.3", @@ -29,9 +29,9 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@types/angular": "^1.8.4", "@types/angular-route": "^1.7.2", "@types/jasmine": "~4.3.0", diff --git a/aio/tools/examples/shared/boilerplate/cli/package.json b/aio/tools/examples/shared/boilerplate/cli/package.json index 9a23c5956e4934..0bffb230401cf0 100644 --- a/aio/tools/examples/shared/boilerplate/cli/package.json +++ b/aio/tools/examples/shared/boilerplate/cli/package.json @@ -13,23 +13,23 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", "angular-in-memory-web-api": "~0.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@types/jasmine": "~4.3.0", "@types/node": "^16.11.35", "copyfiles": "^2.4.1", diff --git a/aio/tools/examples/shared/boilerplate/elements/package.json b/aio/tools/examples/shared/boilerplate/elements/package.json index 67c72972badf25..00b77a1b4dab58 100644 --- a/aio/tools/examples/shared/boilerplate/elements/package.json +++ b/aio/tools/examples/shared/boilerplate/elements/package.json @@ -13,24 +13,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/elements": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/elements": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", "angular-in-memory-web-api": "~0.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@types/jasmine": "~4.3.0", "@types/node": "^16.11.35", "jasmine-core": "~5.1.0", diff --git a/aio/tools/examples/shared/boilerplate/i18n/package.json b/aio/tools/examples/shared/boilerplate/i18n/package.json index 5fca8e7f3d5832..ef6c2ee38be793 100644 --- a/aio/tools/examples/shared/boilerplate/i18n/package.json +++ b/aio/tools/examples/shared/boilerplate/i18n/package.json @@ -15,24 +15,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/localize": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/localize": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", "angular-in-memory-web-api": "~0.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@types/jasmine": "~4.3.0", "@types/node": "^16.11.35", "jasmine-core": "~5.1.0", diff --git a/aio/tools/examples/shared/boilerplate/service-worker/package.json b/aio/tools/examples/shared/boilerplate/service-worker/package.json index de31657fe8ba6a..dd7ffbcc241c88 100644 --- a/aio/tools/examples/shared/boilerplate/service-worker/package.json +++ b/aio/tools/examples/shared/boilerplate/service-worker/package.json @@ -13,24 +13,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", - "@angular/service-worker": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", + "@angular/service-worker": "17.0.0-next.6", "angular-in-memory-web-api": "~0.16.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@types/jasmine": "~4.3.0", "@types/node": "^16.11.35", "jasmine-core": "~5.1.0", diff --git a/aio/tools/examples/shared/boilerplate/systemjs/package.json b/aio/tools/examples/shared/boilerplate/systemjs/package.json index 90a1afe1144bd3..7c4a8ac3d5c575 100644 --- a/aio/tools/examples/shared/boilerplate/systemjs/package.json +++ b/aio/tools/examples/shared/boilerplate/systemjs/package.json @@ -25,15 +25,15 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", - "@angular/upgrade": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", + "@angular/upgrade": "17.0.0-next.6", "core-js": "^3.0.0", "rxjs": "~7.8.0", "systemjs": "~0.19.39", @@ -42,7 +42,7 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular/compiler-cli": "17.0.0-next.4", + "@angular/compiler-cli": "17.0.0-next.6", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^13.2.0", "@types/angular": "^1.8.4", diff --git a/aio/tools/examples/shared/boilerplate/universal/package.json b/aio/tools/examples/shared/boilerplate/universal/package.json index 964b0c2d263658..58e6519dacf7a0 100644 --- a/aio/tools/examples/shared/boilerplate/universal/package.json +++ b/aio/tools/examples/shared/boilerplate/universal/package.json @@ -17,15 +17,15 @@ }, "private": true, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/platform-server": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/platform-server": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", "@nguniversal/express-engine": "^16.2.0", "angular-in-memory-web-api": "~0.16.0", "express": "^4.18.1", @@ -34,9 +34,9 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@nguniversal/builders": "^16.2.0", "@types/express": "^4.17.13", "@types/jasmine": "~4.3.0", diff --git a/aio/tools/examples/shared/package.json b/aio/tools/examples/shared/package.json index 79c10e4243c2e2..cccaada11986bc 100644 --- a/aio/tools/examples/shared/package.json +++ b/aio/tools/examples/shared/package.json @@ -19,19 +19,19 @@ "license": "MIT", "repository": {}, "dependencies": { - "@angular/animations": "17.0.0-next.4", - "@angular/common": "17.0.0-next.4", - "@angular/compiler": "17.0.0-next.4", - "@angular/core": "17.0.0-next.4", - "@angular/elements": "17.0.0-next.4", - "@angular/forms": "17.0.0-next.4", - "@angular/localize": "17.0.0-next.4", - "@angular/platform-browser": "17.0.0-next.4", - "@angular/platform-browser-dynamic": "17.0.0-next.4", - "@angular/platform-server": "17.0.0-next.4", - "@angular/router": "17.0.0-next.4", - "@angular/service-worker": "17.0.0-next.4", - "@angular/upgrade": "17.0.0-next.4", + "@angular/animations": "17.0.0-next.6", + "@angular/common": "17.0.0-next.6", + "@angular/compiler": "17.0.0-next.6", + "@angular/core": "17.0.0-next.6", + "@angular/elements": "17.0.0-next.6", + "@angular/forms": "17.0.0-next.6", + "@angular/localize": "17.0.0-next.6", + "@angular/platform-browser": "17.0.0-next.6", + "@angular/platform-browser-dynamic": "17.0.0-next.6", + "@angular/platform-server": "17.0.0-next.6", + "@angular/router": "17.0.0-next.6", + "@angular/service-worker": "17.0.0-next.6", + "@angular/upgrade": "17.0.0-next.6", "@nguniversal/express-engine": "^16.2.0", "angular": "^1.8.3", "angular-in-memory-web-api": "~0.16.0", @@ -45,9 +45,9 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular/cli": "17.0.0-next.4", - "@angular/compiler-cli": "17.0.0-next.4", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular/cli": "17.0.0-next.6", + "@angular/compiler-cli": "17.0.0-next.6", "@nguniversal/builders": "^16.2.0", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^13.2.0", diff --git a/aio/tools/examples/shared/yarn.lock b/aio/tools/examples/shared/yarn.lock index 7d58a63d9430c0..67f3222d408516 100644 --- a/aio/tools/examples/shared/yarn.lock +++ b/aio/tools/examples/shared/yarn.lock @@ -10,12 +10,12 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.4.tgz#aa20d981179c22d1240c7bd57899dfeffee1a522" - integrity sha512-lPRp+K+YYIHBt2k9yN0KZQG1vRm1B5x8w/Fx/+bMpjxJX5h/x3cRj+oavJUwiFneae3YX74o69kakCsRP/fWvw== +"@angular-devkit/architect@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.6.tgz#8ac2f298f4314bed29cc11da766ea86c4957a339" + integrity sha512-kSC6JwKOpbiOUn9VYdSy/u4gZRGSLl5rNPrVnLBv2A7OSDcNKMGYBzW9k9DxK6y4JW8LGArqBkitwymEoD1MWw== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" rxjs "7.8.1" "@angular-devkit/architect@~0.1602.0": @@ -26,15 +26,15 @@ "@angular-devkit/core" "16.2.1" rxjs "7.8.1" -"@angular-devkit/build-angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.4.tgz#1382c97fb021addaf7f5984333dbe7131c5e785f" - integrity sha512-k8OOeLGh01qun9QQuY3OVxDr2oZCfMogiXAemnJnbLMqwot/R4XHc6Te9l7p2yxLYgHCjJO1ldeIw4Ly65yIvA== +"@angular-devkit/build-angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.6.tgz#212bf083ca7868a0e539bc689e0292cffe62cbce" + integrity sha512-w7Ofqp4cBtdu94G9MApEzH5N50mrfpv/4na3qGWAv1uQJRzXsL5R13grNevOy88u8XXXh9vR5clSXexmzjskxw== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/build-webpack" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/build-webpack" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" "@babel/core" "7.22.17" "@babel/generator" "7.22.15" "@babel/helper-annotate-as-pure" "7.22.5" @@ -45,7 +45,7 @@ "@babel/preset-env" "7.22.15" "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.0.0-next.4" + "@ngtools/webpack" "17.0.0-next.6" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" autoprefixer "10.4.15" @@ -57,9 +57,8 @@ copy-webpack-plugin "11.0.0" critters "0.0.20" css-loader "6.8.1" - esbuild-wasm "0.19.2" + esbuild-wasm "0.19.3" fast-glob "3.3.1" - guess-parser "0.4.22" http-proxy-middleware "2.0.6" https-proxy-agent "7.0.2" inquirer "8.2.6" @@ -81,7 +80,7 @@ postcss-loader "7.3.3" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.66.1" + sass "1.67.0" sass-loader "13.3.2" semver "7.5.4" source-map-loader "4.0.1" @@ -97,14 +96,14 @@ webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.19.2" + esbuild "0.19.3" -"@angular-devkit/build-webpack@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.4.tgz#832f673afae5d26a1fef83fec00522510f1d712c" - integrity sha512-mbWL46KJoi9vYbnbCrvxIfaTkt4SowLxZaNcpOdvMVxB9KUW9a21WOMnbFO80nNfXGnbuVm0RmblpoTbbMcWgQ== +"@angular-devkit/build-webpack@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.6.tgz#b4174ab0e7bf197f6e84135b49d6249fe9e4b1db" + integrity sha512-ik+aZfDZzOW0xxBNRrf1h/0fV+O3FCVHxDlpDdhnrLiecVH78TgOHn1vHKzg2y6chSL3yYyUXeYQ3i0ttr5gtg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" rxjs "7.8.1" "@angular-devkit/core@16.2.1", "@angular-devkit/core@~16.2.0": @@ -119,10 +118,10 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/core@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.4.tgz#55f299ec9ce69841449a88fe1c349eb906c9e8f1" - integrity sha512-yiayoT0NBaajgUWxwHa723nx8xeV3Z5CjlzpV0m5IWn8pxPUqA7tAkFBAyGTuiukfIgri8iIlFkMrZrPIZyC2g== +"@angular-devkit/core@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.6.tgz#e939e86c5b74f5f8b9abbc9cdb16bb6d0998c2de" + integrity sha512-KfuXWSV9BU2dKEEpAwVJFjuvUdlqFzZD1vGqZpbXtaKnRAwqbEChy1nQJNin0E4gJ1XXFDmCv/gcGasDV3r1wg== dependencies: ajv "8.12.0" ajv-formats "2.1.1" @@ -131,33 +130,33 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.4.tgz#ac54e85eaf24a8b5e5b6dcde7f6a59f8f09e2192" - integrity sha512-hS3Wx1u4VEEXixcxDTGOhSqQixYlN3lUz3+44lGfZMJ1wr9IHnhDATywbdOf9pIebnRBpQQGlUpm7aGAG+6BHQ== +"@angular-devkit/schematics@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.6.tgz#d0155cceaa303f5d65c44431dd9bb19d36613d1e" + integrity sha512-BYS/zUuzLzJtG1ajOYzjDQZKFlbcWRuR+03huDxAQsYGF3q0li2I1xly1gZDkZudMoTgYOBcK8oBBC1PAJ2ABA== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" jsonc-parser "3.2.0" magic-string "0.30.3" ora "5.4.1" rxjs "7.8.1" -"@angular/animations@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.0-next.4.tgz#3bf66ebe2ed8aa89c5fe63e2674fb12b99026b92" - integrity sha512-ICKJjT/GS4mfWEFM8qnr8PyZwKgtyLDmjP9VHSNH0MBWJoUL9yyPpl6gjGDsLSISb283jpp/mP3FwsPD+za9eg== +"@angular/animations@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.0-next.6.tgz#8999a3fccc3873b5c449988130d4f82c48313c0e" + integrity sha512-2PClejvCAk+qR05NpJA6Na1ZN0lylAiYtRNqapQEmztZIUxXyge7VaDeVWeYJPV4XbDHe1L2KinBumUWh0qCkw== dependencies: tslib "^2.3.0" -"@angular/cli@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.4.tgz#4c211f26ca7c62bd2cce0b71de5b7446039e32b7" - integrity sha512-zeZnKZV2NpKepCNpLJOU2YlWlbdwsHpZ3g75ip/toNmdMSjuG7qAAwGb9fyRx02B7OKlkczS967LCMVU8eT5kw== +"@angular/cli@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.6.tgz#afa412bce468be376f3cfc6594aeecefb3c26403" + integrity sha512-eE5Q2D1om5Hqumh74Cj40K2Cr9d1kafH24YXHhVjU3eccSGw1UlhMIw14NmJGMJyrONX6UAwKPqvH3JR988Wvg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" - "@schematics/angular" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" + "@schematics/angular" "17.0.0-next.6" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" @@ -173,19 +172,19 @@ symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.0-next.4.tgz#29ca00fda4ef7f44b999ef199b15019b8bc5116d" - integrity sha512-xVNgTL/eADPQQVswvIfG5UMTEE9Pv/odJX0xFGtTspo4d7v9TU4mnZ/fxZ7xPvJTLpQtxBBpjxIGa5bjNVMbWQ== +"@angular/common@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.0-next.6.tgz#3adf0e686c83504790d5f40ea7541af4121261e8" + integrity sha512-3pNdd8SgvsJO1FFxA5w2jzO9yO62A+gPxDc700A01WTn34ogGL7r18VY/0dEKEVf9uUj3P6d20trYQLsrpLr4g== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.0-next.4.tgz#63e8a9e0f6ca5e84e6ba4dd4d84924e43a90d687" - integrity sha512-HBje+PcrXvrCrinVuBVY0hVNCX84uzFBYskBmTEljxMEupMSiIqBxg2nrE5RYPcnfFCNDaV+2mNDBNTRwx/Y/w== +"@angular/compiler-cli@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.0-next.6.tgz#302da650cd08538bebaee42988aa8d484c148a7e" + integrity sha512-fijhHfU17e5/CzjGLxIDptBVai/R520eTVQz1Xf4kefmk5a4Y7Wf/ACzdBEoPcG8vtZYC3y9r/HLmVSNzeFsxg== dependencies: - "@babel/core" "7.22.5" + "@babel/core" "7.22.19" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" @@ -194,83 +193,83 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.0-next.4.tgz#1281e707e16638c5047397ce9d2e03cacf52f6ed" - integrity sha512-9K0eTds+eZuop4bW3I2BzSYoXsaqjCnPnWaBZT499D3Ntc7bb+9gSVBFSPUDhs7ODrUX9yMDiQYzl8jlx3QgWg== +"@angular/compiler@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.0-next.6.tgz#3b20136532dfcd30ffa3baefafbe7f447962a688" + integrity sha512-LmCeYoIApIT8ybH1fJDGNtS9BEmKO0071Or3GKAxh0Tp2uJahxUdx6RpwtZfXxoosi8wDMvIq/uEMHvmGrIJUw== dependencies: tslib "^2.3.0" -"@angular/core@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.0-next.4.tgz#0eeda237442b2ea25793c9b246c16c03e6d1a692" - integrity sha512-xooGfs1sbEh/5RJA7i06mDmHbYSH98D7TWb/0L2kaj33SwRnlar9BqAqinFrOH3eeeN90F97iAtsZN89wCq7ZA== +"@angular/core@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.0-next.6.tgz#8158d38bc5823a0588e20fcba35b7d6d96f27708" + integrity sha512-qW2zx0RWL0sRqLTdM6eZ433A759Q8m/KdQY6TS6OqHvuX2AuwQcQRYcpEu/HD/vELIebv4avxO4iOvEjSzpVlQ== dependencies: tslib "^2.3.0" -"@angular/elements@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-17.0.0-next.4.tgz#4dde6896e0d83e8a124c3fe4c642b5f11147c8ee" - integrity sha512-n8j8UXwe3c+NXypeK7DsmE5FQZAZ96Dsfj0tY4r+y+Dk+RC3xodZpAnC1zBiKGZxfwT+0BftACiKlacIKzYqpw== +"@angular/elements@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-17.0.0-next.6.tgz#f1cb9e50190149a016c5cf17302d9f1c668b0c2e" + integrity sha512-Mm62hQ4uPJH1tWTnHKGOYILZSUQtGmLFJTha09M2hCyXVLt5XcUt3LlZwvpRQcFPao33XtC7o3V43bklE//cLA== dependencies: tslib "^2.3.0" -"@angular/forms@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.0-next.4.tgz#009c13e07e341c4c0ecd441571e57e54506d383b" - integrity sha512-02f0q1Wcz8fadjfk1NT8T+AOA5aTWA8LZ3x+zhYL5GpaAz+6NEhZzyst0mF3UkVWE8uz35xDrp0067FJmYg7hw== +"@angular/forms@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.0-next.6.tgz#66795089d8450fddda408d1cb40ae33115d2a485" + integrity sha512-kuM5M762A72lcuge9fyYEcRwrpuzld2BcAFxC+Xecu48TTkheUhtk5aIprU1/n5SD8KcXrIBaydDdQZO4laIvQ== dependencies: tslib "^2.3.0" -"@angular/localize@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.0.0-next.4.tgz#5a82945cd5e01a2ad57ee654f034edaed34dda44" - integrity sha512-k7wjOuUjE65WYqm4w6OHSe3MjW9ezJ0FCbNsrYyK5JiQ7dq1/xvvibqoNO2Zn4OZgjiwdvV7XD8DrLf1/OZa2A== +"@angular/localize@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-17.0.0-next.6.tgz#e745048aeef1a9c5519ed88e601045b634c28dfa" + integrity sha512-MQie9Ckf/HLzpqolVUgIz+CTtYePzEWkW98n3OxI3xIgXirWNhb5hogpkGap8oykuiteZWI56tEpS3s18vxryA== dependencies: - "@babel/core" "7.22.5" + "@babel/core" "7.22.19" fast-glob "3.3.1" yargs "^17.2.1" -"@angular/platform-browser-dynamic@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.0-next.4.tgz#b6ffb8f7cd6f69dd6d241bac7a7883abd2768005" - integrity sha512-mtwSFskdTKqW2xT88aG/NHm7rBWoEk/UmreNjAZxigr/uhbVa0zAcLMy6OJehbZ/6QYiR72esyCB4UK8iwoOQw== +"@angular/platform-browser-dynamic@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.0-next.6.tgz#ab4b9518e42cfbaf99ca2412641ce45aeafad57e" + integrity sha512-m7PBgM7BVhwyNqjURtk1O7C1tJ50mqHJj07zS5hPbTkoQMgjV6zWHYX4aJwUhrkKRyoWXzP1a/LzuLiBGOAPXw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.0-next.4.tgz#ac508be7b5840d2a24542f7357a5b1efd8a69887" - integrity sha512-6lb3230RgoAteNO8SrMvarrO4eftizDFhAKf3vRxD4jGt+5r8KcxOigyTIjjGhDpP6RHfqDFgVcE9bM5m2WkTQ== +"@angular/platform-browser@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.0-next.6.tgz#8494165aaeb6873bb679074a9bcc0b677b0eb28d" + integrity sha512-oKo+WOR7zr+vqhawXiM5UVkgZ2eTX3P98Y6L1riS0ER2iJIPwIaWcsLJov4eqcJv/5rZk64wPFuPw1jhanC5jw== dependencies: tslib "^2.3.0" -"@angular/platform-server@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-17.0.0-next.4.tgz#7eb6079f60af2bb52a2edfdf1dfba19c00c9ceac" - integrity sha512-gePkIyOUPk3Y+zjCxfYLuoxPmWFfc8C21J5qUlUgOHx265KjfQ+2oOSCyvCuCJLg933Aav6IeDxVjFh1l5X3BQ== +"@angular/platform-server@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-17.0.0-next.6.tgz#c84f4282237eb981becae94216c66e5cd773afa6" + integrity sha512-jpsiSxeP/xCA/qAfxqY20mEEQxYrTj5bXls4ADc0jWPUlUT2PZuWJ0DDYqLiX5D7n4g2eznm9RGIS15n8onVsQ== dependencies: tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.0-next.4.tgz#b2a021818d6b623b0f0738477076c094c5e89d3f" - integrity sha512-/cg1GkJGbU7rc7eOu8tJXiWFcDqs4wAQ60wlcIxPy3/a/+NKhWdm5IPGp+1xgPky3L4X0t3Zu+mV/eDu6ZE8ug== +"@angular/router@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.0-next.6.tgz#f6663319e972a0ba972b83aaf16b05b3736f1d37" + integrity sha512-hckzhc8l71kAuhn1+XHRZIY/zcdXAmzAwxhEIJ0BdHps6wsYERSamS5QGfajFsexgUvEaPfrRbE7OpnFa4Bpog== dependencies: tslib "^2.3.0" -"@angular/service-worker@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.0-next.4.tgz#b7f45c45a0e5cb0d542727c4f54c62aca13f3a96" - integrity sha512-uDvG0NvR3cCTntXm0vLooMbMBgq9DeETcmdtj/glNaJJ1GcpcPhySA8GkBjg3dGZHtJuJb5/pxsf4AaEPuMwcw== +"@angular/service-worker@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.0-next.6.tgz#e711d9997f420acc52f8311e07bbd88c0089eab5" + integrity sha512-bgWwdZrziR/md+az52Kqlg7nRjk0PpMyNAuKnwAcu5t9QOgGDvcy6VglM4WowzJWQYO2yUFt0aFBNmkCyaYe3A== dependencies: tslib "^2.3.0" -"@angular/upgrade@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-17.0.0-next.4.tgz#95e30d3b4a798f10d9d05e98d4164151c2f151ce" - integrity sha512-eDhI4N28dgYuq1YgFvK+RtVPLVMUJLDS1l/6MSzB3kXm7VzYv1X7ViN/ySRQ2HZaxeV9W1LS485HDHZnpGqtnA== +"@angular/upgrade@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-17.0.0-next.6.tgz#6e727e955fa0255782eb200ea631e78969e1ee50" + integrity sha512-dnJM3aKbQzthtIo9FYEd+4d+2SVaprgVT4n5IcQOd5yKStNG306ndPjmPRXPoKnAQ/9AA4JeZJqJ7O74jRn3Gw== dependencies: tslib "^2.3.0" @@ -313,26 +312,26 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== +"@babel/core@7.22.19": + version "7.22.19" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.19.tgz#b38162460a6f3baf2a424bda720b24a8aafea241" + integrity sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.19" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.19" + "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/core@^7.12.3": version "7.22.11" @@ -365,7 +364,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.22.5": +"@babel/generator@^7.22.10": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== @@ -375,6 +374,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@7.22.5", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -446,6 +455,11 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-environment-visitor@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" @@ -459,6 +473,14 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -498,6 +520,17 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.15" +"@babel/helper-module-transforms@^7.22.19": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" @@ -570,6 +603,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" @@ -594,7 +632,7 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.10" -"@babel/helpers@^7.22.11", "@babel/helpers@^7.22.5": +"@babel/helpers@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== @@ -631,6 +669,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" @@ -1311,7 +1354,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.22.11", "@babel/traverse@^7.22.5": +"@babel/traverse@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== @@ -1343,6 +1386,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.19": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" @@ -1361,6 +1420,15 @@ "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" +"@babel/types@^7.22.19", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1383,220 +1451,220 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz#bc35990f412a749e948b792825eef7df0ce0e073" - integrity sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw== +"@esbuild/android-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" + integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.2.tgz#edd1c8f23ba353c197f5b0337123c58ff2a56999" - integrity sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q== +"@esbuild/android-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" + integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.2.tgz#2dcdd6e6f1f2d82ea1b746abd8da5b284960f35a" - integrity sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w== +"@esbuild/android-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" + integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz#55b36bc06d76f5c243987c1f93a11a80d8fc3b26" - integrity sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA== +"@esbuild/darwin-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" + integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz#982524af33a6424a3b5cb44bbd52559623ad719c" - integrity sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw== +"@esbuild/darwin-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" + integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz#8e478a0856645265fe79eac4b31b52193011ee06" - integrity sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ== +"@esbuild/freebsd-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" + integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz#01b96604f2540db023c73809bb8ae6cd1692d6f3" - integrity sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw== +"@esbuild/freebsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" + integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz#7e5d2c7864c5c83ec789b59c77cd9c20d2594916" - integrity sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg== +"@esbuild/linux-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" + integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz#c32ae97bc0246664a1cfbdb4a98e7b006d7db8ae" - integrity sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg== +"@esbuild/linux-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" + integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz#3fc4f0fa026057fe885e4a180b3956e704f1ceaa" - integrity sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ== +"@esbuild/linux-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" + integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz#633bcaea443f3505fb0ed109ab840c99ad3451a4" - integrity sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw== +"@esbuild/linux-loong64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" + integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz#e0bff2898c46f52be7d4dbbcca8b887890805823" - integrity sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg== +"@esbuild/linux-mips64el@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" + integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz#d75798da391f54a9674f8c143b9a52d1dbfbfdde" - integrity sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw== +"@esbuild/linux-ppc64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" + integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz#012409bd489ed1bb9b775541d4a46c5ded8e6dd8" - integrity sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw== +"@esbuild/linux-riscv64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" + integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz#ece3ed75c5a150de8a5c110f02e97d315761626b" - integrity sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g== +"@esbuild/linux-s390x@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" + integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz#dea187019741602d57aaf189a80abba261fbd2aa" - integrity sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ== +"@esbuild/linux-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" + integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz#bbfd7cf9ab236a23ee3a41b26f0628c57623d92a" - integrity sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ== +"@esbuild/netbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" + integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz#fa5c4c6ee52a360618f00053652e2902e1d7b4a7" - integrity sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw== +"@esbuild/openbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" + integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz#52a2ac8ac6284c02d25df22bb4cfde26fbddd68d" - integrity sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw== +"@esbuild/sunos-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" + integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz#719ed5870855de8537aef8149694a97d03486804" - integrity sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg== +"@esbuild/win32-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" + integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz#24832223880b0f581962c8660f8fb8797a1e046a" - integrity sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA== +"@esbuild/win32-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" + integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz#1205014625790c7ff0e471644a878a65d1e34ab0" - integrity sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw== +"@esbuild/win32-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" + integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== "@isaacs/cliui@^8.0.2": version "8.0.2" @@ -1679,10 +1747,10 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@ngtools/webpack@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.4.tgz#e65fd3ee7ee8ab0f1d4c72985b4707e69656ade1" - integrity sha512-XI5mSPloaMsj5zmBQ6QBEhg//OaMxfpNdsPg4EfldbdzwZ8lIS+yD3eoNaX74mkLc0gixgzOVQ6eW2nxsQlvng== +"@ngtools/webpack@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.6.tgz#450f8c1dcc448f6fd8a30e313d0735cd21b803c8" + integrity sha512-xsWk3iwoSvkl3ZSrN8jbLJZPKVPk8Ge7bnD6pzZDokjtl8ApcXatGd0NBqCQDr+lfV+ZdhVGJ5xfBiyGzEeSzw== "@nguniversal/builders@^16.2.0": version "16.2.0" @@ -1848,13 +1916,13 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@schematics/angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.4.tgz#d419002a22089449c92a1ddbf088222806974154" - integrity sha512-9gnR8xoPEUJN4tQcH/yysfXP/4Bbm0f4g6VVnAvOdunwo+u5bucz21MacMqbVvMAFQA92neeFn6m8yb1VTQVHA== +"@schematics/angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.6.tgz#d05b45ad27470c14ada1eef15fa653707aff8913" + integrity sha512-hDDwlWKJhOWKY/+hz8yp/hEDi4ITQO6WYx1al6bfmvf8QOZ4o4HiuW4YSck03XxtCQ0AMTcPBpoYvRNbYWpYRQ== dependencies: - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" jsonc-parser "3.2.0" "@sigstore/bundle@^2.1.0": @@ -3910,38 +3978,38 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -esbuild-wasm@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.2.tgz#046c39a6ef28b937fd8f847edaf767f32ca02ffc" - integrity sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw== +esbuild-wasm@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.3.tgz#9ac844d4b542ad33a81be7cb32ba1d451522cee6" + integrity sha512-Vx94kkrz9CwaYutautk+RhIvwhcpawSRmKD/zz6n3wQqJgBzaMRVZaF9eAuVseXwOmfJexSGmwwgToQ1uAoOjg== -esbuild@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" - integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== +esbuild@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" + integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== optionalDependencies: - "@esbuild/android-arm" "0.19.2" - "@esbuild/android-arm64" "0.19.2" - "@esbuild/android-x64" "0.19.2" - "@esbuild/darwin-arm64" "0.19.2" - "@esbuild/darwin-x64" "0.19.2" - "@esbuild/freebsd-arm64" "0.19.2" - "@esbuild/freebsd-x64" "0.19.2" - "@esbuild/linux-arm" "0.19.2" - "@esbuild/linux-arm64" "0.19.2" - "@esbuild/linux-ia32" "0.19.2" - "@esbuild/linux-loong64" "0.19.2" - "@esbuild/linux-mips64el" "0.19.2" - "@esbuild/linux-ppc64" "0.19.2" - "@esbuild/linux-riscv64" "0.19.2" - "@esbuild/linux-s390x" "0.19.2" - "@esbuild/linux-x64" "0.19.2" - "@esbuild/netbsd-x64" "0.19.2" - "@esbuild/openbsd-x64" "0.19.2" - "@esbuild/sunos-x64" "0.19.2" - "@esbuild/win32-arm64" "0.19.2" - "@esbuild/win32-ia32" "0.19.2" - "@esbuild/win32-x64" "0.19.2" + "@esbuild/android-arm" "0.19.3" + "@esbuild/android-arm64" "0.19.3" + "@esbuild/android-x64" "0.19.3" + "@esbuild/darwin-arm64" "0.19.3" + "@esbuild/darwin-x64" "0.19.3" + "@esbuild/freebsd-arm64" "0.19.3" + "@esbuild/freebsd-x64" "0.19.3" + "@esbuild/linux-arm" "0.19.3" + "@esbuild/linux-arm64" "0.19.3" + "@esbuild/linux-ia32" "0.19.3" + "@esbuild/linux-loong64" "0.19.3" + "@esbuild/linux-mips64el" "0.19.3" + "@esbuild/linux-ppc64" "0.19.3" + "@esbuild/linux-riscv64" "0.19.3" + "@esbuild/linux-s390x" "0.19.3" + "@esbuild/linux-x64" "0.19.3" + "@esbuild/netbsd-x64" "0.19.3" + "@esbuild/openbsd-x64" "0.19.3" + "@esbuild/sunos-x64" "0.19.3" + "@esbuild/win32-arm64" "0.19.3" + "@esbuild/win32-ia32" "0.19.3" + "@esbuild/win32-x64" "0.19.3" esbuild@^0.18.10: version "0.18.20" @@ -4521,7 +4589,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -guess-parser@0.4.22, guess-parser@^0.4.22: +guess-parser@^0.4.22: version "0.4.22" resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== @@ -5385,7 +5453,7 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.1.2, json5@^2.2.2, json5@^2.2.3: +json5@^2.1.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -7088,10 +7156,10 @@ sass-loader@13.3.2: dependencies: neo-async "^2.6.2" -sass@1.66.1: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== +sass@1.67.0: + version "1.67.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.67.0.tgz#fed84d74b9cd708db603b1380d6dc1f71bb24f6f" + integrity sha512-SVrO9ZeX/QQyEGtuZYCVxoeAL5vGlYjJ9p4i4HFuekWl8y/LtJ7tJc10Z+ck1c8xOuoBm2MYzcLfTAffD0pl/A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" diff --git a/aio/yarn.lock b/aio/yarn.lock index b28ba31fda5fe9..b7432848b82ff4 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -15,35 +15,35 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect-cli@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1700.0-next.4.tgz#254c9b8b7446d0209f2ab8b02a58c218c647eaa9" - integrity sha512-TTep0pu3YuX3B5gZB8sD8U8Ma47z4jFSq4PlYPOBirP9ls1156CTRLqpzSZHo1Xo9WxDvdW5jwmavgu6L/iYHA== +"@angular-devkit/architect-cli@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect-cli/-/architect-cli-0.1700.0-next.6.tgz#4a1693a44d85eedffffc1204400b048b62314053" + integrity sha512-ViQTa5UzOWQzmAj2NqNdOJzPY8JeN8yoEQqFP96GtZDPM49FHnXNJtfYdRBUzUi05yndDYLJ9G+oOOxncByntg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" ansi-colors "4.1.3" progress "2.0.3" symbol-observable "4.0.0" yargs-parser "21.1.1" -"@angular-devkit/architect@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.4.tgz#aa20d981179c22d1240c7bd57899dfeffee1a522" - integrity sha512-lPRp+K+YYIHBt2k9yN0KZQG1vRm1B5x8w/Fx/+bMpjxJX5h/x3cRj+oavJUwiFneae3YX74o69kakCsRP/fWvw== +"@angular-devkit/architect@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.6.tgz#8ac2f298f4314bed29cc11da766ea86c4957a339" + integrity sha512-kSC6JwKOpbiOUn9VYdSy/u4gZRGSLl5rNPrVnLBv2A7OSDcNKMGYBzW9k9DxK6y4JW8LGArqBkitwymEoD1MWw== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" rxjs "7.8.1" -"@angular-devkit/build-angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.4.tgz#1382c97fb021addaf7f5984333dbe7131c5e785f" - integrity sha512-k8OOeLGh01qun9QQuY3OVxDr2oZCfMogiXAemnJnbLMqwot/R4XHc6Te9l7p2yxLYgHCjJO1ldeIw4Ly65yIvA== +"@angular-devkit/build-angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.6.tgz#212bf083ca7868a0e539bc689e0292cffe62cbce" + integrity sha512-w7Ofqp4cBtdu94G9MApEzH5N50mrfpv/4na3qGWAv1uQJRzXsL5R13grNevOy88u8XXXh9vR5clSXexmzjskxw== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/build-webpack" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/build-webpack" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" "@babel/core" "7.22.17" "@babel/generator" "7.22.15" "@babel/helper-annotate-as-pure" "7.22.5" @@ -54,7 +54,7 @@ "@babel/preset-env" "7.22.15" "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.0.0-next.4" + "@ngtools/webpack" "17.0.0-next.6" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" autoprefixer "10.4.15" @@ -66,9 +66,8 @@ copy-webpack-plugin "11.0.0" critters "0.0.20" css-loader "6.8.1" - esbuild-wasm "0.19.2" + esbuild-wasm "0.19.3" fast-glob "3.3.1" - guess-parser "0.4.22" http-proxy-middleware "2.0.6" https-proxy-agent "7.0.2" inquirer "8.2.6" @@ -90,7 +89,7 @@ postcss-loader "7.3.3" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.66.1" + sass "1.67.0" sass-loader "13.3.2" semver "7.5.4" source-map-loader "4.0.1" @@ -106,20 +105,20 @@ webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.19.2" + esbuild "0.19.3" -"@angular-devkit/build-webpack@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.4.tgz#832f673afae5d26a1fef83fec00522510f1d712c" - integrity sha512-mbWL46KJoi9vYbnbCrvxIfaTkt4SowLxZaNcpOdvMVxB9KUW9a21WOMnbFO80nNfXGnbuVm0RmblpoTbbMcWgQ== +"@angular-devkit/build-webpack@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.6.tgz#b4174ab0e7bf197f6e84135b49d6249fe9e4b1db" + integrity sha512-ik+aZfDZzOW0xxBNRrf1h/0fV+O3FCVHxDlpDdhnrLiecVH78TgOHn1vHKzg2y6chSL3yYyUXeYQ3i0ttr5gtg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" rxjs "7.8.1" -"@angular-devkit/core@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.4.tgz#55f299ec9ce69841449a88fe1c349eb906c9e8f1" - integrity sha512-yiayoT0NBaajgUWxwHa723nx8xeV3Z5CjlzpV0m5IWn8pxPUqA7tAkFBAyGTuiukfIgri8iIlFkMrZrPIZyC2g== +"@angular-devkit/core@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.6.tgz#e939e86c5b74f5f8b9abbc9cdb16bb6d0998c2de" + integrity sha512-KfuXWSV9BU2dKEEpAwVJFjuvUdlqFzZD1vGqZpbXtaKnRAwqbEChy1nQJNin0E4gJ1XXFDmCv/gcGasDV3r1wg== dependencies: ajv "8.12.0" ajv-formats "2.1.1" @@ -128,12 +127,12 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.4.tgz#ac54e85eaf24a8b5e5b6dcde7f6a59f8f09e2192" - integrity sha512-hS3Wx1u4VEEXixcxDTGOhSqQixYlN3lUz3+44lGfZMJ1wr9IHnhDATywbdOf9pIebnRBpQQGlUpm7aGAG+6BHQ== +"@angular-devkit/schematics@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.6.tgz#d0155cceaa303f5d65c44431dd9bb19d36613d1e" + integrity sha512-BYS/zUuzLzJtG1ajOYzjDQZKFlbcWRuR+03huDxAQsYGF3q0li2I1xly1gZDkZudMoTgYOBcK8oBBC1PAJ2ABA== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" jsonc-parser "3.2.0" magic-string "0.30.3" ora "5.4.1" @@ -193,10 +192,10 @@ "@angular-eslint/bundled-angular-compiler" "16.0.3" "@typescript-eslint/utils" "5.59.7" -"@angular/animations@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.0-next.4.tgz#3bf66ebe2ed8aa89c5fe63e2674fb12b99026b92" - integrity sha512-ICKJjT/GS4mfWEFM8qnr8PyZwKgtyLDmjP9VHSNH0MBWJoUL9yyPpl6gjGDsLSISb283jpp/mP3FwsPD+za9eg== +"@angular/animations@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-17.0.0-next.6.tgz#8999a3fccc3873b5c449988130d4f82c48313c0e" + integrity sha512-2PClejvCAk+qR05NpJA6Na1ZN0lylAiYtRNqapQEmztZIUxXyge7VaDeVWeYJPV4XbDHe1L2KinBumUWh0qCkw== dependencies: tslib "^2.3.0" @@ -208,12 +207,11 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8": - version "0.0.0-ba9b4487ced515e5b4d87edd681a3bd9792444d6" - uid "9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6": + version "0.0.0-9b1adb2ad5a049ea9985734f197dca43dd4d3f1b" + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6" dependencies: - "@angular-devkit/build-angular" "17.0.0-next.4" + "@angular-devkit/build-angular" "17.0.0-next.6" "@angular/benchpress" "0.3.0" "@babel/core" "^7.16.0" "@babel/helper-annotate-as-pure" "^7.18.6" @@ -225,7 +223,7 @@ "@bazel/runfiles" "5.8.1" "@bazel/terser" "5.8.1" "@bazel/typescript" "5.8.1" - "@microsoft/api-extractor" "7.36.4" + "@microsoft/api-extractor" "7.38.0" "@types/browser-sync" "^2.26.3" "@types/marked" "^5.0.1" "@types/node" "16.10.9" @@ -233,7 +231,7 @@ "@types/send" "^0.17.1" "@types/tmp" "^0.2.1" "@types/uuid" "^9.0.0" - "@types/ws" "8.5.5" + "@types/ws" "8.5.6" "@types/yargs" "^17.0.0" browser-sync "^2.27.7" clang-format "1.8.0" @@ -242,7 +240,7 @@ preact-render-to-string "^6.2.1" prettier "3.0.3" protractor "^7.0.0" - selenium-webdriver "4.12.0" + selenium-webdriver "4.13.0" send "^0.18.0" source-map "^0.7.4" tmp "^0.2.1" @@ -252,24 +250,24 @@ uuid "^9.0.0" yargs "^17.0.0" -"@angular/cdk@17.0.0-next.3": - version "17.0.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.0-next.3.tgz#e1478bfc5b452b6fffd30be84421bf71d6777b10" - integrity sha512-oGGdzj2kEEC9BuLMRWnNlyDNKZ4TutdaFj6LHYTUYk2yDe5VdpI8A86PcVXjh7vafVGbnfNZwGG4HnF4YVlpoQ== +"@angular/cdk@17.0.0-next.5": + version "17.0.0-next.5" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.0-next.5.tgz#df8fec7dad4e1c39ba618fdeae90a0101291cf12" + integrity sha512-liDR9yAXuO67y0SuOiDMXAt+DPqY/DLF8sCjYWLSzQf6qCyE293QWQfRBkxxtrADVCNX2Gvk6NtYpeyqG//Xrg== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.4.tgz#4c211f26ca7c62bd2cce0b71de5b7446039e32b7" - integrity sha512-zeZnKZV2NpKepCNpLJOU2YlWlbdwsHpZ3g75ip/toNmdMSjuG7qAAwGb9fyRx02B7OKlkczS967LCMVU8eT5kw== +"@angular/cli@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.6.tgz#afa412bce468be376f3cfc6594aeecefb3c26403" + integrity sha512-eE5Q2D1om5Hqumh74Cj40K2Cr9d1kafH24YXHhVjU3eccSGw1UlhMIw14NmJGMJyrONX6UAwKPqvH3JR988Wvg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" - "@schematics/angular" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" + "@schematics/angular" "17.0.0-next.6" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" @@ -285,19 +283,19 @@ symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.0-next.4.tgz#29ca00fda4ef7f44b999ef199b15019b8bc5116d" - integrity sha512-xVNgTL/eADPQQVswvIfG5UMTEE9Pv/odJX0xFGtTspo4d7v9TU4mnZ/fxZ7xPvJTLpQtxBBpjxIGa5bjNVMbWQ== +"@angular/common@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-17.0.0-next.6.tgz#3adf0e686c83504790d5f40ea7541af4121261e8" + integrity sha512-3pNdd8SgvsJO1FFxA5w2jzO9yO62A+gPxDc700A01WTn34ogGL7r18VY/0dEKEVf9uUj3P6d20trYQLsrpLr4g== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.0-next.4.tgz#63e8a9e0f6ca5e84e6ba4dd4d84924e43a90d687" - integrity sha512-HBje+PcrXvrCrinVuBVY0hVNCX84uzFBYskBmTEljxMEupMSiIqBxg2nrE5RYPcnfFCNDaV+2mNDBNTRwx/Y/w== +"@angular/compiler-cli@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-17.0.0-next.6.tgz#302da650cd08538bebaee42988aa8d484c148a7e" + integrity sha512-fijhHfU17e5/CzjGLxIDptBVai/R520eTVQz1Xf4kefmk5a4Y7Wf/ACzdBEoPcG8vtZYC3y9r/HLmVSNzeFsxg== dependencies: - "@babel/core" "7.22.5" + "@babel/core" "7.22.19" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" @@ -306,17 +304,17 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.0-next.4.tgz#1281e707e16638c5047397ce9d2e03cacf52f6ed" - integrity sha512-9K0eTds+eZuop4bW3I2BzSYoXsaqjCnPnWaBZT499D3Ntc7bb+9gSVBFSPUDhs7ODrUX9yMDiQYzl8jlx3QgWg== +"@angular/compiler@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-17.0.0-next.6.tgz#3b20136532dfcd30ffa3baefafbe7f447962a688" + integrity sha512-LmCeYoIApIT8ybH1fJDGNtS9BEmKO0071Or3GKAxh0Tp2uJahxUdx6RpwtZfXxoosi8wDMvIq/uEMHvmGrIJUw== dependencies: tslib "^2.3.0" -"@angular/core@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.0-next.4.tgz#0eeda237442b2ea25793c9b246c16c03e6d1a692" - integrity sha512-xooGfs1sbEh/5RJA7i06mDmHbYSH98D7TWb/0L2kaj33SwRnlar9BqAqinFrOH3eeeN90F97iAtsZN89wCq7ZA== +"@angular/core@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-17.0.0-next.6.tgz#8158d38bc5823a0588e20fcba35b7d6d96f27708" + integrity sha512-qW2zx0RWL0sRqLTdM6eZ433A759Q8m/KdQY6TS6OqHvuX2AuwQcQRYcpEu/HD/vELIebv4avxO4iOvEjSzpVlQ== dependencies: tslib "^2.3.0" @@ -327,99 +325,99 @@ dependencies: tslib "^2.3.0" -"@angular/elements@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-17.0.0-next.4.tgz#4dde6896e0d83e8a124c3fe4c642b5f11147c8ee" - integrity sha512-n8j8UXwe3c+NXypeK7DsmE5FQZAZ96Dsfj0tY4r+y+Dk+RC3xodZpAnC1zBiKGZxfwT+0BftACiKlacIKzYqpw== +"@angular/elements@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-17.0.0-next.6.tgz#f1cb9e50190149a016c5cf17302d9f1c668b0c2e" + integrity sha512-Mm62hQ4uPJH1tWTnHKGOYILZSUQtGmLFJTha09M2hCyXVLt5XcUt3LlZwvpRQcFPao33XtC7o3V43bklE//cLA== dependencies: tslib "^2.3.0" -"@angular/forms@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.0-next.4.tgz#009c13e07e341c4c0ecd441571e57e54506d383b" - integrity sha512-02f0q1Wcz8fadjfk1NT8T+AOA5aTWA8LZ3x+zhYL5GpaAz+6NEhZzyst0mF3UkVWE8uz35xDrp0067FJmYg7hw== +"@angular/forms@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-17.0.0-next.6.tgz#66795089d8450fddda408d1cb40ae33115d2a485" + integrity sha512-kuM5M762A72lcuge9fyYEcRwrpuzld2BcAFxC+Xecu48TTkheUhtk5aIprU1/n5SD8KcXrIBaydDdQZO4laIvQ== dependencies: tslib "^2.3.0" -"@angular/material@17.0.0-next.3": - version "17.0.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.0-next.3.tgz#9c872bf85b9b3ed7b67242fd809dff9b545ea8b9" - integrity sha512-V7IB9lXM/Gd1NkmsBuIb+YiOvQShVmH3cUQpcOjkG4zt1Mfcwyg2y+eRGqmdh2nWr4zUZ06WQxoNkqouzNJZcA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/auto-init" "15.0.0-canary.bc9ae6c9c.0" - "@material/banner" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/card" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/chips" "15.0.0-canary.bc9ae6c9c.0" - "@material/circular-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/data-table" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dialog" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/drawer" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/fab" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/form-field" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/image-list" "15.0.0-canary.bc9ae6c9c.0" - "@material/layout-grid" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/radio" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/segmented-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/select" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/slider" "15.0.0-canary.bc9ae6c9c.0" - "@material/snackbar" "15.0.0-canary.bc9ae6c9c.0" - "@material/switch" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-bar" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" - "@material/textfield" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tooltip" "15.0.0-canary.bc9ae6c9c.0" - "@material/top-app-bar" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@angular/material@17.0.0-next.5": + version "17.0.0-next.5" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.0-next.5.tgz#1e67e3d6599bd18ac599f804e396a4692e7d2372" + integrity sha512-dlyTJlJ48DsddiX/GLQVsz4Vkw0QdDeEZtyTn5CpWTuPP3aQ1Jb3lpt9CCVmyCwcsCneSNmFMyJLRKlDt61shQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/auto-init" "15.0.0-canary.a246a4439.0" + "@material/banner" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/card" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/chips" "15.0.0-canary.a246a4439.0" + "@material/circular-progress" "15.0.0-canary.a246a4439.0" + "@material/data-table" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dialog" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/drawer" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/fab" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/form-field" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/image-list" "15.0.0-canary.a246a4439.0" + "@material/layout-grid" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/linear-progress" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/radio" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/segmented-button" "15.0.0-canary.a246a4439.0" + "@material/select" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/slider" "15.0.0-canary.a246a4439.0" + "@material/snackbar" "15.0.0-canary.a246a4439.0" + "@material/switch" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" + "@material/tab-bar" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/tab-scroller" "15.0.0-canary.a246a4439.0" + "@material/textfield" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tooltip" "15.0.0-canary.a246a4439.0" + "@material/top-app-bar" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.0-next.4.tgz#b6ffb8f7cd6f69dd6d241bac7a7883abd2768005" - integrity sha512-mtwSFskdTKqW2xT88aG/NHm7rBWoEk/UmreNjAZxigr/uhbVa0zAcLMy6OJehbZ/6QYiR72esyCB4UK8iwoOQw== +"@angular/platform-browser-dynamic@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.0.0-next.6.tgz#ab4b9518e42cfbaf99ca2412641ce45aeafad57e" + integrity sha512-m7PBgM7BVhwyNqjURtk1O7C1tJ50mqHJj07zS5hPbTkoQMgjV6zWHYX4aJwUhrkKRyoWXzP1a/LzuLiBGOAPXw== dependencies: tslib "^2.3.0" -"@angular/platform-browser@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.0-next.4.tgz#ac508be7b5840d2a24542f7357a5b1efd8a69887" - integrity sha512-6lb3230RgoAteNO8SrMvarrO4eftizDFhAKf3vRxD4jGt+5r8KcxOigyTIjjGhDpP6RHfqDFgVcE9bM5m2WkTQ== +"@angular/platform-browser@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-17.0.0-next.6.tgz#8494165aaeb6873bb679074a9bcc0b677b0eb28d" + integrity sha512-oKo+WOR7zr+vqhawXiM5UVkgZ2eTX3P98Y6L1riS0ER2iJIPwIaWcsLJov4eqcJv/5rZk64wPFuPw1jhanC5jw== dependencies: tslib "^2.3.0" -"@angular/router@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.0-next.4.tgz#b2a021818d6b623b0f0738477076c094c5e89d3f" - integrity sha512-/cg1GkJGbU7rc7eOu8tJXiWFcDqs4wAQ60wlcIxPy3/a/+NKhWdm5IPGp+1xgPky3L4X0t3Zu+mV/eDu6ZE8ug== +"@angular/router@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-17.0.0-next.6.tgz#f6663319e972a0ba972b83aaf16b05b3736f1d37" + integrity sha512-hckzhc8l71kAuhn1+XHRZIY/zcdXAmzAwxhEIJ0BdHps6wsYERSamS5QGfajFsexgUvEaPfrRbE7OpnFa4Bpog== dependencies: tslib "^2.3.0" -"@angular/service-worker@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.0-next.4.tgz#b7f45c45a0e5cb0d542727c4f54c62aca13f3a96" - integrity sha512-uDvG0NvR3cCTntXm0vLooMbMBgq9DeETcmdtj/glNaJJ1GcpcPhySA8GkBjg3dGZHtJuJb5/pxsf4AaEPuMwcw== +"@angular/service-worker@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-17.0.0-next.6.tgz#e711d9997f420acc52f8311e07bbd88c0089eab5" + integrity sha512-bgWwdZrziR/md+az52Kqlg7nRjk0PpMyNAuKnwAcu5t9QOgGDvcy6VglM4WowzJWQYO2yUFt0aFBNmkCyaYe3A== dependencies: tslib "^2.3.0" @@ -472,26 +470,26 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89" - integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg== +"@babel/core@7.22.19": + version "7.22.19" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.19.tgz#b38162460a6f3baf2a424bda720b24a8aafea241" + integrity sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helpers" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.19" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.19" + "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.22.11" @@ -524,7 +522,7 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.22.5": +"@babel/generator@^7.22.10": version "7.22.10" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== @@ -534,6 +532,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@7.22.5", "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -610,6 +618,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + "@babel/helper-function-name@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" @@ -618,6 +631,14 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -657,6 +678,17 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.15" +"@babel/helper-module-transforms@^7.22.19": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": version "7.22.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" @@ -729,6 +761,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + "@babel/helper-validator-identifier@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" @@ -753,7 +790,7 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.10" -"@babel/helpers@^7.22.11", "@babel/helpers@^7.22.5": +"@babel/helpers@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== @@ -790,6 +827,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" @@ -1488,7 +1530,7 @@ "@babel/parser" "^7.22.5" "@babel/types" "^7.22.5" -"@babel/traverse@^7.22.11", "@babel/traverse@^7.22.5": +"@babel/traverse@^7.22.11": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== @@ -1520,6 +1562,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.22.19": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": version "7.22.11" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" @@ -1538,6 +1596,15 @@ "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" +"@babel/types@^7.22.19", "@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@bazel/bazelisk@^1.7.5": version "1.18.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.18.0.tgz#90ea8fc432ac6a7c83020e47a4bf59cfa2c81020" @@ -1657,220 +1724,220 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz#bc35990f412a749e948b792825eef7df0ce0e073" - integrity sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw== +"@esbuild/android-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" + integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.2.tgz#edd1c8f23ba353c197f5b0337123c58ff2a56999" - integrity sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q== +"@esbuild/android-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" + integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.2.tgz#2dcdd6e6f1f2d82ea1b746abd8da5b284960f35a" - integrity sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w== +"@esbuild/android-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" + integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz#55b36bc06d76f5c243987c1f93a11a80d8fc3b26" - integrity sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA== +"@esbuild/darwin-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" + integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz#982524af33a6424a3b5cb44bbd52559623ad719c" - integrity sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw== +"@esbuild/darwin-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" + integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz#8e478a0856645265fe79eac4b31b52193011ee06" - integrity sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ== +"@esbuild/freebsd-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" + integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz#01b96604f2540db023c73809bb8ae6cd1692d6f3" - integrity sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw== +"@esbuild/freebsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" + integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz#7e5d2c7864c5c83ec789b59c77cd9c20d2594916" - integrity sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg== +"@esbuild/linux-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" + integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz#c32ae97bc0246664a1cfbdb4a98e7b006d7db8ae" - integrity sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg== +"@esbuild/linux-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" + integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz#3fc4f0fa026057fe885e4a180b3956e704f1ceaa" - integrity sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ== +"@esbuild/linux-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" + integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz#633bcaea443f3505fb0ed109ab840c99ad3451a4" - integrity sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw== +"@esbuild/linux-loong64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" + integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz#e0bff2898c46f52be7d4dbbcca8b887890805823" - integrity sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg== +"@esbuild/linux-mips64el@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" + integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz#d75798da391f54a9674f8c143b9a52d1dbfbfdde" - integrity sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw== +"@esbuild/linux-ppc64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" + integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz#012409bd489ed1bb9b775541d4a46c5ded8e6dd8" - integrity sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw== +"@esbuild/linux-riscv64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" + integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz#ece3ed75c5a150de8a5c110f02e97d315761626b" - integrity sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g== +"@esbuild/linux-s390x@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" + integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz#dea187019741602d57aaf189a80abba261fbd2aa" - integrity sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ== +"@esbuild/linux-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" + integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz#bbfd7cf9ab236a23ee3a41b26f0628c57623d92a" - integrity sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ== +"@esbuild/netbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" + integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz#fa5c4c6ee52a360618f00053652e2902e1d7b4a7" - integrity sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw== +"@esbuild/openbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" + integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz#52a2ac8ac6284c02d25df22bb4cfde26fbddd68d" - integrity sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw== +"@esbuild/sunos-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" + integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz#719ed5870855de8537aef8149694a97d03486804" - integrity sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg== +"@esbuild/win32-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" + integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz#24832223880b0f581962c8660f8fb8797a1e046a" - integrity sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA== +"@esbuild/win32-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" + integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz#1205014625790c7ff0e471644a878a65d1e34ab0" - integrity sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw== +"@esbuild/win32-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" + integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -2079,728 +2146,728 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@material/animation@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz#7c27a42b027fcc2cd9a97c9d3b8f54a16b47333d" - integrity sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw== +"@material/animation@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.a246a4439.0.tgz#bb7a8dc450e99be4f3c3ef4ace206b44ee1a9162" + integrity sha512-0eV06UGYeuFwC/4t+yjg3LCRGRLq72ybBtJYzcBDpP4ASTjie0WmpAOFJYXRq2U5X/yxLviDMhpRemoSUjgZ0Q== dependencies: tslib "^2.1.0" -"@material/auto-init@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz#9536732573cbe3db9613683496884592387c1e7b" - integrity sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA== +"@material/auto-init@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.a246a4439.0.tgz#b5235074cd8ec08a2c28f2b2be1a452a173c4e98" + integrity sha512-0QfmjT5elQ10hCxToVgq/WaC3301tVH1sJaO3O2yocVzr7s6iWm8/zch16V5hcHzQHbtcT3Rf4y1ZzmdNys2Iw== dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/banner@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz#5b1053ebc4a07bfb5f92f6b457e87cd15ed6ebf7" - integrity sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/banner@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.a246a4439.0.tgz#0e9dfb1063b9746b5420579c7a1cc736c589aba9" + integrity sha512-PBLgH7JEbEpTkLy33oyWXUhIFmSsdOrR6Gn6qIgQRo1qrnk5RSBGW2gEq4Z6793vjxM107gKudDb23E4Fcu4vg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/base@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz#99f7243759cc6833707f0bb555db723ea78b9eff" - integrity sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg== +"@material/base@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.a246a4439.0.tgz#a4b013e184d60969c3d27d04925f8a4dbd4a6683" + integrity sha512-/ob3v3IFU8q2gGdVNWw5kNPjW2mRTeBIz1YdhGWUmRxKn2Kl8bdLOvrAmZtQMmPn/4cGXvinxpec/zVBWQKDkA== dependencies: tslib "^2.1.0" -"@material/button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz#adb43ffb0bf57cd634a0c31b6a5f26123e78c2c8" - integrity sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw== - dependencies: - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.a246a4439.0.tgz#84676925fe6da5367b759c4ce9a585f7cbc96416" + integrity sha512-rGpVRde0Aqhv2t9QvT8Zl3HvG89BeUNPOpgfpaLBZ4SGGAO4rIrckl/eCENibKgmmdCKcYZlG9gc5abQVPfUvw== + dependencies: + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/card@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz#772ba3d7397335740c3c2058f039be82696aa884" - integrity sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA== - dependencies: - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/card@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.a246a4439.0.tgz#b195e66485fb450668eec12c3ad68404d659be5a" + integrity sha512-+rYUnBPgv5QVF6BeUs3toIRdSwFVohGmjk2ptTXMZkKxqAJt7Nr9Znbm3Ym2hD8GUHJeh3pyGFvEs6rG6JMYAw== + dependencies: + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/checkbox@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz#b13784c068b137386c43ae409517176b986c5d49" - integrity sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/checkbox@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.a246a4439.0.tgz#9b38a2fcff58f31adb2dcd22e6d6a0095fdf9250" + integrity sha512-sQwHzm1TSxHUoPrqplWTk/BhyzdDhzcwlbucwJK9W0o9WXMDk+d9PvcCxpP/9sAnVqZk42BfE89Y0T1DHglZ9A== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/chips@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz#a77ee7bf8ea9146156996c5632496ebca27520e9" - integrity sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/chips@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.a246a4439.0.tgz#2d73b4c7b5326ee6a160db01b84ad2a893b1cb53" + integrity sha512-TiV9WJ5taEHPGWPhXbxJvUJhLzThg+VpK7aAlvL4RurtmJ7pURuEdRS4Z6o0OEqi3wKQ4z/+K44kZUn/+9HALg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/circular-progress@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz#800cb10a3a66f125a5ed8d4ae9fffdf236da5984" - integrity sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/circular-progress@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.a246a4439.0.tgz#c5d850525d69852526925db21d40c05de516685a" + integrity sha512-+QTfyExPWzgm2tqMInd32qQOftsC1b8MUhAhZSfuecYBfqAc7KZkQEKa2nm4y8EHKMFWe8/DcxLV6IxMBLgHwA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/progress-indicator" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/data-table@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz#0b5b51ed771f9bba8a1b4746448dec25000325c1" - integrity sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/select" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/data-table@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.a246a4439.0.tgz#f0bc21c00b19ae2a1e93cb51de975c7d6c17ca76" + integrity sha512-89qVOjR7gqby6fsmh7tKj29SjQ2sGLXu2IzCeX3Vni4mz+xxo5dv11jxYNADvdgJDfhyDJFPh1FlqAH7O09nFA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/linear-progress" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/select" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/density@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz#83d7ef248a8d1818cddb01bcbfc947ab0ae6a952" - integrity sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg== +"@material/density@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.a246a4439.0.tgz#459282080188a6fc056ba903c5a156599c2e5813" + integrity sha512-h8BJVCWkPR97WeWCN6/atVbSOP8J4+ZbbssidcwsnX7b3+3IaWdtBxGii25dsILX8pUVwwqxVis24y211b+8rg== dependencies: tslib "^2.1.0" -"@material/dialog@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz#a12e676c9d41009a1f4d5617f386d6b00d6ecdf0" - integrity sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/dialog@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.a246a4439.0.tgz#3f89a19028edd942804dcb66945ae6024357b6a4" + integrity sha512-4lyxd+5ccOEMUGKzZcssaYyzkCsYTpYCSQSANR0toQPLv3voDwKMfA709uZI6+nL7Re6Xdf7jx8qe+QpTTjVcw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/dom@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz#960d25fdfed237c542560278465edb9c33ed44ec" - integrity sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg== +"@material/dom@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.a246a4439.0.tgz#040dbc4c2e75ed99cfc4a51e0e5ce75851dd304b" + integrity sha512-AftSOGQoQg/Ys2kOVjZzvqWmsnhg3Kam/2UC4Gj0DMMCu36J4MAoD+3PpnOd1aG3wiJKtUXR2vPIwE8I/PM9yg== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/drawer@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz#68838f1a12ddd2bb56795bd187d0ce0192689ce5" - integrity sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/drawer@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.a246a4439.0.tgz#791e4b776049efc7294a0a9a761c009f0f65fc88" + integrity sha512-/JUmbzRBaikdbZ250yA9ZTPqp2W5nGvvuHYoNVAAmtOmxuwGvvNNpWiVZy2lIYeYcf1hA7hJ5mEQxs0aSD7iWQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/elevation@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz#d8ca5f4b1f387c95326a6220a21178d4e965b30c" - integrity sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg== +"@material/elevation@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.a246a4439.0.tgz#1d41b571cd655947b5dcc6a0cb53e114bf9d39a1" + integrity sha512-lwPIOb8fHyOljIWYcVLPT73dPIEOKat/CXu6gqYIVMQgZQIksQNUA7z1O3l7apkRSuYUOYSXqrgU7AnWP4KcJg== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/fab@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz#7e75ae184555a6568e882e854657ad1515b34c00" - integrity sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/fab@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.a246a4439.0.tgz#f37666a4f40b80a79e36f2b2e369a5f4b792bd85" + integrity sha512-XUex3FNqxPD1i/4jITucB/RWTNkkdv52mbNmwrvbuThZlhuhyH9GzOQYTDop/b2783TPcv++xr8UUbuh8GWYzA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/feature-targeting@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz#f5fd69774664f20f176b3825072d7f2e48de7621" - integrity sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ== +"@material/feature-targeting@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.a246a4439.0.tgz#ea6410861bc847f8315b163333147d7d7c82782b" + integrity sha512-/SU9X5y8CRp6RS9qnjnM/N5qfsJ8bYILpR841eZmN6DLqMupaM9Yy7Mx8+v/QvpBLLhk+jmu79nFzwkwW54d6Q== dependencies: tslib "^2.1.0" -"@material/floating-label@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz#b1245304edd6dbeedeae0499f292e79f8b2c479a" - integrity sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/floating-label@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.a246a4439.0.tgz#6156b0192ac95c61dea705c4c1c6305be84acc22" + integrity sha512-832qZ/qxKx0KUatoeVY3Q2NmboVgiWBG0/1VsbJyodHrgQWfnBOHgLE+M322o6uM3OhvO+kWm4iYbvwhmLZGsw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/focus-ring@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz#063396eefa5638edbbf99ac713c1087da1f8434c" - integrity sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w== - dependencies: - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - -"@material/form-field@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz#76d23e14f910a28081ccb438e094e04bbffadf19" - integrity sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/focus-ring@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.a246a4439.0.tgz#b4aad6f3eb8f3eef07da1f3302e291c02b3a992f" + integrity sha512-ar0BtACFS3K14k/enAg0ePeEA/f/RJY4Ji4L/00Dw/B3XVpNRbqLH49jkcbtcQjdTS0FEyk2sWSNMZl6wVi0/A== + dependencies: + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + +"@material/form-field@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.a246a4439.0.tgz#a3f4deccba0dafa0eefa7c82b9f9b21bec871607" + integrity sha512-Q/+ErgtAUFUPPUmWA1m5IP5voiN8XjPRwyoAlFxSTa/4t+EA5B18Z8Bsn9b6I0AC8RHke06H7UWrKz8XUDIFpw== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/icon-button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz#67246733d5e1aef1953208d3dfac01425d560ede" - integrity sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/icon-button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.a246a4439.0.tgz#6d0121dd8ab97b024dcd36eee620b61fe8bbc8a8" + integrity sha512-Igyo94rkIlqC91BR1Tv+WLTz1ZWcZZjl1xU7Vsx8mbWA1PnaRDUTNVV5LFi4e0ORp6GSblFTImpHngEy4agMEg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/image-list@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz#9a765ec6caa7e4761a19048679912abc759d7988" - integrity sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ== +"@material/image-list@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.a246a4439.0.tgz#ecf3fa191d4e1b1b64050583abb9aa5b08f4e7b7" + integrity sha512-Rcj3q7Tp7Nwbe5ht6ptTc3zqK8TSDJHaPDBf+kzi0kkh6MAB4qoHPgn+HnA+zIZ79CScU56bN7zjA6XYaZvsLw== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/layout-grid@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz#44f972c0975baa36e14c8d82b69957b7e59c25d3" - integrity sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q== +"@material/layout-grid@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.a246a4439.0.tgz#65ad68bab019d92fc047bfd00a8ad2c654ad59f3" + integrity sha512-bkfxZuVzgtjEJgR3n8pvDQbe88ffULDJ5d2DF34IR8SOiRmQcj7UzqAt95XwIUcWlfisLCoIryP4U8XSpFb1EQ== dependencies: tslib "^2.1.0" -"@material/line-ripple@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz#0de6f3f4bcca06056ab0dec23a84a7a99fb0ecc4" - integrity sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q== +"@material/line-ripple@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.a246a4439.0.tgz#b38d7b59507067622825f31e7663301cd18ba240" + integrity sha512-20WmwRrejmtOdI37+959UqEVIjbMtAXlkDOkfCIA3OUhp+oZSjVkCqKxI16jxxVlnzJ353fy8xeSKzOHe4sExQ== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/linear-progress@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz#12650b19c776542b0b084792ca1d6894dbd54cf4" - integrity sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/linear-progress@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.a246a4439.0.tgz#534d36d41e1c05d965fe2b0fe087ca76f15d282c" + integrity sha512-IcCd4476pXHloTYadHDJ+2c2lntoVigeNnQEiD/ASQTKqKrJqkIdvvczFm9Ryu+V2+TKhp7vvQGFLUMaLPcmhw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/progress-indicator" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/list@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz#daaf0ca8cb9b68fb2df0877c12571741b8098ddb" - integrity sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/list@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.a246a4439.0.tgz#530f76da6324f8d4d3b6f9545e1cb53b4dfd2d25" + integrity sha512-4H5dKIjCUGIPmKjfcegV0SBybD5NNdHp26OU6sovvWIvxSGQtDJr6z9I7i+0vF/HIS5ScbHD2+9/txtL80iqCA== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/menu-surface@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz#213cc9b251e626c54e1f799b3b52d74659b3c549" - integrity sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/menu-surface@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.a246a4439.0.tgz#e03cf761cfe331af3498bcbb5cd1601f83e9849e" + integrity sha512-4h4wZ0Rs7qBg1Otldw8ljp+LCULNL42pqbqcTXhKAkJM7pHcSw4k7IfoThSRLU3+V8T3/+qiAXyeQix2OGHzwg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/menu@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz#162fbd5b608fbf6edd4a65b3963db947c0e4c96b" - integrity sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/menu@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.a246a4439.0.tgz#f8725573ff1296c7b1d6539675243a64b96b4957" + integrity sha512-2HOHQAIdWQtXjSvEIrW3lnbcIwFf5XaQhFzCEZ04FcSGApc4iLwsmRFVW3PzWx+mVrUrEfO/K42DVULIX9J1Pg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/notched-outline@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz#94d4c7646e75fad9ca78ad66487a3f7445030664" - integrity sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/notched-outline@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.a246a4439.0.tgz#4d183b37014a3aacf961ee9630848e3b9a530a06" + integrity sha512-zmRZHJ+5cOWsBatRyK50wuht78olXySyKOJIIEmy8lxSMZefI1764u0mr8tS1KYF8vSAl5cUlwCC3/2Njz1FPg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/progress-indicator@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#b440bff7e8b351af7eaf8fa7663f451e7ee112f4" - integrity sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w== +"@material/progress-indicator@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.a246a4439.0.tgz#8b4136e887dbf700fc17f1480eec91ced326c275" + integrity sha512-92HM5niUnqG5Y3M/xkscBD+2lkaWPDcIRPo0RHPYcyldL+EhWRv/sdQpfdiXw/h3uvKSowKxBMCHm8krAyf+sQ== dependencies: tslib "^2.1.0" -"@material/radio@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz#18a1724eb4d394faf7a485f116c8353d3685c0ee" - integrity sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/radio@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.a246a4439.0.tgz#3fe24387017bf312b0092eec65ccc2c531b10ca5" + integrity sha512-on8EVztWXc/ajcaowFZ31ClGADYxQrhj4ulMne0NxdHHWQ44ttf5aXOVqtv5mxeOzrRACOkQyTUXBG07yTWCEQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/ripple@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz#1b64bdb47d1e5016bb0663d8b045a7e63048ad86" - integrity sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/ripple@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.a246a4439.0.tgz#cc280802f29d9e230c2460f790f2adf90fe354a4" + integrity sha512-Vl615/PIBpBD+IOI9Xypz0SV3RsmYJYSNx890Rih7irhUOaPsOUBmTYOWF5AsGBynqLcXoTNVhK92drYLKtJwQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/rtl@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz#a9ba66d0cec2d1d38892d3e9cb65157fcf012dfa" - integrity sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw== +"@material/rtl@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.a246a4439.0.tgz#31ef4971ad1b82c791acf62b412206e093048351" + integrity sha512-pgJFw8ZRpWGpwv7ZuBTJ+WdNmFBKoLVoMbbxKQWTHXVwhAqn3aoIq95o62T5QeEG/+sguNShdquG45CpAMmSRw== dependencies: - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/segmented-button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz#635e5a7dee12163b08a78872a0cacd4121024abd" - integrity sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/segmented-button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.a246a4439.0.tgz#cdd13b33901c20459105c3120b0d3e02380fe930" + integrity sha512-oqGHs2C7C+yJW/xZf/wP8jBGLs6HcerhM3CsorLAEMH3MGuIlVC17WcisBewEWucsILYEWbySXy/7T4h6/psZA== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/select@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz#bd5039d0cb123fef358e85fdd4a002556f11598b" - integrity sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/select@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.a246a4439.0.tgz#0a480c12a09b9fb5e99da94ad5a9aa0c5d26a805" + integrity sha512-odoNLiVOgdwbEeePkjHtlr43pjskDwyO8hi4z3jcud1Rg1czk5zoJ2mUI0+olOJjBQ26PGocwrSLqf3qaThbIA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/shape@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz#c597f8e439dc40799d2de3cfa62006faaf334a20" - integrity sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA== +"@material/shape@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.a246a4439.0.tgz#15ea064ada9d057400f9600bad385b49529f407d" + integrity sha512-rcWPlCoHyP79ozeEKk73KWt9WTWdh6R68+n75l08TSTvnWZB5RRTmsI9BMkz55O9OJD/8H8ZsOxBe4x2QXUT7w== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/slider@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz#5f9fa85cb0b95f45042b14a510d20ae894ee027c" - integrity sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/slider@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.a246a4439.0.tgz#ae6506a049ea9b18dc781dec5117a723cad408b0" + integrity sha512-is1BSBpxaXBBv+wSVpe9WGWmWl59yJEeDNubTES2UFD0er3BmA+PdKkL09vvytDnBcbKf77TbxaRiUSGVaKUQA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/snackbar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz#9f482fab88c3be85d06b450b67ac0008b6352875" - integrity sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/snackbar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.a246a4439.0.tgz#201b417a0e0d674d09c68e6b43668c3ad9b18346" + integrity sha512-2NAtC1qozR/uajszZnPy08Ej8HNnpgvCjNCBerDN4SLH2Q0/aWrVrUjqRCp2ayAvsX+szoroGbCboMhaWRzDuQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/switch@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz#3de9394d2f23dc7bcc57bf633dde68498356f194" - integrity sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/switch@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.a246a4439.0.tgz#3f3c1a1b17a51f971cc6356b7120daac163654c1" + integrity sha512-o0wcbYgm2yRs4een5uxT4RJnJ003DxXe33rk8vTBG2o7cdiSR3X7GJQxeIK3D9wPgWCAwBLhNYSzXrlTL5pkMw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/tab-bar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz#952ce40f811a8fe1d54c1698454c9baf84a57e9d" - integrity sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tab-bar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.a246a4439.0.tgz#548c79f54c5ad912157eab95d2ede6b96bdd8697" + integrity sha512-dMQb1vXsBchQXcjbwgJZIGqTZHngm+3QGSOSb4LWjqHIgC5+w2RRrHsIAjNTyRhKssJ9nKKrbpM/Yz5vTPWH6w== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/tab-scroller" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab-indicator@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#be37f0cf107c23da64efd4f385130d7d22a55b9c" - integrity sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ== +"@material/tab-indicator@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.a246a4439.0.tgz#ed9a9cf50d7175edf32b94d9a199a75656ed5c58" + integrity sha512-gG2BgHT+ggKnUOaT8LjmH/+9nknRLh8v9qemrhUkDuCtZ8inlaC33OVbbxfrpQW3J+UzBh5YCUSC+2KrN39uUA== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab-scroller@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz#fb7f85a6d89cc3ec60c398cf637d201262b9c749" - integrity sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w== +"@material/tab-scroller@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.a246a4439.0.tgz#353927782e309ee1d3b18871b6665a6bca0970d9" + integrity sha512-6KvBpalc4SwLbHFm0rnuIE64VffUj7AKhnPc+mqM6VmxOvDzQ/ZSYga0rWlUfM4mCDFX3ZkSxim+iNzVF+Ejaw== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz#447482c5d13ce95fa502769e1f4bd91aa28b499f" - integrity sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tab@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.a246a4439.0.tgz#7b3629d4259006042c846e77e60fa892f86ef999" + integrity sha512-HGLK774uMeLnhbjDJBOjft7S6SurZnKb+6Und88OMDUVUEG6MkFBAKQQr09iBIeLE2sUAiGQhBVQtb7LJKwolQ== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/textfield@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz#177df6b286da09015153a3eadb9f6e7ddd990676" - integrity sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/textfield@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.a246a4439.0.tgz#fa8b5c9ff15d44d98d223b1b658114c72f258591" + integrity sha512-4BW5bUERPlIeiPnLSby21h1/xDmySuAG9Ucn1LM801a0+5mK3IwWb8031AP3filKZZqTx5JJvOJYZd6/OWBJVA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/theme@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz#32e8571f6b323cafb3f2f6104c06e40f2d7f37e3" - integrity sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg== +"@material/theme@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.a246a4439.0.tgz#02d6f1ba7a7d6948d25b5f328f0381eb414fd081" + integrity sha512-HWxC5Nhz8JZKTLTVmAsNxIGB3Kzr53+YFMg327S8/XuEDmI0RFHFvtwM9rADmyrHFBmUaVhV4iELyxFdi67c9w== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tokens@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz#b6833e9186d85c0707ebac2992098b345fe86ecd" - integrity sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q== - dependencies: - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - -"@material/tooltip@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz#e5703754d44d0daf9fccbaa66fc4dd3aa22b2a5b" - integrity sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tokens@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.a246a4439.0.tgz#93cf05d49bdbc8b494b21fc3159f1bf9274983fa" + integrity sha512-+5iGfQ51YSb0Qau8uC6/jHXCSC3enKaQKDf/iPHfuXAe04UznW3tmm1/Ju227aZXNISTJcnQYa2rpm1M14MeUg== + dependencies: + "@material/elevation" "15.0.0-canary.a246a4439.0" + +"@material/tooltip@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.a246a4439.0.tgz#96d0818b141f4aa4b58f499ab37c02d29a2b5b6b" + integrity sha512-Ja2Z4aZQkYWD6InXA+MG4M9zdKR6dYsXXlYzQppYpfcQzXylZqh5Y7WBLulG5fA2o83pHVwILfwFZM7j7ht08Q== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/top-app-bar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz#e996435725f36991a6ca80604e032d21527e076d" - integrity sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/top-app-bar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.a246a4439.0.tgz#5ca10581940fec75c0da84bb232dc6bb421a3ab2" + integrity sha512-twQchmCa1In/FFrALPYojgeM8vmV7KH96wRY9NmPSJ046ANgPCicLBgLuSzrLETCFqAwbztqzxSG4xMBL81rYg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/touch-target@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz#3416302f86483510e47a8aef9392b0a77784652d" - integrity sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA== +"@material/touch-target@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.a246a4439.0.tgz#1e9d7105ee985fe8b89370e00120d75a3518b78c" + integrity sha512-ubyD1TUjZnRPEdDnk6Lrcm2ZsjnU7CV5y7IX8pj9IPawiM6bx4FkjZBxUvclbv3WiTGk5UOnwPOySYAJYAMQ1w== dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/typography@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz#1ca0641ef8a91945ca01a1aa6651db434741b37b" - integrity sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q== +"@material/typography@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.a246a4439.0.tgz#0d1387bc273511534d37cc6784b4ae1c4f70aeaf" + integrity sha512-eXzBl9ROzWZ+41nan5pCrn1C/Zq3o/VsrLFaGv8fdRmhRR6/wHMeuvCCwGf5VtEmWdAE9FpJzRU/4ZPiJCJUyg== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@microsoft/api-extractor-model@7.27.6": - version "7.27.6" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.27.6.tgz#308e44cd595d2fb446c6357759ee0675ec37d26e" - integrity sha512-eiCnlayyum1f7fS2nA9pfIod5VCNR1G+Tq84V/ijDrKrOFVa598BLw145nCsGDMoFenV6ajNi2PR5WCwpAxW6Q== +"@microsoft/api-extractor-model@7.28.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz#91c66dd820ccc70e0c163e06b392d8363f1b9269" + integrity sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig== dependencies: "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.7" + "@rushstack/node-core-library" "3.61.0" -"@microsoft/api-extractor@7.36.4": - version "7.36.4" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.4.tgz#3bb9fbbbeacaa48eea49150351905a2677a506d9" - integrity sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ== +"@microsoft/api-extractor@7.38.0": + version "7.38.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.38.0.tgz#e72546d6766b3866578a462b040f71b17779e1c5" + integrity sha512-e1LhZYnfw+JEebuY2bzhw0imDCl1nwjSThTrQqBXl40hrVo6xm3j/1EpUr89QyzgjqmAwek2ZkIVZbrhaR+cqg== dependencies: - "@microsoft/api-extractor-model" "7.27.6" + "@microsoft/api-extractor-model" "7.28.2" "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.7" - "@rushstack/rig-package" "0.4.1" - "@rushstack/ts-command-line" "4.15.2" + "@rushstack/node-core-library" "3.61.0" + "@rushstack/rig-package" "0.5.1" + "@rushstack/ts-command-line" "4.16.1" colors "~1.2.1" lodash "~4.17.15" resolve "~1.22.1" @@ -2823,10 +2890,10 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@ngtools/webpack@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.4.tgz#e65fd3ee7ee8ab0f1d4c72985b4707e69656ade1" - integrity sha512-XI5mSPloaMsj5zmBQ6QBEhg//OaMxfpNdsPg4EfldbdzwZ8lIS+yD3eoNaX74mkLc0gixgzOVQ6eW2nxsQlvng== +"@ngtools/webpack@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.6.tgz#450f8c1dcc448f6fd8a30e313d0735cd21b803c8" + integrity sha512-xsWk3iwoSvkl3ZSrN8jbLJZPKVPk8Ge7bnD6pzZDokjtl8ApcXatGd0NBqCQDr+lfV+ZdhVGJ5xfBiyGzEeSzw== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -3092,10 +3159,10 @@ unbzip2-stream "1.4.3" yargs "17.7.1" -"@rushstack/node-core-library@3.59.7": - version "3.59.7" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.59.7.tgz#9dcd62b79263e8a5b68465d4bf9124ec86e14b6c" - integrity sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw== +"@rushstack/node-core-library@3.61.0": + version "3.61.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz#7441a0d2ae5268b758a7a49588a78cd55af57e66" + integrity sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ== dependencies: colors "~1.2.1" fs-extra "~7.0.1" @@ -3105,31 +3172,31 @@ semver "~7.5.4" z-schema "~5.0.2" -"@rushstack/rig-package@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.4.1.tgz#ff11bf67dad46f9b4f09db91cf45739ab411ee9f" - integrity sha512-AGRwpqlXNSp9LhUSz4HKI9xCluqQDt/obsQFdv/NYIekF3pTTPzc+HbQsIsjVjYnJ3DcmxOREVMhvrMEjpiq6g== +"@rushstack/rig-package@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.1.tgz#6c9c283cc96b5bb1eae9875946d974ac5429bb21" + integrity sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA== dependencies: resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/ts-command-line@4.15.2": - version "4.15.2" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.15.2.tgz#7920e3fa2ab6af129d995ce4424c600da0bf8a93" - integrity sha512-5+C2uoJY8b+odcZD6coEe2XNC4ZjGB4vCMESbqW/8DHRWC/qIHfANdmN9F1wz/lAgxz72i7xRoVtPY2j7e4gpQ== +"@rushstack/ts-command-line@4.16.1": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.16.1.tgz#3537bbc323f77c8646646465c579b992d39feb16" + integrity sha512-+OCsD553GYVLEmz12yiFjMOzuPeCiZ3f8wTiFHL30ZVXexTyPmgjwXEhg2K2P0a2lVf+8YBy7WtPoflB2Fp8/A== dependencies: "@types/argparse" "1.0.38" argparse "~1.0.9" colors "~1.2.1" string-argv "~0.3.1" -"@schematics/angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.4.tgz#d419002a22089449c92a1ddbf088222806974154" - integrity sha512-9gnR8xoPEUJN4tQcH/yysfXP/4Bbm0f4g6VVnAvOdunwo+u5bucz21MacMqbVvMAFQA92neeFn6m8yb1VTQVHA== +"@schematics/angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.6.tgz#d05b45ad27470c14ada1eef15fa653707aff8913" + integrity sha512-hDDwlWKJhOWKY/+hz8yp/hEDi4ITQO6WYx1al6bfmvf8QOZ4o4HiuW4YSck03XxtCQ0AMTcPBpoYvRNbYWpYRQ== dependencies: - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" jsonc-parser "3.2.0" "@sentry/core@6.19.7": @@ -3222,11 +3289,6 @@ resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553" integrity sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3629,13 +3691,20 @@ "@types/unist" "*" "@types/vfile-message" "*" -"@types/ws@*", "@types/ws@8.5.5", "@types/ws@^8.5.5": +"@types/ws@*", "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: "@types/node" "*" +"@types/ws@8.5.6": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -3923,16 +3992,6 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" -"@wessberg/ts-evaluator@0.0.27": - version "0.0.27" - resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" - integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== - dependencies: - chalk "^4.1.0" - jsdom "^16.4.0" - object-path "^0.11.5" - tslib "^2.0.3" - "@xmldom/xmldom@^0.8.5": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -3973,7 +4032,7 @@ a-sync-waterfall@^1.0.0: resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" integrity sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA== -abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: +abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -3998,14 +4057,6 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" @@ -4016,22 +4067,17 @@ acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -4773,11 +4819,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - browser-sync-client@^2.29.3: version "2.29.3" resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.29.3.tgz#9300b97f42abc2c4f95ca29b5a9781b5c492f14a" @@ -5767,16 +5808,11 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@0.3.x, cssom@~0.3.6: +cssom@0.3.x: version "0.3.8" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - cssstyle@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" @@ -5784,13 +5820,6 @@ cssstyle@1.2.1: dependencies: cssom "0.3.x" -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - cssstyle@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" @@ -5825,15 +5854,6 @@ data-uri-to-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - data-urls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" @@ -5888,7 +5908,7 @@ decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1, decimal.js@^10.4.3: +decimal.js@^10.4.3: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== @@ -6156,13 +6176,6 @@ domelementtype@^2.0.1, domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - domexception@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -6562,38 +6575,38 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" -esbuild-wasm@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.2.tgz#046c39a6ef28b937fd8f847edaf767f32ca02ffc" - integrity sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw== +esbuild-wasm@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.3.tgz#9ac844d4b542ad33a81be7cb32ba1d451522cee6" + integrity sha512-Vx94kkrz9CwaYutautk+RhIvwhcpawSRmKD/zz6n3wQqJgBzaMRVZaF9eAuVseXwOmfJexSGmwwgToQ1uAoOjg== -esbuild@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" - integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== +esbuild@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" + integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== optionalDependencies: - "@esbuild/android-arm" "0.19.2" - "@esbuild/android-arm64" "0.19.2" - "@esbuild/android-x64" "0.19.2" - "@esbuild/darwin-arm64" "0.19.2" - "@esbuild/darwin-x64" "0.19.2" - "@esbuild/freebsd-arm64" "0.19.2" - "@esbuild/freebsd-x64" "0.19.2" - "@esbuild/linux-arm" "0.19.2" - "@esbuild/linux-arm64" "0.19.2" - "@esbuild/linux-ia32" "0.19.2" - "@esbuild/linux-loong64" "0.19.2" - "@esbuild/linux-mips64el" "0.19.2" - "@esbuild/linux-ppc64" "0.19.2" - "@esbuild/linux-riscv64" "0.19.2" - "@esbuild/linux-s390x" "0.19.2" - "@esbuild/linux-x64" "0.19.2" - "@esbuild/netbsd-x64" "0.19.2" - "@esbuild/openbsd-x64" "0.19.2" - "@esbuild/sunos-x64" "0.19.2" - "@esbuild/win32-arm64" "0.19.2" - "@esbuild/win32-ia32" "0.19.2" - "@esbuild/win32-x64" "0.19.2" + "@esbuild/android-arm" "0.19.3" + "@esbuild/android-arm64" "0.19.3" + "@esbuild/android-x64" "0.19.3" + "@esbuild/darwin-arm64" "0.19.3" + "@esbuild/darwin-x64" "0.19.3" + "@esbuild/freebsd-arm64" "0.19.3" + "@esbuild/freebsd-x64" "0.19.3" + "@esbuild/linux-arm" "0.19.3" + "@esbuild/linux-arm64" "0.19.3" + "@esbuild/linux-ia32" "0.19.3" + "@esbuild/linux-loong64" "0.19.3" + "@esbuild/linux-mips64el" "0.19.3" + "@esbuild/linux-ppc64" "0.19.3" + "@esbuild/linux-riscv64" "0.19.3" + "@esbuild/linux-s390x" "0.19.3" + "@esbuild/linux-x64" "0.19.3" + "@esbuild/netbsd-x64" "0.19.3" + "@esbuild/openbsd-x64" "0.19.3" + "@esbuild/sunos-x64" "0.19.3" + "@esbuild/win32-arm64" "0.19.3" + "@esbuild/win32-ia32" "0.19.3" + "@esbuild/win32-x64" "0.19.3" esbuild@^0.18.10: version "0.18.20" @@ -6665,7 +6678,7 @@ escodegen@^1.13.0: optionalDependencies: source-map "~0.6.1" -escodegen@^2.0.0, escodegen@^2.1.0: +escodegen@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== @@ -7360,15 +7373,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -7920,13 +7924,6 @@ gtoken@^6.1.0: google-p12-pem "^4.0.0" jws "^4.0.0" -guess-parser@0.4.22: - version "0.4.22" - resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" - integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== - dependencies: - "@wessberg/ts-evaluator" "0.0.27" - handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -8147,13 +8144,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -8262,15 +8252,6 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -9245,39 +9226,6 @@ jsdoc@^4.0.0: strip-json-comments "^3.1.0" underscore "~1.13.2" -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsdom@^22.0.0: version "22.1.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" @@ -9964,7 +9912,7 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.15: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -10781,7 +10729,7 @@ nunjucks@^3.2.2: asap "^2.0.3" commander "^5.1.0" -nwsapi@^2.2.0, nwsapi@^2.2.4: +nwsapi@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== @@ -10869,11 +10817,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.5: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -11257,11 +11200,6 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" @@ -12485,10 +12423,10 @@ sass-loader@13.3.2: dependencies: neo-async "^2.6.2" -sass@1.66.1: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== +sass@1.67.0: + version "1.67.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.67.0.tgz#fed84d74b9cd708db603b1380d6dc1f71bb24f6f" + integrity sha512-SVrO9ZeX/QQyEGtuZYCVxoeAL5vGlYjJ9p4i4HFuekWl8y/LtJ7tJc10Z+ck1c8xOuoBm2MYzcLfTAffD0pl/A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -12506,13 +12444,6 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - saxes@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" @@ -12563,10 +12494,10 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: tmp "0.0.30" xml2js "^0.4.17" -selenium-webdriver@4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.12.0.tgz#a8dc8ecf129a2414c2ace6e429aba84722a950a5" - integrity sha512-zvPzmTsky6WfO6+BGMj2mCJsw7qKnfQONur2b+pGn8jeTiC+WAUOthZOnaK+HkX5wiU6L4uoMF+JIcOVstp25A== +selenium-webdriver@4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.13.0.tgz#1e06bab7adedb308e3635131bc75bd32038261d5" + integrity sha512-8JS0h5E0Sq7gNfbGg8LVaQ+Eqek97tvOONn3Jmy+NiWfb12WYpftz4VTC4D2JT4wakdG6VUzGKpA8cFGg0IjkA== dependencies: jszip "^3.10.1" tmp "^0.2.1" @@ -13602,7 +13533,7 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.0.0, tough-cookie@^4.1.2: +tough-cookie@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== @@ -13627,13 +13558,6 @@ toxic@^1.0.0: dependencies: lodash "^4.17.10" -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - tr46@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" @@ -13722,7 +13646,7 @@ tsec@^0.2.2: glob "^7.1.1" minimatch "^3.0.3" -tslib@2.6.2, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.5.2: +tslib@2.6.2, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.5.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -14376,20 +14300,6 @@ void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -14467,16 +14377,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -14604,13 +14504,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" @@ -14623,11 +14516,6 @@ whatwg-fetch@^3.4.1: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4" integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q== -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - whatwg-mimetype@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" @@ -14649,15 +14537,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -14835,7 +14714,7 @@ ws@>=8.13.0, ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^7.0.0, ws@^7.2.3, ws@^7.3.1, ws@^7.4.6: +ws@^7.0.0, ws@^7.2.3, ws@^7.3.1: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -14855,11 +14734,6 @@ xdg-basedir@^4.0.0: resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - xml-name-validator@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" diff --git a/package.json b/package.json index e6d59ae72acd2b..4c1f64ee08aef1 100644 --- a/package.json +++ b/package.json @@ -47,12 +47,12 @@ }, "// 1": "dependencies are used locally and by bazel", "dependencies": { - "@angular-devkit/build-angular": "17.0.0-next.4", - "@angular-devkit/core": "17.0.0-next.4", - "@angular-devkit/schematics": "17.0.0-next.4", - "@angular/cdk": "17.0.0-next.3", - "@angular/cli": "17.0.0-next.4", - "@angular/material": "17.0.0-next.3", + "@angular-devkit/build-angular": "17.0.0-next.6", + "@angular-devkit/core": "17.0.0-next.6", + "@angular-devkit/schematics": "17.0.0-next.6", + "@angular/cdk": "17.0.0-next.5", + "@angular/cli": "17.0.0-next.6", + "@angular/material": "17.0.0-next.5", "@babel/cli": "7.22.15", "@babel/core": "7.22.19", "@babel/generator": "7.22.15", @@ -74,7 +74,7 @@ "@rollup/plugin-babel": "^6.0.0", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-node-resolve": "^13.0.4", - "@schematics/angular": "17.0.0-next.4", + "@schematics/angular": "17.0.0-next.6", "@types/angular": "^1.6.47", "@types/babel__core": "7.20.1", "@types/babel__generator": "7.6.4", @@ -113,7 +113,7 @@ "convert-source-map": "^1.5.1", "d3": "^7.0.0", "diff": "^5.0.0", - "domino": "https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1", + "domino": "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a", "graceful-fs": "4.2.11", "hammerjs": "~2.0.8", "http-server": "^14.0.0", @@ -158,8 +158,8 @@ "// 2": "devDependencies are not used under Bazel. Many can be removed after test.sh is deleted.", "devDependencies": { "@actions/core": "^1.10.0", - "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8", - "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#8affb31414514e13f693ab3795d91f6bb7a1853e", + "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6", + "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#26b676bbb6d98d514004cb3dda76a086812d710f", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-proposal-async-generator-functions": "^7.20.7", "@bazel/bazelisk": "^1.7.5", diff --git a/packages/zone.js/package.json b/packages/zone.js/package.json index 90e7b369ee976e..1a04863cccd969 100644 --- a/packages/zone.js/package.json +++ b/packages/zone.js/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@externs/nodejs": "^1.5.0", "@types/node": "^10.9.4", - "domino": "https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1", + "domino": "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a", "google-closure-compiler": "^20230802.0.0", "jest": "^29.0", "jest-environment-jsdom": "^29.0.3", diff --git a/packages/zone.js/test/typings/package.json b/packages/zone.js/test/typings/package.json index dad4c63d433dd3..5edd3f4d67a44c 100644 --- a/packages/zone.js/test/typings/package.json +++ b/packages/zone.js/test/typings/package.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@types/node": "^16.11.7", - "domino": "https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1", + "domino": "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a", "zone.js": "file:../../../../dist/bin/packages/zone.js/npm_package" }, "devDependencies": { diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index 739dc8aa748ab4..4f3e97234ffd3d 100644 --- a/packages/zone.js/yarn.lock +++ b/packages/zone.js/yarn.lock @@ -1170,9 +1170,10 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" -"domino@https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1": - version "2.1.6" - resolved "https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1" +"domino@https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a": + version "2.1.6+git" + uid f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a + resolved "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a" electron-to-chromium@^1.4.477: version "1.4.508" diff --git a/yarn.lock b/yarn.lock index a9e7800cc50483..06ea1b2218b7fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,23 +25,23 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.4.tgz#aa20d981179c22d1240c7bd57899dfeffee1a522" - integrity sha512-lPRp+K+YYIHBt2k9yN0KZQG1vRm1B5x8w/Fx/+bMpjxJX5h/x3cRj+oavJUwiFneae3YX74o69kakCsRP/fWvw== +"@angular-devkit/architect@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1700.0-next.6.tgz#8ac2f298f4314bed29cc11da766ea86c4957a339" + integrity sha512-kSC6JwKOpbiOUn9VYdSy/u4gZRGSLl5rNPrVnLBv2A7OSDcNKMGYBzW9k9DxK6y4JW8LGArqBkitwymEoD1MWw== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" rxjs "7.8.1" -"@angular-devkit/build-angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.4.tgz#1382c97fb021addaf7f5984333dbe7131c5e785f" - integrity sha512-k8OOeLGh01qun9QQuY3OVxDr2oZCfMogiXAemnJnbLMqwot/R4XHc6Te9l7p2yxLYgHCjJO1ldeIw4Ly65yIvA== +"@angular-devkit/build-angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-17.0.0-next.6.tgz#212bf083ca7868a0e539bc689e0292cffe62cbce" + integrity sha512-w7Ofqp4cBtdu94G9MApEzH5N50mrfpv/4na3qGWAv1uQJRzXsL5R13grNevOy88u8XXXh9vR5clSXexmzjskxw== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/build-webpack" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/build-webpack" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" "@babel/core" "7.22.17" "@babel/generator" "7.22.15" "@babel/helper-annotate-as-pure" "7.22.5" @@ -52,7 +52,7 @@ "@babel/preset-env" "7.22.15" "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "17.0.0-next.4" + "@ngtools/webpack" "17.0.0-next.6" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" autoprefixer "10.4.15" @@ -64,9 +64,8 @@ copy-webpack-plugin "11.0.0" critters "0.0.20" css-loader "6.8.1" - esbuild-wasm "0.19.2" + esbuild-wasm "0.19.3" fast-glob "3.3.1" - guess-parser "0.4.22" http-proxy-middleware "2.0.6" https-proxy-agent "7.0.2" inquirer "8.2.6" @@ -88,7 +87,7 @@ postcss-loader "7.3.3" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.66.1" + sass "1.67.0" sass-loader "13.3.2" semver "7.5.4" source-map-loader "4.0.1" @@ -104,7 +103,7 @@ webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.19.2" + esbuild "0.19.3" "@angular-devkit/build-optimizer@0.14.0-beta.5": version "0.14.0-beta.5" @@ -116,18 +115,18 @@ typescript "3.2.4" webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.1700.0-next.4": - version "0.1700.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.4.tgz#832f673afae5d26a1fef83fec00522510f1d712c" - integrity sha512-mbWL46KJoi9vYbnbCrvxIfaTkt4SowLxZaNcpOdvMVxB9KUW9a21WOMnbFO80nNfXGnbuVm0RmblpoTbbMcWgQ== +"@angular-devkit/build-webpack@0.1700.0-next.6": + version "0.1700.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1700.0-next.6.tgz#b4174ab0e7bf197f6e84135b49d6249fe9e4b1db" + integrity sha512-ik+aZfDZzOW0xxBNRrf1h/0fV+O3FCVHxDlpDdhnrLiecVH78TgOHn1vHKzg2y6chSL3yYyUXeYQ3i0ttr5gtg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" rxjs "7.8.1" -"@angular-devkit/core@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.4.tgz#55f299ec9ce69841449a88fe1c349eb906c9e8f1" - integrity sha512-yiayoT0NBaajgUWxwHa723nx8xeV3Z5CjlzpV0m5IWn8pxPUqA7tAkFBAyGTuiukfIgri8iIlFkMrZrPIZyC2g== +"@angular-devkit/core@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-17.0.0-next.6.tgz#e939e86c5b74f5f8b9abbc9cdb16bb6d0998c2de" + integrity sha512-KfuXWSV9BU2dKEEpAwVJFjuvUdlqFzZD1vGqZpbXtaKnRAwqbEChy1nQJNin0E4gJ1XXFDmCv/gcGasDV3r1wg== dependencies: ajv "8.12.0" ajv-formats "2.1.1" @@ -136,12 +135,12 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.4.tgz#ac54e85eaf24a8b5e5b6dcde7f6a59f8f09e2192" - integrity sha512-hS3Wx1u4VEEXixcxDTGOhSqQixYlN3lUz3+44lGfZMJ1wr9IHnhDATywbdOf9pIebnRBpQQGlUpm7aGAG+6BHQ== +"@angular-devkit/schematics@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-17.0.0-next.6.tgz#d0155cceaa303f5d65c44431dd9bb19d36613d1e" + integrity sha512-BYS/zUuzLzJtG1ajOYzjDQZKFlbcWRuR+03huDxAQsYGF3q0li2I1xly1gZDkZudMoTgYOBcK8oBBC1PAJ2ABA== dependencies: - "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" jsonc-parser "3.2.0" magic-string "0.30.3" ora "5.4.1" @@ -155,12 +154,12 @@ "@angular/core" "^13.0.0 || ^14.0.0-0" reflect-metadata "^0.1.13" -"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8": - version "0.0.0-ba9b4487ced515e5b4d87edd681a3bd9792444d6" - uid "9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8" - resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#9c8f716ebfbda4ecf05cfc7abf06989a6b17b4c8" +"@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6": + version "0.0.0-9b1adb2ad5a049ea9985734f197dca43dd4d3f1b" + uid cc70f65938ac822d810f8ba44427efa848906cd6 + resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6" dependencies: - "@angular-devkit/build-angular" "17.0.0-next.4" + "@angular-devkit/build-angular" "17.0.0-next.6" "@angular/benchpress" "0.3.0" "@babel/core" "^7.16.0" "@babel/helper-annotate-as-pure" "^7.18.6" @@ -172,7 +171,7 @@ "@bazel/runfiles" "5.8.1" "@bazel/terser" "5.8.1" "@bazel/typescript" "5.8.1" - "@microsoft/api-extractor" "7.36.4" + "@microsoft/api-extractor" "7.38.0" "@types/browser-sync" "^2.26.3" "@types/marked" "^5.0.1" "@types/node" "16.10.9" @@ -180,7 +179,7 @@ "@types/send" "^0.17.1" "@types/tmp" "^0.2.1" "@types/uuid" "^9.0.0" - "@types/ws" "8.5.5" + "@types/ws" "8.5.6" "@types/yargs" "^17.0.0" browser-sync "^2.27.7" clang-format "1.8.0" @@ -189,7 +188,7 @@ preact-render-to-string "^6.2.1" prettier "3.0.3" protractor "^7.0.0" - selenium-webdriver "4.12.0" + selenium-webdriver "4.13.0" send "^0.18.0" source-map "^0.7.4" tmp "^0.2.1" @@ -199,24 +198,24 @@ uuid "^9.0.0" yargs "^17.0.0" -"@angular/cdk@17.0.0-next.3": - version "17.0.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.0-next.3.tgz#e1478bfc5b452b6fffd30be84421bf71d6777b10" - integrity sha512-oGGdzj2kEEC9BuLMRWnNlyDNKZ4TutdaFj6LHYTUYk2yDe5VdpI8A86PcVXjh7vafVGbnfNZwGG4HnF4YVlpoQ== +"@angular/cdk@17.0.0-next.5": + version "17.0.0-next.5" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-17.0.0-next.5.tgz#df8fec7dad4e1c39ba618fdeae90a0101291cf12" + integrity sha512-liDR9yAXuO67y0SuOiDMXAt+DPqY/DLF8sCjYWLSzQf6qCyE293QWQfRBkxxtrADVCNX2Gvk6NtYpeyqG//Xrg== dependencies: tslib "^2.3.0" optionalDependencies: parse5 "^7.1.2" -"@angular/cli@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.4.tgz#4c211f26ca7c62bd2cce0b71de5b7446039e32b7" - integrity sha512-zeZnKZV2NpKepCNpLJOU2YlWlbdwsHpZ3g75ip/toNmdMSjuG7qAAwGb9fyRx02B7OKlkczS967LCMVU8eT5kw== +"@angular/cli@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-17.0.0-next.6.tgz#afa412bce468be376f3cfc6594aeecefb3c26403" + integrity sha512-eE5Q2D1om5Hqumh74Cj40K2Cr9d1kafH24YXHhVjU3eccSGw1UlhMIw14NmJGMJyrONX6UAwKPqvH3JR988Wvg== dependencies: - "@angular-devkit/architect" "0.1700.0-next.4" - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" - "@schematics/angular" "17.0.0-next.4" + "@angular-devkit/architect" "0.1700.0-next.6" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" + "@schematics/angular" "17.0.0-next.6" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" @@ -239,64 +238,64 @@ dependencies: tslib "^2.3.0" -"@angular/material@17.0.0-next.3": - version "17.0.0-next.3" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.0-next.3.tgz#9c872bf85b9b3ed7b67242fd809dff9b545ea8b9" - integrity sha512-V7IB9lXM/Gd1NkmsBuIb+YiOvQShVmH3cUQpcOjkG4zt1Mfcwyg2y+eRGqmdh2nWr4zUZ06WQxoNkqouzNJZcA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/auto-init" "15.0.0-canary.bc9ae6c9c.0" - "@material/banner" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/card" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/chips" "15.0.0-canary.bc9ae6c9c.0" - "@material/circular-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/data-table" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dialog" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/drawer" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/fab" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/form-field" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/image-list" "15.0.0-canary.bc9ae6c9c.0" - "@material/layout-grid" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/radio" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/segmented-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/select" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/slider" "15.0.0-canary.bc9ae6c9c.0" - "@material/snackbar" "15.0.0-canary.bc9ae6c9c.0" - "@material/switch" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-bar" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" - "@material/textfield" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tooltip" "15.0.0-canary.bc9ae6c9c.0" - "@material/top-app-bar" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@angular/material@17.0.0-next.5": + version "17.0.0-next.5" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-17.0.0-next.5.tgz#1e67e3d6599bd18ac599f804e396a4692e7d2372" + integrity sha512-dlyTJlJ48DsddiX/GLQVsz4Vkw0QdDeEZtyTn5CpWTuPP3aQ1Jb3lpt9CCVmyCwcsCneSNmFMyJLRKlDt61shQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/auto-init" "15.0.0-canary.a246a4439.0" + "@material/banner" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/card" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/chips" "15.0.0-canary.a246a4439.0" + "@material/circular-progress" "15.0.0-canary.a246a4439.0" + "@material/data-table" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dialog" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/drawer" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/fab" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/form-field" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/image-list" "15.0.0-canary.a246a4439.0" + "@material/layout-grid" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/linear-progress" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/radio" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/segmented-button" "15.0.0-canary.a246a4439.0" + "@material/select" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/slider" "15.0.0-canary.a246a4439.0" + "@material/snackbar" "15.0.0-canary.a246a4439.0" + "@material/switch" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" + "@material/tab-bar" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/tab-scroller" "15.0.0-canary.a246a4439.0" + "@material/textfield" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tooltip" "15.0.0-canary.a246a4439.0" + "@material/top-app-bar" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.3.0" -"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#8affb31414514e13f693ab3795d91f6bb7a1853e": - version "0.0.0-ba9b4487ced515e5b4d87edd681a3bd9792444d6" - uid "8affb31414514e13f693ab3795d91f6bb7a1853e" - resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#8affb31414514e13f693ab3795d91f6bb7a1853e" +"@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#26b676bbb6d98d514004cb3dda76a086812d710f": + version "0.0.0-9b1adb2ad5a049ea9985734f197dca43dd4d3f1b" + uid "26b676bbb6d98d514004cb3dda76a086812d710f" + resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#26b676bbb6d98d514004cb3dda76a086812d710f" dependencies: "@yarnpkg/lockfile" "^1.1.0" typescript "~4.9.0" @@ -1607,220 +1606,220 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== -"@esbuild/android-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz#bc35990f412a749e948b792825eef7df0ce0e073" - integrity sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw== +"@esbuild/android-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.3.tgz#91a3b1b4a68c01ffdd5d8ffffb0a83178a366ae0" + integrity sha512-w+Akc0vv5leog550kjJV9Ru+MXMR2VuMrui3C61mnysim0gkFCPOUTAfzTP0qX+HpN9Syu3YA3p1hf3EPqObRw== "@esbuild/android-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== -"@esbuild/android-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.2.tgz#edd1c8f23ba353c197f5b0337123c58ff2a56999" - integrity sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q== +"@esbuild/android-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.3.tgz#08bd09f2ebc312422f4e94ae954821f9cf37b39e" + integrity sha512-Lemgw4io4VZl9GHJmjiBGzQ7ONXRfRPHcUEerndjwiSkbxzrpq0Uggku5MxxrXdwJ+pTj1qyw4jwTu7hkPsgIA== "@esbuild/android-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== -"@esbuild/android-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.2.tgz#2dcdd6e6f1f2d82ea1b746abd8da5b284960f35a" - integrity sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w== +"@esbuild/android-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.3.tgz#b1dffec99ed5505fc57561e8758b449dba4924fe" + integrity sha512-FKQJKkK5MXcBHoNZMDNUAg1+WcZlV/cuXrWCoGF/TvdRiYS4znA0m5Il5idUwfxrE20bG/vU1Cr5e1AD6IEIjQ== "@esbuild/darwin-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== -"@esbuild/darwin-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz#55b36bc06d76f5c243987c1f93a11a80d8fc3b26" - integrity sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA== +"@esbuild/darwin-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.3.tgz#2e0db5ad26313c7f420f2cd76d9d263fc49cb549" + integrity sha512-kw7e3FXU+VsJSSSl2nMKvACYlwtvZB8RUIeVShIEY6PVnuZ3c9+L9lWB2nWeeKWNNYDdtL19foCQ0ZyUL7nqGw== "@esbuild/darwin-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== -"@esbuild/darwin-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz#982524af33a6424a3b5cb44bbd52559623ad719c" - integrity sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw== +"@esbuild/darwin-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.3.tgz#ebe99f35049180023bb37999bddbe306b076a484" + integrity sha512-tPfZiwF9rO0jW6Jh9ipi58N5ZLoSjdxXeSrAYypy4psA2Yl1dAMhM71KxVfmjZhJmxRjSnb29YlRXXhh3GqzYw== "@esbuild/freebsd-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== -"@esbuild/freebsd-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz#8e478a0856645265fe79eac4b31b52193011ee06" - integrity sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ== +"@esbuild/freebsd-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.3.tgz#cf8b58ba5173440ea6124a3d0278bfe4ce181c20" + integrity sha512-ERDyjOgYeKe0Vrlr1iLrqTByB026YLPzTytDTz1DRCYM+JI92Dw2dbpRHYmdqn6VBnQ9Bor6J8ZlNwdZdxjlSg== "@esbuild/freebsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== -"@esbuild/freebsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz#01b96604f2540db023c73809bb8ae6cd1692d6f3" - integrity sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw== +"@esbuild/freebsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.3.tgz#3f283099810ef1b8468cd1a9400c042e3f12e2a7" + integrity sha512-nXesBZ2Ad1qL+Rm3crN7NmEVJ5uvfLFPLJev3x1j3feCQXfAhoYrojC681RhpdOph8NsvKBBwpYZHR7W0ifTTA== "@esbuild/linux-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== -"@esbuild/linux-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz#7e5d2c7864c5c83ec789b59c77cd9c20d2594916" - integrity sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg== +"@esbuild/linux-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.3.tgz#a8b3aa69653ac504a51aa73739fb06de3a04d1ff" + integrity sha512-qXvYKmXj8GcJgWq3aGvxL/JG1ZM3UR272SdPU4QSTzD0eymrM7leiZH77pvY3UetCy0k1xuXZ+VPvoJNdtrsWQ== "@esbuild/linux-arm@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== -"@esbuild/linux-arm@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz#c32ae97bc0246664a1cfbdb4a98e7b006d7db8ae" - integrity sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg== +"@esbuild/linux-arm@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.3.tgz#ff6a2f68d4fc3ab46f614bca667a1a81ed6eea26" + integrity sha512-zr48Cg/8zkzZCzDHNxXO/89bf9e+r4HtzNUPoz4GmgAkF1gFAFmfgOdCbR8zMbzFDGb1FqBBhdXUpcTQRYS1cQ== "@esbuild/linux-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== -"@esbuild/linux-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz#3fc4f0fa026057fe885e4a180b3956e704f1ceaa" - integrity sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ== +"@esbuild/linux-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.3.tgz#5813baf70e406304e8931b200e39d0293b488073" + integrity sha512-7XlCKCA0nWcbvYpusARWkFjRQNWNGlt45S+Q18UeS///K6Aw8bB2FKYe9mhVWy/XLShvCweOLZPrnMswIaDXQA== "@esbuild/linux-loong64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== -"@esbuild/linux-loong64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz#633bcaea443f3505fb0ed109ab840c99ad3451a4" - integrity sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw== +"@esbuild/linux-loong64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.3.tgz#21110f29b5e31dc865c7253fde8a2003f7e8b6fd" + integrity sha512-qGTgjweER5xqweiWtUIDl9OKz338EQqCwbS9c2Bh5jgEH19xQ1yhgGPNesugmDFq+UUSDtWgZ264st26b3de8A== "@esbuild/linux-mips64el@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== -"@esbuild/linux-mips64el@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz#e0bff2898c46f52be7d4dbbcca8b887890805823" - integrity sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg== +"@esbuild/linux-mips64el@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.3.tgz#4530fc416651eadeb1acc27003c00eac769eb8fd" + integrity sha512-gy1bFskwEyxVMFRNYSvBauDIWNggD6pyxUksc0MV9UOBD138dKTzr8XnM2R4mBsHwVzeuIH8X5JhmNs2Pzrx+A== "@esbuild/linux-ppc64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== -"@esbuild/linux-ppc64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz#d75798da391f54a9674f8c143b9a52d1dbfbfdde" - integrity sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw== +"@esbuild/linux-ppc64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.3.tgz#facf910b0d397e391b37b01a1b4f6e363b04e56b" + integrity sha512-UrYLFu62x1MmmIe85rpR3qou92wB9lEXluwMB/STDzPF9k8mi/9UvNsG07Tt9AqwPQXluMQ6bZbTzYt01+Ue5g== "@esbuild/linux-riscv64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== -"@esbuild/linux-riscv64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz#012409bd489ed1bb9b775541d4a46c5ded8e6dd8" - integrity sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw== +"@esbuild/linux-riscv64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.3.tgz#4a67abe97a495430d5867340982f5424a64f2aac" + integrity sha512-9E73TfyMCbE+1AwFOg3glnzZ5fBAFK4aawssvuMgCRqCYzE0ylVxxzjEfut8xjmKkR320BEoMui4o/t9KA96gA== "@esbuild/linux-s390x@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== -"@esbuild/linux-s390x@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz#ece3ed75c5a150de8a5c110f02e97d315761626b" - integrity sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g== +"@esbuild/linux-s390x@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.3.tgz#c5fb47474b9f816d81876c119dbccadf671cc5f6" + integrity sha512-LlmsbuBdm1/D66TJ3HW6URY8wO6IlYHf+ChOUz8SUAjVTuaisfuwCOAgcxo3Zsu3BZGxmI7yt//yGOxV+lHcEA== "@esbuild/linux-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== -"@esbuild/linux-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz#dea187019741602d57aaf189a80abba261fbd2aa" - integrity sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ== +"@esbuild/linux-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.3.tgz#f22d659969ab78dc422f1df8d9a79bc1e7b12ee3" + integrity sha512-ogV0+GwEmvwg/8ZbsyfkYGaLACBQWDvO0Kkh8LKBGKj9Ru8VM39zssrnu9Sxn1wbapA2qNS6BiLdwJZGouyCwQ== "@esbuild/netbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== -"@esbuild/netbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz#bbfd7cf9ab236a23ee3a41b26f0628c57623d92a" - integrity sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ== +"@esbuild/netbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.3.tgz#e9b046934996991f46b8c1cadac815aa45f84fd4" + integrity sha512-o1jLNe4uzQv2DKXMlmEzf66Wd8MoIhLNO2nlQBHLtWyh2MitDG7sMpfCO3NTcoTMuqHjfufgUQDFRI5C+xsXQw== "@esbuild/openbsd-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== -"@esbuild/openbsd-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz#fa5c4c6ee52a360618f00053652e2902e1d7b4a7" - integrity sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw== +"@esbuild/openbsd-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.3.tgz#b287ef4841fc1067bbbd9a60549e8f9cf1b7ee3a" + integrity sha512-AZJCnr5CZgZOdhouLcfRdnk9Zv6HbaBxjcyhq0StNcvAdVZJSKIdOiPB9az2zc06ywl0ePYJz60CjdKsQacp5Q== "@esbuild/sunos-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== -"@esbuild/sunos-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz#52a2ac8ac6284c02d25df22bb4cfde26fbddd68d" - integrity sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw== +"@esbuild/sunos-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.3.tgz#b2b8ba7d27907c7245f6e57dc62f3b88693f84b0" + integrity sha512-Acsujgeqg9InR4glTRvLKGZ+1HMtDm94ehTIHKhJjFpgVzZG9/pIcWW/HA/DoMfEyXmANLDuDZ2sNrWcjq1lxw== "@esbuild/win32-arm64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== -"@esbuild/win32-arm64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz#719ed5870855de8537aef8149694a97d03486804" - integrity sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg== +"@esbuild/win32-arm64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.3.tgz#1974c8c180c9add4962235662c569fcc4c8f43dd" + integrity sha512-FSrAfjVVy7TifFgYgliiJOyYynhQmqgPj15pzLyJk8BUsnlWNwP/IAy6GAiB1LqtoivowRgidZsfpoYLZH586A== "@esbuild/win32-ia32@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== -"@esbuild/win32-ia32@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz#24832223880b0f581962c8660f8fb8797a1e046a" - integrity sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA== +"@esbuild/win32-ia32@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.3.tgz#b02cc2dd8b6aed042069680f01f45fdfd3de5bc4" + integrity sha512-xTScXYi12xLOWZ/sc5RBmMN99BcXp/eEf7scUC0oeiRoiT5Vvo9AycuqCp+xdpDyAU+LkrCqEpUS9fCSZF8J3Q== "@esbuild/win32-x64@0.18.20": version "0.18.20" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== -"@esbuild/win32-x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz#1205014625790c7ff0e471644a878a65d1e34ab0" - integrity sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw== +"@esbuild/win32-x64@0.19.3": + version "0.19.3" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.3.tgz#e5036be529f757e58d9a7771f2f1b14782986a74" + integrity sha512-FbUN+0ZRXsypPyWE2IwIkVjDkDnJoMJARWOcFZn4KPPli+QnKqF0z1anvfaYe3ev5HFCpRDLLBDHyOALLppWHw== "@google-cloud/paginator@^4.0.0": version "4.0.1" @@ -1988,706 +1987,706 @@ resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.9.tgz#85f221eb82f9d555e180e87d6e50fb154af85408" integrity sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ== -"@material/animation@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz#7c27a42b027fcc2cd9a97c9d3b8f54a16b47333d" - integrity sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw== +"@material/animation@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/animation/-/animation-15.0.0-canary.a246a4439.0.tgz#bb7a8dc450e99be4f3c3ef4ace206b44ee1a9162" + integrity sha512-0eV06UGYeuFwC/4t+yjg3LCRGRLq72ybBtJYzcBDpP4ASTjie0WmpAOFJYXRq2U5X/yxLviDMhpRemoSUjgZ0Q== dependencies: tslib "^2.1.0" -"@material/auto-init@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz#9536732573cbe3db9613683496884592387c1e7b" - integrity sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA== +"@material/auto-init@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-15.0.0-canary.a246a4439.0.tgz#b5235074cd8ec08a2c28f2b2be1a452a173c4e98" + integrity sha512-0QfmjT5elQ10hCxToVgq/WaC3301tVH1sJaO3O2yocVzr7s6iWm8/zch16V5hcHzQHbtcT3Rf4y1ZzmdNys2Iw== dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/banner@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz#5b1053ebc4a07bfb5f92f6b457e87cd15ed6ebf7" - integrity sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/banner@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/banner/-/banner-15.0.0-canary.a246a4439.0.tgz#0e9dfb1063b9746b5420579c7a1cc736c589aba9" + integrity sha512-PBLgH7JEbEpTkLy33oyWXUhIFmSsdOrR6Gn6qIgQRo1qrnk5RSBGW2gEq4Z6793vjxM107gKudDb23E4Fcu4vg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/base@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz#99f7243759cc6833707f0bb555db723ea78b9eff" - integrity sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg== +"@material/base@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/base/-/base-15.0.0-canary.a246a4439.0.tgz#a4b013e184d60969c3d27d04925f8a4dbd4a6683" + integrity sha512-/ob3v3IFU8q2gGdVNWw5kNPjW2mRTeBIz1YdhGWUmRxKn2Kl8bdLOvrAmZtQMmPn/4cGXvinxpec/zVBWQKDkA== dependencies: tslib "^2.1.0" -"@material/button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz#adb43ffb0bf57cd634a0c31b6a5f26123e78c2c8" - integrity sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw== - dependencies: - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/button/-/button-15.0.0-canary.a246a4439.0.tgz#84676925fe6da5367b759c4ce9a585f7cbc96416" + integrity sha512-rGpVRde0Aqhv2t9QvT8Zl3HvG89BeUNPOpgfpaLBZ4SGGAO4rIrckl/eCENibKgmmdCKcYZlG9gc5abQVPfUvw== + dependencies: + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/card@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz#772ba3d7397335740c3c2058f039be82696aa884" - integrity sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA== - dependencies: - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/card@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/card/-/card-15.0.0-canary.a246a4439.0.tgz#b195e66485fb450668eec12c3ad68404d659be5a" + integrity sha512-+rYUnBPgv5QVF6BeUs3toIRdSwFVohGmjk2ptTXMZkKxqAJt7Nr9Znbm3Ym2hD8GUHJeh3pyGFvEs6rG6JMYAw== + dependencies: + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/checkbox@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz#b13784c068b137386c43ae409517176b986c5d49" - integrity sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/checkbox@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-15.0.0-canary.a246a4439.0.tgz#9b38a2fcff58f31adb2dcd22e6d6a0095fdf9250" + integrity sha512-sQwHzm1TSxHUoPrqplWTk/BhyzdDhzcwlbucwJK9W0o9WXMDk+d9PvcCxpP/9sAnVqZk42BfE89Y0T1DHglZ9A== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/chips@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz#a77ee7bf8ea9146156996c5632496ebca27520e9" - integrity sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/chips@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/chips/-/chips-15.0.0-canary.a246a4439.0.tgz#2d73b4c7b5326ee6a160db01b84ad2a893b1cb53" + integrity sha512-TiV9WJ5taEHPGWPhXbxJvUJhLzThg+VpK7aAlvL4RurtmJ7pURuEdRS4Z6o0OEqi3wKQ4z/+K44kZUn/+9HALg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/circular-progress@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz#800cb10a3a66f125a5ed8d4ae9fffdf236da5984" - integrity sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/circular-progress@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/circular-progress/-/circular-progress-15.0.0-canary.a246a4439.0.tgz#c5d850525d69852526925db21d40c05de516685a" + integrity sha512-+QTfyExPWzgm2tqMInd32qQOftsC1b8MUhAhZSfuecYBfqAc7KZkQEKa2nm4y8EHKMFWe8/DcxLV6IxMBLgHwA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/progress-indicator" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/data-table@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz#0b5b51ed771f9bba8a1b4746448dec25000325c1" - integrity sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/checkbox" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/linear-progress" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/select" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/data-table@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/data-table/-/data-table-15.0.0-canary.a246a4439.0.tgz#f0bc21c00b19ae2a1e93cb51de975c7d6c17ca76" + integrity sha512-89qVOjR7gqby6fsmh7tKj29SjQ2sGLXu2IzCeX3Vni4mz+xxo5dv11jxYNADvdgJDfhyDJFPh1FlqAH7O09nFA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/checkbox" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/linear-progress" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/select" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/density@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz#83d7ef248a8d1818cddb01bcbfc947ab0ae6a952" - integrity sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg== +"@material/density@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/density/-/density-15.0.0-canary.a246a4439.0.tgz#459282080188a6fc056ba903c5a156599c2e5813" + integrity sha512-h8BJVCWkPR97WeWCN6/atVbSOP8J4+ZbbssidcwsnX7b3+3IaWdtBxGii25dsILX8pUVwwqxVis24y211b+8rg== dependencies: tslib "^2.1.0" -"@material/dialog@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz#a12e676c9d41009a1f4d5617f386d6b00d6ecdf0" - integrity sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/dialog@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-15.0.0-canary.a246a4439.0.tgz#3f89a19028edd942804dcb66945ae6024357b6a4" + integrity sha512-4lyxd+5ccOEMUGKzZcssaYyzkCsYTpYCSQSANR0toQPLv3voDwKMfA709uZI6+nL7Re6Xdf7jx8qe+QpTTjVcw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/dom@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz#960d25fdfed237c542560278465edb9c33ed44ec" - integrity sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg== +"@material/dom@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/dom/-/dom-15.0.0-canary.a246a4439.0.tgz#040dbc4c2e75ed99cfc4a51e0e5ce75851dd304b" + integrity sha512-AftSOGQoQg/Ys2kOVjZzvqWmsnhg3Kam/2UC4Gj0DMMCu36J4MAoD+3PpnOd1aG3wiJKtUXR2vPIwE8I/PM9yg== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/drawer@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz#68838f1a12ddd2bb56795bd187d0ce0192689ce5" - integrity sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/drawer@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-15.0.0-canary.a246a4439.0.tgz#791e4b776049efc7294a0a9a761c009f0f65fc88" + integrity sha512-/JUmbzRBaikdbZ250yA9ZTPqp2W5nGvvuHYoNVAAmtOmxuwGvvNNpWiVZy2lIYeYcf1hA7hJ5mEQxs0aSD7iWQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/elevation@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz#d8ca5f4b1f387c95326a6220a21178d4e965b30c" - integrity sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg== +"@material/elevation@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-15.0.0-canary.a246a4439.0.tgz#1d41b571cd655947b5dcc6a0cb53e114bf9d39a1" + integrity sha512-lwPIOb8fHyOljIWYcVLPT73dPIEOKat/CXu6gqYIVMQgZQIksQNUA7z1O3l7apkRSuYUOYSXqrgU7AnWP4KcJg== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/fab@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz#7e75ae184555a6568e882e854657ad1515b34c00" - integrity sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/fab@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/fab/-/fab-15.0.0-canary.a246a4439.0.tgz#f37666a4f40b80a79e36f2b2e369a5f4b792bd85" + integrity sha512-XUex3FNqxPD1i/4jITucB/RWTNkkdv52mbNmwrvbuThZlhuhyH9GzOQYTDop/b2783TPcv++xr8UUbuh8GWYzA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/feature-targeting@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz#f5fd69774664f20f176b3825072d7f2e48de7621" - integrity sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ== +"@material/feature-targeting@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-15.0.0-canary.a246a4439.0.tgz#ea6410861bc847f8315b163333147d7d7c82782b" + integrity sha512-/SU9X5y8CRp6RS9qnjnM/N5qfsJ8bYILpR841eZmN6DLqMupaM9Yy7Mx8+v/QvpBLLhk+jmu79nFzwkwW54d6Q== dependencies: tslib "^2.1.0" -"@material/floating-label@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz#b1245304edd6dbeedeae0499f292e79f8b2c479a" - integrity sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/floating-label@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-15.0.0-canary.a246a4439.0.tgz#6156b0192ac95c61dea705c4c1c6305be84acc22" + integrity sha512-832qZ/qxKx0KUatoeVY3Q2NmboVgiWBG0/1VsbJyodHrgQWfnBOHgLE+M322o6uM3OhvO+kWm4iYbvwhmLZGsw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/focus-ring@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz#063396eefa5638edbbf99ac713c1087da1f8434c" - integrity sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w== - dependencies: - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - -"@material/form-field@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz#76d23e14f910a28081ccb438e094e04bbffadf19" - integrity sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/focus-ring@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/focus-ring/-/focus-ring-15.0.0-canary.a246a4439.0.tgz#b4aad6f3eb8f3eef07da1f3302e291c02b3a992f" + integrity sha512-ar0BtACFS3K14k/enAg0ePeEA/f/RJY4Ji4L/00Dw/B3XVpNRbqLH49jkcbtcQjdTS0FEyk2sWSNMZl6wVi0/A== + dependencies: + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + +"@material/form-field@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-15.0.0-canary.a246a4439.0.tgz#a3f4deccba0dafa0eefa7c82b9f9b21bec871607" + integrity sha512-Q/+ErgtAUFUPPUmWA1m5IP5voiN8XjPRwyoAlFxSTa/4t+EA5B18Z8Bsn9b6I0AC8RHke06H7UWrKz8XUDIFpw== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/icon-button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz#67246733d5e1aef1953208d3dfac01425d560ede" - integrity sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/icon-button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-15.0.0-canary.a246a4439.0.tgz#6d0121dd8ab97b024dcd36eee620b61fe8bbc8a8" + integrity sha512-Igyo94rkIlqC91BR1Tv+WLTz1ZWcZZjl1xU7Vsx8mbWA1PnaRDUTNVV5LFi4e0ORp6GSblFTImpHngEy4agMEg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/image-list@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz#9a765ec6caa7e4761a19048679912abc759d7988" - integrity sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ== +"@material/image-list@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-15.0.0-canary.a246a4439.0.tgz#ecf3fa191d4e1b1b64050583abb9aa5b08f4e7b7" + integrity sha512-Rcj3q7Tp7Nwbe5ht6ptTc3zqK8TSDJHaPDBf+kzi0kkh6MAB4qoHPgn+HnA+zIZ79CScU56bN7zjA6XYaZvsLw== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/layout-grid@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz#44f972c0975baa36e14c8d82b69957b7e59c25d3" - integrity sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q== +"@material/layout-grid@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-15.0.0-canary.a246a4439.0.tgz#65ad68bab019d92fc047bfd00a8ad2c654ad59f3" + integrity sha512-bkfxZuVzgtjEJgR3n8pvDQbe88ffULDJ5d2DF34IR8SOiRmQcj7UzqAt95XwIUcWlfisLCoIryP4U8XSpFb1EQ== dependencies: tslib "^2.1.0" -"@material/line-ripple@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz#0de6f3f4bcca06056ab0dec23a84a7a99fb0ecc4" - integrity sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q== +"@material/line-ripple@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-15.0.0-canary.a246a4439.0.tgz#b38d7b59507067622825f31e7663301cd18ba240" + integrity sha512-20WmwRrejmtOdI37+959UqEVIjbMtAXlkDOkfCIA3OUhp+oZSjVkCqKxI16jxxVlnzJ353fy8xeSKzOHe4sExQ== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/linear-progress@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz#12650b19c776542b0b084792ca1d6894dbd54cf4" - integrity sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/progress-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/linear-progress@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-15.0.0-canary.a246a4439.0.tgz#534d36d41e1c05d965fe2b0fe087ca76f15d282c" + integrity sha512-IcCd4476pXHloTYadHDJ+2c2lntoVigeNnQEiD/ASQTKqKrJqkIdvvczFm9Ryu+V2+TKhp7vvQGFLUMaLPcmhw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/progress-indicator" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/list@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz#daaf0ca8cb9b68fb2df0877c12571741b8098ddb" - integrity sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/list@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/list/-/list-15.0.0-canary.a246a4439.0.tgz#530f76da6324f8d4d3b6f9545e1cb53b4dfd2d25" + integrity sha512-4H5dKIjCUGIPmKjfcegV0SBybD5NNdHp26OU6sovvWIvxSGQtDJr6z9I7i+0vF/HIS5ScbHD2+9/txtL80iqCA== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/menu-surface@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz#213cc9b251e626c54e1f799b3b52d74659b3c549" - integrity sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/menu-surface@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-15.0.0-canary.a246a4439.0.tgz#e03cf761cfe331af3498bcbb5cd1601f83e9849e" + integrity sha512-4h4wZ0Rs7qBg1Otldw8ljp+LCULNL42pqbqcTXhKAkJM7pHcSw4k7IfoThSRLU3+V8T3/+qiAXyeQix2OGHzwg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/menu@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz#162fbd5b608fbf6edd4a65b3963db947c0e4c96b" - integrity sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/menu@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/menu/-/menu-15.0.0-canary.a246a4439.0.tgz#f8725573ff1296c7b1d6539675243a64b96b4957" + integrity sha512-2HOHQAIdWQtXjSvEIrW3lnbcIwFf5XaQhFzCEZ04FcSGApc4iLwsmRFVW3PzWx+mVrUrEfO/K42DVULIX9J1Pg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/notched-outline@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz#94d4c7646e75fad9ca78ad66487a3f7445030664" - integrity sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/notched-outline@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-15.0.0-canary.a246a4439.0.tgz#4d183b37014a3aacf961ee9630848e3b9a530a06" + integrity sha512-zmRZHJ+5cOWsBatRyK50wuht78olXySyKOJIIEmy8lxSMZefI1764u0mr8tS1KYF8vSAl5cUlwCC3/2Njz1FPg== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/progress-indicator@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#b440bff7e8b351af7eaf8fa7663f451e7ee112f4" - integrity sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w== +"@material/progress-indicator@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/progress-indicator/-/progress-indicator-15.0.0-canary.a246a4439.0.tgz#8b4136e887dbf700fc17f1480eec91ced326c275" + integrity sha512-92HM5niUnqG5Y3M/xkscBD+2lkaWPDcIRPo0RHPYcyldL+EhWRv/sdQpfdiXw/h3uvKSowKxBMCHm8krAyf+sQ== dependencies: tslib "^2.1.0" -"@material/radio@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz#18a1724eb4d394faf7a485f116c8353d3685c0ee" - integrity sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" +"@material/radio@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/radio/-/radio-15.0.0-canary.a246a4439.0.tgz#3fe24387017bf312b0092eec65ccc2c531b10ca5" + integrity sha512-on8EVztWXc/ajcaowFZ31ClGADYxQrhj4ulMne0NxdHHWQ44ttf5aXOVqtv5mxeOzrRACOkQyTUXBG07yTWCEQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/ripple@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz#1b64bdb47d1e5016bb0663d8b045a7e63048ad86" - integrity sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" +"@material/ripple@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-15.0.0-canary.a246a4439.0.tgz#cc280802f29d9e230c2460f790f2adf90fe354a4" + integrity sha512-Vl615/PIBpBD+IOI9Xypz0SV3RsmYJYSNx890Rih7irhUOaPsOUBmTYOWF5AsGBynqLcXoTNVhK92drYLKtJwQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/rtl@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz#a9ba66d0cec2d1d38892d3e9cb65157fcf012dfa" - integrity sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw== +"@material/rtl@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-15.0.0-canary.a246a4439.0.tgz#31ef4971ad1b82c791acf62b412206e093048351" + integrity sha512-pgJFw8ZRpWGpwv7ZuBTJ+WdNmFBKoLVoMbbxKQWTHXVwhAqn3aoIq95o62T5QeEG/+sguNShdquG45CpAMmSRw== dependencies: - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/segmented-button@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz#635e5a7dee12163b08a78872a0cacd4121024abd" - integrity sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/touch-target" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/segmented-button@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/segmented-button/-/segmented-button-15.0.0-canary.a246a4439.0.tgz#cdd13b33901c20459105c3120b0d3e02380fe930" + integrity sha512-oqGHs2C7C+yJW/xZf/wP8jBGLs6HcerhM3CsorLAEMH3MGuIlVC17WcisBewEWucsILYEWbySXy/7T4h6/psZA== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/touch-target" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/select@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz#bd5039d0cb123fef358e85fdd4a002556f11598b" - integrity sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/list" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu" "15.0.0-canary.bc9ae6c9c.0" - "@material/menu-surface" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/select@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/select/-/select-15.0.0-canary.a246a4439.0.tgz#0a480c12a09b9fb5e99da94ad5a9aa0c5d26a805" + integrity sha512-odoNLiVOgdwbEeePkjHtlr43pjskDwyO8hi4z3jcud1Rg1czk5zoJ2mUI0+olOJjBQ26PGocwrSLqf3qaThbIA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/list" "15.0.0-canary.a246a4439.0" + "@material/menu" "15.0.0-canary.a246a4439.0" + "@material/menu-surface" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/shape@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz#c597f8e439dc40799d2de3cfa62006faaf334a20" - integrity sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA== +"@material/shape@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/shape/-/shape-15.0.0-canary.a246a4439.0.tgz#15ea064ada9d057400f9600bad385b49529f407d" + integrity sha512-rcWPlCoHyP79ozeEKk73KWt9WTWdh6R68+n75l08TSTvnWZB5RRTmsI9BMkz55O9OJD/8H8ZsOxBe4x2QXUT7w== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/slider@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz#5f9fa85cb0b95f45042b14a510d20ae894ee027c" - integrity sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/slider@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/slider/-/slider-15.0.0-canary.a246a4439.0.tgz#ae6506a049ea9b18dc781dec5117a723cad408b0" + integrity sha512-is1BSBpxaXBBv+wSVpe9WGWmWl59yJEeDNubTES2UFD0er3BmA+PdKkL09vvytDnBcbKf77TbxaRiUSGVaKUQA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/snackbar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz#9f482fab88c3be85d06b450b67ac0008b6352875" - integrity sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/icon-button" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/snackbar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-15.0.0-canary.a246a4439.0.tgz#201b417a0e0d674d09c68e6b43668c3ad9b18346" + integrity sha512-2NAtC1qozR/uajszZnPy08Ej8HNnpgvCjNCBerDN4SLH2Q0/aWrVrUjqRCp2ayAvsX+szoroGbCboMhaWRzDuQ== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/icon-button" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/switch@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz#3de9394d2f23dc7bcc57bf633dde68498356f194" - integrity sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" +"@material/switch@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/switch/-/switch-15.0.0-canary.a246a4439.0.tgz#3f3c1a1b17a51f971cc6356b7120daac163654c1" + integrity sha512-o0wcbYgm2yRs4een5uxT4RJnJ003DxXe33rk8vTBG2o7cdiSR3X7GJQxeIK3D9wPgWCAwBLhNYSzXrlTL5pkMw== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/tab-bar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz#952ce40f811a8fe1d54c1698454c9baf84a57e9d" - integrity sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-scroller" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tab-bar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-15.0.0-canary.a246a4439.0.tgz#548c79f54c5ad912157eab95d2ede6b96bdd8697" + integrity sha512-dMQb1vXsBchQXcjbwgJZIGqTZHngm+3QGSOSb4LWjqHIgC5+w2RRrHsIAjNTyRhKssJ9nKKrbpM/Yz5vTPWH6w== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/tab-scroller" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab-indicator@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz#be37f0cf107c23da64efd4f385130d7d22a55b9c" - integrity sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ== +"@material/tab-indicator@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-15.0.0-canary.a246a4439.0.tgz#ed9a9cf50d7175edf32b94d9a199a75656ed5c58" + integrity sha512-gG2BgHT+ggKnUOaT8LjmH/+9nknRLh8v9qemrhUkDuCtZ8inlaC33OVbbxfrpQW3J+UzBh5YCUSC+2KrN39uUA== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab-scroller@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz#fb7f85a6d89cc3ec60c398cf637d201262b9c749" - integrity sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w== +"@material/tab-scroller@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-15.0.0-canary.a246a4439.0.tgz#353927782e309ee1d3b18871b6665a6bca0970d9" + integrity sha512-6KvBpalc4SwLbHFm0rnuIE64VffUj7AKhnPc+mqM6VmxOvDzQ/ZSYga0rWlUfM4mCDFX3ZkSxim+iNzVF+Ejaw== dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab" "15.0.0-canary.bc9ae6c9c.0" + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/tab" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tab@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz#447482c5d13ce95fa502769e1f4bd91aa28b499f" - integrity sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w== - dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/focus-ring" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/tab-indicator" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tab@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tab/-/tab-15.0.0-canary.a246a4439.0.tgz#7b3629d4259006042c846e77e60fa892f86ef999" + integrity sha512-HGLK774uMeLnhbjDJBOjft7S6SurZnKb+6Und88OMDUVUEG6MkFBAKQQr09iBIeLE2sUAiGQhBVQtb7LJKwolQ== + dependencies: + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/focus-ring" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/tab-indicator" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/textfield@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz#177df6b286da09015153a3eadb9f6e7ddd990676" - integrity sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/density" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/floating-label" "15.0.0-canary.bc9ae6c9c.0" - "@material/line-ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/notched-outline" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/textfield@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-15.0.0-canary.a246a4439.0.tgz#fa8b5c9ff15d44d98d223b1b658114c72f258591" + integrity sha512-4BW5bUERPlIeiPnLSby21h1/xDmySuAG9Ucn1LM801a0+5mK3IwWb8031AP3filKZZqTx5JJvOJYZd6/OWBJVA== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/density" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/floating-label" "15.0.0-canary.a246a4439.0" + "@material/line-ripple" "15.0.0-canary.a246a4439.0" + "@material/notched-outline" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/theme@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz#32e8571f6b323cafb3f2f6104c06e40f2d7f37e3" - integrity sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg== +"@material/theme@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/theme/-/theme-15.0.0-canary.a246a4439.0.tgz#02d6f1ba7a7d6948d25b5f328f0381eb414fd081" + integrity sha512-HWxC5Nhz8JZKTLTVmAsNxIGB3Kzr53+YFMg327S8/XuEDmI0RFHFvtwM9rADmyrHFBmUaVhV4iELyxFdi67c9w== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/tokens@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz#b6833e9186d85c0707ebac2992098b345fe86ecd" - integrity sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q== - dependencies: - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - -"@material/tooltip@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz#e5703754d44d0daf9fccbaa66fc4dd3aa22b2a5b" - integrity sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/button" "15.0.0-canary.bc9ae6c9c.0" - "@material/dom" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/tokens" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/tokens@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tokens/-/tokens-15.0.0-canary.a246a4439.0.tgz#93cf05d49bdbc8b494b21fc3159f1bf9274983fa" + integrity sha512-+5iGfQ51YSb0Qau8uC6/jHXCSC3enKaQKDf/iPHfuXAe04UznW3tmm1/Ju227aZXNISTJcnQYa2rpm1M14MeUg== + dependencies: + "@material/elevation" "15.0.0-canary.a246a4439.0" + +"@material/tooltip@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/tooltip/-/tooltip-15.0.0-canary.a246a4439.0.tgz#96d0818b141f4aa4b58f499ab37c02d29a2b5b6b" + integrity sha512-Ja2Z4aZQkYWD6InXA+MG4M9zdKR6dYsXXlYzQppYpfcQzXylZqh5Y7WBLulG5fA2o83pHVwILfwFZM7j7ht08Q== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/button" "15.0.0-canary.a246a4439.0" + "@material/dom" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/tokens" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" safevalues "^0.3.4" tslib "^2.1.0" -"@material/top-app-bar@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz#e996435725f36991a6ca80604e032d21527e076d" - integrity sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA== - dependencies: - "@material/animation" "15.0.0-canary.bc9ae6c9c.0" - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/elevation" "15.0.0-canary.bc9ae6c9c.0" - "@material/ripple" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/shape" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" - "@material/typography" "15.0.0-canary.bc9ae6c9c.0" +"@material/top-app-bar@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-15.0.0-canary.a246a4439.0.tgz#5ca10581940fec75c0da84bb232dc6bb421a3ab2" + integrity sha512-twQchmCa1In/FFrALPYojgeM8vmV7KH96wRY9NmPSJ046ANgPCicLBgLuSzrLETCFqAwbztqzxSG4xMBL81rYg== + dependencies: + "@material/animation" "15.0.0-canary.a246a4439.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/elevation" "15.0.0-canary.a246a4439.0" + "@material/ripple" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/shape" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" + "@material/typography" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/touch-target@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz#3416302f86483510e47a8aef9392b0a77784652d" - integrity sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA== +"@material/touch-target@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/touch-target/-/touch-target-15.0.0-canary.a246a4439.0.tgz#1e9d7105ee985fe8b89370e00120d75a3518b78c" + integrity sha512-ubyD1TUjZnRPEdDnk6Lrcm2ZsjnU7CV5y7IX8pj9IPawiM6bx4FkjZBxUvclbv3WiTGk5UOnwPOySYAJYAMQ1w== dependencies: - "@material/base" "15.0.0-canary.bc9ae6c9c.0" - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/rtl" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/base" "15.0.0-canary.a246a4439.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/rtl" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@material/typography@15.0.0-canary.bc9ae6c9c.0": - version "15.0.0-canary.bc9ae6c9c.0" - resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz#1ca0641ef8a91945ca01a1aa6651db434741b37b" - integrity sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q== +"@material/typography@15.0.0-canary.a246a4439.0": + version "15.0.0-canary.a246a4439.0" + resolved "https://registry.yarnpkg.com/@material/typography/-/typography-15.0.0-canary.a246a4439.0.tgz#0d1387bc273511534d37cc6784b4ae1c4f70aeaf" + integrity sha512-eXzBl9ROzWZ+41nan5pCrn1C/Zq3o/VsrLFaGv8fdRmhRR6/wHMeuvCCwGf5VtEmWdAE9FpJzRU/4ZPiJCJUyg== dependencies: - "@material/feature-targeting" "15.0.0-canary.bc9ae6c9c.0" - "@material/theme" "15.0.0-canary.bc9ae6c9c.0" + "@material/feature-targeting" "15.0.0-canary.a246a4439.0" + "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" "@microsoft/api-extractor-model@7.27.6": @@ -2699,7 +2698,34 @@ "@microsoft/tsdoc-config" "~0.16.1" "@rushstack/node-core-library" "3.59.7" -"@microsoft/api-extractor@7.36.4", "@microsoft/api-extractor@^7.24.2": +"@microsoft/api-extractor-model@7.28.2": + version "7.28.2" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz#91c66dd820ccc70e0c163e06b392d8363f1b9269" + integrity sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig== + dependencies: + "@microsoft/tsdoc" "0.14.2" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "3.61.0" + +"@microsoft/api-extractor@7.38.0": + version "7.38.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.38.0.tgz#e72546d6766b3866578a462b040f71b17779e1c5" + integrity sha512-e1LhZYnfw+JEebuY2bzhw0imDCl1nwjSThTrQqBXl40hrVo6xm3j/1EpUr89QyzgjqmAwek2ZkIVZbrhaR+cqg== + dependencies: + "@microsoft/api-extractor-model" "7.28.2" + "@microsoft/tsdoc" "0.14.2" + "@microsoft/tsdoc-config" "~0.16.1" + "@rushstack/node-core-library" "3.61.0" + "@rushstack/rig-package" "0.5.1" + "@rushstack/ts-command-line" "4.16.1" + colors "~1.2.1" + lodash "~4.17.15" + resolve "~1.22.1" + semver "~7.5.4" + source-map "~0.6.1" + typescript "~5.0.4" + +"@microsoft/api-extractor@^7.24.2": version "7.36.4" resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.4.tgz#3bb9fbbbeacaa48eea49150351905a2677a506d9" integrity sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ== @@ -2732,10 +2758,10 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@ngtools/webpack@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.4.tgz#e65fd3ee7ee8ab0f1d4c72985b4707e69656ade1" - integrity sha512-XI5mSPloaMsj5zmBQ6QBEhg//OaMxfpNdsPg4EfldbdzwZ8lIS+yD3eoNaX74mkLc0gixgzOVQ6eW2nxsQlvng== +"@ngtools/webpack@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-17.0.0-next.6.tgz#450f8c1dcc448f6fd8a30e313d0735cd21b803c8" + integrity sha512-xsWk3iwoSvkl3ZSrN8jbLJZPKVPk8Ge7bnD6pzZDokjtl8ApcXatGd0NBqCQDr+lfV+ZdhVGJ5xfBiyGzEeSzw== "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" @@ -3041,6 +3067,19 @@ semver "~7.5.4" z-schema "~5.0.2" +"@rushstack/node-core-library@3.61.0": + version "3.61.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz#7441a0d2ae5268b758a7a49588a78cd55af57e66" + integrity sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ== + dependencies: + colors "~1.2.1" + fs-extra "~7.0.1" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.22.1" + semver "~7.5.4" + z-schema "~5.0.2" + "@rushstack/rig-package@0.4.1": version "0.4.1" resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.4.1.tgz#ff11bf67dad46f9b4f09db91cf45739ab411ee9f" @@ -3049,6 +3088,14 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" +"@rushstack/rig-package@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.1.tgz#6c9c283cc96b5bb1eae9875946d974ac5429bb21" + integrity sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA== + dependencies: + resolve "~1.22.1" + strip-json-comments "~3.1.1" + "@rushstack/ts-command-line@4.15.2": version "4.15.2" resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.15.2.tgz#7920e3fa2ab6af129d995ce4424c600da0bf8a93" @@ -3059,13 +3106,23 @@ colors "~1.2.1" string-argv "~0.3.1" -"@schematics/angular@17.0.0-next.4": - version "17.0.0-next.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.4.tgz#d419002a22089449c92a1ddbf088222806974154" - integrity sha512-9gnR8xoPEUJN4tQcH/yysfXP/4Bbm0f4g6VVnAvOdunwo+u5bucz21MacMqbVvMAFQA92neeFn6m8yb1VTQVHA== +"@rushstack/ts-command-line@4.16.1": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.16.1.tgz#3537bbc323f77c8646646465c579b992d39feb16" + integrity sha512-+OCsD553GYVLEmz12yiFjMOzuPeCiZ3f8wTiFHL30ZVXexTyPmgjwXEhg2K2P0a2lVf+8YBy7WtPoflB2Fp8/A== + dependencies: + "@types/argparse" "1.0.38" + argparse "~1.0.9" + colors "~1.2.1" + string-argv "~0.3.1" + +"@schematics/angular@17.0.0-next.6": + version "17.0.0-next.6" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-17.0.0-next.6.tgz#d05b45ad27470c14ada1eef15fa653707aff8913" + integrity sha512-hDDwlWKJhOWKY/+hz8yp/hEDi4ITQO6WYx1al6bfmvf8QOZ4o4HiuW4YSck03XxtCQ0AMTcPBpoYvRNbYWpYRQ== dependencies: - "@angular-devkit/core" "17.0.0-next.4" - "@angular-devkit/schematics" "17.0.0-next.4" + "@angular-devkit/core" "17.0.0-next.6" + "@angular-devkit/schematics" "17.0.0-next.6" jsonc-parser "3.2.0" "@sigstore/bundle@^2.1.0": @@ -3119,11 +3176,6 @@ dependencies: defer-to-connect "^2.0.0" -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - "@tootallnate/once@2": version "2.0.0" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" @@ -3732,13 +3784,20 @@ resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== -"@types/ws@*", "@types/ws@8.5.5", "@types/ws@^8.5.5": +"@types/ws@*", "@types/ws@^8.5.5": version "8.5.5" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: "@types/node" "*" +"@types/ws@8.5.6": + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.6.tgz#e9ad51f0ab79b9110c50916c9fcbddc36d373065" + integrity sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -3974,16 +4033,6 @@ "@webassemblyjs/ast" "1.11.6" "@xtuc/long" "4.2.2" -"@wessberg/ts-evaluator@0.0.27": - version "0.0.27" - resolved "https://registry.yarnpkg.com/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz#06e8b901d5e84f11199b9f84577c6426ae761767" - integrity sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA== - dependencies: - chalk "^4.1.0" - jsdom "^16.4.0" - object-path "^0.11.5" - tslib "^2.0.3" - "@xmldom/xmldom@^0.8.0", "@xmldom/xmldom@^0.8.5": version "0.8.10" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" @@ -4012,7 +4061,7 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^2.0.3, abab@^2.0.5, abab@^2.0.6: +abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== @@ -4037,14 +4086,6 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" @@ -4055,11 +4096,6 @@ acorn-jsx@^5.3.2: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - acorn-walk@^8.1.1: version "8.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" @@ -4070,12 +4106,7 @@ acorn@^6.1.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -4945,11 +4976,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - browser-sync-client@^2.29.3: version "2.29.3" resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.29.3.tgz#9300b97f42abc2c4f95ca29b5a9781b5c492f14a" @@ -6238,23 +6264,6 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - csv-parse@^5.0.4: version "5.5.0" resolved "https://registry.yarnpkg.com/csv-parse/-/csv-parse-5.5.0.tgz#2313421e69b650dae32a79ac884b20b21ca1d9da" @@ -6534,15 +6543,6 @@ data-uri-to-buffer@^5.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - date-format@^4.0.14: version "4.0.14" resolved "https://registry.yarnpkg.com/date-format/-/date-format-4.0.14.tgz#7a8e584434fb169a521c8b7aa481f355810d9400" @@ -6588,11 +6588,6 @@ decamelize@^1.1.1, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.2.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - decode-uri-component@^0.2.0, decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -7077,13 +7072,6 @@ domelementtype@^2.3.0: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - domhandler@^5.0.2, domhandler@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" @@ -7091,9 +7079,10 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -"domino@https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1": - version "2.1.6" - resolved "https://github.com/angular/domino.git#aa8de3486307f57a518b4b0d9e5e16d9fbd998d1" +"domino@https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a": + version "2.1.6+git" + uid f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a + resolved "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a" domutils@^3.0.1: version "3.1.0" @@ -7397,38 +7386,38 @@ es6-weak-map@^2.0.1: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -esbuild-wasm@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.2.tgz#046c39a6ef28b937fd8f847edaf767f32ca02ffc" - integrity sha512-ak2XIIJKby+Uo3Iqh8wtw4pn2uZcnfLgtcmBHIgkShpun5ZIJsFigWXp7uLt7gXk3QAOCMmv0TSsIxD5qdn+Vw== +esbuild-wasm@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.19.3.tgz#9ac844d4b542ad33a81be7cb32ba1d451522cee6" + integrity sha512-Vx94kkrz9CwaYutautk+RhIvwhcpawSRmKD/zz6n3wQqJgBzaMRVZaF9eAuVseXwOmfJexSGmwwgToQ1uAoOjg== -esbuild@0.19.2: - version "0.19.2" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" - integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== +esbuild@0.19.3: + version "0.19.3" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.3.tgz#d9268cd23358eef9d76146f184e0c55ff8da7bb6" + integrity sha512-UlJ1qUUA2jL2nNib1JTSkifQTcYTroFqRjwCFW4QYEKEsixXD5Tik9xML7zh2gTxkYTBKGHNH9y7txMwVyPbjw== optionalDependencies: - "@esbuild/android-arm" "0.19.2" - "@esbuild/android-arm64" "0.19.2" - "@esbuild/android-x64" "0.19.2" - "@esbuild/darwin-arm64" "0.19.2" - "@esbuild/darwin-x64" "0.19.2" - "@esbuild/freebsd-arm64" "0.19.2" - "@esbuild/freebsd-x64" "0.19.2" - "@esbuild/linux-arm" "0.19.2" - "@esbuild/linux-arm64" "0.19.2" - "@esbuild/linux-ia32" "0.19.2" - "@esbuild/linux-loong64" "0.19.2" - "@esbuild/linux-mips64el" "0.19.2" - "@esbuild/linux-ppc64" "0.19.2" - "@esbuild/linux-riscv64" "0.19.2" - "@esbuild/linux-s390x" "0.19.2" - "@esbuild/linux-x64" "0.19.2" - "@esbuild/netbsd-x64" "0.19.2" - "@esbuild/openbsd-x64" "0.19.2" - "@esbuild/sunos-x64" "0.19.2" - "@esbuild/win32-arm64" "0.19.2" - "@esbuild/win32-ia32" "0.19.2" - "@esbuild/win32-x64" "0.19.2" + "@esbuild/android-arm" "0.19.3" + "@esbuild/android-arm64" "0.19.3" + "@esbuild/android-x64" "0.19.3" + "@esbuild/darwin-arm64" "0.19.3" + "@esbuild/darwin-x64" "0.19.3" + "@esbuild/freebsd-arm64" "0.19.3" + "@esbuild/freebsd-x64" "0.19.3" + "@esbuild/linux-arm" "0.19.3" + "@esbuild/linux-arm64" "0.19.3" + "@esbuild/linux-ia32" "0.19.3" + "@esbuild/linux-loong64" "0.19.3" + "@esbuild/linux-mips64el" "0.19.3" + "@esbuild/linux-ppc64" "0.19.3" + "@esbuild/linux-riscv64" "0.19.3" + "@esbuild/linux-s390x" "0.19.3" + "@esbuild/linux-x64" "0.19.3" + "@esbuild/netbsd-x64" "0.19.3" + "@esbuild/openbsd-x64" "0.19.3" + "@esbuild/sunos-x64" "0.19.3" + "@esbuild/win32-arm64" "0.19.3" + "@esbuild/win32-ia32" "0.19.3" + "@esbuild/win32-x64" "0.19.3" esbuild@^0.18.10: version "0.18.20" @@ -8263,15 +8252,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -8970,13 +8950,6 @@ gtoken@^6.1.0: google-p12-pem "^4.0.0" jws "^4.0.0" -guess-parser@0.4.22: - version "0.4.22" - resolved "https://registry.yarnpkg.com/guess-parser/-/guess-parser-0.4.22.tgz#c26ab9e21b69bbc761960c5a1511476ae85428eb" - integrity sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg== - dependencies: - "@wessberg/ts-evaluator" "0.0.27" - gulp-cli@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.3.0.tgz#ec0d380e29e52aa45e47977f0d32e18fd161122f" @@ -9234,13 +9207,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -9309,15 +9275,6 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" @@ -9913,11 +9870,6 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - is-reference@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -10287,39 +10239,6 @@ jsdoc@^4.0.0: strip-json-comments "^3.1.0" underscore "~1.13.2" -jsdom@^16.4.0: - version "16.7.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -10987,7 +10906,7 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.15: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -11975,11 +11894,6 @@ number-is-nan@^1.0.0: resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== -nwsapi@^2.2.0: - version "2.2.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" - integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -12014,11 +11928,6 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-path@^0.11.5: - version "0.11.8" - resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.11.8.tgz#ed002c02bbdd0070b78a27455e8ae01fc14d4742" - integrity sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA== - object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -12444,11 +12353,6 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^7.0.0, parse5@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -13043,7 +12947,7 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.28: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== @@ -13182,11 +13086,6 @@ query-string@^7.0.1: split-on-first "^1.0.0" strict-uri-encode "^2.0.0" -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -13895,10 +13794,10 @@ sass-lookup@^3.0.0: dependencies: commander "^2.16.0" -sass@1.66.1: - version "1.66.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.66.1.tgz#04b51c4671e4650aa393740e66a4e58b44d055b1" - integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== +sass@1.67.0: + version "1.67.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.67.0.tgz#fed84d74b9cd708db603b1380d6dc1f71bb24f6f" + integrity sha512-SVrO9ZeX/QQyEGtuZYCVxoeAL5vGlYjJ9p4i4HFuekWl8y/LtJ7tJc10Z+ck1c8xOuoBm2MYzcLfTAffD0pl/A== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -13927,13 +13826,6 @@ sax@>=0.6.0, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" @@ -14006,10 +13898,10 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: tmp "0.0.30" xml2js "^0.4.17" -selenium-webdriver@4.12.0: - version "4.12.0" - resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.12.0.tgz#a8dc8ecf129a2414c2ace6e429aba84722a950a5" - integrity sha512-zvPzmTsky6WfO6+BGMj2mCJsw7qKnfQONur2b+pGn8jeTiC+WAUOthZOnaK+HkX5wiU6L4uoMF+JIcOVstp25A== +selenium-webdriver@4.13.0: + version "4.13.0" + resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-4.13.0.tgz#1e06bab7adedb308e3635131bc75bd32038261d5" + integrity sha512-8JS0h5E0Sq7gNfbGg8LVaQ+Eqek97tvOONn3Jmy+NiWfb12WYpftz4VTC4D2JT4wakdG6VUzGKpA8cFGg0IjkA== dependencies: jszip "^3.10.1" tmp "^0.2.1" @@ -14948,11 +14840,6 @@ symbol-observable@4.0.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-4.0.0.tgz#5b425f192279e87f2f9b937ac8540d1984b39205" integrity sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ== -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - systemjs@0.18.10: version "0.18.10" resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-0.18.10.tgz#4e679dc5bb04dffb9882d40b19c5daa1cd182102" @@ -15222,16 +15109,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.0.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" - integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -15247,13 +15124,6 @@ toxic@^1.0.0: dependencies: lodash "^4.17.10" -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -15674,11 +15544,6 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - universalify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" @@ -15775,14 +15640,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - url-to-options@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" @@ -15952,20 +15809,6 @@ vrsource-tslint-rules@6.0.0: resolved "https://registry.yarnpkg.com/vrsource-tslint-rules/-/vrsource-tslint-rules-6.0.0.tgz#a4e25e8f3fdd487684174f423c090c35d60f37a9" integrity sha512-pmcnJdIVziZTk1V0Cqehmh3gIabBRkBYXkv9vx+1CZDNEa41kNGUBFwQLzw21erYOd2QnD8jJeZhBGqnlT1HWw== -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - walkdir@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.4.1.tgz#dc119f83f4421df52e3061e514228a2db20afa39" @@ -16064,16 +15907,6 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - webpack-dev-middleware@6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.1.1.tgz#6bbc257ec83ae15522de7a62f995630efde7cc3d" @@ -16211,13 +16044,6 @@ webtreemap@^2.0.1: dependencies: commander "^2.11.0" -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - whatwg-encoding@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" @@ -16230,11 +16056,6 @@ whatwg-fetch@^3.4.1: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4" integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q== -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -16243,15 +16064,6 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - when@^3.7.2: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" @@ -16398,7 +16210,7 @@ ws@8.13.0, ws@>=8.13.0, ws@^8.13.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== -ws@^7.2.3, ws@^7.4.6: +ws@^7.2.3: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== @@ -16418,11 +16230,6 @@ xhr2@0.2.1: resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.2.1.tgz#4e73adc4f9cfec9cbd2157f73efdce3a5f108a93" integrity sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw== -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - xml2js@^0.4.17: version "0.4.23" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" @@ -16436,11 +16243,6 @@ xmlbuilder@~11.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - xmlcreate@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be" From e9c3790b4ea7633c3a3242640210452ed1fd2a3e Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 3 Oct 2023 08:38:30 +0000 Subject: [PATCH 02/57] docs: update to latest version of material (#51996) Update to the latest version of material PR Close #51996 --- goldens/size-tracking/aio-payloads.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/goldens/size-tracking/aio-payloads.json b/goldens/size-tracking/aio-payloads.json index 760f783a6977ca..d7e719e4a5263b 100755 --- a/goldens/size-tracking/aio-payloads.json +++ b/goldens/size-tracking/aio-payloads.json @@ -5,8 +5,8 @@ "main": 501754, "polyfills": 33862, "styles": 60209, - "light-theme": 31614, - "dark-theme": 31808 + "light-theme": 34317, + "dark-theme": 34598 } }, "aio-local": { @@ -15,8 +15,8 @@ "main": 501754, "polyfills": 33862, "styles": 60209, - "light-theme": 31614, - "dark-theme": 31808 + "light-theme": 34317, + "dark-theme": 34598 } } } From 9acd2ac98bc3b6ffc5a8d6c19f7290d05fe1f896 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 2 Oct 2023 12:59:36 +0200 Subject: [PATCH 03/57] fix(compiler): enable block syntax in the linker (#51979) Adds some logic to enable parsing of block syntax in the linker. Note that the syntax is only enabled on code compiled with Angular v17 or later. PR Close #51979 --- .../linker/src/file_linker/file_linker.ts | 2 +- .../partial_component_linker_1.ts | 24 +++++++--- .../partial_linkers/partial_linker.ts | 4 +- .../partial_linker_selector.ts | 5 +- .../src/file_linker/partial_linkers/util.ts | 2 + .../test/file_linker/file_linker_spec.ts | 48 +++++++++++++++++-- 6 files changed, 71 insertions(+), 14 deletions(-) diff --git a/packages/compiler-cli/linker/src/file_linker/file_linker.ts b/packages/compiler-cli/linker/src/file_linker/file_linker.ts index d30f8f88855ae4..14c55d41e9371b 100644 --- a/packages/compiler-cli/linker/src/file_linker/file_linker.ts +++ b/packages/compiler-cli/linker/src/file_linker/file_linker.ts @@ -69,7 +69,7 @@ export class FileLinker { const minVersion = metaObj.getString('minVersion'); const version = metaObj.getString('version'); const linker = this.linkerSelector.getLinker(declarationFn, minVersion, version); - const definition = linker.linkPartialDeclaration(emitScope.constantPool, metaObj); + const definition = linker.linkPartialDeclaration(emitScope.constantPool, metaObj, version); return emitScope.translateDefinition(definition); } diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts index 680f87ce376c00..7bee7d19642018 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ import {BoundTarget, ChangeDetectionStrategy, compileComponentFromMetadata, ConstantPool, DeclarationListEmitMode, DEFAULT_INTERPOLATION_CONFIG, ForwardRefHandling, InterpolationConfig, makeBindingParser, outputAst as o, parseTemplate, R3ComponentMetadata, R3DeclareComponentMetadata, R3DeclareDirectiveDependencyMetadata, R3DeclarePipeDependencyMetadata, R3DeferBlockMetadata, R3DirectiveDependencyMetadata, R3PartialDeclaration, R3TargetBinder, R3TemplateDependencyKind, R3TemplateDependencyMetadata, SelectorMatcher, TmplAstDeferredBlock, TmplAstDeferredBlockTriggers, TmplAstDeferredTrigger, TmplAstElement, ViewEncapsulation} from '@angular/compiler'; +import semver from 'semver'; import {AbsoluteFsPath} from '../../../../src/ngtsc/file_system'; import {Range} from '../../ast/ast_host'; @@ -15,7 +16,7 @@ import {GetSourceFileFn} from '../get_source_file'; import {toR3DirectiveMeta} from './partial_directive_linker_1'; import {LinkedDefinition, PartialLinker} from './partial_linker'; -import {extractForwardRef} from './util'; +import {extractForwardRef, PLACEHOLDER_VERSION} from './util'; function makeDirectiveMetadata( directiveExpr: AstObject, @@ -49,22 +50,27 @@ export class PartialComponentLinkerVersion1 implements private code: string) {} linkPartialDeclaration( - constantPool: ConstantPool, - metaObj: AstObject): LinkedDefinition { - const meta = this.toR3ComponentMeta(metaObj); + constantPool: ConstantPool, metaObj: AstObject, + version: string): LinkedDefinition { + const meta = this.toR3ComponentMeta(metaObj, version); return compileComponentFromMetadata(meta, constantPool, makeBindingParser()); } /** * This function derives the `R3ComponentMetadata` from the provided AST object. */ - private toR3ComponentMeta(metaObj: AstObject): - R3ComponentMetadata { + private toR3ComponentMeta( + metaObj: AstObject, + version: string): R3ComponentMetadata { const interpolation = parseInterpolationConfig(metaObj); const templateSource = metaObj.getValue('template'); const isInline = metaObj.has('isInline') ? metaObj.getBoolean('isInline') : false; const templateInfo = this.getTemplateInfo(templateSource, isInline); + // Enable the new block syntax if compiled with v17 and + // above, or when using the local placeholder version. + const supportsBlockSyntax = semver.major(version) >= 17 || version === PLACEHOLDER_VERSION; + const template = parseTemplate(templateInfo.code, templateInfo.sourceUrl, { escapedString: templateInfo.isEscaped, interpolationConfig: interpolation, @@ -74,6 +80,12 @@ export class PartialComponentLinkerVersion1 implements metaObj.has('preserveWhitespaces') ? metaObj.getBoolean('preserveWhitespaces') : false, // We normalize line endings if the template is was inline. i18nNormalizeLineEndingsInICUs: isInline, + + // TODO(crisbeto): hardcode the supported blocks for now. Before the final release + // `enabledBlockTypes` will be replaced with a boolean, at which point `supportsBlockSyntax` + // can be passed in directly here. + enabledBlockTypes: supportsBlockSyntax ? new Set(['if', 'switch', 'for', 'defer']) : + undefined, }); if (template.errors !== null) { const errors = template.errors.map(err => err.toString()).join('\n'); diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker.ts index 8baf54a198874a..680db8a33ecac3 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker.ts @@ -28,6 +28,6 @@ export interface PartialLinker { * `R3DeclareComponentMetadata` interfaces. */ linkPartialDeclaration( - constantPool: ConstantPool, - metaObj: AstObject): LinkedDefinition; + constantPool: ConstantPool, metaObj: AstObject, + version: string): LinkedDefinition; } diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker_selector.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker_selector.ts index 8bfa59796fdb46..03e0cbf9d33fba 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker_selector.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_linker_selector.ts @@ -21,6 +21,7 @@ import {PartialInjectorLinkerVersion1} from './partial_injector_linker_1'; import {PartialLinker} from './partial_linker'; import {PartialNgModuleLinkerVersion1} from './partial_ng_module_linker_1'; import {PartialPipeLinkerVersion1} from './partial_pipe_linker_1'; +import {PLACEHOLDER_VERSION} from './util'; export const ɵɵngDeclareDirective = 'ɵɵngDeclareDirective'; export const ɵɵngDeclareClassMetadata = 'ɵɵngDeclareClassMetadata'; @@ -68,7 +69,7 @@ export function createLinkerMap( environment: LinkerEnvironment, sourceUrl: AbsoluteFsPath, code: string): Map[]> { const linkers = new Map[]>(); - const LATEST_VERSION_RANGE = getRange('<=', '0.0.0-PLACEHOLDER'); + const LATEST_VERSION_RANGE = getRange('<=', PLACEHOLDER_VERSION); linkers.set(ɵɵngDeclareDirective, [ {range: LATEST_VERSION_RANGE, linker: new PartialDirectiveLinkerVersion1(sourceUrl, code)}, @@ -143,7 +144,7 @@ export class PartialLinkerSelector { } const linkerRanges = this.linkers.get(functionName)!; - if (version === '0.0.0-PLACEHOLDER') { + if (version === PLACEHOLDER_VERSION) { // Special case if the `version` is the same as the current compiler version. // This helps with compliance tests where the version placeholders have not been replaced. return linkerRanges[linkerRanges.length - 1].linker; diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/util.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/util.ts index c2e4e30c1b979a..c7ae16836ad493 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/util.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/util.ts @@ -10,6 +10,8 @@ import {createMayBeForwardRefExpression, ForwardRefHandling, MaybeForwardRefExpr import {AstObject, AstValue} from '../../ast/ast_value'; import {FatalLinkerError} from '../../fatal_linker_error'; +export const PLACEHOLDER_VERSION = '0.0.0-PLACEHOLDER'; + export function wrapReference(wrapped: o.WrappedNodeExpr): R3Reference { return {value: wrapped, type: wrapped}; } diff --git a/packages/compiler-cli/linker/test/file_linker/file_linker_spec.ts b/packages/compiler-cli/linker/test/file_linker/file_linker_spec.ts index 4d761cb6306792..3effd9c02af9eb 100644 --- a/packages/compiler-cli/linker/test/file_linker/file_linker_spec.ts +++ b/packages/compiler-cli/linker/test/file_linker/file_linker_spec.ts @@ -120,6 +120,48 @@ describe('FileLinker', () => { }); }); + describe('block syntax support', () => { + function linkComponentWithTemplate(version: string, template: string): string { + // Note that the `minVersion` is set to the placeholder, + // because that's what we have in the source code as well. + const source = ` + ɵɵngDeclareComponent({ + minVersion: "0.0.0-PLACEHOLDER", + version: "${version}", + ngImport: core, + template: \`${template}\`, + isInline: true, + type: SomeComp + }); + `; + + // We need to create a new source file here, because template parsing requires + // the template string to have offsets which synthetic nodes do not. + const {fileLinker} = createFileLinker(source); + const sourceFile = ts.createSourceFile('', source, ts.ScriptTarget.Latest, true); + const call = + (sourceFile.statements[0] as ts.ExpressionStatement).expression as ts.CallExpression; + const result = fileLinker.linkPartialDeclaration( + 'ɵɵngDeclareComponent', [call.arguments[0]], new MockDeclarationScope()); + return ts.createPrinter().printNode(ts.EmitHint.Unspecified, result, sourceFile); + } + + it('should enable block syntax if compiled with version 17 or above', () => { + for (const version of ['17.0.0', '17.0.1', '17.1.0', '17.0.0-next.0', '18.0.0']) { + expect(linkComponentWithTemplate(version, '@defer {}')).toContain('ɵɵdefer('); + } + }); + + it('should enable block syntax if compiled with a local version', () => { + expect(linkComponentWithTemplate('0.0.0-PLACEHOLDER', '@defer {}')).toContain('ɵɵdefer('); + }); + + it('should not enable block syntax if compiled with a version older than 17', () => { + expect(linkComponentWithTemplate('16.2.0', '@Input() is a decorator. This is a brace }')) + .toContain('@Input() is a decorator. This is a brace }'); + }); + }); + describe('getConstantStatements()', () => { it('should capture shared constant values', () => { const {fileLinker} = createFileLinker(); @@ -179,9 +221,9 @@ describe('FileLinker', () => { }); }); - function createFileLinker(): { + function createFileLinker(code = '// test code'): { host: AstHost, - fileLinker: FileLinker + fileLinker: FileLinker, } { const fs = new MockFileSystemNative(); const logger = new MockLogger(); @@ -189,7 +231,7 @@ describe('FileLinker', () => { fs, logger, new TypeScriptAstHost(), new TypeScriptAstFactory(/* annotateForClosureCompiler */ false), DEFAULT_LINKER_OPTIONS); const fileLinker = new FileLinker( - linkerEnvironment, fs.resolve('/test.js'), '// test code'); + linkerEnvironment, fs.resolve('/test.js'), code); return {host: linkerEnvironment.host, fileLinker}; } }); From 1beef49d80809fbb0e7c8e95f17096c39ac8940a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 2 Oct 2023 13:46:06 +0200 Subject: [PATCH 04/57] fix(compiler): update the minVersion if component uses block syntax (#51979) Increases the `minVersion` of component declarations that use bloks to v17 in order to indicate to users that they need to update if the library they're using is on the new syntax, while preserving backwards compatibility for libraries that do not use the syntax. PR Close #51979 --- .../GOLDEN_PARTIAL.js | 58 +++++++++---------- .../GOLDEN_PARTIAL.js | 26 ++++----- .../compiler/src/render3/partial/component.ts | 54 +++++++++++++++++ packages/compiler/src/render3/view/util.ts | 8 ++- 4 files changed, 103 insertions(+), 43 deletions(-) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js index 2345b87092e14f..2aed3e46bb38f4 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/GOLDEN_PARTIAL.js @@ -12,7 +12,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @switch (value()) { @@ -79,7 +79,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @switch (value()) { @@ -141,7 +141,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @switch (value()) { @@ -234,7 +234,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
{{message}} @switch (value() | test) { @@ -302,7 +302,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @if (value()) { @@ -347,7 +347,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @if (value()) { @@ -397,7 +397,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @if (value() === 1) { @@ -456,7 +456,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @if (val === 0) { @@ -541,7 +541,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
{{message}} @if ((val | test) === 1) { @@ -601,7 +601,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @if (value(); as alias) { @@ -645,7 +645,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @if (value(); as root) { Root: {{value()}}/{{root}} @@ -699,7 +699,7 @@ export class MyApp { log(..._) { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @if (value(); as root) { @@ -754,7 +754,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item) { @@ -801,7 +801,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item) { @@ -852,7 +852,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track $index) { @@ -899,7 +899,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item.name[0].toUpperCase()) { @@ -950,7 +950,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item) { @@ -1004,7 +1004,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item) { @@ -1059,7 +1059,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item; let idx = $index, f = $first; let l = $last, ev = $even, o = $odd; let co = $count) { @@ -1118,7 +1118,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item; let outerCount = $count) { @@ -1175,7 +1175,7 @@ export class MyApp { log(..._) { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track item; let ev = $even) { @@ -1220,7 +1220,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `@for (item of items; track item) { +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `@for (item of items; track item) { {{$odd + ''}} }`, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ @@ -1255,7 +1255,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @for (item of items; track item) { {{item}} @@ -1301,7 +1301,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{$index}} {{$count}} {{$first}} {{$last}} @for (item of items; track item) { @@ -1355,7 +1355,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @for (item of items; track trackFn($index, item)) {} @@ -1402,7 +1402,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @@ -1450,7 +1450,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @for (item of items; track item.name[0].toUpperCase()) { {{item.name}} } @@ -1505,7 +1505,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @for (item of items; track trackFn(item, message)) { {{item.name}} } @@ -1560,7 +1560,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @for (item of items; track trackFn({foo: item, bar: item}, [item, item])) { {{item.name}} } diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js index 1cd8d81f7cb596..2b6c76eba07110 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/GOLDEN_PARTIAL.js @@ -9,7 +9,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @defer {Deferred content} @@ -51,7 +51,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: `
{{message}} @defer { @@ -104,7 +104,7 @@ import * as i0 from "@angular/core"; export class MyApp { } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @defer { } @placeholder (minimum 2s) { @@ -141,7 +141,7 @@ import * as i0 from "@angular/core"; export class MyApp { } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @defer { } @loading(minimum 2s; after 500ms) { @@ -202,7 +202,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE export class MyApp { } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
@defer { @@ -331,7 +331,7 @@ import * as i0 from "@angular/core"; export class MyApp { } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
@defer { @@ -383,7 +383,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{message}} @defer ( when isVisible() || isReady; @@ -442,7 +442,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{message}} @defer ( prefetch when isVisible() || isReady; @@ -512,7 +512,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, isStandalone: true, selector: "ng-component", ngImport: i0, template: ` {{message}} @defer (when isVisible() && (isReady | testPipe)) { Hello @@ -560,7 +560,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{message}} @defer (on interaction(button); prefetch on interaction(button)) {} @@ -611,7 +611,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{message}} @@ -662,7 +662,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` {{message}} @defer (on interaction(button); prefetch on interaction(button)) { Main @@ -713,7 +713,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "ng-component", ngImport: i0, template: ` @defer (on hover, interaction, viewport; prefetch on hover, interaction, viewport) { {{message}} } @placeholder { diff --git a/packages/compiler/src/render3/partial/component.ts b/packages/compiler/src/render3/partial/component.ts index 4f89d03625f36f..23913ed141eb62 100644 --- a/packages/compiler/src/render3/partial/component.ts +++ b/packages/compiler/src/render3/partial/component.ts @@ -9,6 +9,7 @@ import * as core from '../../core'; import {DEFAULT_INTERPOLATION_CONFIG} from '../../ml_parser/interpolation_config'; import * as o from '../../output/output_ast'; import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../parse_util'; +import {RecursiveVisitor, visitAll} from '../r3_ast'; import {Identifiers as R3} from '../r3_identifiers'; import {generateForwardRef, R3CompiledExpression} from '../util'; import {DeclarationListEmitMode, R3ComponentMetadata, R3TemplateDependencyKind, R3TemplateDependencyMetadata} from '../view/api'; @@ -71,12 +72,21 @@ export function createComponentDefinitionMap( templateInfo: DeclareComponentTemplateInfo): DefinitionMap { const definitionMap: DefinitionMap = createDirectiveDefinitionMap(meta); + const blockVisitor = new BlockPresenceVisitor(); + visitAll(blockVisitor, template.nodes); definitionMap.set('template', getTemplateExpression(template, templateInfo)); + if (templateInfo.isInline) { definitionMap.set('isInline', o.literal(true)); } + // Set the minVersion to 17.0.0 if the component is using at least one block in its template. + // We don't do this for templates without blocks, in order to preserve backwards compatibility. + if (blockVisitor.hasBlocks) { + definitionMap.set('minVersion', o.literal('17.0.0')); + } + definitionMap.set('styles', toOptionalLiteralArray(meta.styles, o.literal)); definitionMap.set('dependencies', compileUsedDependenciesMetadata(meta)); definitionMap.set('viewProviders', meta.viewProviders); @@ -189,3 +199,47 @@ function compileUsedDependenciesMetadata(meta: R3ComponentMetadata { set(key: keyof T, value: o.Expression|null): void { if (value) { - this.values.push({key: key as string, value, quoted: false}); + const existing = this.values.find(value => value.key === key); + + if (existing) { + existing.value = value; + } else { + this.values.push({key: key as string, value, quoted: false}); + } } } From 43e6fb0606e15584dcb4478ad4eaa8e825dda83e Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 3 Oct 2023 23:12:04 +0200 Subject: [PATCH 05/57] feat(core): enable block syntax (#51994) Enables the new `@` block syntax by default by removing the `enabledBlockTypes` flags. There are still some internal flags that allow special use cases to opt out of the block syntax, like during XML parsing and when compiling older libraries (see #51979). PR Close #51994 --- .../inputs-outputs/src/app/app.component.html | 2 +- .../src/app/item-detail.component.html | 2 +- .../app/item-details-metadata.component.ts | 2 +- .../src/app/item-output.component.html | 2 +- .../app/host-child/host-child.component.html | 2 +- .../host-parent/host-parent.component.html | 2 +- .../src/app/host/host.component.html | 4 +- .../src/app/optional/optional.component.html | 4 +- .../self-no-data/self-no-data.component.html | 2 +- .../src/app/self/self.component.html | 2 +- .../src/app/skipself/skipself.component.html | 2 +- aio/content/marketing/presskit.html | 2 +- .../events/events.component.html | 2 +- .../templates/api/includes/annotations.html | 2 +- .../templates/api/lib/memberHelpers.html | 2 +- .../src/app/app.component.html | 4 +- .../src/app/app.component.html | 4 +- .../src/app/app.component.html | 4 +- .../trusted-types/src/app/app.component.html | 4 +- packages/bazel/src/ngc-wrapped/index.ts | 1 - .../partial_component_linker_1.ts | 9 +- .../annotations/component/src/handler.ts | 10 +- .../annotations/component/src/resources.ts | 3 - .../component/test/component_spec.ts | 1 - .../src/ngtsc/core/api/src/options.ts | 8 - .../src/ngtsc/core/src/compiler.ts | 12 +- .../typecheck/test/type_check_block_spec.ts | 44 +- .../TEST_CASES.json | 147 +------ .../r3_view_compiler_deferred/TEST_CASES.json | 39 -- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 6 - .../test/ngtsc/template_typecheck_spec.ts | 15 +- packages/compiler/src/jit_compiler_facade.ts | 10 +- packages/compiler/src/ml_parser/lexer.ts | 6 +- .../src/render3/r3_template_transform.ts | 41 +- .../src/render3/view/block_syntax_switch.ts | 13 + .../compiler/src/render3/view/template.ts | 17 +- .../test/i18n/extractor_merger_spec.ts | 3 +- .../test/ml_parser/html_parser_spec.ts | 63 +-- .../test/ml_parser/html_whitespaces_spec.ts | 2 +- .../test/ml_parser/icu_ast_expander_spec.ts | 3 +- .../compiler/test/ml_parser/lexer_spec.ts | 81 ++-- .../test/render3/r3_ast_spans_spec.ts | 13 +- .../render3/r3_template_transform_spec.ts | 378 ++++++++---------- .../test/render3/view/binding_spec.ts | 42 +- packages/compiler/test/render3/view/util.ts | 6 +- .../control_flow_exploration_spec.ts | 10 - packages/core/test/acceptance/defer_spec.ts | 4 - packages/core/test/component_fixture_spec.ts | 4 - packages/core/test/defer_fixture_spec.ts | 4 - .../platform-server/test/hydration_spec.ts | 7 - 50 files changed, 351 insertions(+), 701 deletions(-) create mode 100644 packages/compiler/src/render3/view/block_syntax_switch.ts diff --git a/aio/content/examples/inputs-outputs/src/app/app.component.html b/aio/content/examples/inputs-outputs/src/app/app.component.html index 81e27cb481a20a..881d96f42934a7 100644 --- a/aio/content/examples/inputs-outputs/src/app/app.component.html +++ b/aio/content/examples/inputs-outputs/src/app/app.component.html @@ -13,7 +13,7 @@

Inputs and Outputs

-

Parent component receiving value via @Output()

+

Parent component receiving value via @Output()

  • {{item}}
  • diff --git a/aio/content/examples/inputs-outputs/src/app/item-detail.component.html b/aio/content/examples/inputs-outputs/src/app/item-detail.component.html index cd38989ce0fec3..7b856fb9e9de61 100644 --- a/aio/content/examples/inputs-outputs/src/app/item-detail.component.html +++ b/aio/content/examples/inputs-outputs/src/app/item-detail.component.html @@ -1,4 +1,4 @@ -

    Child component with @Input()

    +

    Child component with @Input()

    diff --git a/aio/content/examples/inputs-outputs/src/app/item-details-metadata.component.ts b/aio/content/examples/inputs-outputs/src/app/item-details-metadata.component.ts index c2d8349c30fdb6..5dcb767562caf2 100644 --- a/aio/content/examples/inputs-outputs/src/app/item-details-metadata.component.ts +++ b/aio/content/examples/inputs-outputs/src/app/item-details-metadata.component.ts @@ -9,7 +9,7 @@ import { booleanAttribute } from '@angular/core'; // First, import booleanAttrib standalone: true, selector: 'app-item-detail-metadata', template: ` -

    Child component with @Input() metadata configurations

    +

    Child component with @Input() metadata configurations

    Today's item: {{item}} diff --git a/aio/content/examples/inputs-outputs/src/app/item-output.component.html b/aio/content/examples/inputs-outputs/src/app/item-output.component.html index a9bcf46163570c..22b767084e15be 100644 --- a/aio/content/examples/inputs-outputs/src/app/item-output.component.html +++ b/aio/content/examples/inputs-outputs/src/app/item-output.component.html @@ -1,4 +1,4 @@ -

    Child component with @Output()

    +

    Child component with @Output()

    diff --git a/aio/content/examples/resolution-modifiers/src/app/host-child/host-child.component.html b/aio/content/examples/resolution-modifiers/src/app/host-child/host-child.component.html index 019e2d0e38af16..1170a1cc6a15d2 100755 --- a/aio/content/examples/resolution-modifiers/src/app/host-child/host-child.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/host-child/host-child.component.html @@ -1,4 +1,4 @@
    -

    Child of @Host() Component

    +

    Child of @Host() Component

    Flower emoji: {{flower.emoji}}

    diff --git a/aio/content/examples/resolution-modifiers/src/app/host-parent/host-parent.component.html b/aio/content/examples/resolution-modifiers/src/app/host-parent/host-parent.component.html index 6a60002e126599..13510b077c21ff 100755 --- a/aio/content/examples/resolution-modifiers/src/app/host-parent/host-parent.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/host-parent/host-parent.component.html @@ -1,5 +1,5 @@
    -

    Parent of @Host() Component

    +

    Parent of @Host() Component

    Flower emoji: {{flower.emoji}}

    diff --git a/aio/content/examples/resolution-modifiers/src/app/host/host.component.html b/aio/content/examples/resolution-modifiers/src/app/host/host.component.html index af9796859abc59..2e51694f1810fc 100755 --- a/aio/content/examples/resolution-modifiers/src/app/host/host.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/host/host.component.html @@ -1,6 +1,6 @@
    -

    @Host() Component

    +

    @Host() Component

    Flower emoji: {{flower?.emoji}}

    -

    (@Host() stops it here)

    +

    (@Host() stops it here)

    diff --git a/aio/content/examples/resolution-modifiers/src/app/optional/optional.component.html b/aio/content/examples/resolution-modifiers/src/app/optional/optional.component.html index f50285291a8680..5196b322e68c83 100755 --- a/aio/content/examples/resolution-modifiers/src/app/optional/optional.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/optional/optional.component.html @@ -1,4 +1,4 @@
    -

    @Optional() Component

    -

    This component still works even though the OptionalService (notice @Optional() in the consturctor isn't provided or configured anywhere. Angular goes through tree and visibilty rules, and if it doesn't find the requested service, returns null.

    +

    @Optional() Component

    +

    This component still works even though the OptionalService (notice @Optional() in the consturctor isn't provided or configured anywhere. Angular goes through tree and visibilty rules, and if it doesn't find the requested service, returns null.

    diff --git a/aio/content/examples/resolution-modifiers/src/app/self-no-data/self-no-data.component.html b/aio/content/examples/resolution-modifiers/src/app/self-no-data/self-no-data.component.html index 97d9f1ab4ebea8..bbf75d0c6c4a71 100755 --- a/aio/content/examples/resolution-modifiers/src/app/self-no-data/self-no-data.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/self-no-data/self-no-data.component.html @@ -1,4 +1,4 @@
    -

    @Self() Component (without a provider)

    +

    @Self() Component (without a provider)

    Leaf emoji: {{leaf?.emoji}}

    diff --git a/aio/content/examples/resolution-modifiers/src/app/self/self.component.html b/aio/content/examples/resolution-modifiers/src/app/self/self.component.html index eda31cd7a41d8c..f93c6352f7fd3c 100755 --- a/aio/content/examples/resolution-modifiers/src/app/self/self.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/self/self.component.html @@ -1,4 +1,4 @@
    -

    @Self() Component

    +

    @Self() Component

    Flower emoji: {{flower?.emoji}}

    diff --git a/aio/content/examples/resolution-modifiers/src/app/skipself/skipself.component.html b/aio/content/examples/resolution-modifiers/src/app/skipself/skipself.component.html index 282d5f826eb353..7417cc4cdf6f71 100755 --- a/aio/content/examples/resolution-modifiers/src/app/skipself/skipself.component.html +++ b/aio/content/examples/resolution-modifiers/src/app/skipself/skipself.component.html @@ -1,4 +1,4 @@
    -

    @SkipSelf() Component

    +

    @SkipSelf() Component

    Leaf emoji: {{leaf.emoji}}

    diff --git a/aio/content/marketing/presskit.html b/aio/content/marketing/presskit.html index 063d646e366d4b..b9a24c6bbee294 100644 --- a/aio/content/marketing/presskit.html +++ b/aio/content/marketing/presskit.html @@ -431,7 +431,7 @@

    Press and Media

    For inquiries regarding press and media please contact us at - press@angular.io. + press@angular.io.

diff --git a/aio/src/app/custom-elements/events/events.component.html b/aio/src/app/custom-elements/events/events.component.html index 9bc08662b84575..72ace269e29339 100644 --- a/aio/src/app/custom-elements/events/events.component.html +++ b/aio/src/app/custom-elements/events/events.component.html @@ -7,7 +7,7 @@

Where we'll be presenting:

and follow us on social media.

- If you want us to be part of your event reach out on devrel@angular.io! + If you want us to be part of your event reach out on devrel@angular.io!

diff --git a/aio/tools/transforms/templates/api/includes/annotations.html b/aio/tools/transforms/templates/api/includes/annotations.html index ff0b6f6a193d81..3be3bdd91aa4c3 100644 --- a/aio/tools/transforms/templates/api/includes/annotations.html +++ b/aio/tools/transforms/templates/api/includes/annotations.html @@ -3,7 +3,7 @@

Annotations

{%- for decorator in doc.decorators %} - @{$ decorator.name $}({$ decorator.arguments $}) + @{$ decorator.name $}({$ decorator.arguments $}) {%- if not decorator.notYetDocumented %} {$ decorator.description | marked $} diff --git a/aio/tools/transforms/templates/api/lib/memberHelpers.html b/aio/tools/transforms/templates/api/lib/memberHelpers.html index 313f0bb3a99657..9197f54c7ff711 100644 --- a/aio/tools/transforms/templates/api/lib/memberHelpers.html +++ b/aio/tools/transforms/templates/api/lib/memberHelpers.html @@ -28,7 +28,7 @@ {%- endmacro -%} {%- macro renderMemberSyntax(member, truncateLines) -%} - {%- if member.boundTo %}@{$ member.boundTo.type $}( + {%- if member.boundTo %}@{$ member.boundTo.type $}( {%- if member.boundTo.propertyName != member.boundTo.bindingName %}'{$ member.boundTo.bindingName $}'{% endif -%} )
{% endif -%} {%- if member.accessibility !== 'public' %}{$ member.accessibility $} {% endif -%} diff --git a/integration/cli-hello-world-lazy/src/app/app.component.html b/integration/cli-hello-world-lazy/src/app/app.component.html index c5c71f8c3e9bc5..c16a85af97d3b9 100644 --- a/integration/cli-hello-world-lazy/src/app/app.component.html +++ b/integration/cli-hello-world-lazy/src/app/app.component.html @@ -412,8 +412,8 @@

Next Steps

ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
+
ng add @angular/material
+
ng add @angular/pwa
ng add _____
ng test
ng build --prod
diff --git a/integration/cli-hello-world-mocha/src/app/app.component.html b/integration/cli-hello-world-mocha/src/app/app.component.html index bacd7ef1d72be5..f882a0fa9e3a9f 100644 --- a/integration/cli-hello-world-mocha/src/app/app.component.html +++ b/integration/cli-hello-world-mocha/src/app/app.component.html @@ -412,8 +412,8 @@

Next Steps

ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
+
ng add @angular/material
+
ng add @angular/pwa
ng add _____
ng test
ng build --prod
diff --git a/integration/cli-hello-world/src/app/app.component.html b/integration/cli-hello-world/src/app/app.component.html index bacd7ef1d72be5..f882a0fa9e3a9f 100644 --- a/integration/cli-hello-world/src/app/app.component.html +++ b/integration/cli-hello-world/src/app/app.component.html @@ -412,8 +412,8 @@

Next Steps

ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
+
ng add @angular/material
+
ng add @angular/pwa
ng add _____
ng test
ng build --prod
diff --git a/integration/trusted-types/src/app/app.component.html b/integration/trusted-types/src/app/app.component.html index 8963677d0f884d..de15c5eea5a719 100644 --- a/integration/trusted-types/src/app/app.component.html +++ b/integration/trusted-types/src/app/app.component.html @@ -415,8 +415,8 @@

Next Steps

ng generate component xyz
-
ng add @angular/material
-
ng add @angular/pwa
+
ng add @angular/material
+
ng add @angular/pwa
ng add _____
ng test
ng build --prod
diff --git a/packages/bazel/src/ngc-wrapped/index.ts b/packages/bazel/src/ngc-wrapped/index.ts index 8d679c8d23fb26..5238ac3d67fc10 100644 --- a/packages/bazel/src/ngc-wrapped/index.ts +++ b/packages/bazel/src/ngc-wrapped/index.ts @@ -86,7 +86,6 @@ export async function runOneBuild( 'preserveWhitespaces', 'createExternalSymbolFactoryReexports', 'extendedDiagnostics', - '_enabledBlockTypes', ]); const userOverrides = Object.entries(userOptions) diff --git a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts index 7bee7d19642018..d0b2f21cd410b9 100644 --- a/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts +++ b/packages/compiler-cli/linker/src/file_linker/partial_linkers/partial_component_linker_1.ts @@ -69,7 +69,7 @@ export class PartialComponentLinkerVersion1 implements // Enable the new block syntax if compiled with v17 and // above, or when using the local placeholder version. - const supportsBlockSyntax = semver.major(version) >= 17 || version === PLACEHOLDER_VERSION; + const enableBlockSyntax = semver.major(version) >= 17 || version === PLACEHOLDER_VERSION; const template = parseTemplate(templateInfo.code, templateInfo.sourceUrl, { escapedString: templateInfo.isEscaped, @@ -80,12 +80,7 @@ export class PartialComponentLinkerVersion1 implements metaObj.has('preserveWhitespaces') ? metaObj.getBoolean('preserveWhitespaces') : false, // We normalize line endings if the template is was inline. i18nNormalizeLineEndingsInICUs: isInline, - - // TODO(crisbeto): hardcode the supported blocks for now. Before the final release - // `enabledBlockTypes` will be replaced with a boolean, at which point `supportsBlockSyntax` - // can be passed in directly here. - enabledBlockTypes: supportsBlockSyntax ? new Set(['if', 'switch', 'for', 'defer']) : - undefined, + enableBlockSyntax, }); if (template.errors !== null) { const errors = template.errors.map(err => err.toString()).join('\n'); diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index ac0d5a977b6bb5..f5466620384ffb 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -74,10 +74,9 @@ export class ComponentDecoratorHandler implements private rootDirs: ReadonlyArray, private defaultPreserveWhitespaces: boolean, private i18nUseExternalIds: boolean, private enableI18nLegacyMessageIdFormat: boolean, private usePoisonedData: boolean, private i18nNormalizeLineEndingsInICUs: boolean, - private enabledBlockTypes: Set, private moduleResolver: ModuleResolver, - private cycleAnalyzer: CycleAnalyzer, private cycleHandlingStrategy: CycleHandlingStrategy, - private refEmitter: ReferenceEmitter, private referencesRegistry: ReferencesRegistry, - private depTracker: DependencyTracker|null, + private moduleResolver: ModuleResolver, private cycleAnalyzer: CycleAnalyzer, + private cycleHandlingStrategy: CycleHandlingStrategy, private refEmitter: ReferenceEmitter, + private referencesRegistry: ReferencesRegistry, private depTracker: DependencyTracker|null, private injectableRegistry: InjectableClassRegistry, private semanticDepGraphUpdater: SemanticDepGraphUpdater|null, private annotateForClosureCompiler: boolean, private perf: PerfRecorder, @@ -88,7 +87,6 @@ export class ComponentDecoratorHandler implements enableI18nLegacyMessageIdFormat: this.enableI18nLegacyMessageIdFormat, i18nNormalizeLineEndingsInICUs: this.i18nNormalizeLineEndingsInICUs, usePoisonedData: this.usePoisonedData, - enabledBlockTypes: this.enabledBlockTypes, }; } @@ -107,7 +105,6 @@ export class ComponentDecoratorHandler implements enableI18nLegacyMessageIdFormat: boolean, i18nNormalizeLineEndingsInICUs: boolean, usePoisonedData: boolean, - enabledBlockTypes: Set, }; readonly precedence = HandlerPrecedence.PRIMARY; @@ -362,7 +359,6 @@ export class ComponentDecoratorHandler implements enableI18nLegacyMessageIdFormat: this.enableI18nLegacyMessageIdFormat, i18nNormalizeLineEndingsInICUs: this.i18nNormalizeLineEndingsInICUs, usePoisonedData: this.usePoisonedData, - enabledBlockTypes: this.enabledBlockTypes, }, this.compilationMode); } diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/resources.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/resources.ts index 0aed3529629b62..51cfacdc6c9760 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/resources.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/resources.ts @@ -119,7 +119,6 @@ export interface ExtractTemplateOptions { usePoisonedData: boolean; enableI18nLegacyMessageIdFormat: boolean; i18nNormalizeLineEndingsInICUs: boolean; - enabledBlockTypes: Set; } export function extractTemplate( @@ -238,7 +237,6 @@ function parseExtractedTemplate( enableI18nLegacyMessageIdFormat: options.enableI18nLegacyMessageIdFormat, i18nNormalizeLineEndingsInICUs, alwaysAttemptHtmlToR3AstConversion: options.usePoisonedData, - enabledBlockTypes: options.enabledBlockTypes, }); // Unfortunately, the primary parse of the template above may not contain accurate source map @@ -266,7 +264,6 @@ function parseExtractedTemplate( i18nNormalizeLineEndingsInICUs, leadingTriviaChars: [], alwaysAttemptHtmlToR3AstConversion: options.usePoisonedData, - enabledBlockTypes: options.enabledBlockTypes, }); return { diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/test/component_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/component/test/component_spec.ts index ed4563a40d8896..47ed5445671b78 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/test/component_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/test/component_spec.ts @@ -88,7 +88,6 @@ function setup( /* enableI18nLegacyMessageIdFormat */ false, !!usePoisonedData, /* i18nNormalizeLineEndingsInICUs */ false, - /* enabledBlockTypes */ new Set(), moduleResolver, cycleAnalyzer, CycleHandlingStrategy.UseRemoteScoping, diff --git a/packages/compiler-cli/src/ngtsc/core/api/src/options.ts b/packages/compiler-cli/src/ngtsc/core/api/src/options.ts index b04cb48839b065..7f76a11eafb380 100644 --- a/packages/compiler-cli/src/ngtsc/core/api/src/options.ts +++ b/packages/compiler-cli/src/ngtsc/core/api/src/options.ts @@ -30,14 +30,6 @@ export interface TestOnlyOptions { */ _enableTemplateTypeChecker?: boolean; - /** - * Names of the blocks that should be enabled. E.g. `_enabledBlockTypes: ['defer']` - * would allow usages of `@defer {}` in templates. - * - * @internal - */ - _enabledBlockTypes?: string[]; - /** * An option to enable ngtsc's internal performance tracing. * diff --git a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts index 8290e54df4d233..9d6cb002f2a79d 100644 --- a/packages/compiler-cli/src/ngtsc/core/src/compiler.ts +++ b/packages/compiler-cli/src/ngtsc/core/src/compiler.ts @@ -255,7 +255,6 @@ export class NgCompiler { private moduleResolver: ModuleResolver; private resourceManager: AdapterResourceLoader; private cycleAnalyzer: CycleAnalyzer; - private enabledBlockTypes: Set; readonly ignoreForDiagnostics: Set; readonly ignoreForEmit: Set; readonly enableTemplateTypeChecker: boolean; @@ -323,7 +322,6 @@ export class NgCompiler { ) { this.enableTemplateTypeChecker = enableTemplateTypeChecker || (options['_enableTemplateTypeChecker'] ?? false); - this.enabledBlockTypes = new Set(options['_enabledBlockTypes'] ?? []); this.constructionDiagnostics.push( ...this.adapter.constructionDiagnostics, ...verifyCompatibleTypeCheckOptions(this.options)); @@ -1095,11 +1093,11 @@ export class NgCompiler { this.resourceManager, this.adapter.rootDirs, this.options.preserveWhitespaces || false, this.options.i18nUseExternalIds !== false, this.options.enableI18nLegacyMessageIdFormat !== false, this.usePoisonedData, - this.options.i18nNormalizeLineEndingsInICUs === true, this.enabledBlockTypes, - this.moduleResolver, this.cycleAnalyzer, cycleHandlingStrategy, refEmitter, - referencesRegistry, this.incrementalCompilation.depGraph, injectableRegistry, - semanticDepGraphUpdater, this.closureCompilerEnabled, this.delegatingPerfRecorder, - hostDirectivesResolver, supportTestBed, compilationMode, deferredSymbolsTracker), + this.options.i18nNormalizeLineEndingsInICUs === true, this.moduleResolver, + this.cycleAnalyzer, cycleHandlingStrategy, refEmitter, referencesRegistry, + this.incrementalCompilation.depGraph, injectableRegistry, semanticDepGraphUpdater, + this.closureCompilerEnabled, this.delegatingPerfRecorder, hostDirectivesResolver, + supportTestBed, compilationMode, deferredSymbolsTracker), // TODO(alxhub): understand why the cast here is necessary (something to do with `null` // not being assignable to `unknown` when wrapped in `Readonly`). diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts index dd55ea87ffd87a..b8a9ec605f5166 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts @@ -1357,12 +1357,6 @@ describe('type check blocks', () => { }); describe('deferred blocks', () => { - // TODO(crisbeto): temporary utility while deferred blocks are disabled by default - function deferredTcb(template: string): string { - return tcb( - template, undefined, undefined, undefined, {enabledBlockTypes: new Set(['defer'])}); - } - it('should generate bindings inside deferred blocks', () => { const TEMPLATE = ` @defer { @@ -1376,7 +1370,7 @@ describe('type check blocks', () => { } `; - expect(deferredTcb(TEMPLATE)) + expect(tcb(TEMPLATE)) .toContain( '"" + ((this).main()); "" + ((this).placeholder()); "" + ((this).loading()); "" + ((this).error());'); }); @@ -1388,7 +1382,7 @@ describe('type check blocks', () => { } `; - expect(deferredTcb(TEMPLATE)).toContain('((this).shouldShow()) && (((this).isVisible));'); + expect(tcb(TEMPLATE)).toContain('((this).shouldShow()) && (((this).isVisible));'); }); it('should generate `prefetch when` trigger', () => { @@ -1398,18 +1392,11 @@ describe('type check blocks', () => { } `; - expect(deferredTcb(TEMPLATE)).toContain('((this).shouldShow()) && (((this).isVisible));'); + expect(tcb(TEMPLATE)).toContain('((this).shouldShow()) && (((this).isVisible));'); }); }); describe('conditional blocks', () => { - // TODO(crisbeto): temporary utility while conditional blocks are disabled by default - function conditionalTcb(template: string): string { - return tcb( - template, undefined, undefined, undefined, - {enabledBlockTypes: new Set(['if', 'switch'])}); - } - it('should generate an if block', () => { const TEMPLATE = ` @if (expr === 0) { @@ -1423,7 +1410,7 @@ describe('type check blocks', () => { } `; - expect(conditionalTcb(TEMPLATE)) + expect(tcb(TEMPLATE)) .toContain( 'if ((((this).expr)) === (0)) { "" + ((this).main()); } ' + 'else if ((((this).expr1)) === (1)) { "" + ((this).one()); } ' + @@ -1436,7 +1423,7 @@ describe('type check blocks', () => { {{alias}} }`; - expect(conditionalTcb(TEMPLATE)) + expect(tcb(TEMPLATE)) .toContain( 'if ((((this).expr)) === (1)) { var _t1 = (((this).expr)) === (1); "" + (_t1); }'); }); @@ -1456,7 +1443,7 @@ describe('type check blocks', () => { } `; - expect(conditionalTcb(TEMPLATE)) + expect(tcb(TEMPLATE)) .toContain( 'switch (((this).expr)) { case 1: "" + ((this).one()); break; ' + 'case 2: "" + ((this).two()); break; default: "" + ((this).default()); break; }'); @@ -1479,7 +1466,7 @@ describe('type check blocks', () => { `; - expect(conditionalTcb(TEMPLATE)) + expect(tcb(TEMPLATE)) .toContain( 'var _t1: any = null!; { var _t2 = (_t1.exp); switch (_t2()) { ' + 'case "one": "" + ((this).one()); break; case "two": "" + ((this).two()); break; ' + @@ -1488,11 +1475,6 @@ describe('type check blocks', () => { }); describe('for loop blocks', () => { - // TODO(crisbeto): temporary utility while for loop blocks are disabled by default - function loopTcb(template: string): string { - return tcb(template, undefined, undefined, undefined, {enabledBlockTypes: new Set(['for'])}); - } - it('should generate a for block', () => { const TEMPLATE = ` @for (item of items; track item) { @@ -1502,7 +1484,7 @@ describe('type check blocks', () => { } `; - const result = loopTcb(TEMPLATE); + const result = tcb(TEMPLATE); expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); expect(result).toContain('"" + ((this).main(_t1))'); expect(result).toContain('"" + ((this).empty())'); @@ -1515,7 +1497,7 @@ describe('type check blocks', () => { } `; - const result = loopTcb(TEMPLATE); + const result = tcb(TEMPLATE); expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('var _t3: number = null!;'); @@ -1533,7 +1515,7 @@ describe('type check blocks', () => { } `; - const result = loopTcb(TEMPLATE); + const result = tcb(TEMPLATE); expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('var _t3: number = null!;'); @@ -1549,7 +1531,7 @@ describe('type check blocks', () => { @for (item of items; track item; let i = $index) { {{$index}} {{i}} } `; - const result = loopTcb(TEMPLATE); + const result = tcb(TEMPLATE); expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('"" + (((this).$index)) + (_t2)'); @@ -1566,7 +1548,7 @@ describe('type check blocks', () => { } `; - const result = loopTcb(TEMPLATE); + const result = tcb(TEMPLATE); expect(result).toContain( 'for (const item of ((this).items)) { var _t1 = item; var _t2: number = null!;'); expect(result).toContain('"" + (_t1) + (_t2)'); @@ -1576,7 +1558,7 @@ describe('type check blocks', () => { }); it('should generate the tracking expression of a for loop', () => { - const result = loopTcb(`@for (item of items; track trackingFn($index, item, prop)) {}`); + const result = tcb(`@for (item of items; track trackingFn($index, item, prop)) {}`); expect(result).toContain( 'for (const item of ((this).items)) { var _t1: number = null!; var _t2 = item;'); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json index 6fc337cfd8402f..bb232372ab09a7 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_control_flow/TEST_CASES.json @@ -3,11 +3,6 @@ "cases": [ { "description": "should generate a basic switch block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "switch" - ] - }, "inputFiles": [ "basic_switch.ts" ], @@ -25,11 +20,6 @@ }, { "description": "should generate a switch block without a default block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "switch" - ] - }, "inputFiles": [ "switch_without_default.ts" ], @@ -47,11 +37,6 @@ }, { "description": "should generate nested switch blocks", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "switch" - ] - }, "inputFiles": [ "nested_switch.ts" ], @@ -69,11 +54,6 @@ }, { "description": "should generate switch block with a pipe in its expression", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "switch" - ] - }, "inputFiles": [ "switch_with_pipe.ts" ], @@ -92,11 +72,6 @@ }, { "description": "should generate a basic if block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "basic_if.ts" ], @@ -114,11 +89,6 @@ }, { "description": "should generate a basic if/else block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "basic_if_else.ts" ], @@ -136,11 +106,6 @@ }, { "description": "should generate a basic if/else if block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "basic_if_else_if.ts" ], @@ -158,11 +123,6 @@ }, { "description": "should generate a nested if block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "nested_if.ts" ], @@ -180,11 +140,6 @@ }, { "description": "should generate an if block using pipes in its conditions", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "if_with_pipe.ts" ], @@ -203,11 +158,6 @@ }, { "description": "should generate an if block with an aliased expression", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "if_with_alias.ts" ], @@ -225,11 +175,6 @@ }, { "description": "should expose the alias to nested conditional blocks", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "if_nested_alias.ts" ], @@ -247,11 +192,6 @@ }, { "description": "should expose the alias to nested event listeners", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "if" - ] - }, "inputFiles": [ "if_nested_alias_listeners.ts" ], @@ -270,11 +210,6 @@ }, { "description": "should generate a basic for block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "basic_for.ts" ], @@ -293,11 +228,6 @@ }, { "description": "should generate a for block with an empty block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_with_empty.ts" ], @@ -316,11 +246,6 @@ }, { "description": "should generate a for block that tracks by index", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_track_by_index.ts" ], @@ -339,11 +264,6 @@ }, { "description": "should generate a for block that tracks by a field on the item", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_track_by_field.ts" ], @@ -362,11 +282,6 @@ }, { "description": "should generate a nested for block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "nested_for.ts" ], @@ -385,11 +300,6 @@ }, { "description": "should generate a for block with template variables", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_template_variables.ts" ], @@ -408,11 +318,6 @@ }, { "description": "should generate a for block with aliased template variables", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_aliased_template_variables.ts" ], @@ -431,11 +336,6 @@ }, { "description": "should be able to refer to aliased template variables in nested for blocks", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "nested_for_template_variables.ts" ], @@ -454,11 +354,6 @@ }, { "description": "should be able to use for loop variables in an event listener", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_template_variables_listener.ts" ], @@ -477,11 +372,6 @@ }, { "description": "should parenthesize context variables used in an expression", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_variables_expression.ts" ], @@ -500,11 +390,6 @@ }, { "description": "should implicitly allocate data slots for primary and empty block", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_data_slots.ts" ], @@ -523,11 +408,6 @@ }, { "description": "should not expose for loop variables to the surrounding scope", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_template_variables_scope.ts" ], @@ -546,11 +426,6 @@ }, { "description": "should optimize tracking function that calls a method on the component with $index and the item from the root template", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_template_track_method_root.ts" ], @@ -569,11 +444,6 @@ }, { "description": "should optimize tracking function that calls a method on the component with $index and the item from a nested template", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_template_track_method_nested.ts" ], @@ -592,11 +462,6 @@ }, { "description": "should reuse identical pure tracking functions", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_pure_track_reuse.ts" ], @@ -615,11 +480,6 @@ }, { "description": "should reuse identical impure tracking functions", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_impure_track_reuse.ts" ], @@ -638,11 +498,6 @@ }, { "description": "should preserve object and array literals inside tracking expressions", - "angularCompilerOptions": { - "_enabledBlockTypes": [ - "for" - ] - }, "inputFiles": [ "for_track_literals.ts" ], @@ -660,4 +515,4 @@ "skipForTemplatePipeline": true } ] -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json index 2539552232bc3e..65daeed2df2fbc 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json @@ -3,9 +3,6 @@ "cases": [ { "description": "should generate a basic deferred block", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "basic_deferred.ts" ], @@ -24,9 +21,6 @@ }, { "description": "should generate a deferred block with secondary blocks", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_secondary_blocks.ts" ], @@ -45,9 +39,6 @@ }, { "description": "should generate a deferred block with placeholder block parameters", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_placeholder_params.ts" ], @@ -66,9 +57,6 @@ }, { "description": "should generate a deferred block with loading block parameters", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_loading_params.ts" ], @@ -87,9 +75,6 @@ }, { "description": "should generate a deferred block with local dependencies", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_local_deps.ts" ], @@ -108,9 +93,6 @@ }, { "description": "should generate a deferred block with external dependencies", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_external_deps.ts", "deferred_with_external_deps_eager.ts", @@ -132,9 +114,6 @@ }, { "description": "should generate a deferred block with triggers", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_triggers.ts" ], @@ -153,9 +132,6 @@ }, { "description": "should generate a deferred block with prefetch triggers", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_prefetch_triggers.ts" ], @@ -174,9 +150,6 @@ }, { "description": "should generate a deferred block with a `when` trigger that has a pipe", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_when_with_pipe.ts" ], @@ -195,9 +168,6 @@ }, { "description": "should generate a deferred block with an interaction trigger in the same view", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_interaction_same_view_trigger.ts" ], @@ -216,9 +186,6 @@ }, { "description": "should generate a deferred block with an interaction trigger in a parent view", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_interaction_parent_view_trigger.ts" ], @@ -237,9 +204,6 @@ }, { "description": "should generate a deferred block with an interaction trigger inside the placeholder", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_interaction_placeholder_trigger.ts" ], @@ -258,9 +222,6 @@ }, { "description": "should generate a deferred block with implicit trigger references", - "angularCompilerOptions": { - "_enabledBlockTypes": ["defer"] - }, "inputFiles": [ "deferred_with_implicit_triggers.ts" ], diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 6ac3180ff80f69..9a4c0844c77269 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -8806,7 +8806,6 @@ function allTests(os: string) { describe('deferred blocks', () => { it('should handle deferred blocks', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import { Component } from '@angular/core'; @@ -8857,7 +8856,6 @@ function allTests(os: string) { describe('imports', () => { it('should retain regular imports when symbol is eagerly referenced', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import { Component } from '@angular/core'; @@ -8905,7 +8903,6 @@ function allTests(os: string) { }); it('should retain regular imports when one of the symbols is eagerly referenced', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import { Component } from '@angular/core'; @@ -8962,7 +8959,6 @@ function allTests(os: string) { }); it('should drop regular imports when none of the symbols are eagerly referenced', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import { Component } from '@angular/core'; @@ -9018,7 +9014,6 @@ function allTests(os: string) { describe('setClassMetadataAsync', () => { it('should generate setClassMetadataAsync for components with defer blocks', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import {Component} from '@angular/core'; @@ -9075,7 +9070,6 @@ function allTests(os: string) { it('should *not* generate setClassMetadataAsync for components with defer blocks ' + 'when dependencies are eagerly referenced as well', () => { - env.tsconfig({_enabledBlockTypes: ['defer']}); env.write('cmp-a.ts', ` import {Component} from '@angular/core'; diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index 59c52e7568c4a7..aa93b2b24a3ed5 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -3625,10 +3625,6 @@ suppress }); describe('deferred blocks', () => { - beforeEach(() => { - env.tsconfig({_enabledBlockTypes: ['defer']}); - }); - it('should check bindings inside deferred blocks', () => { env.write('test.ts', ` import {Component} from '@angular/core'; @@ -3749,10 +3745,6 @@ suppress }); describe('conditional blocks', () => { - beforeEach(() => { - env.tsconfig({_enabledBlockTypes: ['if', 'switch']}); - }); - it('should check bindings inside if blocks', () => { env.write('test.ts', ` import {Component} from '@angular/core'; @@ -4014,11 +4006,8 @@ suppress describe('for loop blocks', () => { beforeEach(() => { - env.tsconfig({ - // `fullTemplateTypeCheck: true` is necessary so content inside `ng-template` is checked. - fullTemplateTypeCheck: true, - _enabledBlockTypes: ['for', 'if'], - }); + // `fullTemplateTypeCheck: true` is necessary so content inside `ng-template` is checked. + env.tsconfig({fullTemplateTypeCheck: true}); }); it('should check bindings inside of for loop blocks', () => { diff --git a/packages/compiler/src/jit_compiler_facade.ts b/packages/compiler/src/jit_compiler_facade.ts index 3c3929e05bdd3c..42c6559bc10476 100644 --- a/packages/compiler/src/jit_compiler_facade.ts +++ b/packages/compiler/src/jit_compiler_facade.ts @@ -30,13 +30,6 @@ import {ResourceLoader} from './resource_loader'; import {DomElementSchemaRegistry} from './schema/dom_element_schema_registry'; import {SelectorMatcher} from './selector'; -let enabledBlockTypes: Set|undefined; - -/** Temporary utility that enables specific block types in JIT compilations. */ -export function ɵsetEnabledBlockTypes(types: string[]) { - enabledBlockTypes = types.length > 0 ? new Set(types) : undefined; -} - export class CompilerFacadeImpl implements CompilerFacade { FactoryTarget = FactoryTarget; ResourceLoader = ResourceLoader; @@ -546,8 +539,7 @@ function parseJitTemplate( const interpolationConfig = interpolation ? InterpolationConfig.fromArray(interpolation) : DEFAULT_INTERPOLATION_CONFIG; // Parse the template and check for errors. - const parsed = parseTemplate( - template, sourceMapUrl, {preserveWhitespaces, interpolationConfig, enabledBlockTypes}); + const parsed = parseTemplate(template, sourceMapUrl, {preserveWhitespaces, interpolationConfig}); if (parsed.errors !== null) { const errors = parsed.errors.map(err => err.toString()).join(', '); throw new Error(`Errors during JIT compilation of template for ${typeName}: ${errors}`); diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index a70166c44d754f..aceffc275e3b8d 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -90,9 +90,9 @@ export interface TokenizeOptions { */ preserveLineEndings?: boolean; - // TODO(crisbeto): temporary option to limit access to the block syntax. /** - * Whether the block syntax is enabled at the compiler level. + * Whether to tokenize @ block syntax. Otherwise considered text, + * or ICU tokens if `tokenizeExpansionForms` is enabled. */ tokenizeBlocks?: boolean; } @@ -166,7 +166,7 @@ class _Tokenizer { new PlainCharacterCursor(_file, range); this._preserveLineEndings = options.preserveLineEndings || false; this._i18nNormalizeLineEndingsInICUs = options.i18nNormalizeLineEndingsInICUs || false; - this._tokenizeBlocks = options.tokenizeBlocks || false; + this._tokenizeBlocks = options.tokenizeBlocks ?? true; try { this._cursor.init(); } catch (e) { diff --git a/packages/compiler/src/render3/r3_template_transform.ts b/packages/compiler/src/render3/r3_template_transform.ts index 79833fd17d9e1a..1c37c0dfb1eef8 100644 --- a/packages/compiler/src/render3/r3_template_transform.ts +++ b/packages/compiler/src/render3/r3_template_transform.ts @@ -60,7 +60,6 @@ export interface Render3ParseResult { interface Render3ParseOptions { collectCommentNodes: boolean; - enabledBlockTypes: Set; } export function htmlAstToRender3Ast( @@ -342,26 +341,6 @@ class HtmlAstToIvyAst implements html.Visitor { return null; } - if (!this.options.enabledBlockTypes.has(block.name)) { - let errorMessage: string; - - if (isConnectedDeferLoopBlock(block.name)) { - errorMessage = `@${block.name} block can only be used after an @defer block.`; - this.processedNodes.add(block); - } else if (isConnectedForLoopBlock(block.name)) { - errorMessage = `@${block.name} block can only be used after an @for block.`; - this.processedNodes.add(block); - } else if (isConnectedIfLoopBlock(block.name)) { - errorMessage = `@${block.name} block can only be used after an @if or @else if block.`; - this.processedNodes.add(block); - } else { - errorMessage = `Unrecognized block @${block.name}.`; - } - - this.reportError(errorMessage, block.sourceSpan); - return null; - } - let result: {node: t.Node|null, errors: ParseError[]}|null = null; switch (block.name) { @@ -388,10 +367,22 @@ class HtmlAstToIvyAst implements html.Visitor { break; default: - result = { - node: null, - errors: [new ParseError(block.sourceSpan, `Unrecognized block @${block.name}.`)] - }; + let errorMessage: string; + + if (isConnectedDeferLoopBlock(block.name)) { + errorMessage = `@${block.name} block can only be used after an @defer block.`; + this.processedNodes.add(block); + } else if (isConnectedForLoopBlock(block.name)) { + errorMessage = `@${block.name} block can only be used after an @for block.`; + this.processedNodes.add(block); + } else if (isConnectedIfLoopBlock(block.name)) { + errorMessage = `@${block.name} block can only be used after an @if or @else if block.`; + this.processedNodes.add(block); + } else { + errorMessage = `Unrecognized block @${block.name}.`; + } + + result = {node: null, errors: [new ParseError(block.sourceSpan, errorMessage)]}; break; } diff --git a/packages/compiler/src/render3/view/block_syntax_switch.ts b/packages/compiler/src/render3/view/block_syntax_switch.ts new file mode 100644 index 00000000000000..4e808762f9c5b6 --- /dev/null +++ b/packages/compiler/src/render3/view/block_syntax_switch.ts @@ -0,0 +1,13 @@ +/*! + * @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 + */ + +/** + * Whether the @ block syntax is enabled by default. This constant exists + * so that we can temporarily disable the syntax internally. + */ +export const BLOCK_SYNTAX_ENABLED_DEFAULT = true; diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 5fc3fe17b15c89..4e275542038d6b 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -34,6 +34,7 @@ import {htmlAstToRender3Ast} from '../r3_template_transform'; import {prepareSyntheticListenerFunctionName, prepareSyntheticListenerName, prepareSyntheticPropertyName} from '../util'; import {R3DeferBlockMetadata} from './api'; +import {BLOCK_SYNTAX_ENABLED_DEFAULT} from './block_syntax_switch'; import {I18nContext} from './i18n/context'; import {createGoogleGetMsgStatements} from './i18n/get_msg_utils'; import {createLocalizeStatements} from './i18n/localize_utils'; @@ -2674,11 +2675,8 @@ export interface ParseTemplateOptions { */ collectCommentNodes?: boolean; - /** - * Names of the blocks that should be enabled. E.g. `enabledBlockTypes: new Set(['defer'])` - * would allow usages of `@defer {}` in templates. - */ - enabledBlockTypes?: Set; + /** Whether the @ block syntax is enabled. */ + enableBlockSyntax?: boolean; } /** @@ -2697,7 +2695,7 @@ export function parseTemplate( leadingTriviaChars: LEADING_TRIVIA_CHARS, ...options, tokenizeExpansionForms: true, - tokenizeBlocks: options.enabledBlockTypes != null && options.enabledBlockTypes.size > 0, + tokenizeBlocks: options.enableBlockSyntax ?? BLOCK_SYNTAX_ENABLED_DEFAULT, }); if (!options.alwaysAttemptHtmlToR3AstConversion && parseResult.errors && @@ -2760,11 +2758,8 @@ export function parseTemplate( } } - const {nodes, errors, styleUrls, styles, ngContentSelectors, commentNodes} = - htmlAstToRender3Ast(rootNodes, bindingParser, { - collectCommentNodes: !!options.collectCommentNodes, - enabledBlockTypes: options.enabledBlockTypes || new Set(), - }); + const {nodes, errors, styleUrls, styles, ngContentSelectors, commentNodes} = htmlAstToRender3Ast( + rootNodes, bindingParser, {collectCommentNodes: !!options.collectCommentNodes}); errors.push(...parseResult.errors, ...i18nMetaResult.errors); const parsedTemplate: ParsedTemplate = { diff --git a/packages/compiler/test/i18n/extractor_merger_spec.ts b/packages/compiler/test/i18n/extractor_merger_spec.ts index bf4c9219887527..26468bfcab5303 100644 --- a/packages/compiler/test/i18n/extractor_merger_spec.ts +++ b/packages/compiler/test/i18n/extractor_merger_spec.ts @@ -590,8 +590,7 @@ import {serializeNodes as serializeHtmlNodes} from '../ml_parser/util/util'; function parseHtml(html: string): html.Node[] { const htmlParser = new HtmlParser(); - const parseResult = htmlParser.parse( - html, 'extractor spec', {tokenizeExpansionForms: true, tokenizeBlocks: true}); + const parseResult = htmlParser.parse(html, 'extractor spec', {tokenizeExpansionForms: true}); if (parseResult.errors.length > 1) { throw new Error(`unexpected parse errors: ${parseResult.errors.join('\n')}`); } diff --git a/packages/compiler/test/ml_parser/html_parser_spec.ts b/packages/compiler/test/ml_parser/html_parser_spec.ts index 3b996ccb20d5e0..6e0764f8602178 100644 --- a/packages/compiler/test/ml_parser/html_parser_spec.ts +++ b/packages/compiler/test/ml_parser/html_parser_spec.ts @@ -240,23 +240,6 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} ]); expect(parsed.errors).toEqual([]); }); - - it('should treat prematurely terminated interpolation as text', () => { - const {errors, rootNodes} = - parser.parse('
x {{ expr }} y
', 'TestComp'); - expect(humanizeNodes(rootNodes, true)).toEqual([ - [ - html.Element, 'div', 0, '
x {{ expr }} y
', - '
', '
' - ], - [html.Element, 'span', 1, 'x {{ expr }} y', '', ''], - [html.Text, 'x {{ expr }', 2, ['x '], ['{{', ' expr }'], [''], 'x {{ expr }'], - [html.Comment, '', 2, ''], - [html.Text, '} y', 2, ['} y'], '} y'], - [html.Element, 'div', 1, '
', '
', '
'], - ]); - expect(errors).toEqual([]); - }); }); describe('attributes', () => { @@ -760,15 +743,8 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); describe('blocks', () => { - // TODO(crisbeto): temporary utility while blocks are disabled by default. - const options = {tokenizeBlocks: true}; - - function humanizeBlocks(input: string): any[] { - return humanizeDom(parser.parse(input, 'TestComp', options)); - } - it('should parse a block', () => { - expect(humanizeBlocks('@foo (a b; c d){hello}')).toEqual([ + expect(humanizeDom(parser.parse('@foo (a b; c d){hello}', 'TestComp'))).toEqual([ [html.Block, 'foo', 0], [html.BlockParameter, 'a b'], [html.BlockParameter, 'c d'], @@ -777,20 +753,20 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); it('should parse a block with an HTML element', () => { - expect(humanizeBlocks('@defer {}')).toEqual([ + expect(humanizeDom(parser.parse('@defer {}', 'TestComp'))).toEqual([ [html.Block, 'defer', 0], [html.Element, 'my-cmp', 1], ]); }); it('should parse a block containing mixed plain text and HTML', () => { - expect(humanizeBlocks( + expect(humanizeDom(parser.parse( '@switch (expr) {' + '@case (1) {hellothere}' + '@case (two) {

Two...

}' + '@case (isThree(3)) {Thtree!}' + '}', - )) + 'TestComp'))) .toEqual([ [html.Block, 'switch', 0], [html.BlockParameter, 'expr'], @@ -844,7 +820,7 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} `} `; // clang-format on - expect(humanizeBlocks(markup)).toEqual([ + expect(humanizeDom(parser.parse(markup, 'TestComp'))).toEqual([ [html.Element, 'root-sibling-one', 0], [html.Block, 'root', 0], [html.Element, 'outer-child-one', 1], @@ -871,29 +847,30 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); it('should infer namespace through block boundary', () => { - expect(humanizeBlocks('@if (cond) {}')).toEqual([ - [html.Element, ':svg:svg', 0], - [html.Block, 'if', 1], - [html.BlockParameter, 'cond'], - [html.Element, ':svg:circle', 2], - ]); + expect(humanizeDom(parser.parse('@if (cond) {}', 'TestComp'))) + .toEqual([ + [html.Element, ':svg:svg', 0], + [html.Block, 'if', 1], + [html.BlockParameter, 'cond'], + [html.Element, ':svg:circle', 2], + ]); }); it('should parse an empty block', () => { - expect(humanizeBlocks('@foo{}')).toEqual([ + expect(humanizeDom(parser.parse('@foo{}', 'TestComp'))).toEqual([ [html.Block, 'foo', 0], ]); }); it('should parse a block with void elements', () => { - expect(humanizeBlocks('@foo {
}')).toEqual([ + expect(humanizeDom(parser.parse('@foo {
}', 'TestComp'))).toEqual([ [html.Block, 'foo', 0], [html.Element, 'br', 1], ]); }); it('should close void elements used right before a block', () => { - expect(humanizeBlocks('@foo {hello}')).toEqual([ + expect(humanizeDom(parser.parse('@foo {hello}', 'TestComp'))).toEqual([ [html.Element, 'img', 0], [html.Block, 'foo', 0], [html.Text, 'hello', 1, ['hello']], @@ -901,13 +878,13 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); it('should report an unclosed block', () => { - const errors = parser.parse('@foo {hello', 'TestComp', options).errors; + const errors = parser.parse('@foo {hello', 'TestComp').errors; expect(errors.length).toEqual(1); expect(humanizeErrors(errors)).toEqual([['foo', 'Unclosed block "foo"', '0:0']]); }); it('should report an unexpected block close', () => { - const errors = parser.parse('hello}', 'TestComp', options).errors; + const errors = parser.parse('hello}', 'TestComp').errors; expect(errors.length).toEqual(1); expect(humanizeErrors(errors)).toEqual([ [null, 'Unexpected closing block. The block may have been closed earlier.', '0:5'] @@ -915,7 +892,7 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); it('should report unclosed tags inside of a block', () => { - const errors = parser.parse('@foo {hello}', 'TestComp', options).errors; + const errors = parser.parse('@foo {hello}', 'TestComp').errors; expect(errors.length).toEqual(1); expect(humanizeErrors(errors)).toEqual([[ null, @@ -925,7 +902,7 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} }); it('should report an unexpected closing tag inside a block', () => { - const errors = parser.parse('
@if (cond) {hello
}', 'TestComp', options).errors; + const errors = parser.parse('
@if (cond) {hello
}', 'TestComp').errors; expect(errors.length).toEqual(2); expect(humanizeErrors(errors)).toEqual([ [ @@ -944,7 +921,7 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} '@case (isThree(3)) {Placeholder}' + '}'; - expect(humanizeDomSourceSpans(parser.parse(markup, 'TestComp', options))).toEqual([ + expect(humanizeDomSourceSpans(parser.parse(markup, 'TestComp'))).toEqual([ [ html.Block, 'switch', 0, '@switch (expr) {@case (1) {
hello
world}@case (two) {Two}@case (isThree(3)) {Placeholder}}', diff --git a/packages/compiler/test/ml_parser/html_whitespaces_spec.ts b/packages/compiler/test/ml_parser/html_whitespaces_spec.ts index e375685557b74a..ac1fed58d69c96 100644 --- a/packages/compiler/test/ml_parser/html_whitespaces_spec.ts +++ b/packages/compiler/test/ml_parser/html_whitespaces_spec.ts @@ -68,7 +68,7 @@ import {humanizeDom} from './ast_spec_utils'; it('should remove whitespace inside of blocks', () => { const markup = '@if (cond) {

\t
\n
}'; - expect(parseAndRemoveWS(markup, {tokenizeBlocks: true})).toEqual([ + expect(parseAndRemoveWS(markup)).toEqual([ [html.Block, 'if', 0], [html.BlockParameter, 'cond'], [html.Element, 'br', 1], diff --git a/packages/compiler/test/ml_parser/icu_ast_expander_spec.ts b/packages/compiler/test/ml_parser/icu_ast_expander_spec.ts index b93eb92ad5846e..a0fec820b5c4c8 100644 --- a/packages/compiler/test/ml_parser/icu_ast_expander_spec.ts +++ b/packages/compiler/test/ml_parser/icu_ast_expander_spec.ts @@ -111,8 +111,7 @@ import {humanizeNodes} from './ast_spec_utils'; }); it('should parse an expansion forms inside of blocks', () => { - const res = expand( - '@if (cond) {{a, b, =4 {c}}@if (otherCond) {{d, e, =4 {f}}}}', {tokenizeBlocks: true}); + const res = expand('@if (cond) {{a, b, =4 {c}}@if (otherCond) {{d, e, =4 {f}}}}'); expect(humanizeNodes(res.nodes)).toEqual([ [html.Block, 'if', 0], diff --git a/packages/compiler/test/ml_parser/lexer_spec.ts b/packages/compiler/test/ml_parser/lexer_spec.ts index 918e8fdbec3566..238cf0c5fa4e31 100644 --- a/packages/compiler/test/ml_parser/lexer_spec.ts +++ b/packages/compiler/test/ml_parser/lexer_spec.ts @@ -787,7 +787,9 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.ATTR_NAME, '', '&&'], [TokenType.ATTR_NAME, '', 'c'], [TokenType.TAG_OPEN_END], - [TokenType.TEXT, ' d }}'], + [TokenType.TEXT, ' d '], + [TokenType.BLOCK_CLOSE], + [TokenType.BLOCK_CLOSE], [TokenType.EOF], ]); }); @@ -800,7 +802,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.COMMENT_START], [TokenType.RAW_TEXT, ''], [TokenType.COMMENT_END], - [TokenType.TEXT, '}'], + [TokenType.BLOCK_CLOSE], [TokenType.EOF], ]); }); @@ -825,7 +827,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.CDATA_START], [TokenType.RAW_TEXT, ''], [TokenType.CDATA_END], - [TokenType.TEXT, '}'], + [TokenType.BLOCK_CLOSE], [TokenType.EOF], ]); }); @@ -916,7 +918,8 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u it('should treat expansion form as text when they are not parsed', () => { expect(tokenizeAndHumanizeParts( - '{a, b, =4 {c}}', {tokenizeExpansionForms: false})) + '{a, b, =4 {c}}', + {tokenizeExpansionForms: false, tokenizeBlocks: false})) .toEqual([ [TokenType.TAG_OPEN_START, '', 'span'], [TokenType.TAG_OPEN_END], @@ -1816,13 +1819,6 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); describe('blocks', () => { - // TODO(crisbeto): temporary utility while blocks are disabled by default. - const options: Readonly = {tokenizeBlocks: true}; - - function tokenizeBlock(input: string, additionalOptions: TokenizeOptions = {}): any[] { - return tokenizeAndHumanizeParts(input, {...options, ...additionalOptions}); - } - it('should parse a block without parameters', () => { const expected = [ [TokenType.BLOCK_OPEN_START, 'foo'], @@ -1832,13 +1828,13 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.EOF], ]; - expect(tokenizeBlock('@foo {hello}')).toEqual(expected); - expect(tokenizeBlock('@foo () {hello}')).toEqual(expected); - expect(tokenizeBlock('@foo(){hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo () {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo(){hello}')).toEqual(expected); }); it('should parse a block with parameters', () => { - expect(tokenizeBlock('@for (item of items; track item.id) {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@for (item of items; track item.id) {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'for'], [TokenType.BLOCK_PARAMETER, 'item of items'], [TokenType.BLOCK_PARAMETER, 'track item.id'], @@ -1850,7 +1846,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block with a trailing semicolon after the parameters', () => { - expect(tokenizeBlock('@for (item of items;) {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@for (item of items;) {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'for'], [TokenType.BLOCK_PARAMETER, 'item of items'], [TokenType.BLOCK_OPEN_END], @@ -1861,7 +1857,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block with a space in its name', () => { - expect(tokenizeBlock('@else if {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@else if {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'else if'], [TokenType.BLOCK_OPEN_END], [TokenType.TEXT, 'hello'], @@ -1869,7 +1865,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.EOF], ]); - expect(tokenizeBlock('@else if (foo !== 2) {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@else if (foo !== 2) {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'else if'], [TokenType.BLOCK_PARAMETER, 'foo !== 2'], [TokenType.BLOCK_OPEN_END], @@ -1891,14 +1887,14 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.EOF], ]; - expect(tokenizeBlock('@foo(a; b; c){hello}')).toEqual(expected); - expect(tokenizeBlock('@foo (a; b; c) {hello}')).toEqual(expected); - expect(tokenizeBlock('@foo(a; b; c) {hello}')).toEqual(expected); - expect(tokenizeBlock('@foo (a; b; c){hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo(a; b; c){hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo (a; b; c) {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo(a; b; c) {hello}')).toEqual(expected); + expect(tokenizeAndHumanizeParts('@foo (a; b; c){hello}')).toEqual(expected); }); it('should parse a block with multiple trailing semicolons', () => { - expect(tokenizeBlock('@for (item of items;;;;;) {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@for (item of items;;;;;) {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'for'], [TokenType.BLOCK_PARAMETER, 'item of items'], [TokenType.BLOCK_OPEN_END], @@ -1909,7 +1905,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block with trailing whitespace', () => { - expect(tokenizeBlock('@foo {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@foo {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'foo'], [TokenType.BLOCK_OPEN_END], [TokenType.TEXT, 'hello'], @@ -1919,7 +1915,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block with no trailing semicolon', () => { - expect(tokenizeBlock('@for (item of items){hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@for (item of items){hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'for'], [TokenType.BLOCK_PARAMETER, 'item of items'], [TokenType.BLOCK_OPEN_END], @@ -1931,7 +1927,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u it('should handle semicolons, braces and parentheses used in a block parameter', () => { const input = `@foo (a === ";"; b === ')'; c === "("; d === '}'; e === "{") {hello}`; - expect(tokenizeBlock(input)).toEqual([ + expect(tokenizeAndHumanizeParts(input)).toEqual([ [TokenType.BLOCK_OPEN_START, 'foo'], [TokenType.BLOCK_PARAMETER, `a === ";"`], [TokenType.BLOCK_PARAMETER, `b === ')'`], @@ -1946,7 +1942,8 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should handle object literals and function calls in block parameters', () => { - expect(tokenizeBlock(`@foo (on a({a: 1, b: 2}, false, {c: 3}); when b({d: 4})) {hello}`)) + expect(tokenizeAndHumanizeParts( + `@foo (on a({a: 1, b: 2}, false, {c: 3}); when b({d: 4})) {hello}`)) .toEqual([ [TokenType.BLOCK_OPEN_START, 'foo'], [TokenType.BLOCK_PARAMETER, 'on a({a: 1, b: 2}, false, {c: 3})'], @@ -1959,47 +1956,47 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should unclosed parameters', () => { - expect(tokenizeAndHumanizeErrors(`@foo (a === b {hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo (a === b {hello}`)).toEqual([ [null, 'Unexpected character "EOF"', '0:21'] ]); }); it('should report stray parentheses in the parameter position', () => { - expect(tokenizeAndHumanizeErrors(`@foo a === b) {hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo a === b) {hello}`)).toEqual([ [TokenType.BLOCK_OPEN_END, 'Unexpected character "="', '0:7'] ]); }); it('should report missing block opening brace', () => { - expect(tokenizeAndHumanizeErrors(`@foo (a === b) hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo (a === b) hello}`)).toEqual([ [TokenType.BLOCK_OPEN_END, 'Unexpected character "h"', '0:15'] ]); }); it('should report invalid quotes in a parameter', () => { - expect(tokenizeAndHumanizeErrors(`@foo (a === ") {hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo (a === ") {hello}`)).toEqual([ [TokenType.BLOCK_PARAMETER, 'Unexpected character "EOF"', '0:22'] ]); - expect(tokenizeAndHumanizeErrors(`@foo (a === "hi') {hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo (a === "hi') {hello}`)).toEqual([ [TokenType.BLOCK_PARAMETER, 'Unexpected character "EOF"', '0:25'] ]); }); it('should report unclosed object literal inside a parameter', () => { - expect(tokenizeAndHumanizeErrors(`@foo ({invalid: true) hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo ({invalid: true) hello}`)).toEqual([ [TokenType.BLOCK_OPEN_END, 'Unexpected character "h"', '0:22'], ]); }); it('should block parameters without parentheses', () => { - expect(tokenizeAndHumanizeErrors(`@foo a === b {hello}`, options)).toEqual([ + expect(tokenizeAndHumanizeErrors(`@foo a === b {hello}`)).toEqual([ [TokenType.BLOCK_OPEN_END, 'Unexpected character "="', '0:7'] ]); }); it('should handle a semicolon used in a nested string inside a block parameter', () => { - expect(tokenizeBlock(`@if (condition === "';'") {hello}`)).toEqual([ + expect(tokenizeAndHumanizeParts(`@if (condition === "';'") {hello}`)).toEqual([ [TokenType.BLOCK_OPEN_START, 'if'], [TokenType.BLOCK_PARAMETER, `condition === "';'"`], [TokenType.BLOCK_OPEN_END], @@ -2010,7 +2007,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should handle a semicolon next to an escaped quote used in a block parameter', () => { - expect(tokenizeBlock('@if (condition === "\\";") {hello}')).toEqual([ + expect(tokenizeAndHumanizeParts('@if (condition === "\\";") {hello}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'if'], [TokenType.BLOCK_PARAMETER, 'condition === "\\";"'], [TokenType.BLOCK_OPEN_END], @@ -2021,7 +2018,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse mixed text and html content in a block', () => { - expect(tokenizeBlock('@if (a === 1) {foo bar baz}')).toEqual([ + expect(tokenizeAndHumanizeParts('@if (a === 1) {foo bar baz}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'if'], [TokenType.BLOCK_PARAMETER, 'a === 1'], [TokenType.BLOCK_OPEN_END], @@ -2037,7 +2034,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse HTML tags with attributes containing curly braces inside blocks', () => { - expect(tokenizeBlock('@if (a === 1) {
}')).toEqual([ + expect(tokenizeAndHumanizeParts('@if (a === 1) {
}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'if'], [TokenType.BLOCK_PARAMETER, 'a === 1'], [TokenType.BLOCK_OPEN_END], @@ -2058,7 +2055,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse HTML tags with attribute containing block syntax', () => { - expect(tokenizeBlock('
')).toEqual([ + expect(tokenizeAndHumanizeParts('
')).toEqual([ [TokenType.TAG_OPEN_START, '', 'div'], [TokenType.ATTR_NAME, '', 'a'], [TokenType.ATTR_QUOTE, '"'], @@ -2071,7 +2068,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse nested blocks', () => { - expect(tokenizeBlock( + expect(tokenizeAndHumanizeParts( '@if (a) {' + 'hello a' + '@if {' + @@ -2109,7 +2106,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block containing an expansion', () => { - const result = tokenizeBlock( + const result = tokenizeAndHumanizeParts( '@foo {{one.two, three, =4 {four} =5 {five} foo {bar} }}', {tokenizeExpansionForms: true}); @@ -2138,7 +2135,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should parse a block containing an interpolation', () => { - expect(tokenizeBlock('@foo {{{message}}}')).toEqual([ + expect(tokenizeAndHumanizeParts('@foo {{{message}}}')).toEqual([ [TokenType.BLOCK_OPEN_START, 'foo'], [TokenType.BLOCK_OPEN_END], [TokenType.TEXT, ''], diff --git a/packages/compiler/test/render3/r3_ast_spans_spec.ts b/packages/compiler/test/render3/r3_ast_spans_spec.ts index d15e8fed166d8d..988114844ea23d 100644 --- a/packages/compiler/test/render3/r3_ast_spans_spec.ts +++ b/packages/compiler/test/render3/r3_ast_spans_spec.ts @@ -216,9 +216,8 @@ function humanizeSpan(span: ParseSourceSpan|null|undefined): string { return span.toString(); } -function expectFromHtml(html: string, enabledBlockTypes?: string[]) { - const res = parse(html, {enabledBlockTypes}); - return expectFromR3Nodes(res.nodes); +function expectFromHtml(html: string) { + return expectFromR3Nodes(parse(html).nodes); } function expectFromR3Nodes(nodes: t.Node[]) { @@ -617,7 +616,7 @@ describe('R3 AST source spans', () => { '@placeholder (minimum 500) {Placeholder content!}' + '@error {Loading failed :(}'; - expectFromHtml(html, ['defer']).toEqual([ + expectFromHtml(html).toEqual([ [ 'DeferredBlock', '@defer (when isVisible() && foo; on hover(button), timer(10s), idle, immediate, interaction(button), viewport(container); prefetch on immediate; prefetch when isDataLoaded()) {}', @@ -663,7 +662,7 @@ describe('R3 AST source spans', () => { `@default {No case matched}` + `}`; - expectFromHtml(html, ['switch']).toEqual([ + expectFromHtml(html).toEqual([ [ 'SwitchBlock', '@switch (cond.kind) {@case (x()) {X case}@case (\'hello\') {Y case}@case (42) {Z case}@default {No case matched}}', @@ -686,7 +685,7 @@ describe('R3 AST source spans', () => { const html = `@for (item of items.foo.bar; track item.id) {

{{ item }}

}` + `@empty {There were no items in the list.}`; - expectFromHtml(html, ['for']).toEqual([ + expectFromHtml(html).toEqual([ [ 'ForLoopBlock', '@for (item of items.foo.bar; track item.id) {

{{ item }}

}', '@for (item of items.foo.bar; track item.id) {', '}' @@ -705,7 +704,7 @@ describe('R3 AST source spans', () => { `@else if (other.expr) {Extra case was true!}` + `@else {False case!}`; - expectFromHtml(html, ['if']).toEqual([ + expectFromHtml(html).toEqual([ [ 'IfBlock', '@if (cond.expr; as foo) {Main case was true!}', '@if (cond.expr; as foo) {', '}' diff --git a/packages/compiler/test/render3/r3_template_transform_spec.ts b/packages/compiler/test/render3/r3_template_transform_spec.ts index a1d9868756a652..f95eb4ba39dc96 100644 --- a/packages/compiler/test/render3/r3_template_transform_spec.ts +++ b/packages/compiler/test/render3/r3_template_transform_spec.ts @@ -175,8 +175,8 @@ class R3AstHumanizer implements t.Visitor { } } -function expectFromHtml(html: string, ignoreError = false, enabledBlockTypes?: string[]) { - const res = parse(html, {ignoreError, enabledBlockTypes}); +function expectFromHtml(html: string, ignoreError = false) { + const res = parse(html, {ignoreError}); return expectFromR3Nodes(res.nodes); } @@ -734,25 +734,15 @@ describe('R3 template transform', () => { }); describe('deferred blocks', () => { - // TODO(crisbeto): temporary utility while blocks are disabled by default. - function expectDeferred(html: string, preserveWhitespaces?: boolean) { - return expectFromR3Nodes( - parse(html, {enabledBlockTypes: ['defer'], preserveWhitespaces}).nodes); - } - - function expectDeferredError(html: string) { - return expect(() => parse(html, {enabledBlockTypes: ['defer']})); - } - it('should parse a simple deferred block', () => { - expectDeferred('@defer{hello}').toEqual([ + expectFromHtml('@defer{hello}').toEqual([ ['DeferredBlock'], ['Text', 'hello'], ]); }); it('should parse a deferred block with a `when` trigger', () => { - expectDeferred('@defer (when isVisible() && loaded){hello}').toEqual([ + expectFromHtml('@defer (when isVisible() && loaded){hello}').toEqual([ ['DeferredBlock'], ['BoundDeferredTrigger', 'isVisible() && loaded'], ['Text', 'hello'], @@ -760,7 +750,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with a single `on` trigger', () => { - expectDeferred('@defer (on idle){hello}').toEqual([ + expectFromHtml('@defer (on idle){hello}').toEqual([ ['DeferredBlock'], ['IdleDeferredTrigger'], ['Text', 'hello'], @@ -768,7 +758,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with multiple `on` triggers', () => { - expectDeferred('@defer (on idle, viewport(button)){hello}').toEqual([ + expectFromHtml('@defer (on idle, viewport(button)){hello}').toEqual([ ['DeferredBlock'], ['IdleDeferredTrigger'], ['ViewportDeferredTrigger', 'button'], @@ -777,7 +767,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with a non-parenthesized trigger at the end', () => { - expectDeferred('@defer (on idle, viewport(button), immediate){hello}').toEqual([ + expectFromHtml('@defer (on idle, viewport(button), immediate){hello}').toEqual([ ['DeferredBlock'], ['IdleDeferredTrigger'], ['ViewportDeferredTrigger', 'button'], @@ -787,9 +777,9 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with `when` and `on` triggers', () => { - const markup = '@defer (when isVisible(); on timer(100ms), idle, viewport(button)){hello}'; + const template = '@defer (when isVisible(); on timer(100ms), idle, viewport(button)){hello}'; - expectDeferred(markup).toEqual([ + expectFromHtml(template).toEqual([ ['DeferredBlock'], ['BoundDeferredTrigger', 'isVisible()'], ['TimerDeferredTrigger', 100], @@ -800,10 +790,10 @@ describe('R3 template transform', () => { }); it('should allow new line after trigger name', () => { - const markup = + const template = `@defer(\nwhen\nisVisible(); on\ntimer(100ms),\nidle, viewport(button)){hello}`; - expectDeferred(markup).toEqual([ + expectFromHtml(template).toEqual([ ['DeferredBlock'], ['BoundDeferredTrigger', 'isVisible()'], ['TimerDeferredTrigger', 100], @@ -814,7 +804,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with a timeout set in seconds', () => { - expectDeferred('@defer (on timer(10s)){hello}').toEqual([ + expectFromHtml('@defer (on timer(10s)){hello}').toEqual([ ['DeferredBlock'], ['TimerDeferredTrigger', 10000], ['Text', 'hello'], @@ -822,7 +812,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with a timeout that has no units', () => { - expectDeferred('@defer (on timer(100)){hello}').toEqual([ + expectFromHtml('@defer (on timer(100)){hello}').toEqual([ ['DeferredBlock'], ['TimerDeferredTrigger', 100], ['Text', 'hello'], @@ -830,7 +820,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with a hover trigger', () => { - expectDeferred('@defer (on hover(button)){hello}').toEqual([ + expectFromHtml('@defer (on hover(button)){hello}').toEqual([ ['DeferredBlock'], ['HoverDeferredTrigger', 'button'], ['Text', 'hello'], @@ -838,7 +828,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with an interaction trigger', () => { - expectDeferred('@defer (on interaction(button)){hello}').toEqual([ + expectFromHtml('@defer (on interaction(button)){hello}').toEqual([ ['DeferredBlock'], ['InteractionDeferredTrigger', 'button'], ['Text', 'hello'], @@ -846,7 +836,7 @@ describe('R3 template transform', () => { }); it('should parse a deferred block with connected blocks', () => { - expectDeferred( + expectFromHtml( '@defer {}' + '@loading {Loading...}' + '@placeholder {Placeholder content!}' + @@ -867,28 +857,27 @@ describe('R3 template transform', () => { it('should parse a deferred block with connected blocks that have an arbitrary ' + 'amount of whitespace between them when preserveWhitespaces is enabled', () => { - expectDeferred( - '@defer {}' + - ' @loading {Loading...} ' + - '\n\n @placeholder {Placeholder content!} \n\n' + - '@error {Loading failed :(}', - true) - .toEqual([ - // Note: we also expect the whitespace nodes between the blocks to be ignored here. - ['DeferredBlock'], - ['Element', 'calendar-cmp'], - ['BoundAttribute', 0, 'date', 'current'], - ['DeferredBlockPlaceholder'], - ['Text', 'Placeholder content!'], - ['DeferredBlockLoading'], - ['Text', 'Loading...'], - ['DeferredBlockError'], - ['Text', 'Loading failed :('], - ]); + const template = '@defer {}' + + ' @loading {Loading...} ' + + '\n\n @placeholder {Placeholder content!} \n\n' + + '@error {Loading failed :(}'; + + expectFromR3Nodes(parse(template, {preserveWhitespaces: true}).nodes).toEqual([ + // Note: we also expect the whitespace nodes between the blocks to be ignored here. + ['DeferredBlock'], + ['Element', 'calendar-cmp'], + ['BoundAttribute', 0, 'date', 'current'], + ['DeferredBlockPlaceholder'], + ['Text', 'Placeholder content!'], + ['DeferredBlockLoading'], + ['Text', 'Loading...'], + ['DeferredBlockError'], + ['Text', 'Loading failed :('], + ]); }); it('should parse a loading block with parameters', () => { - expectDeferred( + expectFromHtml( '@defer{}' + '@loading (after 100ms; minimum 1s){Loading...}') .toEqual([ @@ -901,7 +890,7 @@ describe('R3 template transform', () => { }); it('should parse a placeholder block with parameters', () => { - expectDeferred( + expectFromHtml( '@defer {}' + '@placeholder (minimum 1s){Placeholder...}') .toEqual([ @@ -917,7 +906,7 @@ describe('R3 template transform', () => { const html = '@defer (on idle; prefetch on viewport(button), hover(button); prefetch when shouldPrefetch()){hello}'; - expectDeferred(html).toEqual([ + expectFromHtml(html).toEqual([ ['DeferredBlock'], ['IdleDeferredTrigger'], ['ViewportDeferredTrigger', 'button'], @@ -931,7 +920,7 @@ describe('R3 template transform', () => { const html = '@defer (on idle; prefetch on viewport(button), hover(button); prefetch when shouldPrefetch()){hello}'; - expectDeferred(html).toEqual([ + expectFromHtml(html).toEqual([ ['DeferredBlock'], ['IdleDeferredTrigger'], ['ViewportDeferredTrigger', 'button'], @@ -942,7 +931,7 @@ describe('R3 template transform', () => { }); it('should parse a complete example', () => { - expectDeferred( + expectFromHtml( '@defer (when isVisible() && foo; on hover(button), timer(10s), idle, immediate, ' + 'interaction(button), viewport(container); prefetch on immediate; ' + 'prefetch when isDataLoaded()){}' + @@ -972,7 +961,7 @@ describe('R3 template transform', () => { }); it('should treat blocks as plain text inside ngNonBindable', () => { - expectDeferred( + expectFromHtml( '
' + '@defer (when isVisible() && foo; on hover, timer(10s); ' + 'prefetch on immediate; prefetch when isDataLoaded()){}' + @@ -1003,7 +992,7 @@ describe('R3 template transform', () => { }); it('should parse triggers with implied target elements', () => { - expectDeferred( + expectFromHtml( '@defer (on hover, interaction, viewport; prefetch on hover, interaction, viewport) {hello}' + '@placeholder {}') .toEqual([ @@ -1022,212 +1011,214 @@ describe('R3 template transform', () => { describe('block validations', () => { it('should report syntax error in `when` trigger', () => { - expectDeferredError('@defer (when isVisible#){hello}') + expect(() => parse('@defer (when isVisible#){hello}')) .toThrowError(/Invalid character \[#\]/); }); it('should report unrecognized trigger', () => { - expectDeferredError('@defer (unknown visible()){hello}') + expect(() => parse('@defer (unknown visible()){hello}')) .toThrowError(/Unrecognized trigger/); }); it('should report content before a connected block', () => { - expectDeferredError('@defer {hello}
@placeholder {placeholder}') + expect(() => parse('@defer {hello}
@placeholder {placeholder}')) .toThrowError(/@placeholder block can only be used after an @defer block/); }); it('should report connected defer blocks used without a defer block', () => { - expectDeferredError('@placeholder {placeholder}') + expect(() => parse('@placeholder {placeholder}')) .toThrowError(/@placeholder block can only be used after an @defer block/); - expectDeferredError('@loading {loading}') + expect(() => parse('@loading {loading}')) .toThrowError(/@loading block can only be used after an @defer block/); - expectDeferredError('@error {error}') + expect(() => parse('@error {error}')) .toThrowError(/@error block can only be used after an @defer block/); }); it('should report multiple placeholder blocks', () => { - expectDeferredError('@defer {hello} @placeholder {p1} @placeholder {p2}') + expect(() => parse('@defer {hello} @placeholder {p1} @placeholder {p2}')) .toThrowError(/@defer block can only have one @placeholder block/); }); it('should report multiple loading blocks', () => { - expectDeferredError('@defer {hello} @loading {l1} @loading {l2}') + expect(() => parse('@defer {hello} @loading {l1} @loading {l2}')) .toThrowError(/@defer block can only have one @loading block/); }); it('should report multiple error blocks', () => { - expectDeferredError('@defer {hello} @error {e1} @error {e2}') + expect(() => parse('@defer {hello} @error {e1} @error {e2}')) .toThrowError(/@defer block can only have one @error block/); }); it('should report unrecognized parameter in placeholder block', () => { - expectDeferredError('@defer {hello} @placeholder (unknown 100ms) {hi}') + expect(() => parse('@defer {hello} @placeholder (unknown 100ms) {hi}')) .toThrowError(/Unrecognized parameter in @placeholder block: "unknown 100ms"/); }); it('should report unrecognized parameter in loading block', () => { - expectDeferredError('@defer {hello} @loading (unknown 100ms) {hi}') + expect(() => parse('@defer {hello} @loading (unknown 100ms) {hi}')) .toThrowError(/Unrecognized parameter in @loading block: "unknown 100ms"/); }); it('should report any parameter usage in error block', () => { - expectDeferredError('@defer {hello} @error (foo) {hi}') + expect(() => parse('@defer {hello} @error (foo) {hi}')) .toThrowError(/@error block cannot have parameters/); }); it('should report if minimum placeholder time cannot be parsed', () => { - expectDeferredError('@defer {hello} @placeholder (minimum 123abc) {hi}') + expect(() => parse('@defer {hello} @placeholder (minimum 123abc) {hi}')) .toThrowError(/Could not parse time value of parameter "minimum"/); }); it('should report if minimum loading time cannot be parsed', () => { - expectDeferredError('@defer {hello} @loading (minimum 123abc) {hi}') + expect(() => parse('@defer {hello} @loading (minimum 123abc) {hi}')) .toThrowError(/Could not parse time value of parameter "minimum"/); }); it('should report if after loading time cannot be parsed', () => { - expectDeferredError('@defer {hello} @loading (after 123abc) {hi}') + expect(() => parse('@defer {hello} @loading (after 123abc) {hi}')) .toThrowError(/Could not parse time value of parameter "after"/); }); it('should report unrecognized `on` trigger', () => { - expectDeferredError('@defer (on foo) {hello}') + expect(() => parse('@defer (on foo) {hello}')) .toThrowError(/Unrecognized trigger type "foo"/); }); it('should report missing comma after unparametarized `on` trigger', () => { - expectDeferredError('@defer (on hover idle) {hello}').toThrowError(/Unexpected token/); + expect(() => parse('@defer (on hover idle) {hello}')).toThrowError(/Unexpected token/); }); it('should report missing comma after parametarized `on` trigger', () => { - expectDeferredError('@defer (on viewport(button) idle) {hello}') + expect(() => parse('@defer (on viewport(button) idle) {hello}')) .toThrowError(/Unexpected token/); }); it('should report mutliple commas after between `on` triggers', () => { - expectDeferredError('@defer (on viewport(button), , idle) {hello}') + expect(() => parse('@defer (on viewport(button), , idle) {hello}')) .toThrowError(/Unexpected token/); }); it('should report unclosed parenthesis in `on` trigger', () => { - expectDeferredError('@defer (on viewport(button) {hello}') + expect(() => parse('@defer (on viewport(button) {hello}')) .toThrowError(/Unexpected character "EOF"/); }); it('should report incorrect closing parenthesis in `on` trigger', () => { - expectDeferredError('@defer (on viewport(but)ton) {hello}') + expect(() => parse('@defer (on viewport(but)ton) {hello}')) .toThrowError(/Unexpected token/); }); it('should report stray closing parenthesis in `on` trigger', () => { - expectDeferredError('@defer (on idle)) {hello}').toThrowError(/Unexpected character "\)"/); + expect(() => parse('@defer (on idle)) {hello}')).toThrowError(/Unexpected character "\)"/); }); it('should report non-identifier token usage in `on` trigger', () => { - expectDeferredError('@defer (on 123) {hello}').toThrowError(/Unexpected token/); + expect(() => parse('@defer (on 123) {hello}')).toThrowError(/Unexpected token/); }); it('should report if identifier is not followed by an opening parenthesis', () => { - expectDeferredError('@defer (on viewport[]) {hello}').toThrowError(/Unexpected token/); + expect(() => parse('@defer (on viewport[]) {hello}')).toThrowError(/Unexpected token/); }); it('should report if parameters are passed to `idle` trigger', () => { - expectDeferredError('@defer (on idle(1)) {hello}') + expect(() => parse('@defer (on idle(1)) {hello}')) .toThrowError(/"idle" trigger cannot have parameters/); }); it('should report if no parameters are passed into `timer` trigger', () => { - expectDeferredError('@defer (on timer) {hello}') + expect(() => parse('@defer (on timer) {hello}')) .toThrowError(/"timer" trigger must have exactly one parameter/); }); it('should report if `timer` trigger value cannot be parsed', () => { - expectDeferredError('@defer (on timer(123abc)) {hello}') + expect(() => parse('@defer (on timer(123abc)) {hello}')) .toThrowError(/Could not parse time value of trigger "timer"/); }); it('should report if `interaction` trigger has more than one parameter', () => { - expectDeferredError('@defer (on interaction(a, b)) {hello}') + expect(() => parse('@defer (on interaction(a, b)) {hello}')) .toThrowError(/"interaction" trigger can only have zero or one parameters/); }); it('should report if parameters are passed to `immediate` trigger', () => { - expectDeferredError('@defer (on immediate(1)) {hello}') + expect(() => parse('@defer (on immediate(1)) {hello}')) .toThrowError(/"immediate" trigger cannot have parameters/); }); it('should report if `hover` trigger has more than one parameter', () => { - expectDeferredError('@defer (on hover(a, b)) {hello}') + expect(() => parse('@defer (on hover(a, b)) {hello}')) .toThrowError(/"hover" trigger can only have zero or one parameters/); }); it('should report if `viewport` trigger has more than one parameter', () => { - expectDeferredError('@defer (on viewport(a, b)) {hello}') + expect(() => parse('@defer (on viewport(a, b)) {hello}')) .toThrowError(/"viewport" trigger can only have zero or one parameters/); }); it('should report duplicate when triggers', () => { - expectDeferredError('@defer (when isVisible(); when somethingElse()) {hello}') + expect(() => parse('@defer (when isVisible(); when somethingElse()) {hello}')) .toThrowError(/Duplicate "when" trigger is not allowed/); }); it('should report duplicate on triggers', () => { - expectDeferredError('@defer (on idle; when isVisible(); on timer(10), idle) {hello}') + expect(() => parse('@defer (on idle; when isVisible(); on timer(10), idle) {hello}')) .toThrowError(/Duplicate "idle" trigger is not allowed/); }); it('should report duplicate prefetch when triggers', () => { - expectDeferredError( - '@defer (prefetch when isVisible(); prefetch when somethingElse()) {hello}') + expect( + () => + parse('@defer (prefetch when isVisible(); prefetch when somethingElse()) {hello}')) .toThrowError(/Duplicate "when" trigger is not allowed/); }); it('should report duplicate prefetch on triggers', () => { - expectDeferredError( - '@defer (prefetch on idle; prefetch when isVisible(); prefetch on timer(10), idle) {hello}') + expect( + () => parse( + '@defer (prefetch on idle; prefetch when isVisible(); prefetch on timer(10), idle) {hello}')) .toThrowError(/Duplicate "idle" trigger is not allowed/); }); it('should report multiple minimum parameters on a placeholder block', () => { - expectDeferredError('@defer {hello} @placeholder (minimum 1s; minimum 500ms) {placeholder}') + expect(() => parse('@defer {hello} @placeholder (minimum 1s; minimum 500ms) {placeholder}')) .toThrowError(/@placeholder block can only have one "minimum" parameter/); }); it('should report multiple minimum parameters on a loading block', () => { - expectDeferredError('@defer {hello} @loading (minimum 1s; minimum 500ms) {loading}') + expect(() => parse('@defer {hello} @loading (minimum 1s; minimum 500ms) {loading}')) .toThrowError(/@loading block can only have one "minimum" parameter/); }); it('should report multiple after parameters on a loading block', () => { - expectDeferredError('@defer {hello} @loading (after 1s; after 500ms) {loading}') + expect(() => parse('@defer {hello} @loading (after 1s; after 500ms) {loading}')) .toThrowError(/@loading block can only have one "after" parameter/); }); it('should report if reference-based trigger has no reference and there is no placeholder block', () => { - expectDeferredError('@defer (on viewport) {hello}') + expect(() => parse('@defer (on viewport) {hello}')) .toThrowError( /"viewport" trigger with no parameters can only be placed on an @defer that has a @placeholder block/); }); it('should report if reference-based trigger has no reference and the placeholder is empty', () => { - expectDeferredError('@defer (on viewport) {hello} @placeholder {}') + expect(() => parse('@defer (on viewport) {hello} @placeholder {}')) .toThrowError( /"viewport" trigger with no parameters can only be placed on an @defer that has a @placeholder block with exactly one root element node/); }); it('should report if reference-based trigger has no reference and the placeholder with text at the root', () => { - expectDeferredError('@defer (on viewport) {hello} @placeholder {placeholder}') + expect(() => parse('@defer (on viewport) {hello} @placeholder {placeholder}')) .toThrowError( /"viewport" trigger with no parameters can only be placed on an @defer that has a @placeholder block with exactly one root element node/); }); it('should report if reference-based trigger has no reference and the placeholder has multiple root elements', () => { - expectDeferredError( - '@defer (on viewport) {hello} @placeholder {
}') + expect( + () => parse('@defer (on viewport) {hello} @placeholder {
}')) .toThrowError( /"viewport" trigger with no parameters can only be placed on an @defer that has a @placeholder block with exactly one root element node/); }); @@ -1235,18 +1226,8 @@ describe('R3 template transform', () => { }); describe('switch blocks', () => { - // TODO(crisbeto): temporary utility while control flow is disabled by default. - function expectSwitch(html: string, preserveWhitespaces?: boolean) { - return expectFromR3Nodes( - parse(html, {enabledBlockTypes: ['switch'], preserveWhitespaces}).nodes); - } - - function expectSwitchError(html: string) { - return expect(() => parse(html, {enabledBlockTypes: ['switch']})); - } - it('should parse a switch block', () => { - expectSwitch(` + expectFromHtml(` @switch (cond.kind) { @case (x()) { X case } @case ('hello') {} @@ -1287,7 +1268,7 @@ describe('R3 template transform', () => { } `; - expectSwitch(template, true).toEqual([ + expectFromR3Nodes(parse(template, {preserveWhitespaces: true}).nodes).toEqual([ ['Text', '\n '], ['SwitchBlock', 'cond.kind'], ['SwitchBlockCase', 'x()'], @@ -1306,7 +1287,7 @@ describe('R3 template transform', () => { }); it('should parse a switch block with optional parentheses', () => { - expectSwitch(` + expectFromHtml(` @switch ((cond.kind)) { @case ((x())) { X case } @case (('hello')) {} @@ -1328,7 +1309,7 @@ describe('R3 template transform', () => { }); it('should parse a nested switch block', () => { - expectSwitch(` + expectFromHtml(` @switch (cond) { @case ('a') { @switch (innerCond) { @@ -1381,101 +1362,92 @@ describe('R3 template transform', () => { describe('validations', () => { it('should report syntax error in switch expression', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond/.kind) { @case (x()) {X case} @default {No case matched} } - `).toThrowError(/Parser Error: Unexpected token \./); + `)).toThrowError(/Parser Error: Unexpected token \./); }); it('should report syntax error in case expression', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case (x/.y) {X case} } - `).toThrowError(/Parser Error: Unexpected token \./); + `)).toThrowError(/Parser Error: Unexpected token \./); }); it('should report if a block different from "case" and "default" is used in a switch', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case (x()) {X case} @foo {Foo} } - `).toThrowError(/@switch block can only contain @case and @default blocks/); + `)).toThrowError(/@switch block can only contain @case and @default blocks/); }); it('should report if @case or @default is used outside of a switch block', () => { - expectSwitchError(`@case (foo) {}`).toThrowError(/Unrecognized block @case/); - expectSwitchError(`@default {}`).toThrowError(/Unrecognized block @default/); + expect(() => parse(`@case (foo) {}`)).toThrowError(/Unrecognized block @case/); + expect(() => parse(`@default {}`)).toThrowError(/Unrecognized block @default/); }); it('should report if a switch has no parameters', () => { - expectSwitchError(` + expect(() => parse(` @switch { @case (1) {case} } - `).toThrowError(/@switch block must have exactly one parameter/); + `)).toThrowError(/@switch block must have exactly one parameter/); }); it('should report if a switch has more than one parameter', () => { - expectSwitchError(` + expect(() => parse(` @switch (foo; bar) { @case (1) {case} } - `).toThrowError(/@switch block must have exactly one parameter/); + `)).toThrowError(/@switch block must have exactly one parameter/); }); it('should report if a case has no parameters', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case {case} } - `).toThrowError(/@case block must have exactly one parameter/); + `)).toThrowError(/@case block must have exactly one parameter/); }); it('should report if a case has more than one parameter', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case (foo; bar) {case} } - `).toThrowError(/@case block must have exactly one parameter/); + `)).toThrowError(/@case block must have exactly one parameter/); }); it('should report if a switch has multiple default blocks', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case (foo) {foo} @default {one} @default {two} } - `).toThrowError(/@switch block can only have one @default block/); + `)).toThrowError(/@switch block can only have one @default block/); }); it('should report if a default block has parameters', () => { - expectSwitchError(` + expect(() => parse(` @switch (cond) { @case (foo) {foo} @default (bar) {bar} } - `).toThrowError(/@default block cannot have parameters/); + `)).toThrowError(/@default block cannot have parameters/); }); }); }); describe('for loop blocks', () => { - // TODO(crisbeto): temporary utility while control flow is disabled by default. - function expectLoop(html: string) { - return expectFromR3Nodes(parse(html, {enabledBlockTypes: ['for']}).nodes); - } - - function expectLoopError(html: string) { - return expect(() => parse(html, {enabledBlockTypes: ['for']})); - } - it('should parse a for loop block', () => { - expectLoop(` + expectFromHtml(` @for (item of items.foo.bar; track item.id) { {{ item }} } @empty { @@ -1491,7 +1463,7 @@ describe('R3 template transform', () => { }); it('should parse a for loop block with optional parentheses', () => { - expectLoop(` + expectFromHtml(` @for ((item of items.foo.bar); track item.id){ {{ item }} } @@ -1501,7 +1473,7 @@ describe('R3 template transform', () => { ['BoundText', ' {{ item }} '], ]); - expectLoop(` + expectFromHtml(` @for ((item of items.foo.bar()); track item.id) { {{ item }} } @@ -1511,7 +1483,7 @@ describe('R3 template transform', () => { ['BoundText', ' {{ item }} '], ]); - expectLoop(` + expectFromHtml(` @for (( ( (item of items.foo.bar()) ) ); track item.id) { {{ item }} } @@ -1523,7 +1495,7 @@ describe('R3 template transform', () => { }); it('should parse a for loop block with let parameters', () => { - expectLoop(` + expectFromHtml(` @for (item of items.foo.bar; track item.id; let idx = $index, f = $first, c = $count; let l = $last, ev = $even, od = $odd) { {{ item }} } @@ -1541,7 +1513,7 @@ describe('R3 template transform', () => { }); it('should parse nested for loop blocks', () => { - expectLoop(` + expectFromHtml(` @for (item of items.foo.bar; track item.id) { {{ item }} @@ -1566,7 +1538,7 @@ describe('R3 template transform', () => { }); it('should parse a for loop block with a function call in the `track` expression', () => { - expectLoop(` + expectFromHtml(` @for (item of items.foo.bar; track trackBy(item.id, 123)) { {{ item }} } @@ -1579,29 +1551,30 @@ describe('R3 template transform', () => { describe('validations', () => { it('should report if for loop does not have an expression', () => { - expectLoopError(`@for {hello}`).toThrowError(/@for loop does not have an expression/); + expect(() => parse(`@for {hello}`)).toThrowError(/@for loop does not have an expression/); }); it('should report if for loop does not have a tracking expression', () => { - expectLoopError(`@for (a of b) {hello}`) + expect(() => parse(`@for (a of b) {hello}`)) .toThrowError(/@for loop must have a "track" expression/); }); it('should report mismatching optional parentheses around for loop expression', () => { - expectLoopError(`@for ((a of b; track c) {hello}`) + expect(() => parse(`@for ((a of b; track c) {hello}`)) .toThrowError(/Unclosed parentheses in expression/); - expectLoopError(`@for ((a of b(); track c) {hello}`) + expect(() => parse(`@for ((a of b(); track c) {hello}`)) .toThrowError(/Unexpected end of expression: b\(/); - expectLoopError(`@for (a of b); track c) {hello}`).toThrowError(/Unexpected character ";"/); + expect(() => parse(`@for (a of b); track c) {hello}`)) + .toThrowError(/Unexpected character ";"/); }); it('should report unrecognized for loop parameters', () => { - expectLoopError(`@for (a of b; foo bar) {hello}`) + expect(() => parse(`@for (a of b; foo bar) {hello}`)) .toThrowError(/Unrecognized @for loop paramater "foo bar"/); }); it('should report multiple `track` parameters', () => { - expectLoopError(`@for (a of b; track c; track d) {hello}`) + expect(() => parse(`@for (a of b; track c; track d) {hello}`)) .toThrowError(/@for loop can only have one "track" expression/); }); @@ -1609,18 +1582,19 @@ describe('R3 template transform', () => { const errorPattern = /Cannot parse expression\. @for loop expression must match the pattern " of "/; - expectLoopError(`@for (//invalid of items) {hello}`).toThrowError(errorPattern); - expectLoopError(`@for (item) {hello}`).toThrowError(errorPattern); - expectLoopError(`@for (item in items) {hello}`).toThrowError(errorPattern); - expectLoopError(`@for (item of ) {hello}`).toThrowError(errorPattern); + expect(() => parse(`@for (//invalid of items) {hello}`)).toThrowError(errorPattern); + expect(() => parse(`@for (item) {hello}`)).toThrowError(errorPattern); + expect(() => parse(`@for (item in items) {hello}`)).toThrowError(errorPattern); + expect(() => parse(`@for (item of ) {hello}`)).toThrowError(errorPattern); }); it('should report syntax error in for loop expression', () => { - expectLoopError(`@for (item of items..foo) {hello}`).toThrowError(/Unexpected token \./); + expect(() => parse(`@for (item of items..foo) {hello}`)) + .toThrowError(/Unexpected token \./); }); it('should report for loop with multiple `empty` blocks', () => { - expectLoopError(` + expect(() => parse(` @for (a of b; track a) { Main } @empty { @@ -1628,71 +1602,63 @@ describe('R3 template transform', () => { } @empty { Empty two } - `).toThrowError(/@for loop can only have one @empty block/); + `)).toThrowError(/@for loop can only have one @empty block/); }); it('should report empty block with parameters', () => { - expectLoopError(` + expect(() => parse(` @for (a of b; track a) { main } @empty (foo) { empty } - `).toThrowError(/@empty block cannot have parameters/); + `)).toThrowError(/@empty block cannot have parameters/); }); it('should content between @for and @empty blocks', () => { - expectLoopError(` + expect(() => parse(` @for (a of b; track a) { main }
@empty { empty } - `).toThrowError(/@empty block can only be used after an @for block/); + `)).toThrowError(/@empty block can only be used after an @for block/); }); it('should report an empty block used without a @for loop block', () => { - expectLoopError(`@empty {hello}`) + expect(() => parse(`@empty {hello}`)) .toThrowError(/@empty block can only be used after an @for block/); }); it('should report an empty `let` parameter', () => { - expectLoopError(`@for (item of items.foo.bar; track item.id; let ) {}`) + expect(() => parse(`@for (item of items.foo.bar; track item.id; let ) {}`)) .toThrowError( /Invalid @for loop "let" parameter. Parameter should match the pattern " = "/); }); it('should report an invalid `let` parameter', () => { - expectLoopError(`@for (item of items.foo.bar; track item.id; let i = $index, $odd) {}`) + expect(() => parse(`@for (item of items.foo.bar; track item.id; let i = $index, $odd) {}`)) .toThrowError( /Invalid @for loop "let" parameter\. Parameter should match the pattern " = "/); }); it('should an unknown variable in a `let` parameter', () => { - expectLoopError(`@for (item of items.foo.bar; track item.id; let foo = $foo) {}`) + expect(() => parse(`@for (item of items.foo.bar; track item.id; let foo = $foo) {}`)) .toThrowError(/Unknown "let" parameter variable "\$foo"\. The allowed variables are:/); }); it('should report duplicate `let` parameter variables', () => { - expectLoopError( - `@for (item of items.foo.bar; track item.id; let i = $index, f = $first, in = $index) {}`) + expect( + () => parse( + `@for (item of items.foo.bar; track item.id; let i = $index, f = $first, in = $index) {}`)) .toThrowError(/Duplicate "let" parameter variable "\$index"/); }); }); }); describe('if blocks', () => { - // TODO(crisbeto): temporary utility while control flow is disabled by default. - function expectIf(html: string) { - return expectFromR3Nodes(parse(html, {enabledBlockTypes: ['if']}).nodes); - } - - function expectIfError(html: string) { - return expect(() => parse(html, {enabledBlockTypes: ['if']})); - } - it('should parse an if block', () => { - expectIf(` + expectFromHtml(` @if (cond.expr; as foo) { Main case was true! } @else if (other.expr) { @@ -1713,7 +1679,7 @@ describe('R3 template transform', () => { }); it('should parse an if block with optional parentheses', () => { - expectIf(` + expectFromHtml(` @if ((cond.expr)) { Main case was true! } @else if ((other.expr)) { @@ -1733,7 +1699,7 @@ describe('R3 template transform', () => { }); it('should parse nested if blocks', () => { - expectIf(` + expectFromHtml(` @if (a) { @if (a1) { a1 @@ -1774,7 +1740,7 @@ describe('R3 template transform', () => { }); it('should parse an else if block with multiple spaces', () => { - expectIf(` + expectFromHtml(` @if (cond.expr; as foo) { Main case was true! } @else if (other.expr) { @@ -1791,7 +1757,7 @@ describe('R3 template transform', () => { }); it('should parse an else if block with a tab between `else` and `if`', () => { - expectIf(` + expectFromHtml(` @if (cond.expr; as foo) { Main case was true! } @else\tif (other.expr) { @@ -1809,77 +1775,77 @@ describe('R3 template transform', () => { describe('validations', () => { it('should report an if block without a condition', () => { - expectIfError(` + expect(() => parse(` @if {hello} - `).toThrowError(/Conditional block does not have an expression/); + `)).toThrowError(/Conditional block does not have an expression/); }); it('should report an unknown parameter in an if block', () => { - expectIfError(` + expect(() => parse(` @if (foo; bar) {hello} - `).toThrowError(/Unrecognized conditional paramater "bar"/); + `)).toThrowError(/Unrecognized conditional paramater "bar"/); }); it('should report an unknown parameter in an else if block', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else if (bar; baz) {goodbye} - `).toThrowError(/Unrecognized conditional paramater "baz"/); + `)).toThrowError(/Unrecognized conditional paramater "baz"/); }); it('should report an if block that has multiple `as` expressions', () => { - expectIfError(` + expect(() => parse(` @if (foo; as foo; as bar) {hello} - `).toThrowError(/Conditional can only have one "as" expression/); + `)).toThrowError(/Conditional can only have one "as" expression/); }); it('should report an else if block with a newline in the name', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else\nif (bar) {goodbye} - `).toThrowError(/Unrecognized block @else\nif/); + `)).toThrowError(/Unrecognized block @else\nif/); }); it('should report an else if block that has an `as` expression', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else if (bar; as alias) {goodbye} - `).toThrowError(/"as" expression is only allowed on the primary @if block/); + `)).toThrowError(/"as" expression is only allowed on the primary @if block/); }); it('should report an @else if block used without an @if block', () => { - expectIfError(`@else if (foo) {hello}`) + expect(() => parse(`@else if (foo) {hello}`)) .toThrowError(/@else if block can only be used after an @if or @else if block/); }); it('should report an @else block used without an @if block', () => { - expectIfError(`@else (foo) {hello}`) + expect(() => parse(`@else (foo) {hello}`)) .toThrowError(/@else block can only be used after an @if or @else if block/); }); it('should report content between an @if and @else if block', () => { - expectIfError(`@if (foo) {hello}
@else if (bar) {goodbye}`) + expect(() => parse(`@if (foo) {hello}
@else if (bar) {goodbye}`)) .toThrowError(/@else if block can only be used after an @if or @else if block/); }); it('should report content between an @if and @else block', () => { - expectIfError(`@if (foo) {hello}
@else {goodbye}`) + expect(() => parse(`@if (foo) {hello}
@else {goodbye}`)) .toThrowError(/@else block can only be used after an @if or @else if block/); }); it('should report an else block with parameters', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else (bar) {goodbye} - `).toThrowError(/@else block cannot have parameters/); + `)).toThrowError(/@else block cannot have parameters/); }); it('should report a conditional with multiple else blocks', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else {goodbye} @else {goodbye again} - `).toThrowError(/Conditional can only have one @else block/); + `)).toThrowError(/Conditional can only have one @else block/); }); it('should report an else if block after an else block', () => { - expectIfError(` + expect(() => parse(` @if (foo) {hello} @else {goodbye} @else (if bar) {goodbye again} - `).toThrowError(/@else block must be last inside the conditional/); + `)).toThrowError(/@else block must be last inside the conditional/); }); }); }); diff --git a/packages/compiler/test/render3/view/binding_spec.ts b/packages/compiler/test/render3/view/binding_spec.ts index 406fddb300e45f..425e9f939ce711 100644 --- a/packages/compiler/test/render3/view/binding_spec.ts +++ b/packages/compiler/test/render3/view/binding_spec.ts @@ -259,8 +259,6 @@ describe('t2 binding', () => { }); describe('extracting defer blocks info', () => { - const templateOptions = {enabledBlockTypes: new Set(['defer'])}; - it('should extract top-level defer blocks', () => { const template = parseTemplate( ` @@ -268,7 +266,7 @@ describe('t2 binding', () => { @defer {} `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const deferBlocks = bound.getDeferBlocks(); @@ -301,7 +299,7 @@ describe('t2 binding', () => { } {{ name | pipeF }} `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const deferBlocks = bound.getDeferBlocks(); @@ -329,7 +327,7 @@ describe('t2 binding', () => { {{ name | pipeC }} } `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); @@ -363,7 +361,7 @@ describe('t2 binding', () => { } `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const deferBlocks = bound.getDeferBlocks(); @@ -395,7 +393,7 @@ describe('t2 binding', () => { } `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const allDirs = bound.getUsedDirectives().map(dir => dir.name); @@ -412,7 +410,7 @@ describe('t2 binding', () => { @defer (on viewport(trigger)) {}
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -433,7 +431,7 @@ describe('t2 binding', () => {
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -454,7 +452,7 @@ describe('t2 binding', () => {
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -471,7 +469,7 @@ describe('t2 binding', () => { } `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -484,7 +482,7 @@ describe('t2 binding', () => { ` @defer (on viewport(trigger)) {} `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -499,7 +497,7 @@ describe('t2 binding', () => { `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -514,7 +512,7 @@ describe('t2 binding', () => { `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -529,7 +527,7 @@ describe('t2 binding', () => { @defer (on viewport) {} @placeholder {}
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -544,7 +542,7 @@ describe('t2 binding', () => { @defer (on viewport) {} @placeholder {
}
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -560,7 +558,7 @@ describe('t2 binding', () => {
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -576,7 +574,7 @@ describe('t2 binding', () => { @defer (on viewport) {} @placeholder {hello}
`, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -593,7 +591,7 @@ describe('t2 binding', () => { @defer (on viewport(trigger)) {} `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -610,7 +608,7 @@ describe('t2 binding', () => {
} `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -630,7 +628,7 @@ describe('t2 binding', () => { } } `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; @@ -645,7 +643,7 @@ describe('t2 binding', () => { `, - '', templateOptions); + ''); const binder = new R3TargetBinder(makeSelectorMatcher()); const bound = binder.bind({template: template.nodes}); const block = Array.from(bound.getDeferBlocks())[0]; diff --git a/packages/compiler/test/render3/view/util.ts b/packages/compiler/test/render3/view/util.ts index 0900b56f90e265..1de9ea2e03f566 100644 --- a/packages/compiler/test/render3/view/util.ts +++ b/packages/compiler/test/render3/view/util.ts @@ -145,14 +145,11 @@ export function parseR3(input: string, options: { preserveWhitespaces?: boolean, leadingTriviaChars?: string[], ignoreError?: boolean, - enabledBlockTypes?: string[], } = {}): Render3ParseResult { const htmlParser = new HtmlParser(); - const enabledBlockTypes = new Set(options.enabledBlockTypes ?? []); const parseResult = htmlParser.parse(input, 'path:://to/template', { tokenizeExpansionForms: true, leadingTriviaChars: options.leadingTriviaChars ?? LEADING_TRIVIA_CHARS, - tokenizeBlocks: enabledBlockTypes.size > 0, }); if (parseResult.errors.length > 0 && !options.ignoreError) { @@ -172,8 +169,7 @@ export function parseR3(input: string, options: { ['onEvent'], ['onEvent']); const bindingParser = new BindingParser(expressionParser, DEFAULT_INTERPOLATION_CONFIG, schemaRegistry, []); - const r3Result = htmlAstToRender3Ast( - htmlNodes, bindingParser, {collectCommentNodes: false, enabledBlockTypes}); + const r3Result = htmlAstToRender3Ast(htmlNodes, bindingParser, {collectCommentNodes: false}); if (r3Result.errors.length > 0 && !options.ignoreError) { const msg = r3Result.errors.map(e => e.toString()).join('\n'); diff --git a/packages/core/test/acceptance/control_flow_exploration_spec.ts b/packages/core/test/acceptance/control_flow_exploration_spec.ts index de26488b62d266..053ede76e7a58b 100644 --- a/packages/core/test/acceptance/control_flow_exploration_spec.ts +++ b/packages/core/test/acceptance/control_flow_exploration_spec.ts @@ -7,7 +7,6 @@ */ -import {ɵsetEnabledBlockTypes as setEnabledBlockTypes} from '@angular/compiler/src/jit_compiler_facade'; import {Component, Pipe, PipeTransform} from '@angular/core'; import {TestBed} from '@angular/core/testing'; @@ -21,9 +20,6 @@ describe('control flow', () => { } describe('if', () => { - beforeEach(() => setEnabledBlockTypes(['if'])); - afterEach(() => setEnabledBlockTypes([])); - it('should add and remove views based on conditions change', () => { @Component({standalone: true, template: '@if (show) {Something} @else {Nothing}'}) class TestComponent { @@ -244,9 +240,6 @@ describe('control flow', () => { }); describe('switch', () => { - beforeEach(() => setEnabledBlockTypes(['switch'])); - afterEach(() => setEnabledBlockTypes([])); - // Open question: == vs. === for comparison // == is the current Angular implementation // === is used by JavaScript semantics @@ -341,9 +334,6 @@ describe('control flow', () => { }); describe('for', () => { - beforeEach(() => setEnabledBlockTypes(['for', 'if'])); - afterEach(() => setEnabledBlockTypes([])); - it('should create, remove and move views corresponding to items in a collection', () => { @Component({ template: '@for ((item of items); track item; let idx = $index) {{{item}}({{idx}})|}', diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index 482d13295769fb..7c2265d7ea3a4f 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -7,7 +7,6 @@ */ import {ɵPLATFORM_BROWSER_ID as PLATFORM_BROWSER_ID} from '@angular/common'; -import {ɵsetEnabledBlockTypes as setEnabledBlockTypes} from '@angular/compiler/src/jit_compiler_facade'; import {Component, Input, NgZone, PLATFORM_ID, QueryList, Type, ViewChildren, ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR} from '@angular/core'; import {getComponentDef} from '@angular/core/src/render3/definition'; import {DeferBlockBehavior, fakeAsync, flush, TestBed} from '@angular/core/testing'; @@ -62,9 +61,6 @@ function allPendingDynamicImports() { const COMMON_PROVIDERS = [{provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}]; describe('@defer', () => { - beforeEach(() => setEnabledBlockTypes(['defer', 'for', 'if'])); - afterEach(() => setEnabledBlockTypes([])); - beforeEach(() => { TestBed.configureTestingModule( {providers: COMMON_PROVIDERS, deferBlockBehavior: DeferBlockBehavior.Playthrough}); diff --git a/packages/core/test/component_fixture_spec.ts b/packages/core/test/component_fixture_spec.ts index 17a0db732429ee..834cc07c949554 100644 --- a/packages/core/test/component_fixture_spec.ts +++ b/packages/core/test/component_fixture_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {ɵsetEnabledBlockTypes as setEnabledBlockTypes} from '@angular/compiler/src/jit_compiler_facade'; import {Component, Injectable, Input} from '@angular/core'; import {ComponentFixtureAutoDetect, ComponentFixtureNoNgZone, TestBed, waitForAsync, withModule} from '@angular/core/testing'; import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'; @@ -117,9 +116,6 @@ class NestedAsyncTimeoutComp { { describe('ComponentFixture', () => { - beforeEach(() => setEnabledBlockTypes(['defer'])); - afterEach(() => setEnabledBlockTypes([])); - beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [ diff --git a/packages/core/test/defer_fixture_spec.ts b/packages/core/test/defer_fixture_spec.ts index 323d3e33d9ab4f..ae29750d196b32 100644 --- a/packages/core/test/defer_fixture_spec.ts +++ b/packages/core/test/defer_fixture_spec.ts @@ -7,7 +7,6 @@ */ import {ɵPLATFORM_BROWSER_ID as PLATFORM_BROWSER_ID} from '@angular/common'; -import {ɵsetEnabledBlockTypes as setEnabledBlockTypes} from '@angular/compiler/src/jit_compiler_facade'; import {Component, PLATFORM_ID} from '@angular/core'; import {DeferBlockBehavior, DeferBlockState, TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; @@ -24,9 +23,6 @@ const COMMON_PROVIDERS = [{provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}] describe('DeferFixture', () => { - beforeEach(() => setEnabledBlockTypes(['defer'])); - afterEach(() => setEnabledBlockTypes([])); - it('should start in manual behavior mode', async () => { @Component({ selector: 'defer-comp', diff --git a/packages/platform-server/test/hydration_spec.ts b/packages/platform-server/test/hydration_spec.ts index 81752a04a3a6e6..1a9605d647191c 100644 --- a/packages/platform-server/test/hydration_spec.ts +++ b/packages/platform-server/test/hydration_spec.ts @@ -10,7 +10,6 @@ import '@angular/localize/init'; import {CommonModule, DOCUMENT, isPlatformServer, NgComponentOutlet, NgFor, NgIf, NgTemplateOutlet, PlatformLocation} from '@angular/common'; import {MockPlatformLocation} from '@angular/common/testing'; -import {ɵsetEnabledBlockTypes as setEnabledBlockTypes} from '@angular/compiler/src/jit_compiler_facade'; import {afterRender, ApplicationRef, Component, ComponentRef, createComponent, destroyPlatform, Directive, ElementRef, EnvironmentInjector, ErrorHandler, getPlatform, inject, Injectable, Input, NgZone, PLATFORM_ID, Provider, TemplateRef, Type, ViewChild, ViewContainerRef, ViewEncapsulation, ɵsetDocument, ɵwhenStable as whenStable} from '@angular/core'; import {Console} from '@angular/core/src/console'; import {SSR_CONTENT_INTEGRITY_MARKER} from '@angular/core/src/hydration/utils'; @@ -227,12 +226,6 @@ function withDebugConsole() { } describe('platform-server hydration integration', () => { - // Keep those `beforeEach` and `afterEach` blocks separate, - // since we'll need to remove them once new control flow - // syntax is enabled by default. - beforeEach(() => setEnabledBlockTypes(['defer', 'if', 'for', 'switch'])); - afterEach(() => setEnabledBlockTypes([])); - beforeEach(() => { if (typeof ngDevMode === 'object') { // Reset all ngDevMode counters. From 7e0ed9e7b810f501466ae0faf238b242605c18ad Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Fri, 29 Sep 2023 16:19:27 -0700 Subject: [PATCH 06/57] refactor(compiler): Eliminate collision between `UsesSlotIndexTrait` and `ConsumesSlotOpTrait` (#51942) Ops with `ConsumesSlotOpTrait` have a self-xref, and are assigned a corresponding `slot`. Ops with `UsesSlotIndexTrait` have a `target`-xref, and are assigned the `slot` of that `target`. In both cases, the field name `slot` is used, but it means different things. Therefore, any op which both consumes and uses a slot will have a collision of two different meanings on its `slot` field. This commit renames `slot` to `slotTarget` in the `UsesSlotIndexTrait`, to eliminate this collision. PR Close #51942 --- .../template/pipeline/ir/src/expression.ts | 23 +++++++++++-------- .../template/pipeline/ir/src/ops/create.ts | 1 - .../template/pipeline/ir/src/ops/update.ts | 7 +----- .../src/template/pipeline/ir/src/traits.ts | 4 ++-- .../template/pipeline/src/phases/naming.ts | 4 ++-- .../src/template/pipeline/src/phases/reify.ts | 14 +++++------ .../pipeline/src/phases/slot_allocation.ts | 8 +++---- 7 files changed, 29 insertions(+), 32 deletions(-) diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index ce62e810375b3d..cbbd9a886d0ec4 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -92,7 +92,7 @@ export class ReferenceExpr extends ExpressionBase implements UsesSlotIndexTrait readonly[UsesSlotIndex] = true; - slot: number|null = null; + targetSlot: number|null = null; constructor(readonly target: XrefId, readonly offset: number) { super(); @@ -112,7 +112,7 @@ export class ReferenceExpr extends ExpressionBase implements UsesSlotIndexTrait override clone(): ReferenceExpr { const expr = new ReferenceExpr(this.target, this.offset); - expr.slot = this.slot; + expr.targetSlot = this.targetSlot; return expr; } } @@ -420,7 +420,7 @@ export class PipeBindingExpr extends ExpressionBase implements UsesSlotIndexTrai readonly[ConsumesVarsTrait] = true; readonly[UsesVarOffset] = true; - slot: number|null = null; + targetSlot: number|null = null; varOffset: number|null = null; constructor(readonly target: XrefId, readonly name: string, readonly args: o.Expression[]) { @@ -450,7 +450,7 @@ export class PipeBindingExpr extends ExpressionBase implements UsesSlotIndexTrai override clone() { const r = new PipeBindingExpr(this.target, this.name, this.args.map(a => a.clone())); - r.slot = this.slot; + r.targetSlot = this.targetSlot; r.varOffset = this.varOffset; return r; } @@ -464,7 +464,7 @@ export class PipeBindingVariadicExpr extends ExpressionBase implements UsesSlotI readonly[ConsumesVarsTrait] = true; readonly[UsesVarOffset] = true; - slot: number|null = null; + targetSlot: number|null = null; varOffset: number|null = null; constructor( @@ -492,7 +492,7 @@ export class PipeBindingVariadicExpr extends ExpressionBase implements UsesSlotI override clone(): PipeBindingVariadicExpr { const r = new PipeBindingVariadicExpr(this.target, this.name, this.args.clone(), this.numArgs); - r.slot = this.slot; + r.targetSlot = this.targetSlot; r.varOffset = this.varOffset; return r; } @@ -736,7 +736,7 @@ export class SanitizerExpr extends ExpressionBase { override transformInternalExpressions(): void {} } -export class SlotLiteralExpr extends ExpressionBase { +export class SlotLiteralExpr extends ExpressionBase implements UsesSlotIndexTrait { override readonly kind = ExpressionKind.SlotLiteralExpr; readonly[UsesSlotIndex] = true; @@ -744,12 +744,13 @@ export class SlotLiteralExpr extends ExpressionBase { super(); } - slot: number|null = null; + targetSlot: number|null = null; override visitExpression(visitor: o.ExpressionVisitor, context: any): any {} override isEquivalent(e: Expression): boolean { - return e instanceof SlotLiteralExpr && e.target === this.target && e.slot === this.slot; + return e instanceof SlotLiteralExpr && e.target === this.target && + e.targetSlot === this.targetSlot; } override isConstant() { @@ -757,7 +758,9 @@ export class SlotLiteralExpr extends ExpressionBase { } override clone(): SlotLiteralExpr { - return new SlotLiteralExpr(this.target); + const copy = new SlotLiteralExpr(this.target); + copy.targetSlot = this.targetSlot; + return copy; } override transformInternalExpressions(): void {} diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts index 64feb3891e9b0a..4ca4a3938bdbb4 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts @@ -499,7 +499,6 @@ export function createProjectionOp(xref: XrefId, selector: string): ProjectionOp sourceSpan: null!, // TODO ...NEW_OP, ...TRAIT_CONSUMES_SLOT, - ...TRAIT_USES_SLOT_INDEX, }; } diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts index 7813654c878106..475b4bc9159462 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts @@ -486,7 +486,7 @@ export interface ConditionalOp extends Op, DependsOnSlotContextOp /** * The slot of the target, to be populated during slot allocation. */ - slot: number|null; + targetSlot: number|null; /** * The main test expression (for a switch), or `null` (for an if, which has no test expression). @@ -589,11 +589,6 @@ export interface I18nApplyOp extends Op, UsesSlotIndexTrait { */ target: XrefId; - /** - * The slot of the target, to be populated during slot allocation. - */ - slot: number|null; - sourceSpan: ParseSourceSpan; } diff --git a/packages/compiler/src/template/pipeline/ir/src/traits.ts b/packages/compiler/src/template/pipeline/ir/src/traits.ts index 8a0d1703ac1492..e747bbe80c554f 100644 --- a/packages/compiler/src/template/pipeline/ir/src/traits.ts +++ b/packages/compiler/src/template/pipeline/ir/src/traits.ts @@ -103,7 +103,7 @@ export interface UsesSlotIndexTrait { /** * The slot index of `target`, or `null` if slots have not yet been assigned. */ - slot: number|null; + targetSlot: number|null; } /** @@ -138,7 +138,7 @@ export const TRAIT_CONSUMES_SLOT: Omit = { */ export const TRAIT_USES_SLOT_INDEX: Omit = { [UsesSlotIndex]: true, - slot: null, + targetSlot: null, } as const; /** diff --git a/packages/compiler/src/template/pipeline/src/phases/naming.ts b/packages/compiler/src/template/pipeline/src/phases/naming.ts index e86f5b2b5c3bf0..7e722a7bdc4900 100644 --- a/packages/compiler/src/template/pipeline/src/phases/naming.ts +++ b/packages/compiler/src/template/pipeline/src/phases/naming.ts @@ -46,7 +46,7 @@ function addNamesToView( if (op.handlerFnName !== null) { break; } - if (!op.hostListener && op.slot === null) { + if (!op.hostListener && op.targetSlot === null) { throw new Error(`Expected a slot to be assigned`); } let animation = ''; @@ -58,7 +58,7 @@ function addNamesToView( op.handlerFnName = `${baseName}_${animation}${op.name}_HostBindingHandler`; } else { op.handlerFnName = `${unit.fnName}_${op.tag!.replace('-', '_')}_${animation}${op.name}_${ - op.slot}_listener`; + op.targetSlot}_listener`; } op.handlerFnName = sanitizeIdentifier(op.handlerFnName); break; diff --git a/packages/compiler/src/template/pipeline/src/phases/reify.ts b/packages/compiler/src/template/pipeline/src/phases/reify.ts index 40f1ff6c45e4fc..5b428221b61a02 100644 --- a/packages/compiler/src/template/pipeline/src/phases/reify.ts +++ b/packages/compiler/src/template/pipeline/src/phases/reify.ts @@ -217,7 +217,7 @@ function reifyUpdateOperations(_unit: CompilationUnit, ops: ir.OpList Date: Fri, 29 Sep 2023 17:17:08 -0700 Subject: [PATCH 07/57] refactor(compiler): Create a `HasConst` trait for collection into the const array (#51942) Previously, we had many individual constants collected at different places in the template pipeline, using `job.addConst(...)`. Now, this trait can be used to cause any op or expression to receive const collection. PR Close #51942 --- .../src/template/pipeline/ir/src/traits.ts | 49 +++++++++++++++++++ .../src/template/pipeline/src/emit.ts | 2 + .../src/phases/has_const_trait_collection.ts | 38 ++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts diff --git a/packages/compiler/src/template/pipeline/ir/src/traits.ts b/packages/compiler/src/template/pipeline/ir/src/traits.ts index e747bbe80c554f..7251cb9dadee45 100644 --- a/packages/compiler/src/template/pipeline/ir/src/traits.ts +++ b/packages/compiler/src/template/pipeline/ir/src/traits.ts @@ -9,6 +9,7 @@ import type {ParseSourceSpan} from '../../../../parse_util'; import type {Op, XrefId} from './operations'; import type {Expression} from './expression'; +import * as o from '../../../../output/output_ast'; /** * Marker symbol for `ConsumesSlotOpTrait`. @@ -35,6 +36,11 @@ export const ConsumesVarsTrait = Symbol('ConsumesVars'); */ export const UsesVarOffset = Symbol('UsesVarOffset'); +/** + * Marker symbol for `HasConst` trait. + */ +export const HasConst = Symbol('HasConst'); + /** * Marks an operation as requiring allocation of one or more data slots for storage. */ @@ -122,6 +128,31 @@ export interface UsesVarOffsetTrait { varOffset: number|null; } + +/** + * Marker trait indicating that an op or expression has some data which should be collected into the + * component constant array. + * + */ +export interface HasConstTrait { + [HasConst]: true; + + /** + * The constant to be collected into the const array, if non-null. + */ + constValue: unknown|null; + + /** + * The index of the collected constant, after processing. + */ + constIndex: number|null; + + /** + * A callback which converts the constValue into an o.Expression for the const array. + */ + makeExpression: (value: unknown) => o.Expression; +} + /** * Default values for most `ConsumesSlotOpTrait` fields (used with the spread operator to initialize * implementors of the trait). @@ -167,6 +198,15 @@ export const TRAIT_USES_VAR_OFFSET: UsesVarOffsetTrait = { varOffset: null, } as const; +/** + * Default values for `HasConst` fields (used with the spread operator to initialize + * implementors of this trait). + */ +export const TRAIT_HAS_CONST: Omit = { + [HasConst]: true, + constIndex: null, +} as const; + /** * Test whether an operation implements `ConsumesSlotOpTrait`. */ @@ -209,3 +249,12 @@ export function hasUsesSlotIndexTrait>(op: OpT): op is OpT&U export function hasUsesSlotIndexTrait(value: any): boolean { return (value as Partial)[UsesSlotIndex] === true; } + +/** + * Test whether an operation or expression implements `HasConstTrait`. + */ +export function hasConstTrait(expr: ExprT): expr is ExprT&HasConstTrait; +export function hasConstTrait>(op: OpT): op is OpT&HasConstTrait; +export function hasConstTrait(value: any): boolean { + return (value as Partial)[HasConst] === true; +} diff --git a/packages/compiler/src/template/pipeline/src/emit.ts b/packages/compiler/src/template/pipeline/src/emit.ts index 39b4817d4e9bab..51beec7f3685b2 100644 --- a/packages/compiler/src/template/pipeline/src/emit.ts +++ b/packages/compiler/src/template/pipeline/src/emit.ts @@ -25,6 +25,7 @@ import {phaseExpandSafeReads} from './phases/expand_safe_reads'; import {phaseGenerateAdvance} from './phases/generate_advance'; import {phaseGenerateProjectionDef} from './phases/generate_projection_def'; import {phaseGenerateVariables} from './phases/generate_variables'; +import {phaseConstTraitCollection} from './phases/has_const_trait_collection'; import {phaseHostStylePropertyParsing} from './phases/host_style_property_parsing'; import {phaseI18nConstCollection} from './phases/i18n_const_collection'; import {phaseI18nMessageExtraction} from './phases/i18n_message_extraction'; @@ -101,6 +102,7 @@ const phases: Phase[] = [ {kind: Kind.Tmpl, fn: phaseResolveI18nPlaceholders}, {kind: Kind.Tmpl, fn: phaseI18nMessageExtraction}, {kind: Kind.Tmpl, fn: phaseI18nConstCollection}, + {kind: Kind.Tmpl, fn: phaseConstTraitCollection}, {kind: Kind.Both, fn: phaseConstCollection}, {kind: Kind.Both, fn: phaseVarCounting}, {kind: Kind.Tmpl, fn: phaseGenerateAdvance}, diff --git a/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts b/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts new file mode 100644 index 00000000000000..2f07619afd8cc3 --- /dev/null +++ b/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts @@ -0,0 +1,38 @@ +/** + * @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 + */ + +import * as o from '../../../../output/output_ast'; +import * as ir from '../../ir'; +import type {ComponentCompilationJob} from '../compilation'; + +/** + * Looks for the HasConst trait, indicating that an op or expression has some data which + * should be collected into the constant array. Capable of collecting either a single literal value, + * or an array literal. + */ +export function phaseConstTraitCollection(job: ComponentCompilationJob): void { + const collectGlobalConsts = (e: o.Expression): o.Expression => { + if (e instanceof ir.ExpressionBase && ir.hasConstTrait(e as ir.Expression)) { + // TODO: Figure out how to make this type narrowing work. + const ea = e as any; + if (ea.constValue !== null) { + ea.constIndex = job.addConst(ea.constValue); + } + } + return e; + }; + + for (const unit of job.units) { + for (const op of unit.ops()) { + if (ir.hasConstTrait(op) && op.constValue !== null) { + op.constIndex = job.addConst(op.makeExpression(op.constValue)); + } + ir.transformExpressionsInOp(op, collectGlobalConsts, ir.VisitorContextFlag.None); + } + } +} From 07602eb2987db6a0296eeab0b1473fce4996403b Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Fri, 29 Sep 2023 16:24:24 -0700 Subject: [PATCH 08/57] refactor(compiler): Implement basic support for defer in Template Pipeline (#51942) The template pipeline now supports basic forms of `defer` blocks. This includes the `loading`, `placeholder`, and `error` blocks, as well as the loading and placeholder configuration options. Lazy dependencies and prefetch are not yet implemented. PR Close #51942 --- .../r3_view_compiler_deferred/TEST_CASES.json | 74 ++++++++-- .../src/template/pipeline/ir/src/enums.ts | 24 ++++ .../template/pipeline/ir/src/expression.ts | 3 + .../template/pipeline/ir/src/ops/create.ts | 130 ++++++++++++++++-- .../src/template/pipeline/src/conversion.ts | 4 +- .../src/template/pipeline/src/ingest.ts | 71 +++++++++- .../src/template/pipeline/src/instruction.ts | 26 ++++ .../src/phases/has_const_trait_collection.ts | 4 +- .../src/template/pipeline/src/phases/reify.ts | 16 ++- .../core/src/render3/instructions/defer.ts | 2 +- 10 files changed, 322 insertions(+), 32 deletions(-) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json index 65daeed2df2fbc..fb3b465309366b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_deferred/TEST_CASES.json @@ -3,6 +3,11 @@ "cases": [ { "description": "should generate a basic deferred block", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "basic_deferred.ts" ], @@ -16,11 +21,15 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a deferred block with secondary blocks", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_secondary_blocks.ts" ], @@ -34,11 +43,15 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a deferred block with placeholder block parameters", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_placeholder_params.ts" ], @@ -52,11 +65,15 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a deferred block with loading block parameters", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_loading_params.ts" ], @@ -70,11 +87,15 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should generate a deferred block with local dependencies", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_local_deps.ts" ], @@ -93,6 +114,11 @@ }, { "description": "should generate a deferred block with external dependencies", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_external_deps.ts", "deferred_with_external_deps_eager.ts", @@ -114,6 +140,11 @@ }, { "description": "should generate a deferred block with triggers", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_triggers.ts" ], @@ -132,6 +163,11 @@ }, { "description": "should generate a deferred block with prefetch triggers", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_with_prefetch_triggers.ts" ], @@ -150,6 +186,11 @@ }, { "description": "should generate a deferred block with a `when` trigger that has a pipe", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_when_with_pipe.ts" ], @@ -168,6 +209,11 @@ }, { "description": "should generate a deferred block with an interaction trigger in the same view", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_interaction_same_view_trigger.ts" ], @@ -186,6 +232,11 @@ }, { "description": "should generate a deferred block with an interaction trigger in a parent view", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_interaction_parent_view_trigger.ts" ], @@ -204,6 +255,11 @@ }, { "description": "should generate a deferred block with an interaction trigger inside the placeholder", + "angularCompilerOptions": { + "_enabledBlockTypes": [ + "defer" + ] + }, "inputFiles": [ "deferred_interaction_placeholder_trigger.ts" ], @@ -239,4 +295,4 @@ "skipForTemplatePipeline": true } ] -} +} \ No newline at end of file diff --git a/packages/compiler/src/template/pipeline/ir/src/enums.ts b/packages/compiler/src/template/pipeline/ir/src/enums.ts index 6834dca25830f2..5d534ece9b9b81 100644 --- a/packages/compiler/src/template/pipeline/ir/src/enums.ts +++ b/packages/compiler/src/template/pipeline/ir/src/enums.ts @@ -145,6 +145,21 @@ export enum OpKind { */ ExtractedAttribute, + /** + * An operation that configures a `@defer` block. + */ + Defer, + + /** + * An IR operation that provides secondary templates of a `@defer` block. + */ + DeferSecondaryBlock, + + /** + * An operation that controls when a `@defer` loads. + */ + DeferOn, + /** * An i18n message that has been extracted for inclusion in the consts array. */ @@ -353,6 +368,15 @@ export enum SanitizerFn { IframeAttribute, } +/** + * Enumeration of the different kinds of `@defer` secondary blocks. + */ +export enum DeferSecondaryKind { + Loading, + Placeholder, + Error, +} + /** * Enumeration of the types of attributes which can be applied to an element. */ diff --git a/packages/compiler/src/template/pipeline/ir/src/expression.ts b/packages/compiler/src/template/pipeline/ir/src/expression.ts index cbbd9a886d0ec4..e60c7145c677ac 100644 --- a/packages/compiler/src/template/pipeline/ir/src/expression.ts +++ b/packages/compiler/src/template/pipeline/ir/src/expression.ts @@ -909,6 +909,9 @@ export function transformExpressionsInOp( op.params.set(placeholder, transformExpressionsInExpression(expression, transform, flags)); } break; + case OpKind.Defer: + case OpKind.DeferSecondaryBlock: + case OpKind.DeferOn: case OpKind.Projection: case OpKind.ProjectionDef: case OpKind.Element: diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts index 4ca4a3938bdbb4..30f3f508c7f8f2 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/create.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/create.ts @@ -9,9 +9,9 @@ import * as i18n from '../../../../../i18n/i18n_ast'; import * as o from '../../../../../output/output_ast'; import {ParseSourceSpan} from '../../../../../parse_util'; -import {BindingKind, OpKind} from '../enums'; +import {BindingKind, DeferSecondaryKind, OpKind} from '../enums'; import {Op, OpList, XrefId} from '../operations'; -import {ConsumesSlotOpTrait, TRAIT_CONSUMES_SLOT, TRAIT_USES_SLOT_INDEX, UsesSlotIndexTrait} from '../traits'; +import {ConsumesSlotOpTrait, HasConstTrait, TRAIT_CONSUMES_SLOT, TRAIT_HAS_CONST, TRAIT_USES_SLOT_INDEX, UsesSlotIndexTrait} from '../traits'; import {ListEndOp, NEW_OP, StatementOp, VariableOp} from './shared'; @@ -20,10 +20,11 @@ import type {UpdateOp} from './update'; /** * An operation usable on the creation side of the IR. */ -export type CreateOp = ListEndOp|StatementOp|ElementOp|ElementStartOp| - ElementEndOp|ContainerOp|ContainerStartOp|ContainerEndOp|TemplateOp|EnableBindingsOp| - DisableBindingsOp|TextOp|ListenerOp|PipeOp|VariableOp|NamespaceOp|ProjectionDefOp| - ProjectionOp|ExtractedAttributeOp|ExtractedMessageOp|I18nOp|I18nStartOp|I18nEndOp; +export type CreateOp = + ListEndOp|StatementOp|ElementOp|ElementStartOp|ElementEndOp|ContainerOp| + ContainerStartOp|ContainerEndOp|TemplateOp|EnableBindingsOp|DisableBindingsOp|TextOp|ListenerOp| + PipeOp|VariableOp|NamespaceOp|ProjectionDefOp|ProjectionOp|ExtractedAttributeOp| + DeferOp|DeferSecondaryBlockOp|DeferOnOp|ExtractedMessageOp|I18nOp|I18nStartOp|I18nEndOp; /** * An operation representing the creation of an element or container. @@ -178,24 +179,25 @@ export interface TemplateOp extends ElementOpBase { vars: number|null; /** - * Whether or not this template was automatically created for built-in control flow. - * TODO: Should control flow use a different op type, to avoid this flag? + * Whether or not this template was automatically created for use with block syntax (control flow + * or defer). This will eventually cause the emitted template instruction to use fewer arguments, + * since several of the default arguments are unnecessary for blocks. */ - controlFlow: boolean; + block: boolean; } /** * Create a `TemplateOp`. */ export function createTemplateOp( - xref: XrefId, tag: string, namespace: Namespace, controlFlow: boolean, - sourceSpan: ParseSourceSpan): TemplateOp { + xref: XrefId, tag: string, namespace: Namespace, generatedInBlock: boolean, + i18n: i18n.I18nMeta|undefined, sourceSpan: ParseSourceSpan): TemplateOp { return { kind: OpKind.Template, xref, attributes: null, tag, - controlFlow, + block: generatedInBlock, decls: null, vars: null, localRefs: [], @@ -545,6 +547,103 @@ export function createExtractedAttributeOp( }; } +export interface DeferOp extends Op, ConsumesSlotOpTrait, UsesSlotIndexTrait { + kind: OpKind.Defer; + + /** + * The xref of this defer op. + */ + xref: XrefId; + + /** + * The xref of the main view. This will be associated with `slot`. + */ + target: XrefId; + + /** + * Secondary loading block associated with this defer op. + */ + loading: DeferSecondaryBlockOp|null; + + /** + * Secondary placeholder block associated with this defer op. + */ + placeholder: DeferSecondaryBlockOp|null; + + /** + * Secondary error block associated with this defer op. + */ + error: DeferSecondaryBlockOp|null; + + sourceSpan: ParseSourceSpan; +} + +export function createDeferOp(xref: XrefId, main: XrefId, sourceSpan: ParseSourceSpan): DeferOp { + return { + kind: OpKind.Defer, + xref, + target: main, + loading: null, + placeholder: null, + error: null, + sourceSpan, + ...NEW_OP, + ...TRAIT_CONSUMES_SLOT, + ...TRAIT_USES_SLOT_INDEX, + }; +} + +export interface DeferSecondaryBlockOp extends Op, UsesSlotIndexTrait, HasConstTrait { + kind: OpKind.DeferSecondaryBlock; + + /** + * The xref of the corresponding defer op. + */ + deferOp: XrefId; + + /** + * Which kind of secondary block this op represents. + */ + secondaryBlockKind: DeferSecondaryKind; + + /** + * The xref of the secondary view. This will be associated with `slot`. + */ + target: XrefId; +} + +export function createDeferSecondaryOp( + deferOp: XrefId, secondaryView: XrefId, + secondaryBlockKind: DeferSecondaryKind): DeferSecondaryBlockOp { + return { + kind: OpKind.DeferSecondaryBlock, + deferOp, + target: secondaryView, + secondaryBlockKind, + constValue: null, + makeExpression: literalOrArrayLiteral, + ...NEW_OP, + ...TRAIT_USES_SLOT_INDEX, + ...TRAIT_HAS_CONST, + }; +} + +export interface DeferOnOp extends Op, ConsumesSlotOpTrait { + kind: OpKind.DeferOn; + + sourceSpan: ParseSourceSpan; +} + +export function createDeferOnOp(xref: XrefId, sourceSpan: ParseSourceSpan): DeferOnOp { + return { + kind: OpKind.DeferOn, + xref, + sourceSpan, + ...NEW_OP, + ...TRAIT_CONSUMES_SLOT, + }; +} + /** * Represents an i18n message that has been extracted for inclusion in the consts array. */ @@ -664,3 +763,10 @@ export function createI18nEndOp(xref: XrefId): I18nEndOp { * component. */ export type ConstIndex = number&{__brand: 'ConstIndex'}; + +export function literalOrArrayLiteral(value: any): o.Expression { + if (Array.isArray(value)) { + return o.literalArr(value.map(literalOrArrayLiteral)); + } + return o.literal(value, o.INFERRED_TYPE); +} diff --git a/packages/compiler/src/template/pipeline/src/conversion.ts b/packages/compiler/src/template/pipeline/src/conversion.ts index 731dd98475f5dd..6a595288f36550 100644 --- a/packages/compiler/src/template/pipeline/src/conversion.ts +++ b/packages/compiler/src/template/pipeline/src/conversion.ts @@ -29,9 +29,8 @@ export const BINARY_OPERATORS = new Map([ ['+', o.BinaryOperator.Plus], ]); -export const NAMESPACES = new Map([['svg', ir.Namespace.SVG], ['math', ir.Namespace.Math]]); - export function namespaceForKey(namespacePrefixKey: string|null): ir.Namespace { + const NAMESPACES = new Map([['svg', ir.Namespace.SVG], ['math', ir.Namespace.Math]]); if (namespacePrefixKey === null) { return ir.Namespace.HTML; } @@ -39,6 +38,7 @@ export function namespaceForKey(namespacePrefixKey: string|null): ir.Namespace { } export function keyForNamespace(namespace: ir.Namespace): string|null { + const NAMESPACES = new Map([['svg', ir.Namespace.SVG], ['math', ir.Namespace.Math]]); for (const [k, n] of NAMESPACES.entries()) { if (n === namespace) { return k; diff --git a/packages/compiler/src/template/pipeline/src/ingest.ts b/packages/compiler/src/template/pipeline/src/ingest.ts index ea94c6f4176457..3656e5a09abe6f 100644 --- a/packages/compiler/src/template/pipeline/src/ingest.ts +++ b/packages/compiler/src/template/pipeline/src/ingest.ts @@ -127,6 +127,8 @@ function ingestNodes(unit: ViewCompilationUnit, template: t.Node[]): void { ingestIfBlock(unit, node); } else if (node instanceof t.SwitchBlock) { ingestSwitchBlock(unit, node); + } else if (node instanceof t.DeferredBlock) { + ingestDeferBlock(unit, node); } else { throw new Error(`Unsupported template node: ${node.constructor.name}`); } @@ -190,7 +192,7 @@ function ingestTemplate(unit: ViewCompilationUnit, tmpl: t.Template): void { // TODO: validate the fallback tag name here. const tplOp = ir.createTemplateOp( childView.xref, tagNameWithoutNamespace ?? 'ng-template', namespaceForKey(namespacePrefix), - false, tmpl.startSourceSpan); + false, undefined, tmpl.startSourceSpan); unit.create.push(tplOp); ingestBindings(unit, tplOp, tmpl); @@ -278,8 +280,8 @@ function ingestIfBlock(unit: ViewCompilationUnit, ifBlock: t.IfBlock): void { if (firstXref === null) { firstXref = cView.xref; } - unit.create.push( - ir.createTemplateOp(cView.xref, 'Conditional', ir.Namespace.HTML, true, ifCase.sourceSpan)); + unit.create.push(ir.createTemplateOp( + cView.xref, 'Conditional', ir.Namespace.HTML, true, undefined, ifCase.sourceSpan)); const caseExpr = ifCase.expression ? convertAst(ifCase.expression, unit.job, null) : null; const conditionalCaseExpr = new ir.ConditionalCaseExpr(caseExpr, cView.xref, ifCase.expressionAlias); @@ -301,8 +303,8 @@ function ingestSwitchBlock(unit: ViewCompilationUnit, switchBlock: t.SwitchBlock if (firstXref === null) { firstXref = cView.xref; } - unit.create.push( - ir.createTemplateOp(cView.xref, 'Case', ir.Namespace.HTML, true, switchCase.sourceSpan)); + unit.create.push(ir.createTemplateOp( + cView.xref, 'Case', ir.Namespace.HTML, true, undefined, switchCase.sourceSpan)); const caseExpr = switchCase.expression ? convertAst(switchCase.expression, unit.job, switchBlock.startSourceSpan) : null; @@ -316,6 +318,65 @@ function ingestSwitchBlock(unit: ViewCompilationUnit, switchBlock: t.SwitchBlock unit.update.push(conditional); } +function ingestDeferView( + unit: ViewCompilationUnit, suffix: string, children?: t.Node[], + sourceSpan?: ParseSourceSpan): ir.TemplateOp|null { + if (children === undefined) { + return null; + } + const secondaryView = unit.job.allocateView(unit.xref); + ingestNodes(secondaryView, children); + const templateOp = ir.createTemplateOp( + secondaryView.xref, `Defer${suffix}`, ir.Namespace.HTML, true, undefined, sourceSpan!); + unit.create.push(templateOp); + return templateOp; +} + +function ingestDeferBlock(unit: ViewCompilationUnit, deferBlock: t.DeferredBlock): void { + // Generate the defer main view and all secondary views. + const main = ingestDeferView(unit, '', deferBlock.children, deferBlock.sourceSpan)!; + const loading = ingestDeferView( + unit, 'Loading', deferBlock.loading?.children, deferBlock.loading?.sourceSpan); + const placeholder = ingestDeferView( + unit, 'Placeholder', deferBlock.placeholder?.children, deferBlock.placeholder?.sourceSpan); + const error = + ingestDeferView(unit, 'Error', deferBlock.error?.children, deferBlock.error?.sourceSpan); + + // Create the main defer op, and ops for all secondary views. + const deferOp = ir.createDeferOp(unit.job.allocateXrefId(), main.xref, deferBlock.sourceSpan); + unit.create.push(deferOp); + + if (loading && deferBlock.loading) { + deferOp.loading = + ir.createDeferSecondaryOp(deferOp.xref, loading.xref, ir.DeferSecondaryKind.Loading); + if (deferBlock.loading.afterTime !== null || deferBlock.loading.minimumTime !== null) { + deferOp.loading.constValue = [deferBlock.loading.minimumTime, deferBlock.loading.afterTime]; + } + unit.create.push(deferOp.loading); + } + + if (placeholder && deferBlock.placeholder) { + deferOp.placeholder = ir.createDeferSecondaryOp( + deferOp.xref, placeholder.xref, ir.DeferSecondaryKind.Placeholder); + if (deferBlock.placeholder.minimumTime !== null) { + deferOp.placeholder.constValue = [deferBlock.placeholder.minimumTime]; + } + unit.create.push(deferOp.placeholder); + } + + if (error && deferBlock.error) { + deferOp.error = + ir.createDeferSecondaryOp(deferOp.xref, error.xref, ir.DeferSecondaryKind.Error); + unit.create.push(deferOp.error); + } + + // Configure all defer conditions. + const deferOnOp = ir.createDeferOnOp(unit.job.allocateXrefId(), null!); + + // Add all ops to the view. + unit.create.push(deferOnOp); +} + /** * Convert a template AST expression into an output AST expression. */ diff --git a/packages/compiler/src/template/pipeline/src/instruction.ts b/packages/compiler/src/template/pipeline/src/instruction.ts index 4d179225923286..a67f3d92932198 100644 --- a/packages/compiler/src/template/pipeline/src/instruction.ts +++ b/packages/compiler/src/template/pipeline/src/instruction.ts @@ -183,6 +183,32 @@ export function text( return call(Identifiers.text, args, sourceSpan); } +export function defer( + selfSlot: number, primarySlot: number, dependencyResolverFn: null, loadingSlot: number|null, + placeholderSlot: number|null, errorSlot: number|null, loadingConfigIndex: number|null, + placeholderConfigIndex: number|null, sourceSpan: ParseSourceSpan|null): ir.CreateOp { + const args = [ + o.literal(selfSlot), + o.literal(primarySlot), + o.literal(dependencyResolverFn), + o.literal(loadingSlot), + o.literal(placeholderSlot), + o.literal(errorSlot), + o.literal(loadingConfigIndex), + o.literal(placeholderConfigIndex), + ]; + + while (args[args.length - 1].value === null) { + args.pop(); + } + + return call(Identifiers.defer, args, sourceSpan); +} + +export function deferOn(sourceSpan: ParseSourceSpan|null): ir.CreateOp { + return call(Identifiers.deferOnIdle, [], sourceSpan); +} + export function projectionDef(def: o.Expression|null): ir.CreateOp { return call(Identifiers.projectionDef, def ? [def] : [], null); } diff --git a/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts b/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts index 2f07619afd8cc3..bb8330f80270bd 100644 --- a/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts +++ b/packages/compiler/src/template/pipeline/src/phases/has_const_trait_collection.ts @@ -19,9 +19,9 @@ export function phaseConstTraitCollection(job: ComponentCompilationJob): void { const collectGlobalConsts = (e: o.Expression): o.Expression => { if (e instanceof ir.ExpressionBase && ir.hasConstTrait(e as ir.Expression)) { // TODO: Figure out how to make this type narrowing work. - const ea = e as any; + const ea = e as unknown as ir.ExpressionBase & ir.HasConstTrait; if (ea.constValue !== null) { - ea.constIndex = job.addConst(ea.constValue); + ea.constIndex = job.addConst(ea.constValue as unknown as o.Expression); } } return e; diff --git a/packages/compiler/src/template/pipeline/src/phases/reify.ts b/packages/compiler/src/template/pipeline/src/phases/reify.ts index 5b428221b61a02..dc857201f46030 100644 --- a/packages/compiler/src/template/pipeline/src/phases/reify.ts +++ b/packages/compiler/src/template/pipeline/src/phases/reify.ts @@ -98,7 +98,7 @@ function reifyCreateOperations(unit: CompilationUnit, ops: ir.OpList(op); + break; + case ir.OpKind.DeferOn: + ir.OpList.replace(op, ng.deferOn(op.sourceSpan)); + break; case ir.OpKind.ProjectionDef: ir.OpList.replace(op, ng.projectionDef(op.def)); break; diff --git a/packages/core/src/render3/instructions/defer.ts b/packages/core/src/render3/instructions/defer.ts index b1b730f1a6d475..5002f825870b3b 100644 --- a/packages/core/src/render3/instructions/defer.ts +++ b/packages/core/src/render3/instructions/defer.ts @@ -54,7 +54,7 @@ function shouldTriggerDeferBlock(injector: Injector): boolean { * @param errorTmplIndex Index of the template with the error block content. * @param loadingConfigIndex Index in the constants array of the configuration of the loading. * block. - * @param placeholderConfigIndexIndex in the constants array of the configuration of the + * @param placeholderConfigIndex Index in the constants array of the configuration of the * placeholder block. * * @codeGenApi From 4f04d1cdab2fc5217566c0c01b7df10c74a93afa Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 3 Oct 2023 10:56:51 +0200 Subject: [PATCH 09/57] feat(core): add new list reconcilation algorithm (#51980) The new list reconcilation algorithm, an alternative to the DefaultIterableListDiffer. It works by performing updates in place instead of creating intermediate data describing changes to apply. For lists expressed as an Array it performs additional optimizations for the moves and swap scenarios. The new list diffing approach is meant to be used in the new control flow and should me much faster as compared to the ngFor with the DefaultIterableListDiffer. PR Close #51980 --- .../core/src/render3/list_reconciliation.ts | 288 ++++++++++ .../test/render3/list_reconciliation_spec.ts | 493 ++++++++++++++++++ 2 files changed, 781 insertions(+) create mode 100644 packages/core/src/render3/list_reconciliation.ts create mode 100644 packages/core/test/render3/list_reconciliation_spec.ts diff --git a/packages/core/src/render3/list_reconciliation.ts b/packages/core/src/render3/list_reconciliation.ts new file mode 100644 index 00000000000000..4d62b5696ecb2f --- /dev/null +++ b/packages/core/src/render3/list_reconciliation.ts @@ -0,0 +1,288 @@ +/** + * @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 + */ + +import {TrackByFunction} from '../change_detection'; + +/** + * A type representing the live collection to be reconciled with any new (incoming) collection. This + * is an adapter class that makes it possible to work with different internal data structures, + * regardless of the actual values of the incoming collection. + */ +export abstract class LiveCollection { + abstract get length(): number; + abstract at(index: number): T; + abstract key(index: number): unknown; + abstract attach(index: number, item: T): void; + abstract detach(index: number): T; + abstract create(index: number, value: V): T; + destroy(item: T): void { + // noop by default + } + updateValue(index: number, value: V): void { + // noop by default + } + + // operations below could be implemented on top of the operations defined so far, but having + // them explicitly allow clear expression of intent and potentially more performant + // implementations + swap(index1: number, index2: number): void { + const startIdx = Math.min(index1, index2); + const endIdx = Math.max(index1, index2); + const endItem = this.detach(endIdx); + if (endIdx - startIdx > 1) { + const startItem = this.detach(startIdx); + this.attach(startIdx, endItem); + this.attach(endIdx, startItem); + } else { + this.attach(startIdx, endItem); + } + } + move(prevIndex: number, newIdx: number): void { + this.attach(newIdx, this.detach(prevIndex)); + } +} + +/** + * The live collection reconciliation algorithm that perform various in-place operations, so it + * reflects the content of the new (incoming) collection. + * + * The reconciliation algorithm has 2 code paths: + * - "fast" path that don't require any memory allocation; + * - "slow" path that requires additional memory allocation for intermediate data structures used to + * collect additional information about the live collection. + * It might happen that the algorithm switches between the two modes in question in a single + * reconciliation path - generally it tries to stay on the "fast" path as much as possible. + * + * The overall complexity of the algorithm is O(n + m) for speed and O(n) for memory (where n is the + * length of the live collection and m is the length of the incoming collection). Given the problem + * at hand the complexity / performance constraints makes it impossible to perform the absolute + * minimum of operation to reconcile the 2 collections. The algorithm makes different tradeoffs to + * stay within reasonable performance bounds and may apply sub-optimal number of operations in + * certain situations. + * + * @param liveCollection the current, live collection; + * @param newCollection the new, incoming collection; + * @param trackByFn key generation function that determines equality between items in the life and + * incoming collection; + */ +export function reconcile( + liveCollection: LiveCollection, newCollection: Iterable|undefined|null, + trackByFn: TrackByFunction): void { + let detachedItems: MultiMap|undefined = undefined; + let liveKeysInTheFuture: Set|undefined = undefined; + + let liveStartIdx = 0; + let liveEndIdx = liveCollection.length - 1; + + if (Array.isArray(newCollection)) { + let newEndIdx = newCollection.length - 1; + + while (liveStartIdx <= liveEndIdx && liveStartIdx <= newEndIdx) { + // compare from the beginning + const liveStartKey = liveCollection.key(liveStartIdx); + const newStartValue = newCollection[liveStartIdx]; + const newStartKey = trackByFn(liveStartIdx, newStartValue); + if (Object.is(liveStartKey, newStartKey)) { + liveCollection.updateValue(liveStartIdx, newStartValue); + liveStartIdx++; + continue; + } + + // compare from the end + // TODO(perf): do _all_ the matching from the end + const liveEndKey = liveCollection.key(liveEndIdx); + const newEndItem = newCollection[newEndIdx]; + const newEndKey = trackByFn(newEndIdx, newEndItem); + if (Object.is(liveEndKey, newEndKey)) { + liveCollection.updateValue(liveEndIdx, newEndItem); + liveEndIdx--; + newEndIdx--; + continue; + } + + // Detect swap / moves: + if (Object.is(newStartKey, liveEndKey) && Object.is(newEndKey, liveStartKey)) { + // swap on both ends; + liveCollection.swap(liveStartIdx, liveEndIdx); + liveCollection.updateValue(liveStartIdx, newStartValue); + liveCollection.updateValue(liveEndIdx, newEndItem); + newEndIdx--; + liveStartIdx++; + liveEndIdx--; + continue; + } else if (Object.is(newStartKey, liveEndKey)) { + // the new item is the same as the live item with the end pointer - this is a move forward + // to an earlier index; + liveCollection.move(liveEndIdx, liveStartIdx); + liveCollection.updateValue(liveStartIdx, newStartValue); + liveStartIdx++; + continue; + } + + // Fallback to the slow path: we need to learn more about the content of the live and new + // collections. + detachedItems ??= new MultiMap(); + liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx); + + // Check if I'm inserting a previously detached item: if so, attach it here + if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newStartKey)) { + liveCollection.updateValue(liveStartIdx, newStartValue); + liveStartIdx++; + liveEndIdx++; + } else if (!liveKeysInTheFuture.has(newStartKey)) { + // Check if we seen a new item that doesn't exist in the old collection and must be INSERTED + const newItem = liveCollection.create(liveStartIdx, newCollection[liveStartIdx]); + liveCollection.attach(liveStartIdx, newItem); + liveStartIdx++; + liveEndIdx++; + } else { + // We know that the new item exists later on in old collection but we don't know its index + // and as the consequence can't move it (don't know where to find it). Detach the old item, + // hoping that it unlocks the fast path again. + detachedItems.set(liveStartKey, liveCollection.detach(liveStartIdx)); + liveEndIdx--; + } + } + + // Final cleanup steps: + // - more items in the new collection => insert + while (liveStartIdx <= newEndIdx) { + createOrAttach( + liveCollection, detachedItems, trackByFn, liveStartIdx, newCollection[liveStartIdx]); + liveStartIdx++; + } + + } else if (newCollection != null) { + // iterable - immediately fallback to the slow path + const newCollectionIterator = newCollection[Symbol.iterator](); + let newIterationResult = newCollectionIterator.next(); + while (!newIterationResult.done && liveStartIdx <= liveEndIdx) { + const newValue = newIterationResult.value; + const newKey = trackByFn(liveStartIdx, newValue); + const liveKey = liveCollection.key(liveStartIdx); + if (Object.is(liveKey, newKey)) { + // found a match - move on + liveCollection.updateValue(liveStartIdx, newValue); + liveStartIdx++; + newIterationResult = newCollectionIterator.next(); + } else { + detachedItems ??= new MultiMap(); + liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx); + + // Check if I'm inserting a previously detached item: if so, attach it here + if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newKey)) { + liveCollection.updateValue(liveStartIdx, newValue); + liveStartIdx++; + liveEndIdx++; + newIterationResult = newCollectionIterator.next(); + } else if (!liveKeysInTheFuture.has(newKey)) { + liveCollection.attach(liveStartIdx, liveCollection.create(liveStartIdx, newValue)); + liveStartIdx++; + liveEndIdx++; + newIterationResult = newCollectionIterator.next(); + } else { + // it is a move forward - detach the current item without advancing in collections + detachedItems.set(liveKey, liveCollection.detach(liveStartIdx)); + liveEndIdx--; + } + } + } + + // this is a new item as we run out of the items in the old collection - create or attach a + // previously detached one + while (!newIterationResult.done) { + createOrAttach( + liveCollection, detachedItems, trackByFn, liveCollection.length, + newIterationResult.value); + newIterationResult = newCollectionIterator.next(); + } + } + + // Cleanups common to the array and iterable: + // - more items in the live collection => delete starting from the end; + while (liveStartIdx <= liveEndIdx) { + liveCollection.destroy(liveCollection.detach(liveEndIdx--)); + } + + // - destroy items that were detached but never attached again. + detachedItems?.forEach(item => liveCollection.destroy(item)); +} + +function attachPreviouslyDetached( + prevCollection: LiveCollection, detachedItems: MultiMap|undefined, + index: number, key: unknown): boolean { + if (detachedItems !== undefined && detachedItems.has(key)) { + prevCollection.attach(index, detachedItems.get(key)!); + detachedItems.delete(key); + return true; + } + return false; +} + +function createOrAttach( + liveCollection: LiveCollection, detachedItems: MultiMap|undefined, + trackByFn: TrackByFunction, index: number, value: V) { + if (!attachPreviouslyDetached(liveCollection, detachedItems, index, trackByFn(index, value))) { + const newItem = liveCollection.create(index, value); + liveCollection.attach(index, newItem); + } else { + liveCollection.updateValue(index, value); + } +} + +function initLiveItemsInTheFuture( + liveCollection: LiveCollection, start: number, end: number): Set { + const keys = new Set(); + for (let i = start; i <= end; i++) { + keys.add(liveCollection.key(i)); + } + return keys; +} + +class MultiMap { + private map = new Map>(); + + has(key: K): boolean { + const listOfKeys = this.map.get(key); + return listOfKeys !== undefined && listOfKeys.length > 0; + } + + delete(key: K): boolean { + const listOfKeys = this.map.get(key); + if (listOfKeys !== undefined) { + // THINK: pop from the end or shift from the front? "Correct" vs. "slow". + listOfKeys.pop(); + return true; + } + return false; + } + + get(key: K): V|undefined { + const listOfKeys = this.map.get(key); + return listOfKeys !== undefined && listOfKeys.length > 0 ? listOfKeys[0] : undefined; + } + + set(key: K, value: V): void { + // if value is array, they we always store it as [value]. + if (!this.map.has(key)) { + this.map.set(key, [value]); + return; + } + // THINK: this allows duplicate values, but I guess this is fine? + // Is the existing key an array or not? + this.map.get(key)?.push(value); + } + + forEach(cb: (v: V, k: K) => void) { + for (const [key, values] of this.map) { + for (const value of values) { + cb(value, key); + } + } + } +} diff --git a/packages/core/test/render3/list_reconciliation_spec.ts b/packages/core/test/render3/list_reconciliation_spec.ts new file mode 100644 index 00000000000000..775eb591e792ea --- /dev/null +++ b/packages/core/test/render3/list_reconciliation_spec.ts @@ -0,0 +1,493 @@ +/** + * @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 + */ + +import {TrackByFunction} from '@angular/core'; +import {LiveCollection, reconcile} from '@angular/core/src/render3/list_reconciliation'; +import {assertDefined} from '@angular/core/src/util/assert'; + +interface ItemAdapter { + create(index: number, value: V): T; + update(item: T, index: number, value: V): void; + unwrap(item: T): V; +} + +class NoopItemFactory implements ItemAdapter { + create(index: number, value: V): T { + return value as any as T; + } + update(item: T, index: number, value: V): void {} + + unwrap(item: T): V { + return item as any as V; + } +} + +class LoggingLiveCollection extends LiveCollection { + operations = { + at: 0, + key: 0, + }; + + private logs: any[][] = []; + + constructor( + private arr: T[], private trackByFn: TrackByFunction, + private itemFactory: ItemAdapter = new NoopItemFactory()) { + super(); + } + + get length(): number { + return this.arr.length; + } + at(index: number): T { + this.operations.at++; + const item = this.arr.at(index); + assertDefined(item, `Invalid index ${index} - item was undefined`); + return item; + } + key(index: number): unknown { + this.operations.key++; + return this.trackByFn(index, this.itemFactory.unwrap(this.at(index))); + } + attach(index: number, item: T): void { + this.logs.push(['attach', index, item]); + this.arr.splice(index, 0, item); + } + detach(index: number): T { + const item = this.at(index); + this.logs.push(['detach', index, item]); + this.arr.splice(index, 1); + return item; + } + create(index: number, value: V): T { + this.logs.push(['create', index, value]); + return this.itemFactory.create(index, value); + } + override destroy(item: T): void { + this.logs.push(['destroy', item]); + } + override updateValue(index: number, value: V): void { + this.itemFactory.update(this.at(index), index, value); + } + + getCollection() { + return this.arr; + } + + getLogs() { + return this.logs; + } + + clearLogs() { + this.logs = []; + } +} + +function trackByIdentity(index: number, item: T) { + return item; +} + +function trackByIndex(index: number) { + return index; +} + +describe('list reconciliation', () => { + describe('fast path', () => { + it('should do nothing if 2 lists are the same', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, ['a', 'b', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([]); + }); + + it('should add items at the end', () => { + const pc = new LoggingLiveCollection(['a', 'b'], trackByIdentity); + reconcile(pc, ['a', 'b', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([['create', 2, 'c'], ['attach', 2, 'c']]); + }); + + it('should swap items', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, ['c', 'b', 'a'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['c', 'b', 'a']); + // TODO: think of expressing as swap + expect(pc.getLogs()).toEqual([ + ['detach', 2, 'c'], + ['detach', 0, 'a'], + ['attach', 0, 'c'], + ['attach', 2, 'a'], + ]); + }); + + it('should should optimally swap adjacent items', () => { + const pc = new LoggingLiveCollection(['a', 'b'], trackByIdentity); + reconcile(pc, ['b', 'a'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['b', 'a']); + expect(pc.getLogs()).toEqual([ + ['detach', 1, 'b'], + ['attach', 0, 'b'], + ]); + }); + + it('should detect moves to the front', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c', 'd'], trackByIdentity); + reconcile(pc, ['a', 'd', 'b', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'd', 'b', 'c']); + expect(pc.getLogs()).toEqual([ + ['detach', 3, 'd'], + ['attach', 1, 'd'], + ]); + }); + + + it('should delete items in the middle', () => { + const pc = new LoggingLiveCollection(['a', 'x', 'b', 'c'], trackByIdentity); + reconcile(pc, ['a', 'b', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([ + ['detach', 1, 'x'], + ['destroy', 'x'], + ]); + }); + + it('should delete items from the beginning', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, ['c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['c']); + expect(pc.getLogs()).toEqual([ + ['detach', 1, 'b'], + ['destroy', 'b'], + ['detach', 0, 'a'], + ['destroy', 'a'], + ]); + }); + + it('should delete items from the end', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, ['a'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a']); + expect(pc.getLogs()).toEqual([ + ['detach', 2, 'c'], + ['destroy', 'c'], + ['detach', 1, 'b'], + ['destroy', 'b'], + ]); + }); + + it('should work with duplicated items', () => { + const pc = new LoggingLiveCollection(['a', 'a', 'a'], trackByIdentity); + reconcile(pc, ['a', 'a', 'a'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'a', 'a']); + expect(pc.getLogs()).toEqual([]); + }); + }); + + describe('slow path', () => { + it('should delete multiple items from the middle', () => { + const pc = new LoggingLiveCollection(['a', 'x1', 'b', 'x2', 'c'], trackByIdentity); + reconcile(pc, ['a', 'b', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([ + ['detach', 1, 'x1'], + ['detach', 2, 'x2'], + ['destroy', 'x2'], + ['destroy', 'x1'], + ]); + }); + + it('should add multiple items in the middle', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, ['a', 'n1', 'b', 'n2', 'c'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'n1', 'b', 'n2', 'c']); + expect(pc.getLogs()).toEqual([ + ['create', 1, 'n1'], + ['attach', 1, 'n1'], + ['create', 3, 'n2'], + ['attach', 3, 'n2'], + ]); + }); + + it('should go back to the fast path when start / end is different', () => { + const pc = new LoggingLiveCollection(['s1', 'a', 'b', 'c', 'e1'], trackByIdentity); + reconcile(pc, ['s2', 'a', 'b', 'c', 'e2'], trackByIdentity); + + expect(pc.getCollection()).toEqual(['s2', 'a', 'b', 'c', 'e2']); + expect(pc.getLogs()).toEqual([ + // item gets created at index 0 since we know it is not in the old array + ['create', 0, 's2'], + ['attach', 0, 's2'], + // item at index 1 gets detached since it is not part of the new collection + ['detach', 1, 's1'], + // we are on the fast path again, skipping 'a', 'b', 'c' + // item gets created at index 4 since we know it is not in the old array + ['create', 4, 'e2'], + ['attach', 4, 'e2'], + // the rest gets detached / destroyed + ['detach', 5, 'e1'], + ['destroy', 'e1'], + ['destroy', 's1'], + ]); + }); + + it('should detect moves to the back', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c', 'd'], trackByIdentity); + reconcile(pc, ['b', 'c', 'n1', 'n2', 'n3', 'a', 'd'], trackByIdentity); + expect(pc.getCollection()).toEqual(['b', 'c', 'n1', 'n2', 'n3', 'a', 'd']); + expect(pc.getLogs()).toEqual([ + ['detach', 0, 'a'], + ['create', 2, 'n1'], + ['attach', 2, 'n1'], + ['create', 3, 'n2'], + ['attach', 3, 'n2'], + ['create', 4, 'n3'], + ['attach', 4, 'n3'], + ['attach', 5, 'a'], + ]); + }); + + it('should create / reuse duplicated items as needed', () => { + const pc = new LoggingLiveCollection([1, 1, 2, 3], trackByIdentity); + reconcile(pc, [2, 3, 1, 1, 1, 4], trackByIdentity); + + expect(pc.getCollection()).toEqual([2, 3, 1, 1, 1, 4]); + expect(pc.getLogs()).toEqual([ + ['detach', 0, 1], + ['detach', 0, 1], + ['attach', 2, 1], + ['attach', 3, 1], + ['create', 4, 1], + ['attach', 4, 1], + ['create', 5, 4], + ['attach', 5, 4], + ]); + }); + }); + + describe('iterables', () => { + it('should do nothing if 2 lists represented as iterables are the same', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, new Set(['a', 'b', 'c']), trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([]); + }); + + it('should add items at the end', () => { + const pc = new LoggingLiveCollection(['a', 'b'], trackByIdentity); + reconcile(pc, new Set(['a', 'b', 'c']), trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([['create', 2, 'c'], ['attach', 2, 'c']]); + }); + + it('should add multiple items in the middle', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, new Set(['a', 'n1', 'b', 'n2', 'c']), trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'n1', 'b', 'n2', 'c']); + expect(pc.getLogs()).toEqual([ + ['create', 1, 'n1'], + ['attach', 1, 'n1'], + ['create', 3, 'n2'], + ['attach', 3, 'n2'], + ]); + }); + + it('should delete items from the end', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + reconcile(pc, new Set(['a']), trackByIdentity); + + expect(pc.getCollection()).toEqual(['a']); + expect(pc.getLogs()).toEqual([ + ['detach', 2, 'c'], + ['destroy', 'c'], + ['detach', 1, 'b'], + ['destroy', 'b'], + ]); + }); + + it('should detect (slow) moves to the front', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c', 'd'], trackByIdentity); + reconcile(pc, new Set(['a', 'd', 'b', 'c']), trackByIdentity); + + expect(pc.getCollection()).toEqual(['a', 'd', 'b', 'c']); + expect(pc.getLogs()).toEqual([ + ['detach', 1, 'b'], + ['detach', 1, 'c'], + ['attach', 2, 'b'], + ['attach', 3, 'c'], + ]); + }); + + it('should detect (fast) moves to the back', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c', 'd'], trackByIdentity); + reconcile(pc, new Set(['b', 'c', 'a', 'd']), trackByIdentity); + expect(pc.getCollection()).toEqual(['b', 'c', 'a', 'd']); + expect(pc.getLogs()).toEqual([ + ['detach', 0, 'a'], + ['attach', 2, 'a'], + ]); + }); + + it('should allow switching collection types', () => { + const pc = new LoggingLiveCollection(['a', 'b', 'c'], trackByIdentity); + + reconcile(pc, new Set(['a', 'b', 'c']), trackByIdentity); + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([]); + + reconcile(pc, ['a', 'b', 'c'], trackByIdentity); + expect(pc.getCollection()).toEqual(['a', 'b', 'c']); + expect(pc.getLogs()).toEqual([]); + }); + }); + + describe('identity and index update', () => { + interface KeyValueItem { + k: K; + v: V; + } + + interface RepeaterLikeItem { + index: number; + implicit: T; + } + + class RepeaterLikeItemFactory implements ItemAdapter, T> { + keySequence = 0; + + create(index: number, value: T): RepeaterLikeItem { + return {index: index, implicit: value}; + } + + update(item: RepeaterLikeItem, index: number, value: T): void { + item.index = index; + item.implicit = value; + } + + unwrap(item: RepeaterLikeItem): T { + return item.implicit; + } + } + + function trackByKey(index: number, item: KeyValueItem) { + return item.k; + } + + it('should update when tracking by index - fast path from the start', () => { + const pc = new LoggingLiveCollection([], trackByIndex, new RepeaterLikeItemFactory()); + + reconcile(pc, ['a', 'b', 'c'], trackByIndex); + expect(pc.getCollection()).toEqual([ + {index: 0, implicit: 'a'}, + {index: 1, implicit: 'b'}, + {index: 2, implicit: 'c'}, + ]); + + reconcile(pc, ['c', 'b', 'a'], trackByIndex); + expect(pc.getCollection()).toEqual([ + {index: 0, implicit: 'c'}, + {index: 1, implicit: 'b'}, + {index: 2, implicit: 'a'}, + ]); + }); + + it('should update when tracking by key - fast path from the end', () => { + const pc = new LoggingLiveCollection( + [], trackByKey, new RepeaterLikeItemFactory>()); + + reconcile(pc, [{k: 'o', v: 'o'}], trackByKey); + expect(pc.getCollection()).toEqual([ + {index: 0, implicit: {k: 'o', v: 'o'}}, + ]); + + reconcile(pc, [{k: 'n', v: 'n'}, {k: 'o', v: 'oo'}], trackByKey); + expect(pc.getCollection()).toEqual([ + {index: 0, implicit: {k: 'n', v: 'n'}}, + // TODO: this scenario shows situation where the index is not correctly updated + {index: 0, implicit: {k: 'o', v: 'oo'}}, + ]); + }); + + it('should update when swapping on the fast path', () => { + const pc = new LoggingLiveCollection( + [], trackByKey, new RepeaterLikeItemFactory>()); + + reconcile(pc, [{k: 0, v: 'a'}, {k: 1, v: 'b'}, {k: 2, v: 'c'}], trackByKey as any); + expect(pc.getCollection()) + .toEqual( + [ + {index: 0, implicit: {k: 0, v: 'a'}}, + {index: 1, implicit: {k: 1, v: 'b'}}, + {index: 2, implicit: {k: 2, v: 'c'}}, + ], + ); + + reconcile(pc, [{k: 2, v: 'cc'}, {k: 1, v: 'bb'}, {k: 0, v: 'aa'}], trackByKey as any); + expect(pc.getCollection()) + .toEqual( + [ + {index: 0, implicit: {k: 2, v: 'cc'}}, + {index: 1, implicit: {k: 1, v: 'bb'}}, + {index: 2, implicit: {k: 0, v: 'aa'}}, + ], + ); + }); + + it('should update when moving forward on the fast path', () => { + const pc = new LoggingLiveCollection( + [], trackByKey, new RepeaterLikeItemFactory>()); + reconcile( + pc, + [ + {k: 0, v: 'a'}, + {k: 1, v: 'b'}, + {k: 2, v: 'c'}, + {k: 3, v: 'd'}, + ], + trackByKey as any); + expect(pc.getCollection()) + .toEqual( + [ + {index: 0, implicit: {k: 0, v: 'a'}}, + {index: 1, implicit: {k: 1, v: 'b'}}, + {index: 2, implicit: {k: 2, v: 'c'}}, + {index: 3, implicit: {k: 3, v: 'd'}}, + ], + ); + + reconcile( + pc, + [ + {k: 0, v: 'aa'}, + {k: 3, v: 'dd'}, + {k: 1, v: 'bb'}, + {k: 2, v: 'cc'}, + ], + trackByKey as any); + expect(pc.getCollection()).toEqual([ + {index: 0, implicit: {k: 0, v: 'aa'}}, + {index: 1, implicit: {k: 3, v: 'dd'}}, + {index: 2, implicit: {k: 1, v: 'bb'}}, + {index: 3, implicit: {k: 2, v: 'cc'}}, + ]); + }); + }); +}); From 7d42dc3c023391e12ea607beb227fd4426e1694d Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 3 Oct 2023 10:57:54 +0200 Subject: [PATCH 10/57] feat(core): the new list reconciliation algorithm for built-in for (#51980) This commit plugs the new list reconciliation into the new built-in repeater. PR Close #51980 --- .../src/render3/instructions/control_flow.ts | 142 +++++++++--------- .../control_flow_exploration_spec.ts | 30 +--- 2 files changed, 81 insertions(+), 91 deletions(-) diff --git a/packages/core/src/render3/instructions/control_flow.ts b/packages/core/src/render3/instructions/control_flow.ts index 00af4198e7736c..c8765946713baf 100644 --- a/packages/core/src/render3/instructions/control_flow.ts +++ b/packages/core/src/render3/instructions/control_flow.ts @@ -6,7 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {DefaultIterableDiffer, IterableChangeRecord, TrackByFunction} from '../../change_detection'; +import {TrackByFunction} from '../../change_detection'; +import {DehydratedContainerView} from '../../hydration/interfaces'; import {findMatchingDehydratedView} from '../../hydration/views'; import {assertDefined} from '../../util/assert'; import {assertLContainer, assertLView, assertTNode} from '../assert'; @@ -14,8 +15,9 @@ import {bindingUpdated} from '../bindings'; import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; import {ComponentTemplate} from '../interfaces/definition'; import {TNode} from '../interfaces/node'; -import {CONTEXT, DECLARATION_COMPONENT_VIEW, HEADER_OFFSET, LView, TVIEW, TView} from '../interfaces/view'; -import {detachView} from '../node_manipulation'; +import {CONTEXT, DECLARATION_COMPONENT_VIEW, HEADER_OFFSET, HYDRATION, LView, TVIEW, TView} from '../interfaces/view'; +import {LiveCollection, reconcile} from '../list_reconciliation'; +import {destroyLView, detachView} from '../node_manipulation'; import {getLView, nextBindingIndex} from '../state'; import {getTNode} from '../util/view_utils'; import {addLViewToLContainer, createAndRenderEmbeddedLView, getLViewFromLContainer, removeLViewFromLContainer, shouldAddViewToDom} from '../view_manipulation'; @@ -99,7 +101,7 @@ export function ɵɵrepeaterTrackByIdentity(_: number, value: T) { } class RepeaterMetadata { - constructor(public hasEmptyBlock: boolean, public differ: DefaultIterableDiffer) {} + constructor(public hasEmptyBlock: boolean, public trackByFn: TrackByFunction) {} } /** @@ -135,7 +137,7 @@ export function ɵɵrepeaterCreate( // new function. For pure functions it's not necessary. trackByFn.bind(hostLView[DECLARATION_COMPONENT_VIEW][CONTEXT]) : trackByFn; - const metadata = new RepeaterMetadata(hasEmptyBlock, new DefaultIterableDiffer(boundTrackBy)); + const metadata = new RepeaterMetadata(hasEmptyBlock, boundTrackBy); hostLView[HEADER_OFFSET + index] = metadata; ɵɵtemplate(index + 1, templateFn, decls, vars); @@ -150,6 +152,48 @@ export function ɵɵrepeaterCreate( } } +class LiveCollectionLContainerImpl extends + LiveCollection>, RepeaterContext> { + constructor( + private lContainer: LContainer, private hostLView: LView, private templateTNode: TNode, + private trackByFn: TrackByFunction) { + super(); + } + + override get length(): number { + return this.lContainer.length - CONTAINER_HEADER_OFFSET; + } + override at(index: number): LView> { + return getExistingLViewFromLContainer(this.lContainer, index); + } + override key(index: number): unknown { + return this.trackByFn(index, this.at(index)[CONTEXT].$implicit); + } + override attach(index: number, lView: LView>): void { + const dehydratedView = lView[HYDRATION] as DehydratedContainerView; + addLViewToLContainer( + this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView)); + } + override detach(index: number): LView> { + return detachExistingView>(this.lContainer, index); + } + override create(index: number, value: unknown): LView> { + const dehydratedView = + findMatchingDehydratedView(this.lContainer, this.templateTNode.tView!.ssrId); + const embeddedLView = createAndRenderEmbeddedLView( + this.hostLView, this.templateTNode, new RepeaterContext(this.lContainer, value, index), + {dehydratedView}); + + return embeddedLView; + } + override destroy(lView: LView>): void { + destroyLView(lView[TVIEW], lView); + } + override updateValue(index: number, value: unknown): void { + this.at(index)[CONTEXT].$implicit = value; + } +} + /** * The repeater instruction does update-time diffing of a provided collection (against the * collection seen previously) and maps changes in the collection to views structure (by adding, @@ -165,79 +209,43 @@ export function ɵɵrepeater( const hostLView = getLView(); const hostTView = hostLView[TVIEW]; const metadata = hostLView[HEADER_OFFSET + metadataSlotIdx] as RepeaterMetadata; + const containerIndex = metadataSlotIdx + 1; + const lContainer = getLContainer(hostLView, HEADER_OFFSET + containerIndex); + const itemTemplateTNode = getExistingTNode(hostTView, containerIndex); - const differ = metadata.differ; - const changes = differ.diff(collection); - - // handle repeater changes - if (changes !== null) { - const containerIndex = metadataSlotIdx + 1; - const itemTemplateTNode = getExistingTNode(hostTView, containerIndex); - const lContainer = getLContainer(hostLView, HEADER_OFFSET + containerIndex); - let needsIndexUpdate = false; - changes.forEachOperation( - (item: IterableChangeRecord, adjustedPreviousIndex: number|null, - currentIndex: number|null) => { - if (item.previousIndex === null) { - // add - const newViewIdx = adjustToLastLContainerIndex(lContainer, currentIndex); - const dehydratedView = - findMatchingDehydratedView(lContainer, itemTemplateTNode.tView!.ssrId); - const embeddedLView = createAndRenderEmbeddedLView( - hostLView, itemTemplateTNode, - new RepeaterContext(lContainer, item.item, newViewIdx), {dehydratedView}); - addLViewToLContainer( - lContainer, embeddedLView, newViewIdx, - shouldAddViewToDom(itemTemplateTNode, dehydratedView)); - needsIndexUpdate = true; - } else if (currentIndex === null) { - // remove - adjustedPreviousIndex = adjustToLastLContainerIndex(lContainer, adjustedPreviousIndex); - removeLViewFromLContainer(lContainer, adjustedPreviousIndex); - needsIndexUpdate = true; - } else if (adjustedPreviousIndex !== null) { - // move - const existingLView = - detachExistingView>(lContainer, adjustedPreviousIndex); - addLViewToLContainer(lContainer, existingLView, currentIndex); - needsIndexUpdate = true; - } - }); - - // A trackBy function might return the same value even if the underlying item changed - re-bind - // it in the context. - changes.forEachIdentityChange((record: IterableChangeRecord) => { - const viewIdx = adjustToLastLContainerIndex(lContainer, record.currentIndex); - const lView = getExistingLViewFromLContainer>(lContainer, viewIdx); - lView[CONTEXT].$implicit = record.item; - }); + reconcile( + new LiveCollectionLContainerImpl( + lContainer, hostLView, itemTemplateTNode, metadata.trackByFn), + collection, metadata.trackByFn); - // moves in the container might caused context's index to get out of order, re-adjust - if (needsIndexUpdate) { - for (let i = 0; i < lContainer.length - CONTAINER_HEADER_OFFSET; i++) { - const lView = getExistingLViewFromLContainer>(lContainer, i); - lView[CONTEXT].$index = i; - } - } + // moves in the container might caused context's index to get out of order, re-adjust + // PERF: we could try to book-keep moves and do this index re-adjust as need, at the cost of the + // additional code complexity + for (let i = 0; i < lContainer.length - CONTAINER_HEADER_OFFSET; i++) { + const lView = getExistingLViewFromLContainer>(lContainer, i); + lView[CONTEXT].$index = i; } // handle empty blocks + // PERF: maybe I could skip allocation of memory for the empty block? Isn't it the "fix" on the + // compiler side that we've been discussing? Talk to K & D! const bindingIndex = nextBindingIndex(); if (metadata.hasEmptyBlock) { - const hasItemsInCollection = differ.length > 0; - if (bindingUpdated(hostLView, bindingIndex, hasItemsInCollection)) { + const isCollectionEmpty = lContainer.length - CONTAINER_HEADER_OFFSET === 0; + if (bindingUpdated(hostLView, bindingIndex, isCollectionEmpty)) { const emptyTemplateIndex = metadataSlotIdx + 2; - const lContainer = getLContainer(hostLView, HEADER_OFFSET + emptyTemplateIndex); - if (hasItemsInCollection) { - removeLViewFromLContainer(lContainer, 0); - } else { + const lContainerForEmpty = getLContainer(hostLView, HEADER_OFFSET + emptyTemplateIndex); + if (isCollectionEmpty) { const emptyTemplateTNode = getExistingTNode(hostTView, emptyTemplateIndex); const dehydratedView = - findMatchingDehydratedView(lContainer, emptyTemplateTNode.tView!.ssrId); + findMatchingDehydratedView(lContainerForEmpty, emptyTemplateTNode.tView!.ssrId); const embeddedLView = createAndRenderEmbeddedLView( hostLView, emptyTemplateTNode, undefined, {dehydratedView}); addLViewToLContainer( - lContainer, embeddedLView, 0, shouldAddViewToDom(emptyTemplateTNode, dehydratedView)); + lContainerForEmpty, embeddedLView, 0, + shouldAddViewToDom(emptyTemplateTNode, dehydratedView)); + } else { + removeLViewFromLContainer(lContainerForEmpty, 0); } } } @@ -250,10 +258,6 @@ function getLContainer(lView: LView, index: number): LContainer { return lContainer; } -function adjustToLastLContainerIndex(lContainer: LContainer, index: number|null): number { - return index !== null ? index : lContainer.length - CONTAINER_HEADER_OFFSET; -} - function detachExistingView(lContainer: LContainer, index: number): LView { const existingLView = detachView(lContainer, index); ngDevMode && assertLView(existingLView); diff --git a/packages/core/test/acceptance/control_flow_exploration_spec.ts b/packages/core/test/acceptance/control_flow_exploration_spec.ts index 053ede76e7a58b..80042b3b3a6757 100644 --- a/packages/core/test/acceptance/control_flow_exploration_spec.ts +++ b/packages/core/test/acceptance/control_flow_exploration_spec.ts @@ -449,36 +449,29 @@ describe('control flow', () => { it('should be able to access component properties in the tracking function from a loop at the root of the template', () => { - const calls: string[][] = []; + const calls = new Set(); @Component({ template: `@for ((item of items); track trackingFn(item, compProp)) {{{item}}}`, }) class TestComponent { - items = ['one', 'two', 'three']; + items = ['a', 'b']; compProp = 'hello'; trackingFn(item: string, message: string) { - calls.push([item, message]); + calls.add(`${item}:${message}`); return item; } } const fixture = TestBed.createComponent(TestComponent); fixture.detectChanges(); - expect(calls).toEqual([ - ['one', 'hello'], - ['two', 'hello'], - ['three', 'hello'], - ['one', 'hello'], - ['two', 'hello'], - ['three', 'hello'], - ]); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); }); it('should be able to access component properties in the tracking function from a nested template', () => { - const calls: string[][] = []; + const calls = new Set(); @Component({ template: ` @@ -492,25 +485,18 @@ describe('control flow', () => { `, }) class TestComponent { - items = ['one', 'two', 'three']; + items = ['a', 'b']; compProp = 'hello'; trackingFn(item: string, message: string) { - calls.push([item, message]); + calls.add(`${item}:${message}`); return item; } } const fixture = TestBed.createComponent(TestComponent); fixture.detectChanges(); - expect(calls).toEqual([ - ['one', 'hello'], - ['two', 'hello'], - ['three', 'hello'], - ['one', 'hello'], - ['two', 'hello'], - ['three', 'hello'], - ]); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); }); }); }); From 0eae992c4e03b7c9039476e03b72e92d662293df Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 3 Oct 2023 11:55:22 +0200 Subject: [PATCH 11/57] fix(compiler): allow nullable values in for loop block (#51997) Updates the TCB for `@for` loop blocks to allow nullable values. The runtime already supports it and this makes it easier to switch from `NgFor`. Fixes #51993. PR Close #51997 --- .../ngtsc/typecheck/src/type_check_block.ts | 5 +- .../typecheck/test/type_check_block_spec.ts | 14 ++--- .../test/ngtsc/template_typecheck_spec.ts | 51 +++++++++++++++++++ 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index cbfad1c83daeda..0eb6e16e188b48 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -1297,7 +1297,10 @@ class TcbForOfOp extends TcbOp { const loopScope = Scope.forNodes(this.tcb, this.scope, this.block, null); const initializer = ts.factory.createVariableDeclarationList( [ts.factory.createVariableDeclaration(this.block.item.name)], ts.NodeFlags.Const); - const expression = tcbExpression(this.block.expression, this.tcb, loopScope); + // It's common to have a for loop over a nullable value (e.g. produced by the `async` pipe). + // Add a non-null expression to allow such values to be assigned. + const expression = ts.factory.createNonNullExpression( + tcbExpression(this.block.expression, this.tcb, loopScope)); const trackTranslator = new TcbForLoopTrackTranslator(this.tcb, loopScope, this.block); const trackExpression = trackTranslator.translate(this.block.trackBy); const statements = [ diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts index b8a9ec605f5166..aa843011c78265 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts @@ -1485,7 +1485,7 @@ describe('type check blocks', () => { `; const result = tcb(TEMPLATE); - expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); + expect(result).toContain('for (const item of ((this).items)!) { var _t1 = item;'); expect(result).toContain('"" + ((this).main(_t1))'); expect(result).toContain('"" + ((this).empty())'); }); @@ -1498,7 +1498,7 @@ describe('type check blocks', () => { `; const result = tcb(TEMPLATE); - expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); + expect(result).toContain('for (const item of ((this).items)!) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('var _t3: number = null!;'); expect(result).toContain('var _t4: number = null!;'); @@ -1516,7 +1516,7 @@ describe('type check blocks', () => { `; const result = tcb(TEMPLATE); - expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); + expect(result).toContain('for (const item of ((this).items)!) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('var _t3: number = null!;'); expect(result).toContain('var _t4: number = null!;'); @@ -1532,7 +1532,7 @@ describe('type check blocks', () => { `; const result = tcb(TEMPLATE); - expect(result).toContain('for (const item of ((this).items)) { var _t1 = item;'); + expect(result).toContain('for (const item of ((this).items)!) { var _t1 = item;'); expect(result).toContain('var _t2: number = null!;'); expect(result).toContain('"" + (((this).$index)) + (_t2)'); }); @@ -1550,10 +1550,10 @@ describe('type check blocks', () => { const result = tcb(TEMPLATE); expect(result).toContain( - 'for (const item of ((this).items)) { var _t1 = item; var _t2: number = null!;'); + 'for (const item of ((this).items)!) { var _t1 = item; var _t2: number = null!;'); expect(result).toContain('"" + (_t1) + (_t2)'); expect(result).toContain( - 'for (const inner of ((_t1).items)) { var _t8 = inner; var _t9: number = null!;'); + 'for (const inner of ((_t1).items)!) { var _t8 = inner; var _t9: number = null!;'); expect(result).toContain('"" + (_t1) + (_t2) + (_t8) + (_t9)'); }); @@ -1561,7 +1561,7 @@ describe('type check blocks', () => { const result = tcb(`@for (item of items; track trackingFn($index, item, prop)) {}`); expect(result).toContain( - 'for (const item of ((this).items)) { var _t1: number = null!; var _t2 = item;'); + 'for (const item of ((this).items)!) { var _t1: number = null!; var _t2 = item;'); expect(result).toContain('(this).trackingFn(_t1, _t2, ((this).prop));'); }); }); diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index aa93b2b24a3ed5..efb14bc6af50c5 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -4495,6 +4495,57 @@ suppress expect(diags[0].messageText) .toContain('Error: Illegal State: Pipes are not allowed in this context'); }); + + it('should allow nullable values in loop expression', () => { + env.write('test.ts', ` + import {Component, Pipe} from '@angular/core'; + + @Pipe({name: 'fakeAsync', standalone: true}) + export class FakeAsyncPipe { + transform(value: Iterable): Iterable | null | undefined { + return null; + } + } + + @Component({ + template: \` + @for (item of items | fakeAsync; track item) { + {{item}} + } + \`, + standalone: true, + imports: [FakeAsyncPipe] + }) + export class Main { + items = []; + } + `); + + const diags = env.driveDiagnostics(); + expect(diags.map(d => ts.flattenDiagnosticMessageText(d.messageText, ''))).toEqual([]); + }); + + it('should enforce that the loop expression is iterable', () => { + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + template: \` + @for (item of items; track item) { + {{item}} + } + \`, + }) + export class Main { + items = 123; + } + `); + + const diags = env.driveDiagnostics(); + expect(diags.map(d => ts.flattenDiagnosticMessageText(d.messageText, ''))).toEqual([ + `Type 'number' must have a '[Symbol.iterator]()' method that returns an iterator.` + ]); + }); }); }); }); From e5bca432248add0a19102f6afeae145f1a33ee8a Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 4 Oct 2023 13:30:39 +0200 Subject: [PATCH 12/57] perf(compiler): further reduce bundle size using arrow functions (#52010) Reworks a few more places to output arrow functions instead of function declarations in order to reduce the amount of code we generate. Some of these places include: * Factories in injectable definitions. * Forward references. * `dependencies` function in the component definition. * `consts` function in the component definition. PR Close #52010 --- .../GOLDEN_PARTIAL.js | 4 ++-- .../forward_referenced_directive.js | 2 +- .../forward_referenced_pipe.js | 2 +- .../queries/GOLDEN_PARTIAL.js | 16 ++++++------- .../queries/static_view_query.js | 2 +- .../queries/view_query_for_directive.js | 2 +- .../standalone/GOLDEN_PARTIAL.js | 2 +- .../standalone/forward_ref.js | 4 +--- .../template_variables/GOLDEN_PARTIAL.js | 6 ++--- .../let_variable_and_reference.js | 2 +- .../parent_template_variable.js | 2 +- .../template_variables/svg_embedded_view.js | 2 +- .../ng_modules/GOLDEN_PARTIAL.js | 2 +- .../ng_modules/inheritance.js | 4 ++-- .../ng_modules/inheritance.local.js | 4 ++-- .../r3_view_compiler/GOLDEN_PARTIAL.js | 2 +- .../r3_view_compiler_di/di/GOLDEN_PARTIAL.js | 4 ++-- .../di/providedin_forwardref.js | 2 +- .../di/useclass_forwardref.js | 4 +--- .../di/useclass_without_deps.js | 4 +--- .../di/usefactory_without_deps.js | 4 +--- .../host_directives/GOLDEN_PARTIAL.js | 4 ++-- .../r3_view_compiler_i18n/GOLDEN_PARTIAL.js | 2 +- .../element_attributes/i18n_root_node.js | 2 +- .../element_attributes/interpolation_basic.js | 4 ++-- .../interpolation_complex_expressions.js | 2 +- .../interpolation_custom_config.js | 4 ++-- .../interpolation_nested_context.js | 4 ++-- .../element_attributes/meaning_description.js | 2 +- .../element_attributes/ng-template_basic.js | 2 +- .../ng-template_interpolation.js | 2 +- .../ng-template_interpolation_structural.js | 2 +- .../ng-template_structural.js | 2 +- .../element_attributes/static_attributes.js | 2 +- .../static_attributes_structural.js | 2 +- .../icu_logic/bare_icu.js | 2 +- .../icu_logic/custom_interpolation.js | 2 +- .../icu_logic/different_contexts.js | 2 +- .../icu_logic/expressions.js | 2 +- .../icu_logic/html_content.js | 2 +- .../icu_logic/icu_only.js | 4 ++-- .../icu_logic/icu_with_interpolations.js | 2 +- .../icu_logic/multiple_icus.js | 2 +- .../icu_logic/named_interpolations.js | 2 +- .../icu_logic/nested_icu_in_other_block.js | 2 +- .../icu_logic/nested_icus.js | 2 +- .../icu_logic/shared_placeholder.js | 2 +- .../icu_logic/single_icu.js | 2 +- .../r3_view_compiler_i18n/multiple_pipes.js | 2 +- .../namespaces/foreign_object.js | 2 +- .../namespaces/namespaced_div.js | 2 +- .../nested_nodes/bindings_in_content.js | 4 ++-- .../nested_nodes/directives.js | 2 +- .../nested_nodes/event_listeners.js | 2 +- .../interpolation_complex_expressions.js | 2 +- .../interpolation_custom_config.js | 2 +- .../nested_nodes/named_interpolations.js | 2 +- .../nested_nodes/nested_elements.js | 2 +- .../nested_elements_with_i18n_attributes.js | 2 +- .../nested_nodes/nested_templates.js | 2 +- .../nested_nodes/nested_templates_context.js | 2 +- .../nested_nodes/plain_text_messages.js | 2 +- .../nested_nodes/self_closing.js | 2 +- .../ng-container_ng-template/bare_icus.js | 2 +- .../child_elements.js | 2 +- .../ng-container_ng-template/icus.js | 2 +- .../nested_templates.js | 2 +- .../ng-container_with_non_text_content.js | 2 +- .../self_closing_ng-container.js | 2 +- .../self_closing_tags.js | 4 ++-- .../single_ng-container.js | 2 +- .../single_ng-template.js | 2 +- .../structural_directives.js | 2 +- .../repeated_placeholder.js | 2 +- .../icu_only.js | 2 +- .../ng-container_ng-template.js | 2 +- .../self-closing_i18n_instructions/styles.js | 2 +- .../text_only_content.js | 4 ++-- .../preserve_inner_content.js | 2 +- .../inline_templates/GOLDEN_PARTIAL.js | 24 +++++++++---------- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 20 ++++++++-------- .../test/ngtsc/standalone_spec.ts | 4 ++-- .../compiler/src/injectable_compiler_2.ts | 12 ++++------ .../compiler/src/output/abstract_emitter.ts | 8 +++++++ packages/compiler/src/render3/r3_factory.ts | 2 +- packages/compiler/src/render3/util.ts | 4 ++-- .../compiler/src/render3/view/compiler.ts | 16 ++++++------- 87 files changed, 147 insertions(+), 151 deletions(-) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/GOLDEN_PARTIAL.js index 7aeb6fddd08219..d1b8e0d1973478 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/GOLDEN_PARTIAL.js @@ -8,7 +8,7 @@ export class HostBindingComp { HostBindingComp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: HostBindingComp, deps: [], target: i0.ɵɵFactoryTarget.Component }); HostBindingComp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: HostBindingComp, selector: "host-binding-comp", ngImport: i0, template: ` - `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return MyForwardDirective; }), selector: "my-forward-directive" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => MyForwardDirective), selector: "my-forward-directive" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: HostBindingComp, decorators: [{ type: Component, args: [{ @@ -60,7 +60,7 @@ export class HostBindingComp { HostBindingComp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: HostBindingComp, deps: [], target: i0.ɵɵFactoryTarget.Component }); HostBindingComp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: HostBindingComp, selector: "host-binding-comp", ngImport: i0, template: `
...
- `, isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(function () { return MyForwardPipe; }), name: "my_forward_pipe" }] }); + `, isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(() => MyForwardPipe), name: "my_forward_pipe" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: HostBindingComp, decorators: [{ type: Component, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_directive.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_directive.js index 0f299e46f3f259..ed513d2bdd928e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_directive.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_directive.js @@ -1,3 +1,3 @@ // ... -dependencies: function () { return [MyForwardDirective]; } +dependencies: () => [MyForwardDirective] // ... diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_pipe.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_pipe.js index 51551d68481d3e..84493bb312b980 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_pipe.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/forward_referenced_pipe.js @@ -1,3 +1,3 @@ // ... -dependencies: function () { return [MyForwardPipe]; } +dependencies: () => [MyForwardPipe] // ... diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/GOLDEN_PARTIAL.js index a48feedef11c7d..ee9f85aa869bad 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/GOLDEN_PARTIAL.js @@ -34,7 +34,7 @@ export class ViewQueryComponent { ViewQueryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ViewQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ViewQueryComponent, selector: "view-query-component", viewQueries: [{ propertyName: "someDir", first: true, predicate: SomeDirective, descendants: true }, { propertyName: "someDirs", predicate: SomeDirective, descendants: true }], ngImport: i0, template: `
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, decorators: [{ type: Component, args: [{ @@ -87,9 +87,9 @@ import * as i0 from "@angular/core"; export class ViewQueryComponent { } ViewQueryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -ViewQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ViewQueryComponent, selector: "view-query-component", viewQueries: [{ propertyName: "someDir", first: true, predicate: i0.forwardRef(function () { return SomeDirective; }), descendants: true }, { propertyName: "someDirList", predicate: i0.forwardRef(function () { return SomeDirective; }), descendants: true }], ngImport: i0, template: ` +ViewQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ViewQueryComponent, selector: "view-query-component", viewQueries: [{ propertyName: "someDir", first: true, predicate: i0.forwardRef(() => SomeDirective), descendants: true }, { propertyName: "someDirList", predicate: i0.forwardRef(() => SomeDirective), descendants: true }], ngImport: i0, template: `
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, decorators: [{ type: Component, args: [{ @@ -256,7 +256,7 @@ export class ViewQueryComponent { ViewQueryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); ViewQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ViewQueryComponent, selector: "view-query-component", viewQueries: [{ propertyName: "someDir", first: true, predicate: SomeDirective, descendants: true, static: true }, { propertyName: "foo", first: true, predicate: ["foo"], descendants: true }], ngImport: i0, template: `
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ViewQueryComponent, decorators: [{ type: Component, args: [{ @@ -451,7 +451,7 @@ MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(function () { return ContentQueryComponent; }), selector: "content-query-component" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(() => ContentQueryComponent), selector: "content-query-component" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ type: Component, args: [{ @@ -504,7 +504,7 @@ import * as i0 from "@angular/core"; export class ContentQueryComponent { } ContentQueryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ContentQueryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -ContentQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ContentQueryComponent, selector: "content-query-component", queries: [{ propertyName: "someDir", first: true, predicate: i0.forwardRef(function () { return SomeDirective; }), descendants: true }, { propertyName: "someDirList", predicate: i0.forwardRef(function () { return SomeDirective; }) }], ngImport: i0, template: ` +ContentQueryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: ContentQueryComponent, selector: "content-query-component", queries: [{ propertyName: "someDir", first: true, predicate: i0.forwardRef(() => SomeDirective), descendants: true }, { propertyName: "someDirList", predicate: i0.forwardRef(() => SomeDirective) }], ngImport: i0, template: `
`, isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: ContentQueryComponent, decorators: [{ @@ -529,7 +529,7 @@ MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(function () { return ContentQueryComponent; }), selector: "content-query-component" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(() => ContentQueryComponent), selector: "content-query-component" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ type: Component, args: [{ @@ -700,7 +700,7 @@ MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-
- `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return SomeDirective; }), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(function () { return ContentQueryComponent; }), selector: "content-query-component" }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => SomeDirective), selector: "[someDir]" }, { kind: "component", type: i0.forwardRef(() => ContentQueryComponent), selector: "content-query-component" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ type: Component, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/static_view_query.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/static_view_query.js index 187fdea1620553..3d18de04a3d276 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/static_view_query.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/static_view_query.js @@ -22,6 +22,6 @@ ViewQueryComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ $r3$.ɵɵelement(0, "div", 0); } }, - dependencies: function () { return [SomeDirective]; }, + dependencies: () => [SomeDirective], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/view_query_for_directive.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/view_query_for_directive.js index 25ee6a9d625d67..74039d84cd4079 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/view_query_for_directive.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/view_query_for_directive.js @@ -20,6 +20,6 @@ ViewQueryComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ $r3$.ɵɵelement(0, "div", 0); } }, - dependencies: function () { return [SomeDirective]; }, + dependencies: () => [SomeDirective], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/GOLDEN_PARTIAL.js index 7499bac48d6864..e9de539e4337b0 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/GOLDEN_PARTIAL.js @@ -349,7 +349,7 @@ import * as i0 from "@angular/core"; export class TestComponent { } TestComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestComponent, isStandalone: true, selector: "test", ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(function () { return StandaloneComponent; }), selector: "other-standalone" }] }); +TestComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestComponent, isStandalone: true, selector: "test", ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => StandaloneComponent), selector: "other-standalone" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestComponent, decorators: [{ type: Component, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/forward_ref.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/forward_ref.js index c9d1decce375ee..a30684c481ba78 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/forward_ref.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/standalone/forward_ref.js @@ -12,8 +12,6 @@ TestComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ i0.ɵɵelement(0, "other-standalone"); } }, - dependencies: function () { - return [StandaloneComponent]; - }, + dependencies: () => [StandaloneComponent], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js index 467236df0d802d..755946f73065fa 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/GOLDEN_PARTIAL.js @@ -53,7 +53,7 @@ export class MyComponent { } } MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: ``, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return ForOfDirective; }), selector: "[forOf]", inputs: ["forOf"] }] }); +MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: ``, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => ForOfDirective), selector: "[forOf]", inputs: ["forOf"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ type: Component, args: [{ @@ -144,7 +144,7 @@ export class MyComponent { } } MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: `
  • {{item.name}}
`, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return ForOfDirective; }), selector: "[forOf]", inputs: ["forOf"] }] }); +MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: `
  • {{item.name}}
`, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => ForOfDirective), selector: "[forOf]", inputs: ["forOf"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ type: Component, args: [{ @@ -248,7 +248,7 @@ MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: " - `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return ForOfDirective; }), selector: "[forOf]", inputs: ["forOf"] }] }); + `, isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => ForOfDirective), selector: "[forOf]", inputs: ["forOf"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ type: Component, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/let_variable_and_reference.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/let_variable_and_reference.js index 4337ece3ff4f4b..4c274f22dd5b2b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/let_variable_and_reference.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/let_variable_and_reference.js @@ -28,6 +28,6 @@ MyComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ $r3$.ɵɵproperty("forOf", ctx.items); } }, - dependencies: function() { return [ForOfDirective]; }, + dependencies: () => [ForOfDirective], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/parent_template_variable.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/parent_template_variable.js index 2df90ffc77f448..a012ab5369743e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/parent_template_variable.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/parent_template_variable.js @@ -48,6 +48,6 @@ MyComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ $r3$.ɵɵproperty("forOf", ctx.items); } }, - dependencies: function () { return [ForOfDirective]; }, + dependencies: () => [ForOfDirective], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/svg_embedded_view.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/svg_embedded_view.js index 994860a4307863..cc177dfb1d25f6 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/svg_embedded_view.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/template_variables/svg_embedded_view.js @@ -25,6 +25,6 @@ MyComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ $r3$.ɵɵproperty("forOf", ctx.items); } }, - dependencies: function() { return [ForOfDirective]; }, + dependencies: () => [ForOfDirective], encapsulation: 2 }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js index 7a6502772646b7..77e3de090ec883 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/GOLDEN_PARTIAL.js @@ -552,7 +552,7 @@ export function provideModule() { export class TestModule { } TestModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -TestModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestModule, imports: function () { return [ForwardModule]; } }); +TestModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestModule, imports: () => [ForwardModule] }); TestModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestModule, imports: [provideModule()] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestModule, decorators: [{ type: NgModule, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.js index 5d00a3359eecc2..852ecc723c135e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.js @@ -14,12 +14,12 @@ BaseModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [Service] }) export class BasicModule extends BaseModule { } -BasicModule.ɵfac = /*@__PURE__*/ function () { +BasicModule.ɵfac = /*@__PURE__*/ (() => { let ɵBasicModule_BaseFactory; return function BasicModule_Factory(t) { return (ɵBasicModule_BaseFactory || (ɵBasicModule_BaseFactory = i0.ɵɵgetInheritedFactory(BasicModule)))(t || BasicModule); }; -}(); +})(); BasicModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: BasicModule }); BasicModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({}); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.local.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.local.js index 5d00a3359eecc2..852ecc723c135e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.local.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/ng_modules/inheritance.local.js @@ -14,12 +14,12 @@ BaseModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [Service] }) export class BasicModule extends BaseModule { } -BasicModule.ɵfac = /*@__PURE__*/ function () { +BasicModule.ɵfac = /*@__PURE__*/ (() => { let ɵBasicModule_BaseFactory; return function BasicModule_Factory(t) { return (ɵBasicModule_BaseFactory || (ɵBasicModule_BaseFactory = i0.ɵɵgetInheritedFactory(BasicModule)))(t || BasicModule); }; -}(); +})(); BasicModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: BasicModule }); BasicModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({}); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js index 057dd99ee73cef..f46b77826f14ea 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/GOLDEN_PARTIAL.js @@ -9,7 +9,7 @@ export class MyApp { } } MyApp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "my-app", ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(function () { return TodoComponent; }), selector: "todo", inputs: ["data"] }] }); +MyApp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyApp, selector: "my-app", ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "component", type: i0.forwardRef(() => TodoComponent), selector: "todo", inputs: ["data"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyApp, decorators: [{ type: Component, args: [{ selector: 'my-app', template: '' }] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js index 3730c3f84f9f3c..fc63fadcb73100 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/GOLDEN_PARTIAL.js @@ -261,7 +261,7 @@ import * as i0 from "@angular/core"; class SomeProvider { } SomeProvider.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: SomeProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -SomeProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: SomeProvider, providedIn: 'root', useClass: i0.forwardRef(function () { return SomeProviderImpl; }) }); +SomeProvider.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: SomeProvider, providedIn: 'root', useClass: i0.forwardRef(() => SomeProviderImpl) }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: SomeProvider, decorators: [{ type: Injectable, args: [{ providedIn: 'root', useClass: forwardRef(() => SomeProviderImpl) }] @@ -295,7 +295,7 @@ export class Service { constructor(dep) { } } Service.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: Service, deps: [{ token: Dep }], target: i0.ɵɵFactoryTarget.Injectable }); -Service.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: Service, providedIn: i0.forwardRef(function () { return Mod; }) }); +Service.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: Service, providedIn: i0.forwardRef(() => Mod) }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: Service, decorators: [{ type: Injectable, args: [{ providedIn: forwardRef(() => Mod) }] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/providedin_forwardref.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/providedin_forwardref.js index 9dd4b11fa26559..87af653f908519 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/providedin_forwardref.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/providedin_forwardref.js @@ -1,5 +1,5 @@ Service.ɵfac = function Service_Factory(t) { return new (t || Service)($i0$.ɵɵinject(Dep)); }; -Service.ɵprov = /*@__PURE__*/ $i0$.ɵɵdefineInjectable({ token: Service, factory: Service.ɵfac, providedIn: $i0$.forwardRef(function () { return Mod; }) }); +Service.ɵprov = /*@__PURE__*/ $i0$.ɵɵdefineInjectable({ token: Service, factory: Service.ɵfac, providedIn: $i0$.forwardRef(() => Mod) }); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && $i0$.ɵsetClassMetadata(Service, [{ type: Injectable, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_forwardref.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_forwardref.js index 0c6b66fb6da5de..cb3eba00b5f370 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_forwardref.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_forwardref.js @@ -1,7 +1,5 @@ SomeProvider.ɵprov = /*@__PURE__*/ $r3$.ɵɵdefineInjectable({ token: SomeProvider, - factory: function(t) { - return SomeProviderImpl.ɵfac(t); - }, + factory: t => SomeProviderImpl.ɵfac(t), providedIn: 'root' }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_without_deps.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_without_deps.js index 5f2900e67b6bb4..e39ecdbbfe97a8 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_without_deps.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/useclass_without_deps.js @@ -1,7 +1,5 @@ MyService.ɵprov = /*@__PURE__*/ $r3$.ɵɵdefineInjectable({ token: MyService, - factory: function(t) { - return MyAlternateService.ɵfac(t); - }, + factory: t => MyAlternateService.ɵfac(t), providedIn: 'root' }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/usefactory_without_deps.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/usefactory_without_deps.js index 367f71340cef55..b93d4ba25c7616 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/usefactory_without_deps.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_di/di/usefactory_without_deps.js @@ -1,7 +1,5 @@ MyService.ɵprov = /*@__PURE__*/ $r3$.ɵɵdefineInjectable({ token: MyService, - factory: function() { - return alternateFactory(); - }, + factory: () => alternateFactory(), providedIn: 'root' }); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_directives/host_directives/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_directives/host_directives/GOLDEN_PARTIAL.js index f91dec113e5f78..5334a84994725b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_directives/host_directives/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_directives/host_directives/GOLDEN_PARTIAL.js @@ -126,7 +126,7 @@ import * as i0 from "@angular/core"; export class MyComponent { } MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); -MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", hostDirectives: [{ directive: i0.forwardRef(function () { return DirectiveB; }) }], ngImport: i0, template: '', isInline: true }); +MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", hostDirectives: [{ directive: i0.forwardRef(() => DirectiveB) }], ngImport: i0, template: '', isInline: true }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ type: Component, args: [{ @@ -138,7 +138,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE export class DirectiveB { } DirectiveB.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DirectiveB, deps: [], target: i0.ɵɵFactoryTarget.Directive }); -DirectiveB.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: DirectiveB, isStandalone: true, hostDirectives: [{ directive: i0.forwardRef(function () { return DirectiveA; }), inputs: ["value", "value"] }], ngImport: i0 }); +DirectiveB.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: DirectiveB, isStandalone: true, hostDirectives: [{ directive: i0.forwardRef(() => DirectiveA), inputs: ["value", "value"] }], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: DirectiveB, decorators: [{ type: Directive, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/GOLDEN_PARTIAL.js index 8030dbaa4ad6c1..54fe5bff103c88 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/GOLDEN_PARTIAL.js @@ -56,7 +56,7 @@ MyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0. MyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: MyComponent, selector: "my-component", ngImport: i0, template: `
{{ valueA | pipeA }} and {{ valueB | pipeB }}
{{ valueA | pipeA }} and {{ valueB | pipeB }} and {{ valueC | pipeC }}
-`, isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(function () { return PipeA; }), name: "pipeA" }, { kind: "pipe", type: i0.forwardRef(function () { return PipeB; }), name: "pipeB" }, { kind: "pipe", type: i0.forwardRef(function () { return PipeC; }), name: "pipeC" }] }); +`, isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(() => PipeA), name: "pipeA" }, { kind: "pipe", type: i0.forwardRef(() => PipeB), name: "pipeB" }, { kind: "pipe", type: i0.forwardRef(() => PipeC), name: "pipeC" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: MyComponent, decorators: [{ type: Component, args: [{ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node.js index 18c67a6c218602..3a9fd10e174cf2 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/i18n_root_node.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('Element title', [], {}, {meaning: 'm', desc: 'd'}) __i18nMsg__('Some content', [], {}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic.js index 0b22c1d04597a9..408753ab6d6245 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_basic.js @@ -1,6 +1,6 @@ decls: 5, vars: 8, -consts: function() { +consts: () => { __i18nMsg__('static text', [], {}, {}) __i18nMsg__('intro {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ valueA | uppercase }}'}}, {meaning: 'm', desc: 'd'}) __i18nMsg__('{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ valueB }}'}}, {meaning: 'm1', desc: 'd1'}) @@ -31,4 +31,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵi18nExp(ctx.valueA)(ctx.valueB)(ctx.valueA + ctx.valueB)(ctx.valueC); $r3$.ɵɵi18nApply(4); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions.js index f43ccc95b90841..41257ac0c31268 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_complex_expressions.js @@ -1,6 +1,6 @@ decls: 2, vars: 1, -consts: function() { +consts: () => { __i18nMsg__('{$interpolation} title', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{valueA.getRawValue()?.getTitle()}}'}}, {}) return [ [__AttributeMarker.I18n__, "title"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config.js index 171abaf1afb30d..4353958af65e9a 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_custom_config.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('intro {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{% valueA | uppercase %}'}}, {meaning: 'm', desc: 'd'}) return [ [__AttributeMarker.I18n__, "title"], @@ -16,4 +16,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵi18nExp($r3$.ɵɵpipeBind1(1, 1, ctx.valueA)); $r3$.ɵɵi18nApply(2); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context.js index 579bfe70be81af..da132ba5c942e3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/interpolation_nested_context.js @@ -15,7 +15,7 @@ function MyComponent_div_0_Template(rf, ctx) { … decls: 1, vars: 1, -consts: function() { +consts: () => { __i18nMsg__('different scope {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ outer | uppercase }}'}}, {meaning: 'm', desc: 'd'}) return [ [__AttributeMarker.Template__, "ngFor", "ngForOf"], @@ -30,4 +30,4 @@ template: function MyComponent_Template(rf, ctx) { if (rf & 2) { $r3$.ɵɵproperty("ngForOf", ctx.items); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description.js index 496deb99b9bebf..a4c361d2d5ff8d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/meaning_description.js @@ -1,5 +1,5 @@ consts: - function() { + () => { __i18nMsg__('Content A', [], {}, {id: 'idA', meaning: 'meaningA', desc: 'descA'}) __i18nMsg__('Title B', [], {}, {id: 'idB', meaning: 'meaningB', desc: 'descB'}) __i18nMsg__('Title C', [], {}, {meaning: 'meaningC'}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_basic.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_basic.js index 379cd857ff8065..3eab282cce8ecb 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_basic.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_basic.js @@ -1,4 +1,4 @@ -consts: function () { +consts: () => { __i18nMsg__('Hello', [], {}, {}) return [ ["title", $i18n_0$] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation.js index f8a513dcd0fb56..e00e7454b4f1dc 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('Hello {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ name }}'}}, {}) return [ [__AttributeMarker.Bindings__, "title"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural.js index d93c897c84faf3..2d8d727aebfedd 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_interpolation_structural.js @@ -10,7 +10,7 @@ function MyComponent_0_Template(rf, ctx) { } } … -consts: function() { +consts: () => { __i18nMsg__('Hello {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ name }}'}}, {}) return [ [__AttributeMarker.Template__, "ngIf"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_structural.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_structural.js index 72030a85c14602..7a6fd9c6c80572 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_structural.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/ng-template_structural.js @@ -9,7 +9,7 @@ function MyComponent_0_Template(rf, ctx) { } } … -consts: function() { +consts: () => { __i18nMsg__('Hello', [], {}, {}) return [ // NOTE: AttributeMarker.Template = 4 diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes.js index 953e48efc10547..5d5e89c22342a9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('introduction', [], {}, {meaning: 'm', desc: 'd'}) return [ ["id", "static", "title", $i18n_0$] diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural.js index aafa48750da495..bd5f84d9cf50ec 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/element_attributes/static_attributes_structural.js @@ -4,7 +4,7 @@ function MyComponent_div_0_Template(rf, ctx) { } } … -consts: function() { +consts: () => { __i18nMsg__('introduction', [], {}, {meaning: 'm', desc: 'd'}) return [ ["id", "static", "title", $i18n_0$, __AttributeMarker.Template__, "ngIf"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js index ed0d0274127070..3e697e2ba62813 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/bare_icu.js @@ -32,7 +32,7 @@ function $MyComponent_div_3_Template$(rf, ctx) { … decls: 4, vars: 3, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 0 {no emails} 1 {one email} other {{INTERPOLATION} emails}}', [ ['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD1\uFFFD`]], {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/custom_interpolation.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/custom_interpolation.js index c6b3556fa89003..09d4f83e45a7c5 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/custom_interpolation.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/custom_interpolation.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {{INTERPOLATION}}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD1\uFFFD`]], {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/different_contexts.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/different_contexts.js index bd1c56cd7586bd..8daaa7b52031a9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/different_contexts.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/different_contexts.js @@ -14,7 +14,7 @@ function MyComponent_span_2_Template(rf, ctx) { … decls: 3, vars: 2, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0:1\uFFFD`]], {}) __i18nMsg__(' {$icu} {$startTagSpan} {$icu_1} {$closeTagSpan}', [['closeTagSpan', String.raw`\uFFFD/#1:1\uFFFD\uFFFD/*2:1\uFFFD`], ['icu', '$i18n_0$', '7670372064920373295'], ['icu_1', '$i18n_1$', '4590395557003415341'], ['startTagSpan', String.raw`\uFFFD*2:1\uFFFD\uFFFD#1:1\uFFFD`]], {original_code: {'closeTagSpan': '', 'icu': '{gender, select, male {male} female {female} other {other}}', 'icu_1': '{age, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}', 'startTagSpan': ''}}, {}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/expressions.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/expressions.js index d069ca9155de24..20e8f1d00de90d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/expressions.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/expressions.js @@ -1,6 +1,6 @@ decls: 2, vars: 2, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male of age: {INTERPOLATION}} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD1\uFFFD`]], {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/html_content.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/html_content.js index f336209017c00f..ba0b050456358b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/html_content.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/html_content.js @@ -1,6 +1,6 @@ decls: 5, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male - {START_BOLD_TEXT}male{CLOSE_BOLD_TEXT}} female {female {START_BOLD_TEXT}female{CLOSE_BOLD_TEXT}} other {{START_TAG_DIV}{START_ITALIC_TEXT}other{CLOSE_ITALIC_TEXT}{CLOSE_TAG_DIV}}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['START_BOLD_TEXT', ''], ['CLOSE_BOLD_TEXT', ''], ['START_ITALIC_TEXT', ''], ['CLOSE_ITALIC_TEXT', ''], ['START_TAG_DIV', '
'], ['CLOSE_TAG_DIV', '
']], {}) __i18nMsg__(' {$icu} {$startBoldText}Other content{$closeBoldText}{$startTagDiv}{$startItalicText}Another content{$closeItalicText}{$closeTagDiv}', [['closeBoldText', String.raw`\uFFFD/#2\uFFFD`], ['closeItalicText', String.raw`\uFFFD/#4\uFFFD`], ['closeTagDiv', String.raw`\uFFFD/#3\uFFFD`], ['icu', '$I18N_1$', '4731057199984078679'], ['startBoldText', String.raw`\uFFFD#2\uFFFD`], ['startItalicText', String.raw`\uFFFD#4\uFFFD`], ['startTagDiv', String.raw`\uFFFD#3\uFFFD`]], {original_code: {'closeBoldText': '', 'closeItalicText': '', 'closeTagDiv': '
', 'icu': '{gender, select, male {male - male} female {female female} other {
other
}}', 'startBoldText': '', 'startItalicText': '', 'startTagDiv': '
'}}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_only.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_only.js index cf9cc31ce65970..914f7c23158895 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_only.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_only.js @@ -1,6 +1,6 @@ decls: 1, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) return [ $i18n_0$ @@ -14,4 +14,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵi18nExp(ctx.age); $r3$.ɵɵi18nApply(0); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_with_interpolations.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_with_interpolations.js index cd5adc5efebcc1..e4c60035750a5d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_with_interpolations.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/icu_with_interpolations.js @@ -14,7 +14,7 @@ function MyComponent_span_2_Template(rf, ctx) { … decls: 3, vars: 4, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male {INTERPOLATION}} female {female {INTERPOLATION_1}} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD1\uFFFD`], ['INTERPOLATION_1', String.raw`\uFFFD2\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other: {INTERPOLATION}}}', [['VAR_SELECT', String.raw`\uFFFD0:1\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD1:1\uFFFD`]], {}) __i18nMsg__(' {$icu} {$startTagSpan} {$icu_1} {$closeTagSpan}', [['closeTagSpan', String.raw`\uFFFD/#1:1\uFFFD\uFFFD/*2:1\uFFFD`], ['icu', '$i18n_0$', '567200399523107034'], ['icu_1', '$i18n_1$', '5762277079421427850'], ['startTagSpan', String.raw`\uFFFD*2:1\uFFFD\uFFFD#1:1\uFFFD`]], {original_code: {'closeTagSpan': '', 'icu': '{gender, select, male {male {{ weight }}} female {female {{ height }}} other {other}}', 'icu_1': '{age, select, 10 {ten} 20 {twenty} 30 {thirty} other {other: {{ otherAge }}}}', 'startTagSpan': ''}}, {}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/multiple_icus.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/multiple_icus.js index fdaca95c5b5ea2..2b6746836d2657 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/multiple_icus.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/multiple_icus.js @@ -1,6 +1,6 @@ decls: 2, vars: 2, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD1\uFFFD`]], {}) __i18nMsg__(' {$icu} {$icu_1} ', [['icu', '$i18n_0$', '7670372064920373295'], ['icu_1', '$i18n_1$', '4590395557003415341']], {original_code: {'icu': '{gender, select, male {male} female {female} other {other}}', 'icu_1': '{age, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}'}}, {}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/named_interpolations.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/named_interpolations.js index 68ba7c8bf58442..de0f5526adb1a5 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/named_interpolations.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/named_interpolations.js @@ -1,6 +1,6 @@ decls: 2, vars: 4, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male {PH_A}} female {female {PH_B}} other {other {PH_WITH_SPACES}}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['PH_A', String.raw`\uFFFD1\uFFFD`], ['PH_B', String.raw`\uFFFD2\uFFFD`], ['PH_WITH_SPACES', String.raw`\uFFFD3\uFFFD`]], {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icu_in_other_block.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icu_in_other_block.js index 39756284764a37..74a2a7e5f914a4 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icu_in_other_block.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icu_in_other_block.js @@ -1,6 +1,6 @@ decls: 2, vars: 3, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_PLURAL, plural, =0 {zero} =2 {{INTERPOLATION} {VAR_SELECT, select, cat {cats} dog {dogs} other {animals}} !} other {other - {INTERPOLATION}}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['VAR_PLURAL', String.raw`\uFFFD1\uFFFD`], ['INTERPOLATION', String.raw`\uFFFD2\uFFFD`]], {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icus.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icus.js index 769a0a0c3ca62c..5fb1cc639b3a03 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icus.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/nested_icus.js @@ -1,6 +1,6 @@ decls: 2, vars: 2, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT_1, select, male {male of age: {VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`], ['VAR_SELECT_1', String.raw`\uFFFD1\uFFFD`]], {}) __i18nMsg__(' {$icu} ', [['icu', '$i18n_0$', '2960440207608193372']], {original_code: {'icu': '{gender, select,\\n male {male of age: {age, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}}\\n female {female}\\n other {other}\\n }'}}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/shared_placeholder.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/shared_placeholder.js index dbadd9db3f6e14..2528eca544087e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/shared_placeholder.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/shared_placeholder.js @@ -14,7 +14,7 @@ function MyComponent_div_3_Template(rf, ctx) { … decls: 4, vars: 3, -consts: function() { +consts: () => { // NOTE: Keeping raw content here to illustrate the difference in placeholders generated for goog.getMsg and $localize calls (see last i18n block). let $I18N_1$; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) { diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/single_icu.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/single_icu.js index c66286545e8e91..92843a5c6dc9ae 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/single_icu.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/icu_logic/single_icu.js @@ -1,6 +1,6 @@ decls: 2, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nMsg__('before {$icu} after', [['icu', '$i18n_0$', '7670372064920373295']], {original_code: {'icu': '{gender, select, male {male} female {female} other {other}}'}}, {}) return [$i18n_1$]; diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/multiple_pipes.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/multiple_pipes.js index 3612f92ff775e1..e36762a0141a6e 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/multiple_pipes.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/multiple_pipes.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('{$interpolation} and {$interpolation_1}', [['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`]], {original_code: {'interpolation': '{{ valueA | pipeA }}', 'interpolation_1': '{{ valueB | pipeB }}'}}, {}) __i18nMsg__('{$startTagSpan}{$interpolation}{$closeTagSpan} and {$interpolation_1} {$startTagSpan}and {$interpolation_2}{$closeTagSpan}', [['closeTagSpan', String.raw`[\uFFFD/#6\uFFFD|\uFFFD/#9\uFFFD]`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`], ['interpolation_2', String.raw`\uFFFD2\uFFFD`], ['startTagSpan', String.raw`[\uFFFD#6\uFFFD|\uFFFD#9\uFFFD]`]], {original_code: {'closeTagSpan': '', 'interpolation': '{{ valueA | pipeA }}', 'interpolation_1': '{{ valueB | pipeB }}', 'interpolation_2': '{{ valueC | pipeC }}', 'startTagSpan': ''}}, {}) … diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js index 2b7893d4527c35..b03cef3a4c9d80 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/foreign_object.js @@ -1,5 +1,5 @@ -consts: function() { +consts: () => { let $I18N_0$; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) { /** diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js index 0eb1462ff5fda0..1bbd0327bd7971 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/namespaces/namespaced_div.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { let $I18N_0$; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) { /** diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/bindings_in_content.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/bindings_in_content.js index 7ee27249825401..eafc76b8673c55 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/bindings_in_content.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/bindings_in_content.js @@ -1,6 +1,6 @@ decls: 7, vars: 5, -consts: function() { +consts: () => { __i18nMsg__('My i18n block #{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ one }}'}}, {}) __i18nMsg__('My i18n block #{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ two | uppercase }}'}}, {}) __i18nMsg__('My i18n block #{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ three + four + five }}'}}, {}) @@ -34,4 +34,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵi18nExp(ctx.three + ctx.four + ctx.five); $r3$.ɵɵi18nApply(6); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js index 460f180a8a0faa..27b1636efe8ee3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/directives.js @@ -16,7 +16,7 @@ function MyComponent_div_0_Template(rf, ctx) { … decls: 1, vars: 1, -consts: function() { +consts: () => { __i18nMsg__('Some other content {$startTagSpan}{$interpolation}{$closeTagSpan}', [['closeTagSpan', String.raw`\uFFFD/#2\uFFFD`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['startTagSpan', String.raw`\uFFFD#2\uFFFD`]], {original_code: {'closeTagSpan': '', 'interpolation': '{{ valueA }}', 'startTagSpan': '',}}, {}) return [ [__AttributeMarker.Template__, "ngIf"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners.js index 4ac4eaacd0c8ac..554a781298b639 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/event_listeners.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('Hello', [], {}, {}) return [ [__AttributeMarker.Bindings__, "click"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_complex_expressions.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_complex_expressions.js index e829b18a1450d6..ee4b2d4c3aadbe 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_complex_expressions.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_complex_expressions.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__(' {$interpolation} {$interpolation_1} {$interpolation_2} ', [['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`], ['interpolation_2', String.raw`\uFFFD2\uFFFD`]], {original_code: {'interpolation': '{{ valueA | async }}', 'interpolation_1': '{{ valueA?.a?.b }}', 'interpolation_2': '{{ valueA.getRawValue()?.getTitle() }}'}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_custom_config.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_custom_config.js index 5439c4d938ed6e..5b234bd2c3a80c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_custom_config.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/interpolation_custom_config.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{% valueA %}'}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/named_interpolations.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/named_interpolations.js index c2ebae123c40ca..ef665ddffddff3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/named_interpolations.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/named_interpolations.js @@ -1,7 +1,7 @@ // NOTE: Keeping raw content (avoiding `__i18nMsg__` macro) to illustrate how named interpolations are generated. decls: 2, vars: 2, -consts: function() { +consts: () => { let $I18N_0$; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) { /** diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements.js index 522ffb96126520..541ed5583ccea9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements.js @@ -1,6 +1,6 @@ decls: 9, vars: 5, -consts: function() { +consts: () => { __i18nMsg__(' My i18n block #{$interpolation} {$startTagSpan}Plain text in nested element{$closeTagSpan}', [['closeTagSpan', String.raw`\uFFFD/#2\uFFFD`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['startTagSpan', String.raw`\uFFFD#2\uFFFD`]], {original_code: {'closeTagSpan': '', 'interpolation': '{{ one }}', 'startTagSpan': ''}}, {}) __i18nMsgWithPostprocess__(' My i18n block #{$interpolation} {$startTagDiv}{$startTagDiv}{$startTagSpan} More bindings in more nested element: {$interpolation_1} {$closeTagSpan}{$closeTagDiv}{$closeTagDiv}', [['closeTagDiv', String.raw`[\uFFFD/#7\uFFFD|\uFFFD/#6\uFFFD]`], ['closeTagSpan', String.raw`\uFFFD/#8\uFFFD`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`], ['startTagDiv', String.raw`[\uFFFD#6\uFFFD|\uFFFD#7\uFFFD]`], ['startTagSpan', String.raw`\uFFFD#8\uFFFD`]], {original_code: {'closeTagDiv': '
', 'closeTagSpan': '', 'interpolation': '{{ two | uppercase }}', 'interpolation_1': '{{ nestedInBlockTwo }}', 'startTagDiv': '
', 'startTagSpan': ''}}, {}, []) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes.js index ac6e26b110ef25..7d784574de9ab9 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_elements_with_i18n_attributes.js @@ -1,6 +1,6 @@ decls: 9, vars: 7, -consts: function() { +consts: () => { __i18nMsg__('Span title {$interpolation} and {$interpolation_1}', [['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`]], {original_code: {'interpolation': '{{ valueB }}', 'interpolation_1': '{{ valueC }}'}}, {}) __i18nMsg__(' My i18n block #1 with value: {$interpolation} {$startTagSpan} Plain text in nested element (block #1) {$closeTagSpan}',[['closeTagSpan', String.raw`\uFFFD/#2\uFFFD`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['startTagSpan', String.raw`\uFFFD#2\uFFFD`]], {original_code: {'closeTagSpan': '', 'interpolation': '{{ valueA }}', 'startTagSpan': ''}}, {}) __i18nMsg__('Span title {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ valueE }}'}}, {}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js index 2b6b4f5528bd8c..62dd7111aaf793 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates.js @@ -17,7 +17,7 @@ function MyComponent_div_2_Template(rf, ctx) { … decls: 3, vars: 1, -consts: function() { +consts: () => { __i18nMsg__(' Some other content {$interpolation} {$startTagDiv} More nested levels with bindings {$interpolation_1} {$closeTagDiv}', [['closeTagDiv', String.raw`\uFFFD/#3\uFFFD`], ['interpolation', String.raw`\uFFFD0\uFFFD`], ['interpolation_1', String.raw`\uFFFD1\uFFFD`], ['startTagDiv', String.raw`\uFFFD#3\uFFFD`]], {original_code: {'closeTagDiv': '
', 'interpolation': '{{ valueA }}', 'interpolation_1': '{{ valueB | uppercase }}', 'startTagDiv': '
'}}, {}) return [ [__AttributeMarker.Template__, "ngIf"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates_context.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates_context.js index 6afa93a1aea8eb..788352c371e527 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates_context.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/nested_templates_context.js @@ -50,7 +50,7 @@ function MyComponent_div_3_Template(rf, ctx) { … decls: 4, vars: 2, -consts: function() { +consts: () => { __i18nMsgWithPostprocess__(' Some content {$startTagDiv_2} Some other content {$interpolation} {$startTagDiv} More nested levels with bindings {$interpolation_1} {$startTagDiv_1} Content inside sub-template {$interpolation_2} {$startTagDiv} Bottom level element {$interpolation_3} {$closeTagDiv}{$closeTagDiv}{$closeTagDiv}{$closeTagDiv}{$startTagDiv_3} Some other content {$interpolation_4} {$startTagDiv} More nested levels with bindings {$interpolation_5} {$closeTagDiv}{$closeTagDiv}', [['closeTagDiv', String.raw`[\uFFFD/#2:2\uFFFD|\uFFFD/#1:2\uFFFD\uFFFD/*4:2\uFFFD|\uFFFD/#2:1\uFFFD|\uFFFD/#1:1\uFFFD\uFFFD/*2:1\uFFFD|\uFFFD/#2:3\uFFFD|\uFFFD/#1:3\uFFFD\uFFFD/*3:3\uFFFD]`], ['interpolation', String.raw`\uFFFD0:1\uFFFD`], ['interpolation_1', String.raw`\uFFFD1:1\uFFFD`], ['interpolation_2', String.raw`\uFFFD0:2\uFFFD`], ['interpolation_3', String.raw`\uFFFD1:2\uFFFD`], ['interpolation_4', String.raw`\uFFFD0:3\uFFFD`], ['interpolation_5', String.raw`\uFFFD1:3\uFFFD`], ['startTagDiv', String.raw`[\uFFFD#2:1\uFFFD|\uFFFD#2:2\uFFFD|\uFFFD#2:3\uFFFD]`], ['startTagDiv_1', String.raw`\uFFFD*4:2\uFFFD\uFFFD#1:2\uFFFD`], ['startTagDiv_2', String.raw`\uFFFD*2:1\uFFFD\uFFFD#1:1\uFFFD`], ['startTagDiv_3', String.raw`\uFFFD*3:3\uFFFD\uFFFD#1:3\uFFFD`]], {original_code: {'closeTagDiv': '
', 'interpolation': '{{ valueA }}', 'interpolation_1': '{{ valueB | uppercase }}', 'interpolation_2': '{{ valueC }}', 'interpolation_3': '{{ valueD }}', 'interpolation_4': '{{ valueE + valueF }}', 'interpolation_5': '{{ valueG | uppercase }}', 'startTagDiv': '
', 'startTagDiv_1': '
', 'startTagDiv_2': '
', 'startTagDiv_3': '
',}}, {}, []) return [ $i18n_0$, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/plain_text_messages.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/plain_text_messages.js index f72e20b4ed66b2..69e0e478ccdd8d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/plain_text_messages.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/plain_text_messages.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('My i18n block #1', [], {}, {}) __i18nMsg__('My i18n block #2', [], {}, {}) __i18nMsg__('My i18n block #3', [], {}, {}) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing.js index df2986de29308c..03cd9d0fd7eec3 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/nested_nodes/self_closing.js @@ -19,7 +19,7 @@ function MyComponent_img_2_Template(rf, ctx) { … decls: 3, vars: 2, -consts: function() { +consts: () => { __i18nMsg__('App logo #{$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ id }}'}}, {}) return [ ["src", "logo.png"], diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/bare_icus.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/bare_icus.js index 8345bfb1e3d652..16c17191168602 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/bare_icus.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/bare_icus.js @@ -11,7 +11,7 @@ function MyComponent_ng_template_0_Template(rf, ctx) { … decls: 3, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/child_elements.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/child_elements.js index 0169657c835025..197d0342102c92 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/child_elements.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/child_elements.js @@ -13,7 +13,7 @@ function MyComponent_ng_template_2_Template(rf, ctx) { … decls: 5, vars: 3, -consts: function() { +consts: () => { __i18nMsg__('{$startTagNgTemplate}Template content: {$interpolation}{$closeTagNgTemplate}{$startTagNgContainer}Container content: {$interpolation_1}{$closeTagNgContainer}', [['closeTagNgContainer', String.raw`\uFFFD/#3\uFFFD`], ['closeTagNgTemplate', String.raw`\uFFFD/*2:1\uFFFD`], ['interpolation', String.raw`\uFFFD0:1\uFFFD`], ['interpolation_1', String.raw`\uFFFD0\uFFFD`], ['startTagNgContainer', String.raw`\uFFFD#3\uFFFD`], ['startTagNgTemplate', String.raw`\uFFFD*2:1\uFFFD`]], {original_code: {'closeTagNgContainer': '', 'closeTagNgTemplate': '', 'interpolation': '{{ valueA | uppercase }}', 'interpolation_1': '{{ valueB | uppercase }}', 'startTagNgContainer': '', 'startTagNgTemplate': '',}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/icus.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/icus.js index 4656f170501f30..81f49e284e8480 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/icus.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/icus.js @@ -11,7 +11,7 @@ function MyComponent_ng_template_2_Template(rf, ctx) { … decls: 3, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, male {male} female {female} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/nested_templates.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/nested_templates.js index 6c2932e501b9e5..d3053b5ac587d4 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/nested_templates.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/nested_templates.js @@ -39,7 +39,7 @@ function MyComponent_ng_template_2_Template(rf, ctx) { … decls: 3, vars: 0, -consts: function() { +consts: () => { __i18nMsgWithPostprocess__('{$startTagNgTemplate} Template A: {$interpolation} {$startTagNgTemplate} Template B: {$interpolation_1} {$startTagNgTemplate} Template C: {$interpolation_2} {$closeTagNgTemplate}{$closeTagNgTemplate}{$closeTagNgTemplate}', [['closeTagNgTemplate', String.raw`[\uFFFD/*1:3\uFFFD|\uFFFD/*2:2\uFFFD|\uFFFD/*2:1\uFFFD]`], ['interpolation', String.raw`\uFFFD0:1\uFFFD`], ['interpolation_1', String.raw`\uFFFD0:2\uFFFD`], ['interpolation_2', String.raw`\uFFFD0:3\uFFFD`], ['startTagNgTemplate', String.raw`[\uFFFD*2:1\uFFFD|\uFFFD*2:2\uFFFD|\uFFFD*1:3\uFFFD]`]], {original_code: {'closeTagNgTemplate': '', 'interpolation': '{{ valueA | uppercase }}', 'interpolation_1': '{{ valueB }}', 'interpolation_2': '{{ valueC }}', 'startTagNgTemplate': ''}}, {}, []) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/ng-container_with_non_text_content.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/ng-container_with_non_text_content.js index 0dfec41e7555d7..de1e90e0e3394d 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/ng-container_with_non_text_content.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/ng-container_with_non_text_content.js @@ -1,6 +1,6 @@ decls: 4, vars: 0, -consts: function() { +consts: () => { __i18nMsg__(' Hello {$startTagNgContainer}there {$startTagStrong}!{$closeTagStrong}{$closeTagNgContainer}', [['closeTagNgContainer', String.raw`\uFFFD/#2\uFFFD`], ['closeTagStrong', String.raw`\uFFFD/#3\uFFFD`], ['startTagNgContainer', String.raw`\uFFFD#2\uFFFD`], ['startTagStrong', String.raw`\uFFFD#3\uFFFD`]], {original_code: {'closeTagNgContainer': '', 'closeTagStrong': '', 'startTagNgContainer': '', 'startTagStrong': ''}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_ng-container.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_ng-container.js index 1d19cc1156db74..f444b34e22a422 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_ng-container.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_ng-container.js @@ -1,6 +1,6 @@ decls: 3, vars: 0, -consts: function() { +consts: () => { __i18nMsg__(' Hello {$startTagNgContainer}there{$closeTagNgContainer}', [['closeTagNgContainer', String.raw`\uFFFD/#2\uFFFD`], ['startTagNgContainer', String.raw`\uFFFD#2\uFFFD`],], {original_code: {'closeTagNgContainer': '', 'startTagNgContainer': ''}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js index 55ac3113fc82fb..0e402acadabbe4 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/self_closing_tags.js @@ -6,7 +6,7 @@ function MyComponent_ng_template_3_Template(rf, ctx) { } } … -consts: function() { +consts: () => { __i18nMsg__('{$tagImg} is my logo #1 ', [['tagImg', String.raw`\uFFFD#2\uFFFD\uFFFD/#2\uFFFD`]], {original_code: {tagImg: ''}}, {}) __i18nMsg__('{$tagImg} is my logo #2 ', [['tagImg', String.raw`\uFFFD#1\uFFFD\uFFFD/#1\uFFFD`]], {original_code: {tagImg: ''}}, {}) return [ @@ -24,4 +24,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵelementContainerEnd(); $r3$.ɵɵtemplate(3, MyComponent_ng_template_3_Template, 2, 0, "ng-template"); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-container.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-container.js index cb1dd941408466..638394622c1e4a 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-container.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-container.js @@ -1,6 +1,6 @@ decls: 3, vars: 3, -consts: function() { +consts: () => { __i18nMsg__('Some content: {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ valueA | uppercase }}'}}, {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-template.js index ee9a24d9598a44..1b72876b87d13b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/single_ng-template.js @@ -11,7 +11,7 @@ function MyComponent_ng_template_0_Template(rf, ctx) { } } … -decls: 1, vars: 0, consts: function() { +decls: 1, vars: 0, consts: () => { __i18nMsg__('Some content: {$interpolation}', [['interpolation', String.raw`\uFFFD0\uFFFD`]], {original_code: {'interpolation': '{{ valueA | uppercase }}'}}, {}) return [$i18n_0$]; }, diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js index ceb00dd9cef79a..3bc7dd41aee1af 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/ng-container_ng-template/structural_directives.js @@ -20,7 +20,7 @@ function MyComponent_ng_container_1_Template(rf, ctx) { … decls: 2, vars: 2, -consts: function() { +consts: () => { __i18nMsg__('Content A', [], {}, {}) __i18nMsg__('Content B', [], {}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/repeated_placeholder.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/repeated_placeholder.js index 425cae70b5eb99..abbe8b96b9c840 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/repeated_placeholder.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/repeated_placeholder.js @@ -1,3 +1,3 @@ -consts: function () { +consts: () => { __i18nMsgWithPostprocess__('Hello, {$interpolation}! You are a very good {$interpolation}.', [['interpolation', String.raw`[\uFFFD0\uFFFD|\uFFFD1\uFFFD]`]], {original_code: {'interpolation': '{{ placeholder }}'}}, {}, []) __i18nMsgWithPostprocess__('Hello, {$ph}! Hello again {$ph}.', [['ph', String.raw`[\uFFFD0\uFFFD|\uFFFD1\uFFFD]`]], {original_code: {'ph': '{{ placeholder // i18n(ph = "ph") }}'}}, {}, []) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/icu_only.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/icu_only.js index 2cc0c08f94b259..9c1f3a9518ee2c 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/icu_only.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/icu_only.js @@ -1,6 +1,6 @@ decls: 2, vars: 1, -consts: function() { +consts: () => { __i18nIcuMsg__('{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}', [['VAR_SELECT', String.raw`\uFFFD0\uFFFD`]], {}) return [ $i18n_0$ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/ng-container_ng-template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/ng-container_ng-template.js index 3c49d7acddeea8..4b7a466b66c4b2 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/ng-container_ng-template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/ng-container_ng-template.js @@ -4,7 +4,7 @@ function MyComponent_ng_template_0_Template(rf, ctx) { } } … -consts: function() { +consts: () => { __i18nMsg__('My i18n block #2', [], {}, {}) __i18nMsg__('My i18n block #1', [], {}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js index 5c375eafbcc6e8..5d5071dea0b759 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/styles.js @@ -1,6 +1,6 @@ decls: 4, vars: 0, -consts: function() { +consts: () => { __i18nMsg__('Text #1', [], {}, {}) __i18nMsg__('Text #2', [], {}, {}) return [ diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/text_only_content.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/text_only_content.js index 81dfb6b233bd44..f0f594d18c9b28 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/text_only_content.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/self-closing_i18n_instructions/text_only_content.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { __i18nMsg__('My i18n block #1', [], {}, {}) return [ $i18n_0$ @@ -10,4 +10,4 @@ template: function MyComponent_Template(rf, ctx) { $r3$.ɵɵi18n(1, 0); $r3$.ɵɵelementEnd(); } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/whitespace_preserving_mode/preserve_inner_content.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/whitespace_preserving_mode/preserve_inner_content.js index bf1a740171393b..20a5e764aef759 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/whitespace_preserving_mode/preserve_inner_content.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_i18n/whitespace_preserving_mode/preserve_inner_content.js @@ -1,4 +1,4 @@ -consts: function() { +consts: () => { // NOTE: Keeping raw content (avoiding `i18nMsg`) to illustrate message layout in case of whitespace preserving mode. let $I18N_0$; if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode) { diff --git a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/GOLDEN_PARTIAL.js b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/GOLDEN_PARTIAL.js index 8ffe1f386cc738..8b754da314e438 100644 --- a/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/GOLDEN_PARTIAL.js +++ b/packages/compiler-cli/test/compliance/test_cases/source_mapping/inline_templates/GOLDEN_PARTIAL.js @@ -334,7 +334,7 @@ import * as i0 from "@angular/core"; export class TestCmp { } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: '
{{200.3 | percent : 2 }}
', isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(function () { return PercentPipe; }), name: "percent" }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: '
{{200.3 | percent : 2 }}
', isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(() => PercentPipe), name: "percent" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -364,7 +364,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: interpolation_with_pipe.js.map ****************************************************************************************************/ -{"version":3,"file":"interpolation_with_pipe.js","sourceRoot":"","sources":["../interpolation_with_pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;AAMvE,MAAM,OAAO,OAAO;;+GAAP,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,0FAMpC,WAAW;sGAJX,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAKD,MAAM,OAAO,WAAW;IACtB,SAAS,KAAI,CAAC;;mHADH,WAAW;iHAAX,WAAW;sGAAX,WAAW;kBADvB,IAAI;mBAAC,EAAC,IAAI,EAAE,SAAS,EAAC;;AAMvB,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBATT,OAAO,EAIP,WAAW;kHAKX,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAC"} +{"version":3,"file":"interpolation_with_pipe.js","sourceRoot":"","sources":["../interpolation_with_pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;AAMvE,MAAM,OAAO,OAAO;;+GAAP,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,2EAMpC,WAAW;sGAJX,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAKD,MAAM,OAAO,WAAW;IACtB,SAAS,KAAI,CAAC;;mHADH,WAAW;iHAAX,WAAW;sGAAX,WAAW;kBADvB,IAAI;mBAAC,EAAC,IAAI,EAAE,SAAS,EAAC;;AAMvB,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBATT,OAAO,EAIP,WAAW;kHAKX,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: interpolation_with_pipe.d.ts ****************************************************************************************************/ @@ -393,7 +393,7 @@ import * as i0 from "@angular/core"; export class TestCmp { } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: '
{{200.3 | percent : 2 }}
', isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(function () { return PercentPipe; }), name: "percent" }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: '
{{200.3 | percent : 2 }}
', isInline: true, dependencies: [{ kind: "pipe", type: i0.forwardRef(() => PercentPipe), name: "percent" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -423,7 +423,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: interpolation_with_pipe.js.map ****************************************************************************************************/ -{"version":3,"file":"interpolation_with_pipe.js","sourceRoot":"","sources":["../interpolation_with_pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;AAMvE,MAAM,OAAO,OAAO;;+GAAP,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,0FAMpC,WAAW;sGAJX,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAKD,MAAM,OAAO,WAAW;IACtB,SAAS,KAAI,CAAC;;mHADH,WAAW;iHAAX,WAAW;sGAAX,WAAW;kBADvB,IAAI;mBAAC,EAAC,IAAI,EAAE,SAAS,EAAC;;AAMvB,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBATT,OAAO,EAIP,WAAW;kHAKX,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAC"} +{"version":3,"file":"interpolation_with_pipe.js","sourceRoot":"","sources":["../interpolation_with_pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAgB,MAAM,eAAe,CAAC;;AAMvE,MAAM,OAAO,OAAO;;+GAAP,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,2EAMpC,WAAW;sGAJX,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAKD,MAAM,OAAO,WAAW;IACtB,SAAS,KAAI,CAAC;;mHADH,WAAW;iHAAX,WAAW;sGAAX,WAAW;kBADvB,IAAI;mBAAC,EAAC,IAAI,EAAE,SAAS,EAAC;;AAMvB,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBATT,OAAO,EAIP,WAAW;kHAKX,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: interpolation_with_pipe.d.ts ****************************************************************************************************/ @@ -859,7 +859,7 @@ export class TestCmp { } } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgModelDirective; }), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgModelDirective), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -896,7 +896,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: two_way_binding_simple.js.map ****************************************************************************************************/ -{"version":3,"file":"two_way_binding_simple.js","sourceRoot":"","sources":["../two_way_binding_simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,kCAAkC,+FAOjC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,kCAAkC;iBAC7C;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} +{"version":3,"file":"two_way_binding_simple.js","sourceRoot":"","sources":["../two_way_binding_simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,kCAAkC,gFAOjC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,kCAAkC;iBAC7C;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: two_way_binding_simple.d.ts ****************************************************************************************************/ @@ -930,7 +930,7 @@ export class TestCmp { } } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgModelDirective; }), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgModelDirective), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -967,7 +967,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: two_way_binding_simple.js.map ****************************************************************************************************/ -{"version":3,"file":"two_way_binding_simple.js","sourceRoot":"","sources":["../two_way_binding_simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,kCAAkC,+FAOjC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,kCAAkC;iBAC7C;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} +{"version":3,"file":"two_way_binding_simple.js","sourceRoot":"","sources":["../two_way_binding_simple.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,kCAAkC,gFAOjC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,kCAAkC;iBAC7C;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: two_way_binding_simple.d.ts ****************************************************************************************************/ @@ -1001,7 +1001,7 @@ export class TestCmp { } } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgModelDirective; }), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgModelDirective), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -1038,7 +1038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: two_way_binding_longhand.js.map ****************************************************************************************************/ -{"version":3,"file":"two_way_binding_longhand.js","sourceRoot":"","sources":["../two_way_binding_longhand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,+FAOpC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} +{"version":3,"file":"two_way_binding_longhand.js","sourceRoot":"","sources":["../two_way_binding_longhand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,gFAOpC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: two_way_binding_longhand.d.ts ****************************************************************************************************/ @@ -1072,7 +1072,7 @@ export class TestCmp { } } TestCmp.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, deps: [], target: i0.ɵɵFactoryTarget.Component }); -TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(function () { return NgModelDirective; }), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); +TestCmp.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "0.0.0-PLACEHOLDER", type: TestCmp, selector: "test-cmp", ngImport: i0, template: 'Name: ', isInline: true, dependencies: [{ kind: "directive", type: i0.forwardRef(() => NgModelDirective), selector: "[ngModel]", inputs: ["ngModel"], outputs: ["ngModelChanges"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDER", ngImport: i0, type: TestCmp, decorators: [{ type: Component, args: [{ @@ -1109,7 +1109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "0.0.0-PLACEHOLDE /**************************************************************************************************** * PARTIAL FILE: two_way_binding_longhand.js.map ****************************************************************************************************/ -{"version":3,"file":"two_way_binding_longhand.js","sourceRoot":"","sources":["../two_way_binding_longhand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,+FAOpC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} +{"version":3,"file":"two_way_binding_longhand.js","sourceRoot":"","sources":["../two_way_binding_longhand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;;AAM1F,MAAM,OAAO,OAAO;IAJpB;QAKE,SAAI,GAAW,EAAE,CAAC;KACnB;;+GAFY,OAAO;mGAAP,OAAO,gDAFR,qCAAqC,gFAOpC,gBAAgB;sGALhB,OAAO;kBAJnB,SAAS;mBAAC;oBACT,QAAQ,EAAE,UAAU;oBACpB,QAAQ,EAAE,qCAAqC;iBAChD;;AAMD,MAAM,OAAO,gBAAgB;IAD7B;QAEW,YAAO,GAAW,EAAE,CAAC;QACpB,mBAAc,GAAyB,IAAI,YAAY,EAAE,CAAC;KACrE;;wHAHY,gBAAgB;4GAAhB,gBAAgB;sGAAhB,gBAAgB;kBAD5B,SAAS;mBAAC,EAAC,QAAQ,EAAE,WAAW,EAAC;8BAEvB,OAAO;sBAAf,KAAK;gBACI,cAAc;sBAAvB,MAAM;;AAIT,MAAM,OAAO,SAAS;;iHAAT,SAAS;kHAAT,SAAS,iBAXT,OAAO,EAKP,gBAAgB;kHAMhB,SAAS;sGAAT,SAAS;kBADrB,QAAQ;mBAAC,EAAC,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,EAAC"} /**************************************************************************************************** * PARTIAL FILE: two_way_binding_longhand.d.ts ****************************************************************************************************/ diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 9a4c0844c77269..1f3bc3389dc4f2 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -162,7 +162,7 @@ function allTests(os: string) { const jsContents = env.getContents('test.js'); expect(jsContents).toContain('Service.ɵprov ='); - expect(jsContents).toContain('factory: function () { return (() => new Service())(); }'); + expect(jsContents).toContain('factory: () => (() => new Service())()'); expect(jsContents).toContain('Service_Factory(t) { return new (t || Service)(); }'); expect(jsContents).toContain(', providedIn: \'root\' });'); expect(jsContents).not.toContain('__decorate'); @@ -257,7 +257,7 @@ function allTests(os: string) { expect(jsContents) .toContain( 'Service.ɵfac = function Service_Factory(t) { return new (t || Service)(i0.ɵɵinject(Dep)); };'); - expect(jsContents).toContain('providedIn: i0.forwardRef(function () { return Mod; }) })'); + expect(jsContents).toContain('providedIn: i0.forwardRef(() => Mod) })'); expect(jsContents).not.toContain('__decorate'); const dtsContents = env.getContents('test.d.ts'); expect(dtsContents).toContain('static ɵprov: i0.ɵɵInjectableDeclaration;'); @@ -564,7 +564,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('Dir.ɵfac = /** @pureOrBreakMyCode */ function () {'); + expect(jsContents).toContain('Dir.ɵfac = /** @pureOrBreakMyCode */ (() => {'); expect(jsContents) .toContain( '(ɵDir_BaseFactory || (ɵDir_BaseFactory = i0.ɵɵgetInheritedFactory(Dir)))(t || Dir);'); @@ -1599,7 +1599,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('bootstrap: function () { return [Foo]; }'); + expect(jsContents).toContain('bootstrap: () => [Foo]'); }); it('should compile NgModules with references to forward declared directives', () => { @@ -1618,7 +1618,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('declarations: function () { return [Foo]; }'); + expect(jsContents).toContain('declarations: () => [Foo]'); }); it('should compile NgModules with references to forward declared imports', () => { @@ -1637,7 +1637,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('imports: function () { return [BarModule]; }'); + expect(jsContents).toContain('imports: () => [BarModule]'); }); it('should compile NgModules with references to forward declared exports', () => { @@ -1656,7 +1656,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('exports: function () { return [BarModule]; }'); + expect(jsContents).toContain('exports: () => [BarModule]'); }); it('should use relative import for forward references that were resolved from a relative file', @@ -4789,7 +4789,7 @@ function allTests(os: string) { .toContain('function Base_Factory(t) { return new (t || Base)(i0.ɵɵinject(Dep)); }'); expect(jsContents) .toContain( - 'function () { let ɵChild_BaseFactory; return function Child_Factory(t) { return (ɵChild_BaseFactory || (ɵChild_BaseFactory = i0.ɵɵgetInheritedFactory(Child)))(t || Child); }; }();'); + '(() => { let ɵChild_BaseFactory; return function Child_Factory(t) { return (ɵChild_BaseFactory || (ɵChild_BaseFactory = i0.ɵɵgetInheritedFactory(Child)))(t || Child); }; })();'); expect(jsContents) .toContain('function GrandChild_Factory(t) { return new (t || GrandChild)(); }'); }); @@ -4815,7 +4815,7 @@ function allTests(os: string) { const jsContents = env.getContents('test.js'); expect(jsContents) .toContain( - '/*@__PURE__*/ function () { let ɵDir_BaseFactory; return function Dir_Factory(t) { return (ɵDir_BaseFactory || (ɵDir_BaseFactory = i0.ɵɵgetInheritedFactory(Dir)))(t || Dir); }; }();'); + '/*@__PURE__*/ (() => { let ɵDir_BaseFactory; return function Dir_Factory(t) { return (ɵDir_BaseFactory || (ɵDir_BaseFactory = i0.ɵɵgetInheritedFactory(Dir)))(t || Dir); }; })();'); }); it('should wrap "directives" in component metadata in a closure when forward references are present', @@ -4844,7 +4844,7 @@ function allTests(os: string) { env.driveMain(); const jsContents = env.getContents('test.js'); - expect(jsContents).toContain('dependencies: function () { return [CmpB]; }'); + expect(jsContents).toContain('dependencies: () => [CmpB]'); }); it('should wrap setClassMetadata in an iife with ngDevMode guard', () => { diff --git a/packages/compiler-cli/test/ngtsc/standalone_spec.ts b/packages/compiler-cli/test/ngtsc/standalone_spec.ts index 03bd707dff6e88..e72c1acf6e0551 100644 --- a/packages/compiler-cli/test/ngtsc/standalone_spec.ts +++ b/packages/compiler-cli/test/ngtsc/standalone_spec.ts @@ -200,7 +200,7 @@ runInEachFileSystem(() => { 'i0.ɵɵsetComponentScope(ModuleCmp, function () { return [i1.StandaloneCmp]; }, []);'); const cmpJs = env.getContents('component.js'); - expect(cmpJs).toContain('dependencies: function () { return [Module, i1.ModuleCmp]; }'); + expect(cmpJs).toContain('dependencies: () => [Module, i1.ModuleCmp]'); }); it('should error when a non-standalone component tries to use imports', () => { @@ -578,7 +578,7 @@ runInEachFileSystem(() => { expect(diags.length).toBe(0); expect(jsCode).toContain('standalone: true'); - expect(jsCode).toContain('dependencies: function () { return [StandaloneComponent]; }'); + expect(jsCode).toContain('dependencies: () => [StandaloneComponent]'); }); }); diff --git a/packages/compiler/src/injectable_compiler_2.ts b/packages/compiler/src/injectable_compiler_2.ts index dace6d7fcd83bc..992a908ae62444 100644 --- a/packages/compiler/src/injectable_compiler_2.ts +++ b/packages/compiler/src/injectable_compiler_2.ts @@ -77,10 +77,7 @@ export function compileInjectable( delegateType: R3FactoryDelegateType.Function, }); } else { - result = { - statements: [], - expression: o.fn([], [new o.ReturnStatement(meta.useFactory.callFn([]))]) - }; + result = {statements: [], expression: o.arrowFn([], meta.useFactory.callFn([]))}; } } else if (meta.useValue !== undefined) { // Note: it's safe to use `meta.useValue` instead of the `USE_VALUE in meta` check used for @@ -161,8 +158,7 @@ function delegateToFactory( return createFactoryFunction(unwrappedType); } -function createFactoryFunction(type: o.Expression): o.FunctionExpr { - return o.fn( - [new o.FnParam('t', o.DYNAMIC_TYPE)], - [new o.ReturnStatement(type.prop('ɵfac').callFn([o.variable('t')]))]); +function createFactoryFunction(type: o.Expression): o.ArrowFunctionExpr { + return o.arrowFn( + [new o.FnParam('t', o.DYNAMIC_TYPE)], type.prop('ɵfac').callFn([o.variable('t')])); } diff --git a/packages/compiler/src/output/abstract_emitter.ts b/packages/compiler/src/output/abstract_emitter.ts index 7f8ae5edab473d..59e32f2b0e3079 100644 --- a/packages/compiler/src/output/abstract_emitter.ts +++ b/packages/compiler/src/output/abstract_emitter.ts @@ -284,7 +284,15 @@ export abstract class AbstractEmitterVisitor implements o.StatementVisitor, o.Ex } visitInvokeFunctionExpr(expr: o.InvokeFunctionExpr, ctx: EmitterVisitorContext): any { + const shouldParenthesize = expr.fn instanceof o.ArrowFunctionExpr; + + if (shouldParenthesize) { + ctx.print(expr.fn, '('); + } expr.fn.visitExpression(this, ctx); + if (shouldParenthesize) { + ctx.print(expr.fn, ')'); + } ctx.print(expr, `(`); this.visitAllExpressions(expr.args, ctx, ','); ctx.print(expr, `)`); diff --git a/packages/compiler/src/render3/r3_factory.ts b/packages/compiler/src/render3/r3_factory.ts index c4934d3d9c3908..3c311305d57f5b 100644 --- a/packages/compiler/src/render3/r3_factory.ts +++ b/packages/compiler/src/render3/r3_factory.ts @@ -186,7 +186,7 @@ export function compileFactoryFunction(meta: R3FactoryMetadata): R3CompiledExpre if (baseFactoryVar !== null) { // There is a base factory variable so wrap its declaration along with the factory function into // an IIFE. - factoryFn = o.fn([], [ + factoryFn = o.arrowFn([], [ new o.DeclareVarStmt(baseFactoryVar.name!), new o.ReturnStatement(factoryFn) ]).callFn([], /* sourceSpan */ undefined, /* pure */ true); } diff --git a/packages/compiler/src/render3/util.ts b/packages/compiler/src/render3/util.ts index bb35c98df679c6..c5e171ae052621 100644 --- a/packages/compiler/src/render3/util.ts +++ b/packages/compiler/src/render3/util.ts @@ -79,7 +79,7 @@ export function wrapReference(value: any): R3Reference { export function refsToArray(refs: R3Reference[], shouldForwardDeclare: boolean): o.Expression { const values = o.literalArr(refs.map(ref => ref.value)); - return shouldForwardDeclare ? o.fn([], [new o.ReturnStatement(values)]) : values; + return shouldForwardDeclare ? o.arrowFn([], values) : values; } @@ -151,7 +151,7 @@ export function convertFromMaybeForwardRefExpression( * ``` */ export function generateForwardRef(expr: o.Expression): o.Expression { - return o.importExpr(Identifiers.forwardRef).callFn([o.fn([], [new o.ReturnStatement(expr)])]); + return o.importExpr(Identifiers.forwardRef).callFn([o.arrowFn([], expr)]); } /** diff --git a/packages/compiler/src/render3/view/compiler.ts b/packages/compiler/src/render3/view/compiler.ts index 8e8f6fc47c216a..6c84f6743f0f48 100644 --- a/packages/compiler/src/render3/view/compiler.ts +++ b/packages/compiler/src/render3/view/compiler.ts @@ -218,14 +218,14 @@ export function compileComponentFromMetadata( // - either as an array: // `consts: [['one', 'two'], ['three', 'four']]` // - or as a factory function in case additional statements are present (to support i18n): - // `consts: function() { var i18n_0; if (ngI18nClosureMode) {...} else {...} return [i18n_0]; + // `consts: () => { var i18n_0; if (ngI18nClosureMode) {...} else {...} return [i18n_0]; // }` const {constExpressions, prepareStatements} = templateBuilder.getConsts(); if (constExpressions.length > 0) { - let constsExpr: o.LiteralArrayExpr|o.FunctionExpr = o.literalArr(constExpressions); + let constsExpr: o.LiteralArrayExpr|o.ArrowFunctionExpr = o.literalArr(constExpressions); // Prepare statements are present - turn `consts` into a function. if (prepareStatements.length > 0) { - constsExpr = o.fn([], [...prepareStatements, new o.ReturnStatement(constsExpr)]); + constsExpr = o.arrowFn([], [...prepareStatements, new o.ReturnStatement(constsExpr)]); } definitionMap.set('consts', constsExpr); } @@ -252,9 +252,9 @@ export function compileComponentFromMetadata( definitionMap.set('vars', o.literal(tpl.root.vars as number)); if (tpl.consts.length > 0) { if (tpl.constsInitializers.length > 0) { - definitionMap.set( - 'consts', - o.fn([], [...tpl.constsInitializers, new o.ReturnStatement(o.literalArr(tpl.consts))])); + definitionMap.set('consts', o.arrowFn([], [ + ...tpl.constsInitializers, new o.ReturnStatement(o.literalArr(tpl.consts)) + ])); } else { definitionMap.set('consts', o.literalArr(tpl.consts)); } @@ -361,11 +361,11 @@ function compileDeclarationList( return list; case DeclarationListEmitMode.Closure: // directives: function () { return [MyDir]; } - return o.fn([], [new o.ReturnStatement(list)]); + return o.arrowFn([], list); case DeclarationListEmitMode.ClosureResolved: // directives: function () { return [MyDir].map(ng.resolveForwardRef); } const resolvedList = list.prop('map').callFn([o.importExpr(R3.resolveForwardRef)]); - return o.fn([], [new o.ReturnStatement(resolvedList)]); + return o.arrowFn([], resolvedList); case DeclarationListEmitMode.RuntimeResolved: throw new Error(`Unsupported with an array of pre-resolved dependencies`); } From 85e31465c978e516160c6e65a3e87d96fe6efea1 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 3 Oct 2023 17:16:42 +0200 Subject: [PATCH 13/57] refactor(http): create an `InjectionToken` for a global `HttpBackend` (#51999) `withHttp` provides the new `PRIMARY_HTTP_BACKEND` token with `FetchBackend` to use it globally. PR Close #51999 --- packages/common/http/src/interceptor.ts | 13 ++++++++++ packages/common/http/src/provider.ts | 3 ++- packages/common/http/test/provider_spec.ts | 29 ++++++++++++++++++++-- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/common/http/src/interceptor.ts b/packages/common/http/src/interceptor.ts index 87e86c2a5a96a9..faf868e122b078 100644 --- a/packages/common/http/src/interceptor.ts +++ b/packages/common/http/src/interceptor.ts @@ -189,6 +189,13 @@ export const HTTP_INTERCEPTOR_FNS = export const HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? 'HTTP_ROOT_INTERCEPTOR_FNS' : ''); +/** + * A provider to set a global primary http backend. If set, it will override the default one + */ +export const PRIMARY_HTTP_BACKEND = + new InjectionToken(ngDevMode ? 'PRIMARY_HTTP_BACKEND' : ''); + + /** * Creates an `HttpInterceptorFn` which lazily initializes an interceptor chain from the legacy * class-based interceptors and runs the request through it. @@ -220,6 +227,12 @@ export class HttpInterceptorHandler extends HttpHandler { constructor(private backend: HttpBackend, private injector: EnvironmentInjector) { super(); + + // Check if there is a preferred HTTP backend configured and use it if that's the case. + // This is needed to enable `FetchBackend` globally for all HttpClient's when `withFetch` + // is used. + const primaryHttpBackend = inject(PRIMARY_HTTP_BACKEND, {optional: true}); + this.backend = primaryHttpBackend ?? backend; } override handle(initialRequest: HttpRequest): Observable> { diff --git a/packages/common/http/src/provider.ts b/packages/common/http/src/provider.ts index bec5719387e56b..b7e61511fcc7e2 100644 --- a/packages/common/http/src/provider.ts +++ b/packages/common/http/src/provider.ts @@ -11,7 +11,7 @@ import {EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders, import {HttpBackend, HttpHandler} from './backend'; import {HttpClient} from './client'; import {FetchBackend} from './fetch'; -import {HTTP_INTERCEPTOR_FNS, HttpInterceptorFn, HttpInterceptorHandler, legacyInterceptorFnFactory} from './interceptor'; +import {HTTP_INTERCEPTOR_FNS, HttpInterceptorFn, HttpInterceptorHandler, legacyInterceptorFnFactory, PRIMARY_HTTP_BACKEND} from './interceptor'; import {jsonpCallbackContext, JsonpCallbackContext, JsonpClientBackend, jsonpInterceptorFn} from './jsonp'; import {HttpXhrBackend} from './xhr'; import {HttpXsrfCookieExtractor, HttpXsrfTokenExtractor, XSRF_COOKIE_NAME, XSRF_ENABLED, XSRF_HEADER_NAME, xsrfInterceptorFn} from './xsrf'; @@ -261,5 +261,6 @@ export function withFetch(): HttpFeature { return makeHttpFeature(HttpFeatureKind.Fetch, [ FetchBackend, {provide: HttpBackend, useExisting: FetchBackend}, + {provide: PRIMARY_HTTP_BACKEND, useExisting: FetchBackend}, ]); } diff --git a/packages/common/http/test/provider_spec.ts b/packages/common/http/test/provider_spec.ts index 693c9f66a46733..3bcafba91af6d0 100644 --- a/packages/common/http/test/provider_spec.ts +++ b/packages/common/http/test/provider_spec.ts @@ -7,14 +7,14 @@ */ import {DOCUMENT, XhrFactory} from '@angular/common'; -import {HTTP_INTERCEPTORS, HttpClient, HttpClientModule, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, JsonpClientBackend} from '@angular/common/http'; +import {FetchBackend, HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpXhrBackend, JsonpClientBackend} from '@angular/common/http'; import {HttpClientTestingModule, HttpTestingController, provideHttpClientTesting} from '@angular/common/http/testing'; import {createEnvironmentInjector, EnvironmentInjector, inject, InjectionToken, PLATFORM_ID, Provider} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {EMPTY, Observable} from 'rxjs'; import {HttpInterceptorFn} from '../src/interceptor'; -import {provideHttpClient, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration} from '../src/provider'; +import {provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration} from '../src/provider'; describe('provideHttp', () => { beforeEach(() => { @@ -387,6 +387,31 @@ describe('provideHttp', () => { req.flush(''); }); }); + + describe('fetch support', () => { + it('withFetch', () => { + TestBed.resetTestingModule(); + TestBed.configureTestingModule({providers: [provideHttpClient(withFetch())]}); + const fetchBackend = TestBed.inject(HttpBackend); + expect(fetchBackend).toBeInstanceOf(FetchBackend); + }); + + it('withFetch should always override the backend', () => { + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + provideHttpClient(withFetch()), + // This emulates a situation when `provideHttpClient()` is used + // later in a different part of an app. We want to make sure that + // the `FetchBackend` is enabled in that case as well. + {provide: HttpBackend, useClass: HttpXhrBackend}, + ] + }); + + const handler = TestBed.inject(HttpHandler); + expect((handler as any).backend).toBeInstanceOf(FetchBackend); + }); + }); }); function setXsrfToken(token: string): void { From 3bf9b96ef50487bf9514349197d1114640bc3291 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Mon, 2 Oct 2023 11:07:41 +0000 Subject: [PATCH 14/57] build: update dependency css-selector-parser to v3 (#51983) See associated pull request for more information. PR Close #51983 --- aio/package.json | 2 +- .../processors/addMetadataAliases.js | 23 ++++++++++++------- aio/yarn.lock | 8 +++---- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/aio/package.json b/aio/package.json index c99fc753f4fef9..1baf25182d70b9 100644 --- a/aio/package.json +++ b/aio/package.json @@ -106,7 +106,7 @@ "chalk": "^4.1.0", "cjson": "^0.5.0", "cross-spawn": "^7.0.3", - "css-selector-parser": "^1.4.1", + "css-selector-parser": "^3.0.0", "dgeni": "^0.4.14", "dgeni-packages": "^0.30.0", "entities": "^4.0.0", diff --git a/aio/tools/transforms/angular-api-package/processors/addMetadataAliases.js b/aio/tools/transforms/angular-api-package/processors/addMetadataAliases.js index a3699988e9fd38..4c40453fc39a7d 100644 --- a/aio/tools/transforms/angular-api-package/processors/addMetadataAliases.js +++ b/aio/tools/transforms/angular-api-package/processors/addMetadataAliases.js @@ -1,5 +1,6 @@ -const CssSelectorParser = require('css-selector-parser').CssSelectorParser; -const cssParser = new CssSelectorParser(); +const cssSelectorParser = require('css-selector-parser'); +const parseCss = cssSelectorParser.createParser(); + /** * @dgProcessor addMetadataAliases * @@ -34,15 +35,21 @@ module.exports = function addMetadataAliasesProcessor() { }; function extractSelectors(selectors) { - const selectorAST = cssParser.parse(stripQuotes(selectors)); - const rules = selectorAST.selectors ? selectorAST.selectors.map(ruleSet => ruleSet.rule) : [selectorAST.rule]; + const rules = parseCss(stripQuotes(selectors)).rules; const aliases = {}; rules.forEach(rule => { - if (rule.tagName) { - aliases[rule.tagName] = true; + if (rule.items.length === 0) { + return; + } + const tagNames = rule.items.filter(cssSelectorParser.ast.isTagName); + if (tagNames) { + for (let tagName of tagNames) { + aliases[tagName.name] = true; + } } - if (rule.attrs) { - rule.attrs.forEach(attr => aliases[attr.name] = true); + const attrs = rule.items.filter(cssSelectorParser.ast.isAttribute); + if (attrs) { + attrs.forEach(attr => aliases[attr.name] = true); } }); return Object.keys(aliases); diff --git a/aio/yarn.lock b/aio/yarn.lock index b7432848b82ff4..07e573863d538e 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -5793,10 +5793,10 @@ css-select@^5.1.0: domutils "^3.0.1" nth-check "^2.0.1" -css-selector-parser@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" - integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== +css-selector-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-3.0.0.tgz#25c3da2ed85f8f78c6e6684c168a71ddea81918c" + integrity sha512-ITsFspnTOObbNv81tXX+7QK/MtxciSBDAWQCKnmWIuwDSDDvfJD+YSPEpC7TMVhi1N2llzHHMz7xCX8AoC0L6w== css-what@^6.1.0: version "6.1.0" From 650ab4f21809896a2b576ac8a35a63733a53497f Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Sun, 1 Oct 2023 15:56:45 -0700 Subject: [PATCH 15/57] refactor(core): add support for `on timer` trigger in `@defer` blocks (#51974) This commit adds the logic to support `on timer` triggers in `@defer` blocks in both rendering and prefetching conditions. PR Close #51974 --- .../core/src/render3/instructions/defer.ts | 285 +++++++++++++++-- packages/core/test/acceptance/defer_spec.ts | 287 ++++++++++++++++++ 2 files changed, 541 insertions(+), 31 deletions(-) diff --git a/packages/core/src/render3/instructions/defer.ts b/packages/core/src/render3/instructions/defer.ts index 5002f825870b3b..5fb85dc91f80e7 100644 --- a/packages/core/src/render3/instructions/defer.ts +++ b/packages/core/src/render3/instructions/defer.ts @@ -9,6 +9,7 @@ import {inject, InjectionToken, Injector, ɵɵdefineInjectable} from '../../di'; import {findMatchingDehydratedView} from '../../hydration/views'; import {populateDehydratedViewsInLContainer} from '../../linker/view_container_ref'; +import {arrayInsert2, arraySplice} from '../../util/array_utils'; import {assertDefined, assertElement, assertEqual, throwError} from '../../util/assert'; import {NgZone} from '../../zone'; import {afterRender} from '../after_render_hooks'; @@ -157,11 +158,7 @@ export function ɵɵdeferPrefetchWhen(rawValue: unknown) { * @codeGenApi */ export function ɵɵdeferOnIdle() { - const lView = getLView(); - const tNode = getCurrentTNode()!; - - renderPlaceholder(lView, tNode); - onIdle(() => triggerDeferBlock(lView, tNode), lView, true /* withLViewCleanup */); + scheduleDelayedTrigger(onIdle); } /** @@ -169,28 +166,7 @@ export function ɵɵdeferOnIdle() { * @codeGenApi */ export function ɵɵdeferPrefetchOnIdle() { - const lView = getLView(); - const tNode = getCurrentTNode()!; - const tView = lView[TVIEW]; - const tDetails = getTDeferBlockDetails(tView, tNode); - - if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { - // Prevent scheduling more than one `requestIdleCallback` call - // for each defer block. For this reason we use only a trigger - // identifier in a key, so all instances would use the same key. - const key = String(DeferBlockTriggers.OnIdle); - const injector = lView[INJECTOR]!; - const manager = injector.get(DeferBlockCleanupManager); - if (!manager.has(tDetails, key)) { - // In case of prefetching, we intentionally avoid cancelling resource loading if - // an underlying LView get destroyed (thus passing `null` as a second argument), - // because there might be other LViews (that represent embedded views) that - // depend on resource loading. - const prefetch = () => triggerPrefetching(tDetails, lView); - const cleanupFn = onIdle(prefetch, lView, false /* withLViewCleanup */); - registerTDetailsCleanup(injector, tDetails, key, cleanupFn); - } - } + scheduleDelayedPrefetching(onIdle, DeferBlockTriggers.OnIdle); } /** @@ -233,14 +209,18 @@ export function ɵɵdeferPrefetchOnImmediate() { * @param delay Amount of time to wait before loading the content. * @codeGenApi */ -export function ɵɵdeferOnTimer(delay: number) {} // TODO: implement runtime logic. +export function ɵɵdeferOnTimer(delay: number) { + scheduleDelayedTrigger(onTimer(delay)); +} /** * Creates runtime data structures for the `prefetch on timer` deferred trigger. * @param delay Amount of time to wait before prefetching the content. * @codeGenApi */ -export function ɵɵdeferPrefetchOnTimer(delay: number) {} // TODO: implement runtime logic. +export function ɵɵdeferPrefetchOnTimer(delay: number) { + scheduleDelayedPrefetching(onTimer(delay), DeferBlockTriggers.OnTimer); +} /** * Creates runtime data structures for the `on hover` deferred trigger. @@ -347,6 +327,51 @@ export function ɵɵdeferPrefetchOnViewport(triggerIndex: number, walkUpTimes?: /********** Helper functions **********/ +/** + * Schedules triggering of a defer block for `on idle` and `on timer` conditions. + */ +function scheduleDelayedTrigger( + scheduleFn: (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => VoidFunction) { + const lView = getLView(); + const tNode = getCurrentTNode()!; + + renderPlaceholder(lView, tNode); + scheduleFn(() => triggerDeferBlock(lView, tNode), lView, true /* withLViewCleanup */); +} + +/** + * Schedules prefetching for `on idle` and `on timer` triggers. + * + * @param scheduleFn A function that does the scheduling. + * @param trigger A trigger that initiated scheduling. + */ +function scheduleDelayedPrefetching( + scheduleFn: (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => VoidFunction, + trigger: DeferBlockTriggers) { + const lView = getLView(); + const tNode = getCurrentTNode()!; + const tView = lView[TVIEW]; + const tDetails = getTDeferBlockDetails(tView, tNode); + + if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) { + // Prevent scheduling more than one prefetch init call + // for each defer block. For this reason we use only a trigger + // identifier in a key, so all instances would use the same key. + const key = String(trigger); + const injector = lView[INJECTOR]!; + const manager = injector.get(DeferBlockCleanupManager); + if (!manager.has(tDetails, key)) { + // In case of prefetching, we intentionally avoid cancelling resource loading if + // an underlying LView get destroyed (thus passing `null` as a second argument), + // because there might be other LViews (that represent embedded views) that + // depend on resource loading. + const prefetch = () => triggerPrefetching(tDetails, lView); + const cleanupFn = scheduleFn(prefetch, lView, false /* withLViewCleanup */); + registerTDetailsCleanup(injector, tDetails, key, cleanupFn); + } + } +} + /** * Helper function to get the LView in which a deferred block's trigger is rendered. * @param deferredHostLView LView in which the deferred block is defined. @@ -480,6 +505,36 @@ function onIdle(callback: VoidFunction, lView: LView, withLViewCleanup: boolean) return cleanupFn; } +/** + * Returns a function that captures a provided delay. + * Invoking the returned function schedules a trigger. + */ +function onTimer(delay: number) { + return (callback: VoidFunction, lView: LView, withLViewCleanup: boolean) => + scheduleTimerTrigger(delay, callback, lView, withLViewCleanup); +} + +/** + * Schedules a callback to be invoked after a given timeout. + * + * @param delay A number of ms to wait until firing a callback. + * @param callback A function to be invoked after a timeout. + * @param lView LView that hosts an instance of a defer block. + * @param withLViewCleanup A flag that indicates whether a scheduled callback + * should be cancelled in case an LView is destroyed before a callback + * was invoked. + */ +function scheduleTimerTrigger( + delay: number, callback: VoidFunction, lView: LView, withLViewCleanup: boolean) { + const injector = lView[INJECTOR]!; + const scheduler = injector.get(TimerScheduler); + const cleanupFn = () => scheduler.remove(callback); + const wrappedCallback = + withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback; + scheduler.add(delay, wrappedCallback); + return cleanupFn; +} + /** * Wraps a given callback into a logic that registers a cleanup function * in the LView cleanup slot, to be invoked when an LView is destroyed. @@ -708,11 +763,9 @@ export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LVie /** Utility function to render placeholder content (if present) */ function renderPlaceholder(lView: LView, tNode: TNode) { - const tView = lView[TVIEW]; const lContainer = lView[tNode.index]; ngDevMode && assertLContainer(lContainer); - const tDetails = getTDeferBlockDetails(tView, tNode); renderDeferBlockState(DeferBlockState.Placeholder, tNode, lContainer); } @@ -1060,3 +1113,173 @@ class OnIdleScheduler { factory: () => new OnIdleScheduler(), }); } + +/** + * Helper service to schedule `setTimeout`s for batches of defer blocks, + * to avoid calling `setTimeout` for each defer block (e.g. if defer blocks + * are created inside a for loop). + */ +class TimerScheduler { + // Indicates whether current callbacks are being invoked. + executingCallbacks = false; + + // Currently scheduled `setTimeout` id. + timeoutId: number|null = null; + + // When currently scheduled timer would fire. + invokeTimerAt: number|null = null; + + // List of callbacks to be invoked. + // For each callback we also store a timestamp on when the callback + // should be invoked. We store timestamps and callback functions + // in a flat array to avoid creating new objects for each entry. + // [timestamp1, callback1, timestamp2, callback2, ...] + current: Array = []; + + // List of callbacks collected while invoking current set of callbacks. + // Those callbacks are added to the "current" queue at the end of + // the current callback invocation. The shape of this list is the same + // as the shape of the `current` list. + deferred: Array = []; + + add(delay: number, callback: VoidFunction) { + const target = this.executingCallbacks ? this.deferred : this.current; + this.addToQueue(target, Date.now() + delay, callback); + this.scheduleTimer(); + } + + remove(callback: VoidFunction) { + const callbackIndex = this.removeFromQueue(this.current, callback); + if (callbackIndex === -1) { + // Try cleaning up deferred queue only in case + // we didn't find a callback in the "current" queue. + this.removeFromQueue(this.deferred, callback); + } + } + + private addToQueue(target: Array, invokeAt: number, callback: VoidFunction) { + let insertAtIndex = target.length; + for (let i = 0; i < target.length; i += 2) { + const invokeQueuedCallbackAt = target[i] as number; + if (invokeQueuedCallbackAt > invokeAt) { + // We've reached a first timer that is scheduled + // for a later time than what we are trying to insert. + // This is the location at which we need to insert, + // no need to iterate further. + insertAtIndex = i; + break; + } + } + arrayInsert2(target, insertAtIndex, invokeAt, callback); + } + + private removeFromQueue(target: Array, callback: VoidFunction) { + let index = -1; + for (let i = 0; i < target.length; i += 2) { + const queuedCallback = target[i + 1]; + if (queuedCallback === callback) { + index = i; + break; + } + } + if (index > -1) { + // Remove 2 elements: a timestamp slot and + // the following slot with a callback function. + arraySplice(target, index, 2); + } + return index; + } + + private scheduleTimer() { + const callback = () => { + clearTimeout(this.timeoutId!); + this.timeoutId = null; + + this.executingCallbacks = true; + + // Invoke callbacks that were scheduled to run + // before the current time. + let now = Date.now(); + let lastCallbackIndex: number|null = null; + for (let i = 0; i < this.current.length; i += 2) { + const invokeAt = this.current[i] as number; + const callback = this.current[i + 1] as VoidFunction; + if (invokeAt <= now) { + callback(); + // Point at the invoked callback function, which is located + // after the timestamp. + lastCallbackIndex = i + 1; + } else { + // We've reached a timer that should not be invoked yet. + break; + } + } + if (lastCallbackIndex !== null) { + // If last callback index is `null` - no callbacks were invoked, + // so no cleanup is needed. Otherwise, remove invoked callbacks + // from the queue. + arraySplice(this.current, 0, lastCallbackIndex + 1); + } + + this.executingCallbacks = false; + + // If there are any callbacks added during an invocation + // of the current ones - move them over to the "current" + // queue. + if (this.deferred.length > 0) { + for (let i = 0; i < this.deferred.length; i += 2) { + const invokeAt = this.deferred[i] as number; + const callback = this.deferred[i + 1] as VoidFunction; + this.addToQueue(this.current, invokeAt, callback); + } + this.deferred.length = 0; + } + this.scheduleTimer(); + }; + + // Avoid running timer callbacks more than once per + // average frame duration. This is needed for better + // batching and to avoid kicking off excessive change + // detection cycles. + const FRAME_DURATION_MS = 16; // 1000ms / 60fps + + if (this.current.length > 0) { + const now = Date.now(); + // First element in the queue points at the timestamp + // of the first (earliest) event. + const invokeAt = this.current[0] as number; + if (!this.timeoutId || + // Reschedule a timer in case a queue contains an item with + // an earlier timestamp and the delta is more than an average + // frame duration. + (this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) { + if (this.timeoutId !== null) { + // There was a timeout already, but an earlier event was added + // into the queue. In this case we drop an old timer and setup + // a new one with an updated (smaller) timeout. + clearTimeout(this.timeoutId); + this.timeoutId = null; + } + const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS); + this.invokeTimerAt = invokeAt; + this.timeoutId = setTimeout(callback, timeout) as unknown as number; + } + } + } + + ngOnDestroy() { + if (this.timeoutId !== null) { + clearTimeout(this.timeoutId); + this.timeoutId = null; + } + this.current.length = 0; + this.deferred.length = 0; + } + + /** @nocollapse */ + static ɵprov = /** @pureOrBreakMyCode */ ɵɵdefineInjectable({ + token: TimerScheduler, + providedIn: 'root', + factory: () => new TimerScheduler(), + }); +} diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index 7c2265d7ea3a4f..b29d9d5040a691 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -56,6 +56,15 @@ function allPendingDynamicImports() { return dynamicImportOf(null, 10); } +/** + * Invoke a callback function after a specified amount of time (in ms). + */ +function timer(delay: number): Promise { + return new Promise((resolve) => { + setTimeout(() => resolve(), delay); + }); +} + // Set `PLATFORM_ID` to a browser platform value to trigger defer loading // while running tests in Node. const COMMON_PROVIDERS = [{provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}]; @@ -2411,6 +2420,284 @@ describe('@defer', () => { })); }); + describe('`on timer` triggers', () => { + it('should trigger based on `on timer` condition', async () => { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: 'Rendering {{ block }} block.', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'root-app', + imports: [NestedCmp], + template: ` + @for (item of items; track item) { + @defer (on timer(500ms)) { + + } @placeholder { + Placeholder \`{{ item }}\` + } + } + ` + }) + class RootCmp { + items = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + } + + let loadingFnInvokedTimes = 0; + const deferDepsInterceptor = { + intercept() { + return () => { + loadingFnInvokedTimes++; + return [dynamicImportOf(NestedCmp)]; + }; + } + }; + + TestBed.configureTestingModule({ + providers: [ + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + clearDirectiveDefs(RootCmp); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `a`'); + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `b`'); + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `c`'); + + // Make sure loading function is not yet invoked. + expect(loadingFnInvokedTimes).toBe(0); + + await timer(1000); + await allPendingDynamicImports(); // fetching dependencies of the defer block + fixture.detectChanges(); + + // Expect that the loading resources function was invoked once. + expect(loadingFnInvokedTimes).toBe(1); + + // Verify primary blocks content. + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `a` block'); + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `b` block'); + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `c` block'); + + // Expect that the loading resources function was not invoked again (counter remains 1). + expect(loadingFnInvokedTimes).toBe(1); + + // Adding an extra item to the list + fixture.componentInstance.items = ['a', 'b', 'c', 'd']; + fixture.detectChanges(); + + // Make sure loading function is still 1 (i.e. wasn't invoked again). + expect(loadingFnInvokedTimes).toBe(1); + }); + + it('should trigger nested `on timer` condition', async () => { + @Component({ + standalone: true, + selector: 'root-app', + template: ` + @defer (on timer(100ms)) { + primary[top] + + @defer (on timer(100ms)) { + primary[nested] + } @placeholder { + placeholder[nested] + } + } @placeholder { + placeholder[top] + } + ` + }) + class RootCmp { + } + + TestBed.configureTestingModule({ + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + clearDirectiveDefs(RootCmp); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + expect(fixture.nativeElement.outerHTML).toContain('placeholder[top]'); + + await timer(110); + fixture.detectChanges(); + + // Verify primary blocks content after triggering top-level @defer. + expect(fixture.nativeElement.outerHTML).toContain('primary[top]'); + expect(fixture.nativeElement.outerHTML).toContain('placeholder[nested]'); + + await timer(110); + fixture.detectChanges(); + + // Verify that nested @defer block was triggered as well. + expect(fixture.nativeElement.outerHTML).toContain('primary[top]'); + expect(fixture.nativeElement.outerHTML).toContain('primary[nested]'); + }); + }); + + describe('`prefetch on timer` triggers', () => { + it('should trigger prefetching based on `on timer` condition', async () => { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: 'Rendering {{ block }} block.', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'root-app', + imports: [NestedCmp], + template: ` + @for (item of items; track item) { + @defer (when shouldTrigger; prefetch on timer(100ms)) { + + } @placeholder { + Placeholder \`{{ item }}\` + } + } + ` + }) + class RootCmp { + shouldTrigger = false; + items = ['a', 'b', 'c']; + } + + let loadingFnInvokedTimes = 0; + const deferDepsInterceptor = { + intercept() { + return () => { + loadingFnInvokedTimes++; + return [dynamicImportOf(NestedCmp)]; + }; + } + }; + + TestBed.configureTestingModule({ + providers: [ + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + clearDirectiveDefs(RootCmp); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `a`'); + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `b`'); + expect(fixture.nativeElement.outerHTML).toContain('Placeholder `c`'); + + // Make sure loading function is not yet invoked. + expect(loadingFnInvokedTimes).toBe(0); + + await timer(200); + await allPendingDynamicImports(); // fetching dependencies of the defer block + fixture.detectChanges(); + + // Expect that the loading resources function was invoked once. + expect(loadingFnInvokedTimes).toBe(1); + + // Trigger rendering of all defer blocks. + fixture.componentInstance.shouldTrigger = true; + fixture.detectChanges(); + + // Verify primary blocks content. + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `a` block'); + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `b` block'); + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary for `c` block'); + + // Make sure the loading function wasn't invoked again (count remains `1`). + expect(loadingFnInvokedTimes).toBe(1); + }); + + it('should trigger prefetching and rendering based on `on timer` condition', async () => { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: 'Rendering {{ block }} block.', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'root-app', + imports: [NestedCmp], + template: ` + @defer (on timer(200ms); prefetch on timer(100ms)) { + + } @placeholder { + Placeholder + } + ` + }) + class RootCmp { + } + + let loadingFnInvokedTimes = 0; + const deferDepsInterceptor = { + intercept() { + return () => { + loadingFnInvokedTimes++; + return [dynamicImportOf(NestedCmp)]; + }; + } + }; + + TestBed.configureTestingModule({ + providers: [ + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + clearDirectiveDefs(RootCmp); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + expect(fixture.nativeElement.outerHTML).toContain('Placeholder'); + + // Make sure loading function is not yet invoked. + expect(loadingFnInvokedTimes).toBe(0); + + await timer(110); + await allPendingDynamicImports(); // fetching dependencies of the defer block + fixture.detectChanges(); + + // Expect that the loading resources function was invoked once. + expect(loadingFnInvokedTimes).toBe(1); + + await timer(110); + fixture.detectChanges(); + + // Verify primary blocks content. + expect(fixture.nativeElement.outerHTML).toContain('Rendering primary block'); + + // Make sure the loading function wasn't invoked again (count remains `1`). + expect(loadingFnInvokedTimes).toBe(1); + }); + }); + describe('viewport triggers', () => { let activeObservers: MockIntersectionObserver[] = []; let nativeIntersectionObserver: typeof IntersectionObserver; From 8e7feefb5bd371f576ae9a81769f87e560083663 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 28 Sep 2023 12:11:39 +0200 Subject: [PATCH 16/57] build: align schematics tsconfig with rest of the project (#51969) Adds `noPropertyAccessFromIndexSignature` to the tsconfig of the schematics in order to align it with the rest of the project. PR Close #51969 --- packages/core/schematics/tsconfig.json | 1 + packages/core/schematics/utils/project_tsconfig_paths.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/schematics/tsconfig.json b/packages/core/schematics/tsconfig.json index 450689783aaa4b..e900d404f8ed9b 100644 --- a/packages/core/schematics/tsconfig.json +++ b/packages/core/schematics/tsconfig.json @@ -3,6 +3,7 @@ "noImplicitReturns": true, "noImplicitOverride": true, "noFallthroughCasesInSwitch": true, + "noPropertyAccessFromIndexSignature": true, "esModuleInterop": true, "strict": true, "moduleResolution": "node", diff --git a/packages/core/schematics/utils/project_tsconfig_paths.ts b/packages/core/schematics/utils/project_tsconfig_paths.ts index 41f1a1ca9cdd39..8939e908a68c3b 100644 --- a/packages/core/schematics/utils/project_tsconfig_paths.ts +++ b/packages/core/schematics/utils/project_tsconfig_paths.ts @@ -28,7 +28,7 @@ export async function getProjectTsConfigPaths(tree: Tree): } for (const [, options] of allTargetOptions(target)) { - const tsConfig = options.tsConfig; + const tsConfig = options['tsConfig']; // Filter out tsconfig files that don't exist in the CLI project. if (typeof tsConfig !== 'string' || !tree.exists(tsConfig)) { continue; From d77c4b2aae03ac636c744866cbb868d343f03793 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 20 Sep 2023 11:30:37 -0700 Subject: [PATCH 17/57] refactor(core): Update view flags so only one number needs adjustment (#51839) When adding a new view flag, you currently need to adjust the last number of the last 3 flags. All of these share the same number so the shifting ones can just use the base-10 IndexWithinInitPhaseShift. PR Close #51839 --- packages/core/src/render3/interfaces/view.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index f1b678d460087f..e85cc790799e96 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -435,18 +435,19 @@ export const enum LViewFlags { /** Indicates that the view was created with `signals: true`. */ SignalView = 1 << 12, - /** - * Index of the current init phase on last 21 bits - */ - IndexWithinInitPhaseIncrementer = 1 << 13, /** * This is the count of the bits the 1 was shifted above (base 10) */ IndexWithinInitPhaseShift = 13, + /** + * Index of the current init phase on last 21 bits + */ + IndexWithinInitPhaseIncrementer = 1 << IndexWithinInitPhaseShift, + // Subtracting 1 gives all 1s to the right of the initial shift // So `(1 << 3) - 1` would give 3 1s: 1 << 3 = 0b01000, subtract 1 = 0b00111 - IndexWithinInitPhaseReset = (1 << 13) - 1, + IndexWithinInitPhaseReset = (1 << IndexWithinInitPhaseShift) - 1, } /** From ffd3fca0a861a648ed889ca0a881b16476d8757d Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sat, 23 Sep 2023 10:40:02 +0000 Subject: [PATCH 18/57] test: add benchmark for ng template outlet context modifications (#51887) Adds a benchmark for potential upcoming `NgTemplateOutlet` context logic updates. PR Close #51887 --- .../ng_template_outlet_context/BUILD.bazel | 14 ++++ .../ng2/BUILD.bazel | 39 +++++++++ .../ng_template_outlet_context/ng2/index.html | 16 ++++ .../ng_template_outlet_context/ng2/index.ts | 82 +++++++++++++++++++ .../ng_template_outlet_context.perf-spec.ts | 74 +++++++++++++++++ 5 files changed, 225 insertions(+) create mode 100644 modules/benchmarks/src/ng_template_outlet_context/BUILD.bazel create mode 100644 modules/benchmarks/src/ng_template_outlet_context/ng2/BUILD.bazel create mode 100644 modules/benchmarks/src/ng_template_outlet_context/ng2/index.html create mode 100644 modules/benchmarks/src/ng_template_outlet_context/ng2/index.ts create mode 100644 modules/benchmarks/src/ng_template_outlet_context/ng_template_outlet_context.perf-spec.ts diff --git a/modules/benchmarks/src/ng_template_outlet_context/BUILD.bazel b/modules/benchmarks/src/ng_template_outlet_context/BUILD.bazel new file mode 100644 index 00000000000000..8930db9a4ecf8f --- /dev/null +++ b/modules/benchmarks/src/ng_template_outlet_context/BUILD.bazel @@ -0,0 +1,14 @@ +load("//tools:defaults.bzl", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "perf_lib", + testonly = True, + srcs = ["ng_template_outlet_context.perf-spec.ts"], + tsconfig = "//modules/benchmarks:tsconfig-e2e.json", + deps = [ + "@npm//@angular/build-tooling/bazel/benchmark/driver-utilities", + "@npm//protractor", + ], +) diff --git a/modules/benchmarks/src/ng_template_outlet_context/ng2/BUILD.bazel b/modules/benchmarks/src/ng_template_outlet_context/ng2/BUILD.bazel new file mode 100644 index 00000000000000..72978f7a71bee3 --- /dev/null +++ b/modules/benchmarks/src/ng_template_outlet_context/ng2/BUILD.bazel @@ -0,0 +1,39 @@ +load("//tools:defaults.bzl", "app_bundle", "http_server", "ng_module") +load("@npm//@angular/build-tooling/bazel/benchmark/component_benchmark:benchmark_test.bzl", "benchmark_test") + +package(default_visibility = ["//modules/benchmarks:__subpackages__"]) + +ng_module( + name = "ng2", + srcs = glob(["*.ts"]), + strict_templates = True, + tsconfig = "//modules/benchmarks:tsconfig-build.json", + deps = [ + "//modules/benchmarks/src:util_lib", + "//packages/core", + "//packages/platform-browser", + ], +) + +app_bundle( + name = "bundle", + entry_point = ":index.ts", + deps = [ + ":ng2", + ], +) + +http_server( + name = "prodserver", + srcs = ["index.html"], + deps = [ + ":bundle.debug.min.js", + "//packages/zone.js/bundles:zone.umd.js", + ], +) + +benchmark_test( + name = "perf", + server = ":prodserver", + deps = ["//modules/benchmarks/src/ng_template_outlet_context:perf_lib"], +) diff --git a/modules/benchmarks/src/ng_template_outlet_context/ng2/index.html b/modules/benchmarks/src/ng_template_outlet_context/ng2/index.html new file mode 100644 index 00000000000000..206f7b0e568fba --- /dev/null +++ b/modules/benchmarks/src/ng_template_outlet_context/ng2/index.html @@ -0,0 +1,16 @@ + + + + + + + + +
+ Loading... +
+ + + + + diff --git a/modules/benchmarks/src/ng_template_outlet_context/ng2/index.ts b/modules/benchmarks/src/ng_template_outlet_context/ng2/index.ts new file mode 100644 index 00000000000000..a09f9c37788fb7 --- /dev/null +++ b/modules/benchmarks/src/ng_template_outlet_context/ng2/index.ts @@ -0,0 +1,82 @@ +/** + * @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 + */ + +import {NgIf, NgTemplateOutlet} from '@angular/common'; +import {Component, enableProdMode, Input} from '@angular/core'; +import {bootstrapApplication} from '@angular/platform-browser'; + +@Component({ + selector: 'deep', + standalone: true, + imports: [NgIf], + template: ` Level: {{depth}}`, +}) +class Deep { + @Input({required: true}) depth: number; +} + +@Component({ + selector: 'app-component', + standalone: true, + imports: [NgTemplateOutlet, Deep], + template: ` + + + + + + +

Implicit: {{implicit}}

+

A: {{a}}

+

B: {{b}}

+

Deep: {{deep.next.text}}

+

New: {{new}}

+ + +
+ +
+

Outlet

+ +
+ `, +}) +class AppComponent { + context: + {$implicit: unknown, a: unknown, b: unknown, deep: {next: {text: unknown}}, new?: unknown} = { + $implicit: 'Default Implicit', + a: 'Default A', + b: 'Default B', + deep: {next: {text: 'Default deep text'}}, + }; + + swapOutFull() { + this.context = { + $implicit: 'New Implicit new Object', + a: 'New A new Object', + b: 'New B new Object', + deep: {next: {text: 'New Deep text new Object'}}, + }; + } + + modifyProperty() { + this.context.a = 'Modified a'; + } + + modifyDeepProperty() { + this.context.deep.next.text = 'Modified deep a'; + } + + addNewProperty() { + this.context.new = 'New property set'; + } +} + +enableProdMode(); +bootstrapApplication(AppComponent); diff --git a/modules/benchmarks/src/ng_template_outlet_context/ng_template_outlet_context.perf-spec.ts b/modules/benchmarks/src/ng_template_outlet_context/ng_template_outlet_context.perf-spec.ts new file mode 100644 index 00000000000000..50c099a657eeb8 --- /dev/null +++ b/modules/benchmarks/src/ng_template_outlet_context/ng_template_outlet_context.perf-spec.ts @@ -0,0 +1,74 @@ +/** + * @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 + */ + +import {runBenchmark, verifyNoBrowserErrors} from '@angular/build-tooling/bazel/benchmark/driver-utilities'; +import {$} from 'protractor'; + +interface Worker { + id: string; + prepare?(): void; + work(): void; +} + +const SwapFullContext = { + id: 'swapFullContext', + work: () => { + $('#swapOutFull').click(); + } +}; + +const ModifyContextProperty = { + id: 'modifyContextProperty', + work: () => { + $('#modifyProperty').click(); + } +}; + +const ModifyContextDeepProperty = { + id: 'modifyContextDeepProperty', + work: () => { + $('#modifyDeepProperty').click(); + } +}; + +const AddNewContextProperty = { + id: 'addNewContextProperty', + work: () => { + $('#addNewProperty').click(); + } +}; + +const scenarios = [ + SwapFullContext, + ModifyContextProperty, + ModifyContextDeepProperty, + AddNewContextProperty, +]; + +describe('ng_template_outlet_context benchmark spec', () => { + afterEach(verifyNoBrowserErrors); + + scenarios.forEach((worker) => { + describe(worker.id, () => { + it('should run for ng2', async () => { + await runBenchmarkScenario( + {url: '/', id: `ngTemplateOutletContext.ng2.${worker.id}`, worker: worker}); + }); + }); + }); + + function runBenchmarkScenario(config: {id: string, url: string, worker: Worker}) { + return runBenchmark({ + id: config.id, + url: config.url, + ignoreBrowserSynchronization: true, + prepare: config.worker.prepare, + work: config.worker.work + }); + } +}); From 7be3620a13e404330df84ce9d7ec40d490716267 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sat, 23 Sep 2023 10:40:42 +0000 Subject: [PATCH 19/57] build: fix IDE completion for benchmarks code (#51887) We are including a file, for some reason, that is outside of the root dir. This breaks TypeScript/ or more specifically VSCode from picking up this tsconfig- breaking path mappings and hence auto completion. PR Close #51887 --- modules/benchmarks/tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/benchmarks/tsconfig.json b/modules/benchmarks/tsconfig.json index 020672cb006554..aa2d8c2d3616ee 100644 --- a/modules/benchmarks/tsconfig.json +++ b/modules/benchmarks/tsconfig.json @@ -30,6 +30,5 @@ "no-floating-promises": true, "no-unused-expression": true, "no-unused-variable": true - }, - "include": ["../../node_modules/@angular/build-tooling/bazel/benchmark/driver-utilities/"] + } } From 9b9e11fcaf5d8d639ff1d7b8feddb01751b47e14 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Thu, 28 Sep 2023 13:12:28 +0000 Subject: [PATCH 20/57] refactor(core): deprecate allowing full context object to be replaced in `EmbeddedViewRef` (#51887) This partially reverts commit a3e17190e7e7e0329ed3643299c24d5fd510b7d6 and deprecates behavior added. The context of an embedded view ref at some point was switched from a getter to an actual assignable property. This is something we revert as it introduces additional complexity for our generated code (in terms of closures capturing the `ctx`), creates technical limitations for Angular's internals and the usage pattern is rarely used (and can be addressed via simple assignments, `Object.assign` or the use of a proxy if replacing the full context object is still desirable) DEPRECATED: Swapping out the context object for `EmbeddedViewRef` is no longer supported. Support for this was introduced with v12.0.0, but this pattern is rarely used. There is no replacement, but you can use simple assignments in most cases, or `Object.assign , or alternatively still replace the full object by using a `Proxy` (see `NgTemplateOutlet` as an example). Also adds a warning if the deprecated PR Close #51887 --- packages/core/src/render3/view_ref.ts | 12 +++++++++++ .../core/test/acceptance/template_ref_spec.ts | 21 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/packages/core/src/render3/view_ref.ts b/packages/core/src/render3/view_ref.ts index 2139b1c0f8f28e..40080ea84b6d1f 100644 --- a/packages/core/src/render3/view_ref.ts +++ b/packages/core/src/render3/view_ref.ts @@ -63,7 +63,19 @@ export class ViewRef implements EmbeddedViewRef, InternalViewRef, ChangeDe return this._lView[CONTEXT] as unknown as T; } + /** + * @deprecated Replacing the full context object is not supported. Modify the context + * directly, or consider using a `Proxy` if you need to replace the full object. + * // TODO(devversion): Remove this. + */ set context(value: T) { + if (ngDevMode) { + // Note: We have a warning message here because the `@deprecated` JSDoc will not be picked + // up for assignments on the setter. We want to let users know about the deprecated usage. + console.warn( + 'Angular: Replacing the `context` object of an `EmbeddedViewRef` is deprecated.'); + } + this._lView[CONTEXT] = value as unknown as {}; } diff --git a/packages/core/test/acceptance/template_ref_spec.ts b/packages/core/test/acceptance/template_ref_spec.ts index 58bc1fecb74b5b..c1c22702e6c6b5 100644 --- a/packages/core/test/acceptance/template_ref_spec.ts +++ b/packages/core/test/acceptance/template_ref_spec.ts @@ -317,5 +317,26 @@ describe('TemplateRef', () => { button.click(); expect(events).toEqual(['Frodo', 'Bilbo']); }); + + it('should warn if the context of an embedded view ref is replaced', () => { + TestBed.configureTestingModule({declarations: [App]}); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + const viewRef = fixture.componentInstance.templateRef.createEmbeddedView({name: 'Frodo'}); + fixture.componentInstance.containerRef.insert(viewRef); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('Frodo'); + spyOn(console, 'warn'); + + viewRef.context = {name: 'Bilbo'}; + fixture.detectChanges(); + + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.warn) + .toHaveBeenCalledWith(jasmine.stringContaining( + 'Replacing the `context` object of an `EmbeddedViewRef` is deprecated')); + expect(fixture.nativeElement.textContent).toBe('Bilbo'); + }); }); }); From 7426948ff63a68524cee19f891205525bb9d5bd7 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 4 Oct 2023 11:08:45 +0000 Subject: [PATCH 21/57] refactor(common): update `NgTemplateOutlet` to no longer rely on context swapping (#51887) The context of an embedded view ref at some point was switched from a getter to an actual assignable property. This is something we reverted with the previous commit as it introduces additional complexity for our generated code (in terms of closures capturing the `ctx`). This change impacted the template outlet code because we actively relied on swapping out the full context if the user changes it. Previousl, before we allowed to swap out the context (in v16), we mutated the initial view context if it didn't change structurally- and in other cases the view was re-created. We improved this performance aspect with the changes to allow for the context to be swapped out + actually also fixed a bug where the initial context object was mutated and the user could observe this change. This commit adjusts for context not being replacable- while still keeping the bugs fixed and preserving the performance wins of not having to destroy/re-create the view whenever the context changes. Benchmarks: https://hackmd.io/J0Ci_JzxQ0K1AA1omXhIQQ PR Close #51887 --- goldens/size-tracking/aio-payloads.json | 2 +- .../src/directives/ng_template_outlet.ts | 59 ++++++++++++++----- .../directives/ng_template_outlet_spec.ts | 24 ++++++++ 3 files changed, 68 insertions(+), 17 deletions(-) diff --git a/goldens/size-tracking/aio-payloads.json b/goldens/size-tracking/aio-payloads.json index d7e719e4a5263b..90aebc5a03bf29 100755 --- a/goldens/size-tracking/aio-payloads.json +++ b/goldens/size-tracking/aio-payloads.json @@ -19,4 +19,4 @@ "dark-theme": 34598 } } -} +} \ No newline at end of file diff --git a/packages/common/src/directives/ng_template_outlet.ts b/packages/common/src/directives/ng_template_outlet.ts index 3d75130103bed2..46068372c8c93e 100644 --- a/packages/common/src/directives/ng_template_outlet.ts +++ b/packages/common/src/directives/ng_template_outlet.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive, EmbeddedViewRef, Injector, Input, OnChanges, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core'; +import {Directive, EmbeddedViewRef, Injector, Input, OnChanges, SimpleChange, SimpleChanges, TemplateRef, ViewContainerRef} from '@angular/core'; /** * @ngModule CommonModule @@ -57,30 +57,57 @@ export class NgTemplateOutlet implements OnChanges { constructor(private _viewContainerRef: ViewContainerRef) {} - /** @nodoc */ ngOnChanges(changes: SimpleChanges) { - if (changes['ngTemplateOutlet'] || changes['ngTemplateOutletInjector']) { + if (this._shouldRecreateView(changes)) { const viewContainerRef = this._viewContainerRef; if (this._viewRef) { viewContainerRef.remove(viewContainerRef.indexOf(this._viewRef)); } - if (this.ngTemplateOutlet) { - const { - ngTemplateOutlet: template, - ngTemplateOutletContext: context, - ngTemplateOutletInjector: injector, - } = this; - this._viewRef = - viewContainerRef.createEmbeddedView( - template, context, injector ? {injector} : undefined) as EmbeddedViewRef; - } else { + // If there is no outlet, clear the destroyed view ref. + if (!this.ngTemplateOutlet) { this._viewRef = null; + return; } - } else if ( - this._viewRef && changes['ngTemplateOutletContext'] && this.ngTemplateOutletContext) { - this._viewRef.context = this.ngTemplateOutletContext; + + // Create a context forward `Proxy` that will always bind to the user-specified context, + // without having to destroy and re-create views whenever the context changes. + const viewContext = this._createContextForwardProxy(); + this._viewRef = viewContainerRef.createEmbeddedView(this.ngTemplateOutlet, viewContext, { + injector: this.ngTemplateOutletInjector ?? undefined, + }); } } + + /** + * We need to re-create existing embedded view if either is true: + * - the outlet changed. + * - the injector changed. + */ + private _shouldRecreateView(changes: SimpleChanges): boolean { + return !!changes['ngTemplateOutlet'] || !!changes['ngTemplateOutletInjector']; + } + + /** + * For a given outlet instance, we create a proxy object that delegates + * to the user-specified context. This allows changing, or swapping out + * the context object completely without having to destroy/re-create the view. + */ + private _createContextForwardProxy(): C { + return new Proxy({}, { + set: (_target, prop, newValue) => { + if (!this.ngTemplateOutletContext) { + return false; + } + return Reflect.set(this.ngTemplateOutletContext, prop, newValue); + }, + get: (_target, prop, receiver) => { + if (!this.ngTemplateOutletContext) { + return undefined; + } + return Reflect.get(this.ngTemplateOutletContext, prop, receiver); + }, + }); + } } diff --git a/packages/common/test/directives/ng_template_outlet_spec.ts b/packages/common/test/directives/ng_template_outlet_spec.ts index eb3fdd2a0b66b4..f6ffc47d48ff21 100644 --- a/packages/common/test/directives/ng_template_outlet_spec.ts +++ b/packages/common/test/directives/ng_template_outlet_spec.ts @@ -318,6 +318,30 @@ describe('NgTemplateOutlet', () => { expect(fixture.nativeElement.textContent).toBe('Hello World'); }); + + it('should properly bind context if context is unset initially', () => { + @Component({ + imports: [NgTemplateOutlet], + template: ` + Name:{{name}} + + `, + standalone: true, + }) + class TestComponent { + ctx: {$implicit: string}|undefined = undefined; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('Name:'); + + fixture.componentInstance.ctx = {$implicit: 'Angular'}; + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('Name:Angular'); + }); }); const templateToken = new InjectionToken('templateToken'); From 02edb4306736e6f12e87a4164c17eca6cbdfe151 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 29 Sep 2023 12:02:24 +0200 Subject: [PATCH 22/57] fix(compiler): narrow the type of the aliased if block expression (#51952) Currently the TCB for aliased `if` blocks looks something like this: ``` // Markup: `@if (expr; as alias) { {{alias}} } if (block.condition) { var alias = block.condition; "" + alias; } ``` The problem with this approach is that the type of `alias` won't be narrowed. This is something that `NgIf` currently supports. These changes resolve the issue by emitting the variable outside the `if` block and using the variable reference instead: ``` // Markup: `@if (expr; as alias) { {{alias}} } var alias = block.condition; if (alias) { "" + alias; } ``` PR Close #51952 --- .../ngtsc/typecheck/src/type_check_block.ts | 83 +++++++++++-------- .../typecheck/test/type_check_block_spec.ts | 3 +- .../test/ngtsc/template_typecheck_spec.ts | 25 ++++++ 3 files changed, 73 insertions(+), 38 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index 0eb6e16e188b48..666978574cd5eb 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -85,7 +85,7 @@ export function generateTypeCheckBlock( const tcb = new Context( env, domSchemaChecker, oobRecorder, meta.id, meta.boundTarget, meta.pipes, meta.schemas, meta.isStandalone); - const scope = Scope.forNodes(tcb, null, tcb.boundTarget.target.template!, /* guard */ null); + const scope = Scope.forNodes(tcb, null, null, tcb.boundTarget.target.template!, /* guard */ null); const ctxRawType = env.referenceType(ref); if (!ts.isTypeReferenceNode(ctxRawType)) { throw new Error( @@ -379,7 +379,8 @@ class TcbTemplateBodyOp extends TcbOp { // Create a new Scope for the template. This constructs the list of operations for the template // children, as well as tracks bindings within the template. - const tmplScope = Scope.forNodes(this.tcb, this.scope, this.template, guard); + const tmplScope = + Scope.forNodes(this.tcb, this.scope, this.template, this.template.children, guard); // Render the template's `Scope` into its statements. const statements = tmplScope.render(); @@ -1228,14 +1229,31 @@ class TcbIfOp extends TcbOp { return undefined; } - const branchScope = Scope.forNodes(this.tcb, this.scope, branch, null); - // If the expression is null, it means that it's an `else` statement. - return branch.expression === null ? - ts.factory.createBlock(branchScope.render()) : - ts.factory.createIfStatement( - tcbExpression(branch.expression, this.tcb, branchScope), - ts.factory.createBlock(branchScope.render()), this.generateBranch(index + 1)); + if (branch.expression === null) { + const branchScope = Scope.forNodes(this.tcb, this.scope, null, branch.children, null); + return ts.factory.createBlock(branchScope.render()); + } + + let branchParentScope: Scope; + + if (branch.expressionAlias === null) { + branchParentScope = this.scope; + } else { + // If the expression is aliased, we create a scope with a variable containing the expression. + // Further down we'll use the variable instead of the expression itself in the `if` statement. + // This allows for the type of the alias to be narrowed. + branchParentScope = Scope.forNodes(this.tcb, this.scope, branch, [], null); + branchParentScope.render().forEach(stmt => this.scope.addStatement(stmt)); + } + + const branchScope = Scope.forNodes(this.tcb, branchParentScope, null, branch.children, null); + const expression = branch.expressionAlias === null ? + tcbExpression(branch.expression, this.tcb, branchScope) : + branchScope.resolve(branch.expressionAlias); + + return ts.factory.createIfStatement( + expression, ts.factory.createBlock(branchScope.render()), this.generateBranch(index + 1)); } } @@ -1260,7 +1278,7 @@ class TcbSwitchOp extends TcbOp { for (const current of this.block.cases) { // Our template switch statements don't fall through so we always have a break at the end. const breakStatement = ts.factory.createBreakStatement(); - const clauseScope = Scope.forNodes(this.tcb, this.scope, current.children, null); + const clauseScope = Scope.forNodes(this.tcb, this.scope, null, current.children, null); if (current.expression === null) { clauses.push(ts.factory.createDefaultClause([...clauseScope.render(), breakStatement])); @@ -1294,7 +1312,7 @@ class TcbForOfOp extends TcbOp { } override execute(): null { - const loopScope = Scope.forNodes(this.tcb, this.scope, this.block, null); + const loopScope = Scope.forNodes(this.tcb, this.scope, this.block, this.block.children, null); const initializer = ts.factory.createVariableDeclarationList( [ts.factory.createVariableDeclaration(this.block.item.name)], ts.NodeFlags.Const); // It's common to have a for loop over a nullable value (e.g. produced by the `async` pipe). @@ -1431,32 +1449,31 @@ class Scope { * Constructs a `Scope` given either a `TmplAstTemplate` or a list of `TmplAstNode`s. * * @param tcb the overall context of TCB generation. - * @param parent the `Scope` of the parent template (if any) or `null` if this is the root + * @param parentScope the `Scope` of the parent template (if any) or `null` if this is the root * `Scope`. - * @param blockOrNodes either a `TmplAstTemplate` representing the template for which to - * calculate the `Scope`, or a list of nodes if no outer template object is available. + * @param scopedNode Node that provides the scope around the child nodes (e.g. a + * `TmplAstTemplate` node exposing variables to its children). + * @param children Child nodes that should be appended to the TCB. * @param guard an expression that is applied to this scope for type narrowing purposes. */ static forNodes( - tcb: Context, parent: Scope|null, - blockOrNodes: TmplAstTemplate|TmplAstIfBlockBranch|TmplAstForLoopBlock|TmplAstNode[], - guard: ts.Expression|null): Scope { - const scope = new Scope(tcb, parent, guard); + tcb: Context, parentScope: Scope|null, + scopedNode: TmplAstTemplate|TmplAstIfBlockBranch|TmplAstForLoopBlock|null, + children: TmplAstNode[], guard: ts.Expression|null): Scope { + const scope = new Scope(tcb, parentScope, guard); - if (parent === null && tcb.env.config.enableTemplateTypeChecker) { + if (parentScope === null && tcb.env.config.enableTemplateTypeChecker) { // Add an autocompletion point for the component context. scope.opQueue.push(new TcbComponentContextCompletionOp(scope)); } - let children: TmplAstNode[]; - // If given an actual `TmplAstTemplate` instance, then process any additional information it // has. - if (blockOrNodes instanceof TmplAstTemplate) { + if (scopedNode instanceof TmplAstTemplate) { // The template's variable declarations need to be added as `TcbVariableOp`s. const varMap = new Map(); - for (const v of blockOrNodes.variables) { + for (const v of scopedNode.variables) { // Validate that variables on the `TmplAstTemplate` are only declared once. if (!varMap.has(v.name)) { varMap.set(v.name, v); @@ -1464,34 +1481,28 @@ class Scope { const firstDecl = varMap.get(v.name)!; tcb.oobRecorder.duplicateTemplateVar(tcb.id, v, firstDecl); } - this.registerVariable(scope, v, new TcbTemplateVariableOp(tcb, scope, blockOrNodes, v)); + this.registerVariable(scope, v, new TcbTemplateVariableOp(tcb, scope, scopedNode, v)); } - children = blockOrNodes.children; - } else if (blockOrNodes instanceof TmplAstIfBlockBranch) { - const {expression, expressionAlias} = blockOrNodes; + } else if (scopedNode instanceof TmplAstIfBlockBranch) { + const {expression, expressionAlias} = scopedNode; if (expression !== null && expressionAlias !== null) { this.registerVariable( scope, expressionAlias, new TcbBlockVariableOp( tcb, scope, tcbExpression(expression, tcb, scope), expressionAlias)); } - children = blockOrNodes.children; - } else if (blockOrNodes instanceof TmplAstForLoopBlock) { + } else if (scopedNode instanceof TmplAstForLoopBlock) { this.registerVariable( - scope, blockOrNodes.item, + scope, scopedNode.item, new TcbBlockVariableOp( - tcb, scope, ts.factory.createIdentifier(blockOrNodes.item.name), blockOrNodes.item)); + tcb, scope, ts.factory.createIdentifier(scopedNode.item.name), scopedNode.item)); - for (const variable of Object.values(blockOrNodes.contextVariables)) { + for (const variable of Object.values(scopedNode.contextVariables)) { // Note: currently all context variables are assumed to be number types. const type = ts.factory.createKeywordTypeNode(ts.SyntaxKind.NumberKeyword); this.registerVariable( scope, variable, new TcbBlockImplicitVariableOp(tcb, scope, type, variable)); } - - children = blockOrNodes.children; - } else { - children = blockOrNodes; } for (const node of children) { scope.appendNode(node); diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts index aa843011c78265..b549105acc85e0 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/type_check_block_spec.ts @@ -1424,8 +1424,7 @@ describe('type check blocks', () => { }`; expect(tcb(TEMPLATE)) - .toContain( - 'if ((((this).expr)) === (1)) { var _t1 = (((this).expr)) === (1); "" + (_t1); }'); + .toContain('var _t1 = (((this).expr)) === (1); if (_t1) { "" + (_t1); } }'); }); it('should generate a switch block', () => { diff --git a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts index efb14bc6af50c5..0c8f28f61d0c97 100644 --- a/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts +++ b/packages/compiler-cli/test/ngtsc/template_typecheck_spec.ts @@ -3831,6 +3831,31 @@ suppress ]); }); + it('should check narrow the type in the alias', () => { + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + template: \`@if (value; as alias) { + {{acceptsNumber(alias)}} + }\`, + standalone: true, + }) + export class Main { + value: 'one' | 0 = 0; + + acceptsNumber(value: number) { + return value; + } + } + `); + + const diags = env.driveDiagnostics(); + expect(diags.map(d => ts.flattenDiagnosticMessageText(d.messageText, ''))).toEqual([ + `Argument of type 'string' is not assignable to parameter of type 'number'.`, + ]); + }); + it('should not expose the aliased expression outside of the main block', () => { env.write('test.ts', ` import {Component} from '@angular/core'; From cc7973f5a5cddbc5288db7d572757819327a40c3 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Fri, 29 Sep 2023 21:46:27 +0200 Subject: [PATCH 23/57] fix(service-worker): throw a critical error when handleFetch fails (#51960) #51885 patched a call site that threw an error but there were 2 others call that needed to be wrapped in the same way by a try/catch. `initializeFully` is part of the calls in `responseWith(handleFetch)`. Same #51885, throwing `SwCriticalError`allows the driver to fallback to `safeFetch` and ensure `responseWith` doesn't fail. Fixes #50378 PR Close #51960 --- packages/service-worker/worker/src/assets.ts | 30 +++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/packages/service-worker/worker/src/assets.ts b/packages/service-worker/worker/src/assets.ts index d762ec3dc960dc..17810118c9d22a 100644 --- a/packages/service-worker/worker/src/assets.ts +++ b/packages/service-worker/worker/src/assets.ts @@ -539,8 +539,19 @@ export class PrefetchAssetGroup extends AssetGroup { // Construct the Request for this url. const req = this.adapter.newRequest(url); - // First, check the cache to see if there is already a copy of this resource. - const alreadyCached = (await cache.match(req, this.config.cacheQueryOptions)) !== undefined; + let alreadyCached = false; + try { + // Safari 16.4/17 is known to sometimes throw an unexpected internal error on cache access + // This try/catch is here as a workaround to prevent a failure of the handleFetch + // as the Driver falls back to safeFetch on critical errors. + // See #50378 + + // First, check the cache to see if there is already a copy of this resource. + alreadyCached = (await cache.match(req, this.config.cacheQueryOptions)) !== undefined; + } catch (error) { + throw new SwCriticalError( + `Cache is throwing while looking for a match in a PrefetchAssetGroup: ${error}`); + } // If the resource is in the cache already, it can be skipped. if (alreadyCached) { @@ -617,8 +628,19 @@ export class LazyAssetGroup extends AssetGroup { // Construct the Request for this url. const req = this.adapter.newRequest(url); - // First, check the cache to see if there is already a copy of this resource. - const alreadyCached = (await cache.match(req, this.config.cacheQueryOptions)) !== undefined; + let alreadyCached = false; + try { + // Safari 16.4/17 is known to sometimes throw an unexpected internal error on cache access + // This try/catch is here as a workaround to prevent a failure of the handleFetch + // as the Driver falls back to safeFetch on critical errors. + // See #50378 + + // First, check the cache to see if there is already a copy of this resource. + alreadyCached = (await cache.match(req, this.config.cacheQueryOptions)) !== undefined; + } catch (error) { + throw new SwCriticalError( + `Cache is throwing while looking for a match in a LazyAssetGroup: ${error}`); + } // If the resource is in the cache already, it can be skipped. if (alreadyCached) { From 1d871c03a523e10bb838cb0f9550595cfbd9d14d Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Wed, 4 Oct 2023 16:12:07 +0200 Subject: [PATCH 24/57] fix(compiler): forward referenced dependencies not identified as deferrable (#52017) Fixes that we weren't accounting for dependencies using `forwardRef` when determining if they can be lazy-loaded. Fixes #52014. PR Close #52017 --- .../annotations/component/src/handler.ts | 6 ++- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 41 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts index f5466620384ffb..704e93a892dc23 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts @@ -26,7 +26,7 @@ import {TypeCheckableDirectiveMeta, TypeCheckContext} from '../../../typecheck/a import {ExtendedTemplateChecker} from '../../../typecheck/extended/api'; import {getSourceFile} from '../../../util/src/typescript'; import {Xi18nContext} from '../../../xi18n'; -import {combineResolvers, compileDeclareFactory, compileInputTransformFields, compileNgFactoryDefField, compileResults, extractClassMetadata, extractSchemas, findAngularDecorator, forwardRefResolver, getDirectiveDiagnostics, getProviderDiagnostics, InjectableClassRegistry, isExpressionForwardReference, readBaseClass, ReferencesRegistry, removeIdentifierReferences, resolveEncapsulationEnumValueLocally, resolveEnumValue, resolveImportedFile, resolveLiteral, resolveProvidersRequiringFactory, ResourceLoader, toFactoryMetadata, validateHostDirectives, wrapFunctionExpressionsInParens,} from '../../common'; +import {combineResolvers, compileDeclareFactory, compileInputTransformFields, compileNgFactoryDefField, compileResults, extractClassMetadata, extractSchemas, findAngularDecorator, forwardRefResolver, getDirectiveDiagnostics, getProviderDiagnostics, InjectableClassRegistry, isExpressionForwardReference, readBaseClass, ReferencesRegistry, removeIdentifierReferences, resolveEncapsulationEnumValueLocally, resolveEnumValue, resolveImportedFile, resolveLiteral, resolveProvidersRequiringFactory, ResourceLoader, toFactoryMetadata, tryUnwrapForwardRef, validateHostDirectives, wrapFunctionExpressionsInParens,} from '../../common'; import {extractDirectiveMetadata, parseDirectiveStyles} from '../../directive'; import {createModuleWithProvidersResolver, NgModuleSymbol} from '../../ng_module'; @@ -1186,7 +1186,9 @@ export class ComponentDecoratorHandler implements // for defer loading. if (analysisData.meta.isStandalone && analysisData.rawImports !== null && ts.isArrayLiteralExpression(analysisData.rawImports)) { - for (const node of analysisData.rawImports.elements) { + for (const element of analysisData.rawImports.elements) { + const node = tryUnwrapForwardRef(element, this.reflector) || element; + if (!ts.isIdentifier(node)) { // Can't defer-load non-literal references. continue; diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 1f3bc3389dc4f2..6f0ee8f0d46643 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -9010,6 +9010,47 @@ function allTests(os: string) { 'import("./cmp-a").then(m => m.CmpB)]'); expect(jsContents).not.toContain('import { CmpA, CmpB }'); }); + + it('should lazy-load dependency referenced with a fowrardRef', () => { + env.write('cmp-a.ts', ` + import { Component } from '@angular/core'; + + @Component({ + standalone: true, + selector: 'cmp-a', + template: 'CmpA!' + }) + export class CmpA {} + `); + + env.write('/test.ts', ` + import { Component, forwardRef } from '@angular/core'; + import { CmpA } from './cmp-a'; + + @Component({ + selector: 'test-cmp', + standalone: true, + imports: [forwardRef(() => CmpA)], + template: \` + @defer { + + } + \`, + }) + export class TestCmp {} + `); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + + expect(jsContents).toContain('ɵɵdefer(1, 0, TestCmp_Defer_1_DepsFn)'); + expect(jsContents).toContain('() => [import("./cmp-a").then(m => m.CmpA)]'); + + // The `CmpA` symbol wasn't referenced elsewhere, so it can be defer-loaded + // via dynamic imports and an original import can be removed. + expect(jsContents).not.toContain('import { CmpA }'); + }); }); describe('setClassMetadataAsync', () => { From 706838950c34a44d7df3ac20bd657e57771e3267 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Fri, 29 Sep 2023 17:06:14 -0700 Subject: [PATCH 25/57] refactor(core): allow nested @defer block to contain the same dependency (#51964) Currently, if there are 2 nested @defer blocks with the same dependency, Angular throws an error at runtime to indicate that there was a duplicate component def in the registry. This commit updates the logic to only append dependencies when they didn't previously exist in the registry. PR Close #51964 --- .../core/src/render3/instructions/defer.ts | 31 ++++++++--- .../core/src/render3/interfaces/definition.ts | 2 + packages/core/test/acceptance/defer_spec.ts | 53 +++++++++++++++++++ 3 files changed, 79 insertions(+), 7 deletions(-) diff --git a/packages/core/src/render3/instructions/defer.ts b/packages/core/src/render3/instructions/defer.ts index 5fb85dc91f80e7..28650966c01d23 100644 --- a/packages/core/src/render3/instructions/defer.ts +++ b/packages/core/src/render3/instructions/defer.ts @@ -18,7 +18,7 @@ import {bindingUpdated} from '../bindings'; import {getComponentDef, getDirectiveDef, getPipeDef} from '../definition'; import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; import {DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockConfig, DeferBlockInternalState, DeferBlockState, DeferBlockTriggers, DeferDependenciesLoadingState, DeferredLoadingBlockConfig, DeferredPlaceholderBlockConfig, DependencyResolverFn, LDeferBlockDetails, TDeferBlockDetails} from '../interfaces/defer'; -import {DirectiveDefList, PipeDefList} from '../interfaces/definition'; +import {DependencyDef, DirectiveDefList, PipeDefList} from '../interfaces/definition'; import {TContainerNode, TNode} from '../interfaces/node'; import {isDestroyed, isLContainer, isLView} from '../interfaces/type_checks'; import {FLAGS, HEADER_OFFSET, INJECTOR, LView, LViewFlags, PARENT, TVIEW, TView} from '../interfaces/view'; @@ -748,19 +748,36 @@ export function triggerResourceLoading(tDetails: TDeferBlockDetails, lView: LVie // Update directive and pipe registries to add newly downloaded dependencies. const primaryBlockTView = primaryBlockTNode.tView!; if (directiveDefs.length > 0) { - primaryBlockTView.directiveRegistry = primaryBlockTView.directiveRegistry ? - [...primaryBlockTView.directiveRegistry, ...directiveDefs] : - directiveDefs; + primaryBlockTView.directiveRegistry = + addDepsToRegistry(primaryBlockTView.directiveRegistry, directiveDefs); } if (pipeDefs.length > 0) { - primaryBlockTView.pipeRegistry = primaryBlockTView.pipeRegistry ? - [...primaryBlockTView.pipeRegistry, ...pipeDefs] : - pipeDefs; + primaryBlockTView.pipeRegistry = + addDepsToRegistry(primaryBlockTView.pipeRegistry, pipeDefs); } } }); } +/** + * Adds downloaded dependencies into a directive or a pipe registry, + * making sure that a dependency doesn't yet exist in the registry. + */ +function addDepsToRegistry(currentDeps: T|null, newDeps: T): T { + if (!currentDeps || currentDeps.length === 0) { + return newDeps; + } + + const currentDepSet = new Set(currentDeps); + for (const dep of newDeps) { + currentDepSet.add(dep); + } + + // If `currentDeps` is the same length, there were no new deps and can + // return the original array. + return (currentDeps.length === currentDepSet.size) ? currentDeps : Array.from(currentDepSet) as T; +} + /** Utility function to render placeholder content (if present) */ function renderPlaceholder(lView: LView, tNode: TNode) { const lContainer = lView[tNode.index]; diff --git a/packages/core/src/render3/interfaces/definition.ts b/packages/core/src/render3/interfaces/definition.ts index fd3744168fd4ce..b18b0817ae5c20 100644 --- a/packages/core/src/render3/interfaces/definition.ts +++ b/packages/core/src/render3/interfaces/definition.ts @@ -488,6 +488,8 @@ export type DirectiveDefListOrFactory = (() => DirectiveDefList)|DirectiveDefLis export type DirectiveDefList = (DirectiveDef|ComponentDef)[]; +export type DependencyDef = DirectiveDef|ComponentDef|PipeDef; + export type DirectiveTypesOrFactory = (() => DirectiveTypeList)|DirectiveTypeList; export type DirectiveTypeList = diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index b29d9d5040a691..649c75281b863a 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -619,6 +619,59 @@ describe('@defer', () => { // Nested defer block was triggered and the `CmpB` content got rendered. expect(fixture.nativeElement.outerHTML).toContain('CmpA'); }); + + it('should handle nested blocks that defer load the same dep', async () => { + @Component({ + selector: 'cmp-a', + standalone: true, + template: 'CmpA', + }) + class CmpA { + } + + @Component({ + standalone: true, + selector: 'root-app', + imports: [CmpA], + template: ` + @defer (on immediate) { + + + @defer (on immediate) { + + } + } + ` + }) + class RootCmp { + } + + const deferDepsInterceptor = { + intercept() { + return () => { + return [dynamicImportOf(CmpA)]; + }; + } + }; + + TestBed.configureTestingModule({ + providers: [ + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + const fixture = TestBed.createComponent(RootCmp); + fixture.detectChanges(); + + // Wait for the dependency fn promise to resolve. + await allPendingDynamicImports(); + fixture.detectChanges(); + + // Expect both components to be rendered. + expect(fixture.nativeElement.innerHTML.replaceAll('', '')) + .toBe('CmpACmpA'); + }); }); describe('prefetch', () => { From aa6bb8ee95bb4e6d530ac4b74e346612928bca6e Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Thu, 28 Sep 2023 12:44:25 -0700 Subject: [PATCH 26/57] refactor(compiler): Fix a bug in which temporaries were being declared in the wrong places (#51950) Previously, we always generated temporary variable declarations at the beginning of each view's update block. This is wrong, for two reasons: 1. Temporaries can be used in the create block 2. When listeners use temporaries, we should declare them inside the listener. Now, we always place temporaries at the beginning of the enclosing OpList, and recursively try to generate them when we find a listener. PR Close #51950 --- .../nullish_coalescing/TEST_CASES.json | 15 ++- .../src/phases/temporary_variables.ts | 98 +++++++++++-------- 2 files changed, 69 insertions(+), 44 deletions(-) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/nullish_coalescing/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/nullish_coalescing/TEST_CASES.json index 3bfadccf874b2f..a7f78af7cf33fa 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/nullish_coalescing/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/nullish_coalescing/TEST_CASES.json @@ -3,7 +3,9 @@ "cases": [ { "description": "should handle nullish coalescing inside interpolations", - "inputFiles": ["nullish_coalescing_interpolation.ts"], + "inputFiles": [ + "nullish_coalescing_interpolation.ts" + ], "expectations": [ { "files": [ @@ -18,7 +20,9 @@ }, { "description": "should handle nullish coalescing inside property bindings", - "inputFiles": ["nullish_coalescing_property.ts"], + "inputFiles": [ + "nullish_coalescing_property.ts" + ], "expectations": [ { "files": [ @@ -33,7 +37,9 @@ }, { "description": "should handle nullish coalescing inside host bindings", - "inputFiles": ["nullish_coalescing_host.ts"], + "inputFiles": [ + "nullish_coalescing_host.ts" + ], "expectations": [ { "files": [ @@ -44,8 +50,7 @@ ], "failureMessage": "Incorrect host bindings" } - ], - "skipForTemplatePipeline": true + ] } ] } \ No newline at end of file diff --git a/packages/compiler/src/template/pipeline/src/phases/temporary_variables.ts b/packages/compiler/src/template/pipeline/src/phases/temporary_variables.ts index 5fcef42358c37a..dd7b0edf0c0158 100644 --- a/packages/compiler/src/template/pipeline/src/phases/temporary_variables.ts +++ b/packages/compiler/src/template/pipeline/src/phases/temporary_variables.ts @@ -8,7 +8,7 @@ import * as o from '../../../../output/output_ast'; import * as ir from '../../ir'; -import {CompilationJob, ComponentCompilationJob} from '../compilation'; +import type {CompilationJob, CompilationUnit} from '../compilation'; /** * Find all assignments and usages of temporary variables, which are linked to each other with cross @@ -21,49 +21,69 @@ import {CompilationJob, ComponentCompilationJob} from '../compilation'; */ export function phaseTemporaryVariables(cpl: CompilationJob): void { for (const unit of cpl.units) { - let opCount = 0; - let generatedStatements: Array> = []; - for (const op of unit.ops()) { - // Identify the final time each temp var is read. - const finalReads = new Map(); - ir.visitExpressionsInOp(op, expr => { - if (expr instanceof ir.ReadTemporaryExpr) { - finalReads.set(expr.xref, expr); - } - }); + unit.create.prepend(generateTemporaries(unit.create) as Array>); + unit.update.prepend(generateTemporaries(unit.update) as Array>); + } +} + +function generateTemporaries(ops: ir.OpList): + Array> { + let opCount = 0; + let generatedStatements: Array> = []; - // Name the temp vars, accounting for the fact that a name can be reused after it has been - // read for the final time. - let count = 0; - const assigned = new Set(); - const released = new Set(); - const defs = new Map(); - ir.visitExpressionsInOp(op, expr => { - if (expr instanceof ir.AssignTemporaryExpr) { - if (!assigned.has(expr.xref)) { - assigned.add(expr.xref); - // TODO: Exactly replicate the naming scheme used by `TemplateDefinitionBuilder`. - // It seems to rely on an expression index instead of an op index. - defs.set(expr.xref, `tmp_${opCount}_${count++}`); - } - assignName(defs, expr); - } else if (expr instanceof ir.ReadTemporaryExpr) { - if (finalReads.get(expr.xref) === expr) { - released.add(expr.xref); - count--; - } - assignName(defs, expr); + // For each op, search for any variables that are assigned or read. For each variable, generate a + // name and produce a `DeclareVarStmt` to the beginning of the block. + for (const op of ops) { + // Identify the final time each temp var is read. + const finalReads = new Map(); + ir.visitExpressionsInOp(op, (expr, flag) => { + if (flag & ir.VisitorContextFlag.InChildOperation) { + return; + } + if (expr instanceof ir.ReadTemporaryExpr) { + finalReads.set(expr.xref, expr); + } + }); + + // Name the temp vars, accounting for the fact that a name can be reused after it has been + // read for the final time. + let count = 0; + const assigned = new Set(); + const released = new Set(); + const defs = new Map(); + ir.visitExpressionsInOp(op, (expr, flag) => { + if (flag & ir.VisitorContextFlag.InChildOperation) { + return; + } + if (expr instanceof ir.AssignTemporaryExpr) { + if (!assigned.has(expr.xref)) { + assigned.add(expr.xref); + // TODO: Exactly replicate the naming scheme used by `TemplateDefinitionBuilder`. + // It seems to rely on an expression index instead of an op index. + defs.set(expr.xref, `tmp_${opCount}_${count++}`); + } + assignName(defs, expr); + } else if (expr instanceof ir.ReadTemporaryExpr) { + if (finalReads.get(expr.xref) === expr) { + released.add(expr.xref); + count--; } - }); + assignName(defs, expr); + } + }); - // Add declarations for the temp vars. - generatedStatements.push( - ...Array.from(new Set(defs.values())) - .map(name => ir.createStatementOp(new o.DeclareVarStmt(name)))); - opCount++; + // Add declarations for the temp vars. + generatedStatements.push( + ...Array.from(new Set(defs.values())) + .map(name => ir.createStatementOp(new o.DeclareVarStmt(name)))); + opCount++; + + if (op.kind === ir.OpKind.Listener) { + op.handlerOps.prepend(generateTemporaries(op.handlerOps) as ir.UpdateOp[]); } - unit.update.prepend(generatedStatements); } + + return generatedStatements; } /** From 04436cfd602f1caa97938a24786b802926f64087 Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Thu, 28 Sep 2023 13:46:46 -0700 Subject: [PATCH 27/57] refactor(compiler): Drop `!important` when parsing host style/class bindings (#51950) For components, the parser already extracts the `important` property (and it is later disregarded). However, because host bindings use a totally separate parsing code path, this was never happing for host bindings. Here, we add some code to the host style parsing phase to drop the `!important` suffix. We could solve this category of problems for good by parsing host bindings with the same code as template bindings. PR Close #51950 --- .../r3_view_compiler_styling/host_bindings/TEST_CASES.json | 1 - .../compiler/src/template/pipeline/ir/src/ops/update.ts | 2 +- .../pipeline/src/phases/host_style_property_parsing.ts | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/host_bindings/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/host_bindings/TEST_CASES.json index 4601c86641321b..af5be4ba308664 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/host_bindings/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/host_bindings/TEST_CASES.json @@ -34,7 +34,6 @@ "inputFiles": [ "important.ts" ], - "skipForTemplatePipeline": true, "expectations": [ { "failureMessage": "Incorrect template", diff --git a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts index 475b4bc9159462..00d32fac829bb2 100644 --- a/packages/compiler/src/template/pipeline/ir/src/ops/update.ts +++ b/packages/compiler/src/template/pipeline/ir/src/ops/update.ts @@ -114,7 +114,7 @@ export interface BindingOp extends Op { securityContext: SecurityContext; /** - * Whether the binding is a TextAttribute (e.g. `some-attr="some-value"`). This needs ot be + * Whether the binding is a TextAttribute (e.g. `some-attr="some-value"`). This needs to be * tracked for compatiblity with `TemplateDefinitionBuilder` which treats `style` and `class` * TextAttributes differently from `[attr.style]` and `[attr.class]`. */ diff --git a/packages/compiler/src/template/pipeline/src/phases/host_style_property_parsing.ts b/packages/compiler/src/template/pipeline/src/phases/host_style_property_parsing.ts index dfe37c3afa92c8..cf73579d594ece 100644 --- a/packages/compiler/src/template/pipeline/src/phases/host_style_property_parsing.ts +++ b/packages/compiler/src/template/pipeline/src/phases/host_style_property_parsing.ts @@ -16,6 +16,7 @@ const CLASS_DOT = 'class.'; const STYLE_BANG = 'style!'; const CLASS_BANG = 'class!'; +const BANG_IMPORTANT = '!important'; export function phaseHostStylePropertyParsing(job: CompilationJob): void { for (const op of job.root.update) { @@ -23,6 +24,11 @@ export function phaseHostStylePropertyParsing(job: CompilationJob): void { continue; } + if (op.name.endsWith(BANG_IMPORTANT)) { + // Delete any `!important` suffixes from the binding name. + op.name = op.name.substring(0, op.name.length - BANG_IMPORTANT.length); + } + if (op.name.startsWith(STYLE_DOT)) { op.bindingKind = ir.BindingKind.StyleProperty; op.name = op.name.substring(STYLE_DOT.length); From 4b4dd2bf3a14501b41eeccbb95fcb35c8ab1d806 Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Fri, 29 Sep 2023 16:44:39 -0700 Subject: [PATCH 28/57] refactor(compiler): Don't emit properties on structural `ng-template`s (#51950) Consider an `ng-template` which is generated as a result of a structural directive: ```
``` This should logically expand into something like the following: ```
``` Note that the `(click)` handler and the `[title]` property are only present on the inner div, *not* on the enclosing generated `ng-template`. Previously, Template Pipeline would place these bindings on *both* the tempate and the inner element. However, we can't just remove them completely, because these bindings should still be matchable on the generated `ng-template` (which is very surprising, but nonetheless true). We resolve this issue with two improvements: (1) The ingestion step is now much smarter about determining not only if a binding is on a template element, but whether it actually targets that template element. (2) We use `ExtractedAttributeOp` directly, rather than going through `BindingOp`, to cause the `ng-template` to still receive these bindings in its `consts` array for matching purposes. PR Close #51950 --- .../r3_view_compiler_template/TEST_CASES.json | 4 +- .../nested_template_context.pipeline.js | 66 ++++++++++++++++++ .../src/template/pipeline/src/emit.ts | 2 - .../src/template/pipeline/src/ingest.ts | 67 ++++++++++++++++--- .../src/phases/no_listeners_on_templates.ts | 35 ---------- 5 files changed, 126 insertions(+), 48 deletions(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js delete mode 100644 packages/compiler/src/template/pipeline/src/phases/no_listeners_on_templates.ts diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json index 343c40423058ac..b944b0ce93e759 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json @@ -11,13 +11,13 @@ "files": [ { "expected": "nested_template_context_template.js", + "templatePipelineExpected": "nested_template_context.pipeline.js", "generated": "nested_template_context.js" } ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should correctly bind to context in nested template with many bindings", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js new file mode 100644 index 00000000000000..9fbd05bca0e9db --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/nested_template_context.pipeline.js @@ -0,0 +1,66 @@ +function MyComponent_ul_0_li_1_div_1_Template(rf, ctx) { + if (rf & 1) { + const $s$ = $i0$.ɵɵgetCurrentView(); + $i0$.ɵɵelementStart(0, "div", 2); + $i0$.ɵɵlistener("click", function MyComponent_ul_0_li_1_div_1_Template_div_click_0_listener(){ + const $inner$ = $i0$.ɵɵrestoreView($s$).$implicit; + const $middle$ = $i0$.ɵɵnextContext().$implicit; + const $outer$ = $i0$.ɵɵnextContext().$implicit; + const $myComp$ = $i0$.ɵɵnextContext(); + return $i0$.ɵɵresetView($myComp$.onClick($outer$, $middle$, $inner$)); + }); + $i0$.ɵɵtext(1); + $i0$.ɵɵelementEnd(); + } + + if (rf & 2) { + const $inner1$ = ctx.$implicit; + const $middle1$ = $i0$.ɵɵnextContext().$implicit; + const $outer1$ = $i0$.ɵɵnextContext().$implicit; + const $myComp1$ = $i0$.ɵɵnextContext(); + $i0$.ɵɵproperty("title", $myComp1$.format($outer1$, $middle1$, $inner1$, $myComp1$.component)); + $r3$.ɵɵadvance(1); + $i0$.ɵɵtextInterpolate1(" ", $myComp1$.format($outer1$, $middle1$, $inner1$, $myComp1$.component), " "); + } + } + + function MyComponent_ul_0_li_1_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelementStart(0, "li"); + $i0$.ɵɵtemplate(1, MyComponent_ul_0_li_1_div_1_Template, 2, 2, "div", 1); + $i0$.ɵɵelementEnd(); + } + if (rf & 2) { + const $myComp2$ = $i0$.ɵɵnextContext(2); + $r3$.ɵɵadvance(1); + $i0$.ɵɵproperty("ngForOf", $myComp2$.items); + } + } + + function MyComponent_ul_0_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelementStart(0, "ul"); + $i0$.ɵɵtemplate(1, MyComponent_ul_0_li_1_Template, 2, 1, "li", 0); + $i0$.ɵɵelementEnd(); + } + if (rf & 2) { + const $outer2$ = ctx.$implicit; + $r3$.ɵɵadvance(1); + $i0$.ɵɵproperty("ngForOf", $outer2$.items); + } + } + … + consts: [ + [__AttributeMarker.Template__, "ngFor", "ngForOf"], + [__AttributeMarker.Bindings__, "title", "click", __AttributeMarker.Template__, "ngFor", "ngForOf"], + [__AttributeMarker.Bindings__, "click", "title"] + ], + template:function MyComponent_Template(rf, ctx){ + if (rf & 1) { + $i0$.ɵɵtemplate(0, MyComponent_ul_0_Template, 2, 1, "ul", 0); + } + if (rf & 2) { + $i0$.ɵɵproperty("ngForOf", ctx.items); + } + } + \ No newline at end of file diff --git a/packages/compiler/src/template/pipeline/src/emit.ts b/packages/compiler/src/template/pipeline/src/emit.ts index 51beec7f3685b2..36b77bc51782e9 100644 --- a/packages/compiler/src/template/pipeline/src/emit.ts +++ b/packages/compiler/src/template/pipeline/src/emit.ts @@ -35,7 +35,6 @@ import {phaseNamespace} from './phases/namespace'; import {phaseNaming} from './phases/naming'; import {phaseMergeNextContext} from './phases/next_context_merging'; import {phaseNgContainer} from './phases/ng_container'; -import {phaseNoListenersOnTemplates} from './phases/no_listeners_on_templates'; import {phaseNonbindable} from './phases/nonbindable'; import {phaseNullishCoalescing} from './phases/nullish_coalescing'; import {phaseOrdering} from './phases/ordering'; @@ -80,7 +79,6 @@ const phases: Phase[] = [ {kind: Kind.Both, fn: phaseParseExtractedStyles}, {kind: Kind.Tmpl, fn: phaseRemoveEmptyBindings}, {kind: Kind.Tmpl, fn: phaseConditionals}, - {kind: Kind.Tmpl, fn: phaseNoListenersOnTemplates}, {kind: Kind.Tmpl, fn: phasePipeCreation}, {kind: Kind.Tmpl, fn: phaseI18nTextExtraction}, {kind: Kind.Tmpl, fn: phaseApplyI18nExpressions}, diff --git a/packages/compiler/src/template/pipeline/src/ingest.ts b/packages/compiler/src/template/pipeline/src/ingest.ts index 3656e5a09abe6f..812b6a8a75e5e4 100644 --- a/packages/compiler/src/template/pipeline/src/ingest.ts +++ b/packages/compiler/src/template/pipeline/src/ingest.ts @@ -219,7 +219,7 @@ function ingestContent(unit: ViewCompilationUnit, content: t.Content): void { for (const attr of content.attributes) { ingestBinding( unit, op.xref, attr.name, o.literal(attr.value), e.BindingType.Attribute, null, - SecurityContext.NONE, attr.sourceSpan, true, false); + SecurityContext.NONE, attr.sourceSpan, BindingFlags.TextValue); } unit.create.push(op); } @@ -485,16 +485,27 @@ function convertAst( */ function ingestBindings( unit: ViewCompilationUnit, op: ir.ElementOpBase, element: t.Element|t.Template): void { + let flags: BindingFlags = BindingFlags.None; + const isPlainTemplate = + element instanceof t.Template && splitNsName(element.tagName ?? '')[1] === 'ng-template'; + if (element instanceof t.Template) { + flags |= BindingFlags.OnNgTemplateElement; + if (isPlainTemplate) { + flags |= BindingFlags.BindingTargetsTemplate; + } + + const templateAttrFlags = + flags | BindingFlags.BindingTargetsTemplate | BindingFlags.IsStructuralTemplateAttribute; for (const attr of element.templateAttrs) { if (attr instanceof t.TextAttribute) { ingestBinding( unit, op.xref, attr.name, o.literal(attr.value), e.BindingType.Attribute, null, - SecurityContext.NONE, attr.sourceSpan, true, true); + SecurityContext.NONE, attr.sourceSpan, templateAttrFlags | BindingFlags.TextValue); } else { ingestBinding( unit, op.xref, attr.name, attr.value, attr.type, attr.unit, attr.securityContext, - attr.sourceSpan, false, true); + attr.sourceSpan, templateAttrFlags); } } } @@ -505,13 +516,12 @@ function ingestBindings( // `BindingType.Attribute`. ingestBinding( unit, op.xref, attr.name, o.literal(attr.value), e.BindingType.Attribute, null, - SecurityContext.NONE, attr.sourceSpan, true, false); + SecurityContext.NONE, attr.sourceSpan, flags | BindingFlags.TextValue); } - for (const input of element.inputs) { ingestBinding( unit, op.xref, input.name, input.value, input.type, input.unit, input.securityContext, - input.sourceSpan, false, false); + input.sourceSpan, flags); } for (const output of element.outputs) { @@ -521,6 +531,13 @@ function ingestBindings( throw Error('Animation listener should have a phase'); } } + + if (element instanceof t.Template && !isPlainTemplate) { + unit.create.push( + ir.createExtractedAttributeOp(op.xref, ir.BindingKind.Property, output.name, null)); + continue; + } + listenerOp = ir.createListenerOp(op.xref, output.name, op.tag, output.phase, false, output.sourceSpan); @@ -564,14 +581,46 @@ const BINDING_KINDS = new Map([ [e.BindingType.Animation, ir.BindingKind.Animation], ]); +enum BindingFlags { + None = 0b000, + + /** + * The binding is to a static text literal and not to an expression. + */ + TextValue = 0b0001, + + /** + * The binding belongs to the `` side of a `t.Template`. + */ + BindingTargetsTemplate = 0b0010, + + /** + * The binding is on a structural directive. + */ + IsStructuralTemplateAttribute = 0b0100, + + /** + * The binding is on a `t.Template`. + */ + OnNgTemplateElement = 0b1000, +} + function ingestBinding( view: ViewCompilationUnit, xref: ir.XrefId, name: string, value: e.AST|o.Expression, type: e.BindingType, unit: string|null, securityContext: SecurityContext, - sourceSpan: ParseSourceSpan, isTextAttribute: boolean, isTemplateBinding: boolean): void { + sourceSpan: ParseSourceSpan, flags: BindingFlags): void { if (value instanceof e.ASTWithSource) { value = value.ast; } + if (flags & BindingFlags.OnNgTemplateElement && !(flags & BindingFlags.BindingTargetsTemplate) && + type === e.BindingType.Property) { + // This binding only exists for later const extraction, and is not an actual binding to be + // created. + view.create.push(ir.createExtractedAttributeOp(xref, ir.BindingKind.Property, name, null)); + return; + } + let expression: o.Expression|ir.Interpolation; // TODO: We could easily generate source maps for subexpressions in these cases, but // TemplateDefinitionBuilder does not. Should we do so? @@ -586,8 +635,8 @@ function ingestBinding( const kind: ir.BindingKind = BINDING_KINDS.get(type)!; view.update.push(ir.createBindingOp( - xref, kind, name, expression, unit, securityContext, isTextAttribute, isTemplateBinding, - sourceSpan)); + xref, kind, name, expression, unit, securityContext, !!(flags & BindingFlags.TextValue), + !!(flags & BindingFlags.IsStructuralTemplateAttribute), sourceSpan)); } /** diff --git a/packages/compiler/src/template/pipeline/src/phases/no_listeners_on_templates.ts b/packages/compiler/src/template/pipeline/src/phases/no_listeners_on_templates.ts deleted file mode 100644 index 1b11e807dd7282..00000000000000 --- a/packages/compiler/src/template/pipeline/src/phases/no_listeners_on_templates.ts +++ /dev/null @@ -1,35 +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 - */ - -import * as o from '../../../../output/output_ast'; -import * as ir from '../../ir'; -import type {CompilationJob} from '../compilation'; - -export function phaseNoListenersOnTemplates(job: CompilationJob): void { - for (const unit of job.units) { - let inTemplate = false; - for (const op of unit.create) { - switch (op.kind) { - case ir.OpKind.Template: - inTemplate = true; - break; - case ir.OpKind.ElementStart: - case ir.OpKind.Element: - case ir.OpKind.ContainerStart: - case ir.OpKind.Container: - inTemplate = false; - break; - case ir.OpKind.Listener: - if (inTemplate) { - ir.OpList.remove(op); - } - break; - } - } - } -} From 422a3db2a895efb2a53c4c6cd239c09952885c24 Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Sat, 30 Sep 2023 16:12:39 -0700 Subject: [PATCH 29/57] refactor(compiler): Enable passing and nearly-passing Template Pipeline tests (#51950) A couple tests were already passing, and just needed to be enabled. This includes tests pertaining to: * ng-template * host binding styling slots * and host animation bindings * some literal tests (which were missing some $foo$ escaped names) We add pipeline-specific versions of the following tests, and enable them: * A local refs test. The consts for the element attributes and the consts for local reference are collected in the reverse order, but the emitted template is functionally the same. * A safe accesstest. Consider the expression `$any(val)?.foo`. `TemplateDefinitionBuilder` extracts a temporary variable: `($tmp_0_0$ = $ctx$.val) == null ? null : $tmp_0_0$.foo`. It presumably does this because it considers the `$any(...)` to be a function call. However, this is not a real call, so Template Pipeline safely ignores it and declines to generate a temporary. * Another local refs test. AttributeMarker.Template is emitted at the end of the const array (instead of the middle) PR Close #51950 --- .../lifecycle_hooks/TEST_CASES.json | 9 ++- .../local_reference_nested.pipeline.js | 56 +++++++++++++++++++ ....js => local_reference_nested_template.js} | 0 .../queries/TEST_CASES.json | 3 +- .../safe_access/TEST_CASES.json | 30 +++++++--- .../safe_access_non_null_template.pipeline.js | 10 ++++ .../non_bindable_behavior/TEST_CASES.json | 9 ++- .../local_ref_on_host.pipeline.js | 18 ++++++ ..._host.js => local_ref_on_host.template.js} | 0 .../r3_view_compiler_listener/TEST_CASES.json | 3 +- ...embedded_view_listener_context_template.js | 6 +- .../binding_slots/TEST_CASES.json | 3 +- .../component_animations/TEST_CASES.json | 47 +++++++++++----- .../r3_view_compiler_template/TEST_CASES.json | 7 +-- ...g_for_parent_context_variables.pipeline.js | 42 ++++++++++++++ 15 files changed, 201 insertions(+), 42 deletions(-) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js rename packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/{local_reference_nested.js => local_reference_nested_template.js} (100%) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js rename packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/{local_ref_on_host.js => local_ref_on_host.template.js} (100%) create mode 100644 packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json index fd22e36cf0395c..a07200fee5b6ca 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/TEST_CASES.json @@ -24,11 +24,14 @@ { "failureMessage": "Incorrect MyComponent.ɵcmp", "files": [ - "local_reference_nested.js" + { + "generated": "local_reference_nested.js", + "expected": "local_reference_nested_template.js", + "templatePipelineExpected": "local_reference_nested.pipeline.js" + } ] } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should support local refs mixed with context assignments", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js new file mode 100644 index 00000000000000..340d0d88077db9 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.pipeline.js @@ -0,0 +1,56 @@ +function MyComponent_div_3_span_2_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵelementStart(0, "span"); + $r3$.ɵɵtext(1); + $r3$.ɵɵelementEnd(); + } + if (rf & 2) { + $r3$.ɵɵnextContext(); + const $bar$ = $r3$.ɵɵreference(4); + $r3$.ɵɵnextContext(); + const $foo$ = $r3$.ɵɵreference(1); + const $baz$ = $r3$.ɵɵreference(5); + $r3$.ɵɵadvance(1); + $r3$.ɵɵtextInterpolate3("", $foo$, "-", $bar$, "-", $baz$, ""); + } + } + function MyComponent_div_3_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵelementStart(0, "div"); + $r3$.ɵɵtext(1); + $r3$.ɵɵtemplate(2, MyComponent_div_3_span_2_Template, 2, 3, "span", 3); + $r3$.ɵɵelement(3, "span", null, 2); + $r3$.ɵɵelementEnd(); + } + if (rf & 2) { + const $bar$ = $r3$.ɵɵreference(4); + $r3$.ɵɵnextContext(); + const $foo$ = $r3$.ɵɵreference(1); + $r3$.ɵɵadvance(1); + $r3$.ɵɵtextInterpolate2(" ", $foo$, "-", $bar$, " "); + } + } + // ... + MyComponent.ɵcmp = /*@__PURE__*/ $r3$.ɵɵdefineComponent({ + type: MyComponent, + selectors: [["my-component"]], + decls: 6, + vars: 1, + consts: [["foo", ""], ["baz", ""], ["bar", ""], [__AttributeMarker.Template__, "if"]], + template: function MyComponent_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵɵelement(0, "div", null, 0); + $r3$.ɵɵtext(2); + $r3$.ɵɵtemplate(3, MyComponent_div_3_Template, 5, 2, "div", 3); + $r3$.ɵɵelement(4, "div", null, 1); + } + if (rf & 2) { + const $foo$ = $r3$.ɵɵreference(1); + $r3$.ɵɵadvance(2); + $r3$.ɵɵtextInterpolate1(" ", $foo$, " "); + } + }, + dependencies:[IfDirective], + encapsulation: 2 + }); + \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested_template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested.js rename to packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/lifecycle_hooks/local_reference_nested_template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/TEST_CASES.json index bf6ee89d7d2ffa..38d95651e57c3a 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_compiler_compliance/components_and_directives/queries/TEST_CASES.json @@ -87,8 +87,7 @@ "content_query_for_directive.js" ] } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should support content queries with forwardRefs", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json index 9389efdf54efae..a9a4d9a33d7a78 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/TEST_CASES.json @@ -3,7 +3,9 @@ "cases": [ { "description": "should handle safe keyed reads inside templates", - "inputFiles": ["safe_keyed_read.ts"], + "inputFiles": [ + "safe_keyed_read.ts" + ], "expectations": [ { "files": [ @@ -18,7 +20,9 @@ }, { "description": "should handle deep safe property reads inside templates", - "inputFiles": ["safe_access_deep.ts"], + "inputFiles": [ + "safe_access_deep.ts" + ], "expectations": [ { "files": [ @@ -32,7 +36,9 @@ }, { "description": "should handle property reads requiring temporary variables", - "inputFiles": ["safe_access_temporaries.ts"], + "inputFiles": [ + "safe_access_temporaries.ts" + ], "expectations": [ { "files": [ @@ -48,7 +54,9 @@ }, { "description": "should handle safe method calls inside templates", - "inputFiles": ["safe_method_call.ts"], + "inputFiles": [ + "safe_method_call.ts" + ], "expectations": [ { "files": [ @@ -63,7 +71,9 @@ }, { "description": "should handle safe calls inside templates", - "inputFiles": ["safe_call.ts"], + "inputFiles": [ + "safe_call.ts" + ], "expectations": [ { "files": [ @@ -79,19 +89,21 @@ }, { "description": "should handle non-null assertions after a safe access", - "inputFiles": ["safe_access_non_null.ts"], + "inputFiles": [ + "safe_access_non_null.ts" + ], "expectations": [ { "files": [ { "expected": "safe_access_non_null_template.js", + "templatePipelineExpected": "safe_access_non_null_template.pipeline.js", "generated": "safe_access_non_null.js" } ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] } ] -} +} \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js new file mode 100644 index 00000000000000..2febae32126f3a --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler/safe_access/safe_access_non_null_template.pipeline.js @@ -0,0 +1,10 @@ +template: function MyApp_Template(rf, $ctx$) { + if (rf & 1) { + i0.ɵɵtext(0); + } + if (rf & 2) { + let $tmp_0_0$; + i0.ɵɵtextInterpolate4(" ", $ctx$.val == null ? null : $ctx$.val.foo.bar, " ", $ctx$.val == null ? null : $ctx$.val[0].foo.bar, " ", ($tmp_0_0$ = $ctx$.foo($ctx$.val)) == null ? null : $tmp_0_0$.foo.bar, " ", $ctx$.val == null ? null : $ctx$.val.foo.bar, " "); + } + } + \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json index 767dc15846aa62..f9e47f8666e8bc 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/TEST_CASES.json @@ -10,11 +10,14 @@ { "failureMessage": "Incorrect handling of local refs for host element", "files": [ - "local_ref_on_host.js" + { + "generated": "local_ref_on_host.js", + "expected": "local_ref_on_host.template.js", + "templatePipelineExpected": "local_ref_on_host.pipeline.js" + } ] } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should not have local refs for nested elements", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js new file mode 100644 index 00000000000000..514e4513df7758 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.pipeline.js @@ -0,0 +1,18 @@ +consts: [["myRef", ""], ["id", "my-id"]], +template:function MyComponent_Template(rf, $ctx$){ + if (rf & 1) { + $i0$.ɵɵelementStart(0, "b", 1, 0); + $i0$.ɵɵdisableBindings(); + $i0$.ɵɵelementStart(2, "i"); + $i0$.ɵɵtext(3, "Hello {{ name }}!"); + $i0$.ɵɵelementEnd(); + $i0$.ɵɵenableBindings(); + $i0$.ɵɵelementEnd(); + $i0$.ɵɵtext(4); + } + if (rf & 2) { + const $_r0$ = $i0$.ɵɵreference(1); + $r3$.ɵɵadvance(4); + $i0$.ɵɵtextInterpolate1(" ", $_r0$.id, " "); + } +} diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.template.js similarity index 100% rename from packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.js rename to packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_bindings/non_bindable_behavior/local_ref_on_host.template.js diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json index 27b6fc3d9abed3..88ad2ce8c74381 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/TEST_CASES.json @@ -128,8 +128,7 @@ ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should not generate the $event argument if it is not being used in a template", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js index 0f339b3aafdc57..8fb9a64ff01f54 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_listener/embedded_view_listener_context_template.js @@ -1,10 +1,10 @@ function MyComponent_ng_template_0_Template(rf, $ctx$) { if (rf & 1) { - const _r3 = $i0$.ɵɵgetCurrentView(); + const $_r3$ = $i0$.ɵɵgetCurrentView(); $i0$.ɵɵelementStart(0, "button", 0); $i0$.ɵɵlistener("click", function MyComponent_ng_template_0_Template_button_click_0_listener() { - const restoredCtx = $i0$.ɵɵrestoreView(_r3); - const $obj_r1$ = restoredCtx.$implicit; + const $restoredCtx$ = $i0$.ɵɵrestoreView($_r3$); + const $obj_r1$ = $restoredCtx$.$implicit; return $i0$.ɵɵresetView($obj_r1$.value = 1); }); $i0$.ɵɵtext(1, "Change"); diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/binding_slots/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/binding_slots/TEST_CASES.json index 844f47a281f2fe..aecdf748335070 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/binding_slots/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/binding_slots/TEST_CASES.json @@ -41,8 +41,7 @@ "host_binding_slots.js" ] } - ], - "skipForTemplatePipeline": true + ] } ] } \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/component_animations/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/component_animations/TEST_CASES.json index 67873cf3857960..6115842a4eba8b 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/component_animations/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_styling/component_animations/TEST_CASES.json @@ -3,54 +3,73 @@ "cases": [ { "description": "should pass in the component metadata animations into the component definition", - "inputFiles": ["metadata.ts"], + "inputFiles": [ + "metadata.ts" + ], "expectations": [ { "failureMessage": "Incorrect template", - "files": ["metadata.js"] + "files": [ + "metadata.js" + ] } ] }, { "description": "should include animations even if the provided array is empty", - "inputFiles": ["metadata_empty.ts"], + "inputFiles": [ + "metadata_empty.ts" + ], "expectations": [ { "failureMessage": "Incorrect template", - "files": ["metadata_empty.js"] + "files": [ + "metadata_empty.js" + ] } ] }, { "description": "should generate any animation triggers into the component template", - "inputFiles": ["animation_property_bindings.ts"], + "inputFiles": [ + "animation_property_bindings.ts" + ], "expectations": [ { "failureMessage": "Incorrect template", - "files": ["animation_property_bindings.js"] + "files": [ + "animation_property_bindings.js" + ] } ] }, { "description": "should generate animation listeners", - "inputFiles": ["animation_listeners.ts"], + "inputFiles": [ + "animation_listeners.ts" + ], "expectations": [ { "failureMessage": "Incorrect template", - "files": ["animation_listeners.js"] + "files": [ + "animation_listeners.js" + ] } - ] + ] }, { "description": "should generate animation host binding and listener code for directives", - "inputFiles": ["animation_host_bindings.ts"], + "inputFiles": [ + "animation_host_bindings.ts" + ], "expectations": [ { "failureMessage": "Incorrect template", - "files": ["animation_host_bindings.js"] + "files": [ + "animation_host_bindings.js" + ] } - ], - "skipForTemplatePipeline": true + ] } ] -} +} \ No newline at end of file diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json index b944b0ce93e759..87d91f3f26cd29 100644 --- a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/TEST_CASES.json @@ -80,13 +80,13 @@ "files": [ { "expected": "ng_for_parent_context_variables_template.js", + "templatePipelineExpected": "ng_for_parent_context_variables.pipeline.js", "generated": "ng_for_parent_context_variables.js" } ], "failureMessage": "Incorrect template" } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should correctly skip contexts as needed", @@ -234,8 +234,7 @@ ] ] } - ], - "skipForTemplatePipeline": true + ] }, { "description": "should create unique listener function names even for similar nested template structures", diff --git a/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js new file mode 100644 index 00000000000000..7d2cf6d85f6e11 --- /dev/null +++ b/packages/compiler-cli/test/compliance/test_cases/r3_view_compiler_template/ng_for_parent_context_variables.pipeline.js @@ -0,0 +1,42 @@ +function MyComponent_div_0_span_1_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelementStart(0, "span"); + $i0$.ɵɵtext(1); + $i0$.ɵɵelementEnd(); + } + if (rf & 2) { + const $div$ = $i0$.ɵɵnextContext(); + const $item$ = $div$.$implicit; + const $i$ = $div$.index; + $r3$.ɵɵadvance(1); + $i0$.ɵɵtextInterpolate2(" ", $i$, " - ", $item$, " "); + } + } + + function MyComponent_div_0_Template(rf, ctx) { + if (rf & 1) { + $i0$.ɵɵelementStart(0, "div"); + $i0$.ɵɵtemplate(1, MyComponent_div_0_span_1_Template, 2, 2, "span", 1); + $i0$.ɵɵelementEnd(); + } + if (rf & 2) { + const $app$ = $i0$.ɵɵnextContext(); + $r3$.ɵɵadvance(1); + $i0$.ɵɵproperty("ngIf", $app$.showing); + } + } + + … + consts: [ + [__AttributeMarker.Template__, "ngFor", "ngForOf"], + [__AttributeMarker.Template__, "ngIf"] + ], + template:function MyComponent_Template(rf, ctx){ + if (rf & 1) { + $i0$.ɵɵtemplate(0, MyComponent_div_0_Template, 2, 1, "div", 0); + } + if (rf & 2) { + $i0$.ɵɵproperty("ngForOf", ctx.items); + } + } + \ No newline at end of file From 08482f2c7dcbcd100981dfb266a6e63f64432328 Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Tue, 26 Sep 2023 10:31:27 -0700 Subject: [PATCH 30/57] fix(language-service): Retain correct language service when `ts.Project` reloads (#51912) When the `ts.Project` creates the language service plugin (in this case, the Angular Language Service), it sets the project's language service to the new language service returned by the plugin create: https://sourcegraph.com/github.com/microsoft/TypeScript@b12af0fa2bbd4b015e59adcfb49988cea7f919a1/-/blob/src/server/project.ts?L2035-2044 The project may be reloaded in response to various events, such as a change to the tsconfig file, which then recreates the plugin. When this happens, the language service that gets passed to the plugin `create` function will not be the typescript language service, but rather the previous instance of the new language service returned by the last call to `create`. This commit ensures that subsequent calls to `create` for the `NgLanguageService` plugin for a project after the first call are able to retrieve and hold on to the _TypeScript_ language service. fixes https://github.com/angular/vscode-ng-language-service/issues/1923 PR Close #51912 --- packages/language-service/api.ts | 1 + packages/language-service/src/ts_plugin.ts | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/language-service/api.ts b/packages/language-service/api.ts index 4f41bbf7ad4607..2039720abf4347 100644 --- a/packages/language-service/api.ts +++ b/packages/language-service/api.ts @@ -58,6 +58,7 @@ export interface NgLanguageService extends ts.LanguageService { getComponentLocationsForTemplate(fileName: string): GetComponentLocationsForTemplateResponse; getTemplateLocationForComponent(fileName: string, position: number): GetTemplateLocationForComponentResponse; + getTypescriptLanguageService(): ts.LanguageService; } export function isNgLanguageService(ls: ts.LanguageService| diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index ca822290fa4dbe..d6caf9fc9fe79d 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -8,12 +8,15 @@ import ts from 'typescript/lib/tsserverlibrary'; -import {GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse, NgLanguageService} from '../api'; +import {GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse, isNgLanguageService, NgLanguageService} from '../api'; import {LanguageService} from './language_service'; export function create(info: ts.server.PluginCreateInfo): NgLanguageService { - const {project, languageService: tsLS, config} = info; + const {project, languageService, config} = info; + const tsLS = isNgLanguageService(languageService) ? + languageService.getTypescriptLanguageService() : + languageService; const angularOnly = config?.angularOnly === true; const ngLS = new LanguageService(project, tsLS, config); @@ -194,6 +197,9 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService { } } + function getTypescriptLanguageService() { + return tsLS; + } return { ...tsLS, @@ -214,6 +220,7 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService { getTemplateLocationForComponent, getCodeFixesAtPosition, getCombinedCodeFix, + getTypescriptLanguageService, }; } From 4611b7032df819e4b51264f185ea315f7b401f85 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Sat, 30 Sep 2023 15:03:37 +0000 Subject: [PATCH 31/57] docs: update events (#51966) Generated `events.json` with the latest events retrieved from the Firebase DB. Closes #51955 PR Close #51966 --- aio/content/marketing/events.json | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/aio/content/marketing/events.json b/aio/content/marketing/events.json index a25a011af6fe09..d1a73a9299b7ee 100644 --- a/aio/content/marketing/events.json +++ b/aio/content/marketing/events.json @@ -1211,6 +1211,24 @@ }, "name": "ng-conf" }, + { + "date": { + "start": "2023-09-19" + }, + "name": "GraphQL SF" + }, + { + "date": { + "start": "2023-10-05" + }, + "name": "ViteConf" + }, + { + "date": { + "start": "2023-10-15" + }, + "name": "All Things Open" + }, { "date": { "start": "2023-11-08" @@ -1222,5 +1240,23 @@ "start": "2023-11-09" }, "name": "JSPoland" + }, + { + "date": { + "start": "2023-12-01" + }, + "name": "ngRome" + }, + { + "date": { + "start": "2023-11-02" + }, + "name": "JetBrains JavaScript Day " + }, + { + "date": { + "start": "2023-09-26" + }, + "name": "JSDayIE" } ] \ No newline at end of file From 5269cae788abc4a95078b9c6e5d43af221a8a9cd Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Wed, 20 Sep 2023 15:42:18 +0000 Subject: [PATCH 32/57] build: lock file maintenance (#51834) Update the lock file. PR Close #51834 --- aio/yarn.lock | 935 +++++++-------- package.json | 7 +- .../bundle.golden_symbols.json | 27 + .../animations/bundle.golden_symbols.json | 30 + .../cyclic_import/bundle.golden_symbols.json | 9 + .../forms_reactive/bundle.golden_symbols.json | 15 + .../bundle.golden_symbols.json | 15 + .../hello_world/bundle.golden_symbols.json | 9 + .../hydration/bundle.golden_symbols.json | 9 + .../router/bundle.golden_symbols.json | 63 +- .../bundle.golden_symbols.json | 6 + .../bundling/todo/bundle.golden_symbols.json | 15 + packages/zone.js/yarn.lock | 816 ++++++------- yarn.lock | 1066 ++++++++--------- 14 files changed, 1565 insertions(+), 1457 deletions(-) diff --git a/aio/yarn.lock b/aio/yarn.lock index 07e573863d538e..ba29b82be45acc 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -151,10 +151,10 @@ resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.0.3.tgz#52db355eb2794e5407bfd045c64e102a0c078fbe" integrity sha512-8zwY6ustiPXBEF3+jELKVwGk6j2HJn7GHbqAhDFR02YiE27iRMSGTHIAWGs6ZI7F1JgfrIsOHrUgzC1x95K6rg== -"@angular-eslint/bundled-angular-compiler@16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.1.1.tgz#d2dbf1bd4942cbb4b11fc3fd4055d1c57d0818c6" - integrity sha512-TB01AWZBDfrZBxN1I50HfBXtC7q4NI5fwl1aS4tOfef2/kQjTtR9zmha8CsxjDkAOa9tA/4MUayAMqEBQLuHKQ== +"@angular-eslint/bundled-angular-compiler@16.2.0": + version "16.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.2.0.tgz#09d0637d738850a2c6f0523f19632e992f790102" + integrity sha512-ct9orDYxkMl2+uvM7UBfgV28Dq57V4dEs+Drh7cD673JIMa6sXbgmd0QEtm8W3cmyK/jcTzmuoufxbH7hOxd6g== "@angular-eslint/eslint-plugin-template@16.0.3": version "16.0.3" @@ -177,11 +177,11 @@ "@typescript-eslint/utils" "5.59.7" "@angular-eslint/template-parser@^16.0.3": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-16.1.1.tgz#299aea38f3ede18add854359652b95f2f56e5bde" - integrity sha512-ZJ+M4+JGYcsIP/t+XiuzL5A5pCjjCen272U3/M/WqIMDDxyIKrHubK1bVtr2kndCEudqud+WyJU0ub13UIwGgw== + version "16.2.0" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-16.2.0.tgz#eccd1a2424b001a585107ec4db8eda726bdc9a6d" + integrity sha512-v2jVKTy2wN7iM9nHpBkxLn2wfL8jSl4IlPrXThIqj8No2VHtpLQZPKuXbGPUXQX05VS2Mj5feScQ36ZVGS8Rbw== dependencies: - "@angular-eslint/bundled-angular-compiler" "16.1.1" + "@angular-eslint/bundled-angular-compiler" "16.2.0" eslint-scope "^7.0.0" "@angular-eslint/utils@16.0.3": @@ -436,7 +436,7 @@ resolved "https://registry.yarnpkg.com/@assemblyscript/loader/-/loader-0.10.1.tgz#70e45678f06c72fa2e350e8553ec4a4d72b92e06" integrity sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg== -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -445,9 +445,9 @@ chalk "^2.4.2" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@7.22.17": version "7.22.17" @@ -492,20 +492,20 @@ semver "^6.3.1" "@babel/core@^7.12.3", "@babel/core@^7.16.0": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" + integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.20" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.20" + "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -522,16 +522,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/generator@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" @@ -550,24 +540,13 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== - dependencies: - "@babel/types" "^7.22.10" - -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15": +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -579,14 +558,14 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -594,9 +573,9 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" @@ -613,12 +592,7 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-environment-visitor@^7.22.20": +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== @@ -646,37 +620,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" + integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-imports@^7.22.15": +"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz#7edf129097a51ccc12443adbc6320e90eab76693" - integrity sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ== +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" + integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-module-transforms@^7.22.19": version "7.23.0" @@ -689,17 +656,6 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" - "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -713,21 +669,21 @@ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -756,48 +712,24 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" - integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== - -"@babel/helper-validator-identifier@^7.22.20": +"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" - -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" "@babel/helpers@^7.22.15": version "7.22.15" @@ -809,20 +741,15 @@ "@babel/types" "^7.22.15" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== - -"@babel/parser@^7.22.15", "@babel/parser@^7.22.16": +"@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": version "7.22.16" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== @@ -1491,28 +1418,21 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.16.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.11.tgz#bf65b846cb4a03e1594dba9850c4632a992ddc04" - integrity sha512-NhfzUbdWbiE6fCFypbWCPu6AR8xre31EOPF7wwAIJEvGQ2avov04eymayWinCuyXmV1b0+jzoXP/HYzzUYdvwg== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz#7aeb9460598a997b0fe74982a5b02fb9e5d264d9" + integrity sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@7.22.15": +"@babel/runtime@7.22.15", "@babel/runtime@^7.8.4": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.8.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.22.15": +"@babel/template@^7.22.15", "@babel/template@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1521,44 +1441,19 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.17.tgz#b23c203ab3707e3be816043081b4a994fcacec44" - integrity sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg== +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" + integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== dependencies: "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.17" + "@babel/types" "^7.22.19" debug "^4.1.0" globals "^11.1.0" @@ -1578,22 +1473,13 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15", "@babel/types@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee" - integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg== +"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5", "@babel/types@^7.4.4": + version "7.22.19" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" + integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-validator-identifier" "^7.22.19" to-fast-properties "^2.0.0" "@babel/types@^7.22.19", "@babel/types@^7.23.0": @@ -1947,9 +1833,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.8.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.1.tgz#8c4bb756cc2aa7eaf13cfa5e69c83afb3260c20c" + integrity sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ== "@eslint/eslintrc@^2.1.1": version "2.1.2" @@ -1967,9 +1853,9 @@ strip-json-comments "^3.1.1" "@eslint/js@^8.46.0": - version "8.48.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb" - integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== + version "8.49.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333" + integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w== "@google-cloud/paginator@^4.0.0": version "4.0.1" @@ -2025,9 +1911,9 @@ "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.0": - version "0.7.9" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.9.tgz#3ca68236f1a0d77566dafa53c715eb31d096279a" - integrity sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ== + version "0.7.10" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" + integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" @@ -3050,9 +2936,9 @@ integrity sha512-liHtyVVOttcqHIV3Xrg/1AJzEgfiOCeqJsleHXHGgPr1fxPx7SIZaa3/QnDY1lNMN+t6Gvj0/r2Ba3iuptYD3Q== "@opentelemetry/api@^1.0.0": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" - integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.6.0.tgz#de2c6823203d6f319511898bb5de7e70f5267e19" + integrity sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g== "@opentelemetry/semantic-conventions@~1.3.0": version "1.3.1" @@ -3338,24 +3224,24 @@ integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" + integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== dependencies: "@types/node" "*" "@types/browser-sync@^2.26.3": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.0.tgz#28f579ce4cb06e5b69e2701c654df437ab618664" - integrity sha512-CQc8mggMZpKsUAdjm7jyR8uWcFnxuly8xw76ZY4jSLugsZWHLcv7mLVVY591XPaZ2BqbFZT1fxov3hrQFistNg== + version "2.27.1" + resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.1.tgz#e6147254d020e600d1382fc6c4fd9243231ed0ca" + integrity sha512-p/qAU+3dqq/CqobNiiZkIsernNfQe/35QEtor8Oae/WWgMLLhceFogCaAMe7pO4T8Z5WL/Co522YBo2sk/I7AQ== dependencies: "@types/micromatch" "^2" "@types/node" "*" @@ -3363,17 +3249,17 @@ chokidar "^3.0.0" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" @@ -3383,9 +3269,9 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== dependencies: "@types/node" "*" @@ -3446,14 +3332,14 @@ "@types/node" "*" "@types/http-errors@*": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.12" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" + integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== dependencies: "@types/node" "*" @@ -3473,9 +3359,9 @@ integrity sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g== "@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/json5@^0.0.29": version "0.0.29" @@ -3545,9 +3431,9 @@ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== "@types/node@16.10.9": version "16.10.9" @@ -3610,9 +3496,9 @@ "@types/ws" "*" "@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.2" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" + integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== "@types/send@*", "@types/send@^0.17.1": version "0.17.1" @@ -3646,19 +3532,19 @@ "@types/node" "*" "@types/tmp@^0.2.1": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" - integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== + version "0.2.4" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.4.tgz#1e26f791b94a95474f1f3322a721dfb065b876fb" + integrity sha512-Vq3rwM+2KgiLacq68EjTJD9cuJ/ne5pXntWn8B8Rxj25SLkGAhCgooCZ1lhcIcV5OFveJ+s5Cqpi+XKfFM/xZA== "@types/triple-beam@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" - integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" + integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== "@types/trusted-types@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.3.tgz#a136f83b0758698df454e328759dbd3d44555311" - integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.4.tgz#2b38784cd16957d3782e8e2b31c03bc1d13b4d65" + integrity sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ== "@types/unist@*", "@types/unist@^3.0.0": version "3.0.0" @@ -3671,9 +3557,9 @@ integrity sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw== "@types/uuid@^9.0.0": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.3.tgz#6cdd939b4316b4f81625de9f06028d848c4a1533" - integrity sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug== + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.4.tgz#e884a59338da907bda8d2ed03e01c5c49d036f1c" + integrity sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA== "@types/vfile-message@*": version "2.0.0" @@ -4013,9 +3899,9 @@ integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== "@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.50" - resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.50.tgz#6433be9c65d5621f535cf8a6be43862f1199776c" - integrity sha512-rsqnaP3NnFZdmTbgs5WoybBSx4wCvcCM4e3btvH7YdsTmnuSn4mE6KuILxca8MVTSY5xYFsXOb5ZvwhyhsX8qw== + version "3.0.0-rc.51" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.51.tgz#b6628fdb00e984c54f7eca8b8cbd71cc52fabe73" + integrity sha512-E3sHAnUcyvGbXDCY1YJTVTwovF1UFP8IVJ6CFGgTST8RGD2gRQqqmW8dZykpaDWKqO6RBqwJcfmJMyqYBBpixw== dependencies: js-yaml "^3.10.0" tslib "^2.4.0" @@ -4109,7 +3995,7 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" -agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: +agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== @@ -4290,12 +4176,12 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" -archiver-utils@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.3.tgz#0531e6f64078a325e591886773fa80d72c97df19" - integrity sha512-fXzpEZTKgBJMWy0eUT0/332CAQnJ27OJd7sGcvNZzxS2Yzg7iITivMhXOm+zUTO4vT8ZqlPCqiaLPmB8qWhWRA== +archiver-utils@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7" + integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== dependencies: - glob "^7.1.4" + glob "^7.2.3" graceful-fs "^4.2.0" lazystream "^1.0.0" lodash.defaults "^4.2.0" @@ -4306,6 +4192,18 @@ archiver-utils@^3.0.0: normalize-path "^3.0.0" readable-stream "^3.6.0" +archiver-utils@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-4.0.1.tgz#66ad15256e69589a77f706c90c6dbcc1b2775d2a" + integrity sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg== + dependencies: + glob "^8.0.0" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash "^4.17.15" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + archiver@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" @@ -4320,17 +4218,17 @@ archiver@^5.0.0: zip-stream "^4.1.0" archiver@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-6.0.0.tgz#b366c8a21bdb84932b3913d83d0cc576dd4ec112" - integrity sha512-EPGa+bYaxaMiCT8DCbEDqFz8IjeBSExrJzyUOJx2FBkFJ/OZzJuso3lMSk901M50gMqXxTQcumlGajOFlXhVhw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-6.0.1.tgz#d56968d4c09df309435adb5a1bbfc370dae48133" + integrity sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ== dependencies: - archiver-utils "^3.0.0" + archiver-utils "^4.0.1" async "^3.2.4" buffer-crc32 "^0.2.1" readable-stream "^3.6.0" readdir-glob "^1.1.2" - tar-stream "^2.2.0" - zip-stream "^4.1.0" + tar-stream "^3.0.0" + zip-stream "^5.0.1" are-docs-informative@^0.0.2: version "0.0.2" @@ -4393,14 +4291,14 @@ array-flatten@^2.1.2: integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^1.0.1: @@ -4432,33 +4330,34 @@ array.prototype.findlastindex@^1.2.2: get-intrinsic "^1.2.1" array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -4496,14 +4395,15 @@ assert-plus@1.0.0, assert-plus@^1.0.0: integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== assert@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" - integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== dependencies: - es6-object-assign "^1.1.0" - is-nan "^1.2.1" - object-is "^1.0.1" - util "^0.12.0" + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" ast-types@^0.13.4: version "0.13.4" @@ -5039,15 +4939,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== - -caniuse-lite@^1.0.30001520: - version "1.0.30001534" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz#f24a9b2a6d39630bac5c132b5dff89b39a12e7dd" - integrity sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q== +caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== canonical-path@1.0.0, canonical-path@^1.0.0: version "1.0.0" @@ -5276,9 +5171,9 @@ cli-spinners@2.6.1: integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-table3@^0.6.3: version "0.6.3" @@ -5472,16 +5367,26 @@ common-path-prefix@^3.0.0: resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== +compress-commons@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" + integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== dependencies: buffer-crc32 "^0.2.13" crc32-stream "^4.0.2" normalize-path "^3.0.0" readable-stream "^3.6.0" +compress-commons@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-5.0.1.tgz#e46723ebbab41b50309b27a0e0f6f3baed2d6590" + integrity sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag== + dependencies: + crc-32 "^1.2.0" + crc32-stream "^5.0.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + compressible@~2.0.16: version "2.0.18" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" @@ -5642,16 +5547,16 @@ copy-webpack-plugin@11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.2.tgz#8047d1a8b3ac4e639f0d4f66d4431aa3b16e004c" + integrity sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== dependencies: browserslist "^4.21.10" core-js-pure@^3.30.2: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.1.tgz#5775b88f9062885f67b6d7edce59984e89d276f3" - integrity sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" + integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== core-util-is@1.0.2: version "1.0.2" @@ -5672,13 +5577,13 @@ cors@^2.8.5, cors@~2.8.5: vary "^1" cosmiconfig@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: - import-fresh "^3.2.1" + import-fresh "^3.3.0" js-yaml "^4.1.0" - parse-json "^5.0.0" + parse-json "^5.2.0" path-type "^4.0.0" crc-32@^1.2.0: @@ -5687,9 +5592,17 @@ crc-32@^1.2.0: integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33" + integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + +crc32-stream@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-5.0.0.tgz#a97d3a802c8687f101c27cc17ca5253327354720" + integrity sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw== dependencies: crc-32 "^1.2.0" readable-stream "^3.4.0" @@ -5966,16 +5879,26 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -6316,9 +6239,9 @@ ejs@^3.1.7: jake "^10.8.5" electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== + version "1.4.525" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz#614284f33901fbecd3e90176c0d60590cd939700" + integrity sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA== emoji-regex@^8.0.0: version "8.0.0" @@ -6468,18 +6391,18 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.20.4, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1: + version "1.22.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.2.tgz#90f7282d91d0ad577f505e423e52d4c1d93c1b8a" + integrity sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" + function.prototype.name "^1.1.6" get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" @@ -6495,23 +6418,23 @@ es-abstract@^1.20.4, es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.11" es-get-iterator@^1.1.3: version "1.1.3" @@ -6529,9 +6452,9 @@ es-get-iterator@^1.1.3: stop-iteration-iterator "^1.0.0" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -6558,11 +6481,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es6-object-assign@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" - integrity sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw== - es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -7251,9 +7169,9 @@ find-yarn-workspace-root@^2.0.0: micromatch "^4.0.2" firebase-tools@^12.0.0: - version "12.5.2" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.2.tgz#d73a561a6c5d934f725a48ddc0f6b81f714f197f" - integrity sha512-sd/nWoLPYN4fRGgCv4EQdXrp+cezgQM/Z5fYyLqiCZgDhsz1POxzUb17k4mdJNlI+YkkAVPNzpErjdbwKGaZoA== + version "12.5.4" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.4.tgz#5235b857cc0d384b2036cd7a25c812cd487d4746" + integrity sha512-fLE+91tJp3PNZPyB6kN9zfn5rkQWhzPX3mlsAGKTMJUA5TLeZA1YlfBbgPr2DJUO47cHN/9b0BYUQjYcYsBPgw== dependencies: "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" @@ -7331,9 +7249,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== fn.name@1.x.x: version "1.1.0" @@ -7341,9 +7259,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-each@^0.3.3: version "0.3.3" @@ -7500,7 +7418,7 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -7709,7 +7627,7 @@ glob@^10.2.2, glob@^10.2.5: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -8322,14 +8240,6 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" -https-proxy-agent@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" - integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== - dependencies: - agent-base "^7.0.2" - debug "4" - human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -8425,7 +8335,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== -import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -8737,7 +8647,7 @@ is-map@^2.0.1, is-map@^2.0.2: resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== -is-nan@^1.2.1: +is-nan@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== @@ -8874,7 +8784,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.3, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.3, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== @@ -9060,9 +8970,9 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.0.5: istanbul-lib-report "^3.0.0" jackspeak@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.1.tgz#ce2effa4c458e053640e61938865a5b5fae98456" - integrity sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A== + version "2.3.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" + integrity sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -9140,9 +9050,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== jju@^1.1.0, jju@~1.4.0: version "1.4.0" @@ -9609,16 +9519,16 @@ levn@~0.3.0: type-check "~0.3.2" libsodium-wrappers@^0.7.10: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#53bd20606dffcc54ea2122133c7da38218f575f7" - integrity sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q== + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== dependencies: - libsodium "^0.7.11" + libsodium "^0.7.13" -libsodium@^0.7.11: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" - integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== license-webpack-plugin@4.0.2: version "4.0.2" @@ -10464,9 +10374,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nanoid@^3.3.6: version "3.3.6" @@ -10804,7 +10714,7 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== -object-is@^1.0.1, object-is@^1.1.5: +object-is@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== @@ -11064,20 +10974,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz#db42120c64292685dafaf2bd921e223c56bfb13b" - integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== - dependencies: - "@tootallnate/quickjs-emscripten" "^0.23.0" - agent-base "^7.0.2" - debug "^4.3.4" - get-uri "^6.0.1" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.1" - pac-proxy-agent@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" @@ -11169,7 +11065,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -11463,7 +11359,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.29, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: +postcss@8.4.29: version "8.4.29" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== @@ -11472,6 +11368,15 @@ postcss@8.4.29, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4. picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.30" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" + integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact-render-to-string@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.1.tgz#bd4f01f9a6b91b16b281343e665d110487f68d67" @@ -11661,7 +11566,7 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-agent@6.3.1: +proxy-agent@6.3.1, proxy-agent@^6.3.0: version "6.3.1" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.1.tgz#40e7b230552cf44fd23ffaf7c59024b692612687" integrity sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ== @@ -11675,20 +11580,6 @@ proxy-agent@6.3.1: proxy-from-env "^1.1.0" socks-proxy-agent "^8.0.2" -proxy-agent@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" - integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== - dependencies: - agent-base "^7.0.2" - debug "^4.3.4" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - lru-cache "^7.14.1" - pac-proxy-agent "^7.0.0" - proxy-from-env "^1.1.0" - socks-proxy-agent "^8.0.1" - proxy-from-env@1.1.0, 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" @@ -11954,9 +11845,9 @@ reflect-metadata@^0.1.13, reflect-metadata@^0.1.2: integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -11982,14 +11873,14 @@ regex-parser@^2.2.11: resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" regexpu-core@^5.3.1: version "5.3.2" @@ -12205,7 +12096,7 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.3, resolve@^1.22.4, resolve@^1.3.2, resolve@~1.22.1: +resolve@1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -12214,6 +12105,15 @@ resolve@1.22.4, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22. path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.22.3, resolve@^1.22.4, resolve@^1.3.2, resolve@~1.22.1: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@~1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -12293,9 +12193,9 @@ robots-parser@^3.0.0: integrity sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ== rollup@^3.27.1: - version "3.29.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.1.tgz#ba53a179d46ac3cd79e162dca6ab70d93cd26f78" - integrity sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg== + version "3.29.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.2.tgz#cbc76cd5b03b9f9e93be991d23a1dff9c6d5b740" + integrity sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A== optionalDependencies: fsevents "~2.3.2" @@ -12341,13 +12241,13 @@ rxjs@7.8.1, rxjs@^7.5.5, rxjs@~7.8.0: dependencies: tslib "^2.1.0" -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -12671,6 +12571,15 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -12850,16 +12759,7 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks-proxy-agent@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" - integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== - dependencies: - agent-base "^7.0.1" - debug "^4.3.4" - socks "^2.7.1" - -socks-proxy-agent@^8.0.2: +socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== @@ -12955,9 +12855,9 @@ spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.15" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" + integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== spdx-license-list@^2.1.0: version "2.1.0" @@ -13136,40 +13036,40 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string.prototype.padend@^3.0.0: - version "3.1.4" - resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz#2c43bb3a89eb54b6750de5942c123d6c98dd65b6" - integrity sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz#311ef3a4e3c557dd999cdf88fbdde223f2ac0f95" + integrity sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -13373,7 +13273,7 @@ tar-stream@^2.1.4, tar-stream@^2.2.0, tar-stream@~2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar-stream@^3.1.5: +tar-stream@^3.0.0, tar-stream@^3.1.5: version "3.1.6" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== @@ -13383,9 +13283,9 @@ tar-stream@^3.1.5: streamx "^2.15.0" tar@^6.1.11, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -13444,9 +13344,9 @@ terser@5.19.4: source-map-support "~0.5.20" terser@^5.16.8: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== + version "5.20.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.20.0.tgz#ea42aea62578703e33def47d5c5b93c49772423e" + integrity sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -13826,14 +13726,14 @@ typescript@~5.0.2, typescript@~5.0.4: integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== + version "0.7.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.36.tgz#382c5d6fc09141b6541be2cae446ecfcec284db2" + integrity sha512-CPPLoCts2p7D8VbybttE3P2ylv0OBZEAy7a12DsulIEcAiMtWJy+PBgMXgWDI80D5UwqE8oQPHYnk13tm38M2Q== ua-parser-js@^1.0.33: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + version "1.0.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" + integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== uberproto@^1.1.0: version "1.2.0" @@ -14142,7 +14042,7 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util@^0.12.0: +util@^0.12.5: version "0.12.5" resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -14169,9 +14069,9 @@ uuid@^8.0.0, uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" @@ -14512,9 +14412,9 @@ whatwg-encoding@^2.0.0: iconv-lite "0.6.3" whatwg-fetch@^3.4.1: - version "3.6.18" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4" - integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q== + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== whatwg-mimetype@^3.0.0: version "3.0.0" @@ -14563,7 +14463,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: +which-typed-array@^1.1.11, which-typed-array@^1.1.2, which-typed-array@^1.1.9: version "1.1.11" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== @@ -14710,9 +14610,9 @@ ws@8.5.0: integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== ws@>=8.13.0, ws@^8.13.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== ws@^7.0.0, ws@^7.2.3, ws@^7.3.1: version "7.5.9" @@ -14926,17 +14826,26 @@ z-schema@~5.0.2: commander "^10.0.0" zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" + integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" + archiver-utils "^3.0.4" + compress-commons "^4.1.2" + readable-stream "^3.6.0" + +zip-stream@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-5.0.1.tgz#cf3293bba121cad98be2ec7f05991d81d9f18134" + integrity sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA== + dependencies: + archiver-utils "^4.0.1" + compress-commons "^5.0.1" readable-stream "^3.6.0" zone.js@~0.13.0: - version "0.13.1" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.13.1.tgz#ea06f6a80ba8ac0c68e412365ae72e2cd0787982" - integrity sha512-+bIeDAFEBYuXRuU3qGQvzdPap+N1zjM4KkBAiiQuVVCrHrhjDuY6VkUhNa5+U27+9w0q3fbKiMCbpJ0XzMmSWA== + version "0.13.3" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.13.3.tgz#344c24098fa047eda6427a4c7ed486e391fd67b5" + integrity sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww== dependencies: tslib "^2.3.0" diff --git a/package.json b/package.json index 4c1f64ee08aef1..cab9064dbb1954 100644 --- a/package.json +++ b/package.json @@ -54,12 +54,13 @@ "@angular/cli": "17.0.0-next.6", "@angular/material": "17.0.0-next.5", "@babel/cli": "7.22.15", - "@babel/core": "7.22.19", + "@babel/core": "7.22.20", "@babel/generator": "7.22.15", + "@babel/helper-replace-supers": "7.22.20", "@babel/parser": "7.22.16", - "@babel/preset-env": "7.22.15", + "@babel/preset-env": "7.22.20", "@babel/template": "7.22.15", - "@babel/traverse": "7.22.19", + "@babel/traverse": "7.22.20", "@babel/types": "7.22.19", "@bazel/concatjs": "5.8.1", "@bazel/esbuild": "5.8.1", diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index b60099f5c6c519..df5b1a0619c116 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -41,6 +41,12 @@ { "name": "AnimationRenderer" }, + { + "name": "AnimationRendererFactory" + }, + { + "name": "AnimationStateStyles" + }, { "name": "AnimationStyleNormalizer" }, @@ -53,6 +59,12 @@ { "name": "AnimationTransitionFactory" }, + { + "name": "AnimationTransitionNamespace" + }, + { + "name": "AnimationTrigger" + }, { "name": "AnimationsComponent" }, @@ -107,6 +119,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -158,6 +173,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -512,9 +530,15 @@ { "name": "TYPE" }, + { + "name": "TimelineAnimationEngine" + }, { "name": "TimelineBuilder" }, + { + "name": "TransitionAnimationEngine" + }, { "name": "TransitionAnimationPlayer" }, @@ -533,6 +557,9 @@ { "name": "ViewRef" }, + { + "name": "WebAnimationsDriver" + }, { "name": "WebAnimationsPlayer" }, diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index c8b80f84bd04c3..1d278a38beda61 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -44,6 +44,12 @@ { "name": "AnimationRenderer" }, + { + "name": "AnimationRendererFactory" + }, + { + "name": "AnimationStateStyles" + }, { "name": "AnimationStyleNormalizer" }, @@ -56,6 +62,12 @@ { "name": "AnimationTransitionFactory" }, + { + "name": "AnimationTransitionNamespace" + }, + { + "name": "AnimationTrigger" + }, { "name": "AnimationsComponent" }, @@ -128,6 +140,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -182,6 +197,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -416,6 +434,9 @@ { "name": "NoopAnimationPlayer" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, @@ -566,9 +587,15 @@ { "name": "TestabilityRegistry" }, + { + "name": "TimelineAnimationEngine" + }, { "name": "TimelineBuilder" }, + { + "name": "TransitionAnimationEngine" + }, { "name": "TransitionAnimationPlayer" }, @@ -587,6 +614,9 @@ { "name": "ViewRef" }, + { + "name": "WebAnimationsDriver" + }, { "name": "WebAnimationsPlayer" }, diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 18278fcb4301fe..72418860918ada 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -62,6 +62,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -107,6 +110,9 @@ { "name": "DepComponent" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -311,6 +317,9 @@ { "name": "NoneEncapsulationDomRenderer" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index 8c0dd44d1567dd..ce3ecc58c9f262 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -89,6 +89,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -152,6 +155,9 @@ { "name": "DefaultValueAccessor" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -389,6 +395,9 @@ { "name": "NgForOf" }, + { + "name": "NgForOfContext" + }, { "name": "NgModuleFactory" }, @@ -419,6 +428,9 @@ { "name": "NoneEncapsulationDomRenderer" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, @@ -608,6 +620,9 @@ { "name": "_DOM" }, + { + "name": "_DuplicateItemRecordList" + }, { "name": "_DuplicateMap" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index f97ed88fc73031..c54997f8a3d8d2 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -92,6 +92,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -158,6 +161,9 @@ { "name": "DefaultValueAccessor" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -371,6 +377,9 @@ { "name": "NgForOf" }, + { + "name": "NgForOfContext" + }, { "name": "NgForm" }, @@ -410,6 +419,9 @@ { "name": "NoneEncapsulationDomRenderer" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, @@ -599,6 +611,9 @@ { "name": "_DOM" }, + { + "name": "_DuplicateItemRecordList" + }, { "name": "_DuplicateMap" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index d352f6aadca946..4599632798dfe7 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -38,6 +38,9 @@ { "name": "CONTAINER_HEADER_OFFSET" }, + { + "name": "ChainedInjector" + }, { "name": "ComponentFactory" }, @@ -65,6 +68,9 @@ { "name": "DOCUMENT2" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -230,6 +236,9 @@ { "name": "NodeInjectorFactory" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 13eab6d8957bdd..e5ed50931cdb54 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -62,6 +62,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -113,9 +116,15 @@ { "name": "DefaultIfEmptySubscriber" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, + { + "name": "DoOperator" + }, { "name": "DomAdapter" }, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index e0cbaaa4929827..d18a246e22e829 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -14,12 +14,21 @@ { "name": "AbsoluteRedirect" }, + { + "name": "ActivateRoutes" + }, { "name": "ActivatedRoute" }, { "name": "ActivatedRouteSnapshot" }, + { + "name": "ActivationEnd" + }, + { + "name": "ActivationStart" + }, { "name": "AfterRenderEventManager" }, @@ -32,6 +41,9 @@ { "name": "ApplicationRef" }, + { + "name": "ApplyRedirects" + }, { "name": "ArgumentOutOfRangeError" }, @@ -92,12 +104,21 @@ { "name": "CatchSubscriber" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, { "name": "ChangeDetectorRef" }, + { + "name": "ChildActivationEnd" + }, + { + "name": "ChildActivationStart" + }, { "name": "ChildrenOutletContexts" }, @@ -170,6 +191,9 @@ { "name": "DefaultUrlSerializer" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -335,6 +359,9 @@ { "name": "MapSubscriber" }, + { + "name": "MapToOperator" + }, { "name": "MapToSubscriber" }, @@ -344,6 +371,9 @@ { "name": "MergeMapSubscriber" }, + { + "name": "ModuleWithComponentFactories" + }, { "name": "NAMESPACE_URIS" }, @@ -458,6 +488,9 @@ { "name": "NgZoneChangeDetectionScheduler" }, + { + "name": "NoLeftoversInUrl" + }, { "name": "NoMatch" }, @@ -482,6 +515,9 @@ { "name": "OuterSubscriber" }, + { + "name": "OutletContext" + }, { "name": "OutletInjector" }, @@ -500,6 +536,9 @@ { "name": "PRIMARY_OUTLET" }, + { + "name": "ParamsAsMap" + }, { "name": "PathLocationStrategy" }, @@ -545,6 +584,9 @@ { "name": "ROUTES" }, + { + "name": "Recognizer" + }, { "name": "RedirectRequest" }, @@ -572,6 +614,12 @@ { "name": "RootViewRef" }, + { + "name": "RouteConfigLoadEnd" + }, + { + "name": "RouteConfigLoadStart" + }, { "name": "RouteReuseStrategy" }, @@ -626,6 +674,9 @@ { "name": "Sanitizer" }, + { + "name": "ScanOperator" + }, { "name": "ScanSubscriber" }, @@ -683,6 +734,9 @@ { "name": "TQueries_" }, + { + "name": "TQueryMetadata_" + }, { "name": "TQuery_" }, @@ -704,6 +758,9 @@ { "name": "TakeSubscriber" }, + { + "name": "TakeUntilOperator" + }, { "name": "TakeUntilSubscriber" }, @@ -1787,9 +1844,6 @@ { "name": "provideZoneChangeDetection" }, - { - "name": "recognize2" - }, { "name": "redirectIfUrlTree" }, @@ -1832,9 +1886,6 @@ { "name": "resetPreOrderHookFlags" }, - { - "name": "resolveData" - }, { "name": "resolveForwardRef" }, diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index 19a0523cef83dd..180a316824d9ec 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -50,6 +50,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -89,6 +92,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 0b21fd598f64d7..fe61840afa24b6 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -62,6 +62,9 @@ { "name": "CSP_NONCE" }, + { + "name": "ChainedInjector" + }, { "name": "ChangeDetectionStrategy" }, @@ -110,6 +113,9 @@ { "name": "DefaultIterableDifferFactory" }, + { + "name": "DistinctUntilChangedOperator" + }, { "name": "DistinctUntilChangedSubscriber" }, @@ -293,6 +299,9 @@ { "name": "NgForOf" }, + { + "name": "NgForOfContext" + }, { "name": "NgIf" }, @@ -326,6 +335,9 @@ { "name": "NoneEncapsulationDomRenderer" }, + { + "name": "NoopNgZone" + }, { "name": "NullInjector" }, @@ -524,6 +536,9 @@ { "name": "_DOM" }, + { + "name": "_DuplicateItemRecordList" + }, { "name": "_DuplicateMap" }, diff --git a/packages/zone.js/yarn.lock b/packages/zone.js/yarn.lock index 4f3e97234ffd3d..24b4690eaca050 100644 --- a/packages/zone.js/yarn.lock +++ b/packages/zone.js/yarn.lock @@ -10,7 +10,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -19,56 +19,56 @@ chalk "^2.4.2" "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.11.tgz#8033acaa2aa24c3f814edaaa057f3ce0ba559c24" - integrity sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" + integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-compilation-targets" "^7.22.10" - "@babel/helper-module-transforms" "^7.22.9" - "@babel/helpers" "^7.22.11" - "@babel/parser" "^7.22.11" - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.20" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.20" + "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.10", "@babel/generator@^7.7.2": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== +"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== dependencies: - "@babel/types" "^7.22.10" + "@babel/types" "^7.22.15" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" browserslist "^4.21.9" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5": version "7.22.5" @@ -85,23 +85,23 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== +"@babel/helper-module-transforms@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" + integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" @@ -127,38 +127,38 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": + version "7.22.16" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" + integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -258,38 +258,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/template@^7.22.5", "@babel/template@^7.3.3": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" + integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/parser" "^7.22.16" + "@babel/types" "^7.22.19" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.3.3": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.3": + version "7.22.19" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" + integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== dependencies: "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.19" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -318,27 +318,27 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.4.tgz#a7e2d84516301f986bba0dd55af9d5fe37f46527" - integrity sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.6.3" - jest-util "^29.6.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.4.tgz#265ebee05ec1ff3567757e7a327155c8d6bdb126" - integrity sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^29.6.4" - "@jest/reporters" "^29.6.4" - "@jest/test-result" "^29.6.4" - "@jest/transform" "^29.6.4" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" @@ -346,80 +346,80 @@ ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.6.3" - jest-config "^29.6.4" - jest-haste-map "^29.6.4" - jest-message-util "^29.6.3" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" jest-regex-util "^29.6.3" - jest-resolve "^29.6.4" - jest-resolve-dependencies "^29.6.4" - jest-runner "^29.6.4" - jest-runtime "^29.6.4" - jest-snapshot "^29.6.4" - jest-util "^29.6.3" - jest-validate "^29.6.3" - jest-watcher "^29.6.4" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^29.6.3" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.4.tgz#78ec2c9f8c8829a37616934ff4fea0c028c79f4f" - integrity sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ== +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^29.6.4" + "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.3" + jest-mock "^29.7.0" -"@jest/expect-utils@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.4.tgz#17c7dfe6cec106441f218b0aff4b295f98346679" - integrity sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" -"@jest/expect@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.4.tgz#1d6ae17dc68d906776198389427ab7ce6179dba6" - integrity sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^29.6.4" - jest-snapshot "^29.6.4" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.4.tgz#45a27f093c43d5d989362a3e7a8c70c83188b4f6" - integrity sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.6.3" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.4.tgz#4f04f58731b062b44ef23036b79bdb31f40c7f63" - integrity sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^29.6.4" - "@jest/expect" "^29.6.4" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" "@jest/types" "^29.6.3" - jest-mock "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.4.tgz#9d6350c8a2761ece91f7946e97ab0dabc06deab7" - integrity sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.6.4" - "@jest/test-result" "^29.6.4" - "@jest/transform" "^29.6.4" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" @@ -433,9 +433,9 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.6.3" - jest-util "^29.6.3" - jest-worker "^29.6.4" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" @@ -457,30 +457,30 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.4.tgz#adf5c79f6e1fb7405ad13d67d9e2b6ff54b54c6b" - integrity sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^29.6.4" + "@jest/console" "^29.7.0" "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz#86aef66aaa22b181307ed06c26c82802fb836d7b" - integrity sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^29.6.4" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.4" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.6.4": - version "29.6.4" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.4.tgz#a6bc799ef597c5d85b2e65a11fd96b6b239bab5a" - integrity sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" "@jest/types" "^29.6.3" @@ -490,9 +490,9 @@ convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.4" + jest-haste-map "^29.7.0" jest-regex-util "^29.6.3" - jest-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -567,9 +567,9 @@ integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@types/babel__core@^7.1.14": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" - integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.2.tgz#215db4f4a35d710256579784a548907237728756" + integrity sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" @@ -578,24 +578,24 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" - integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== dependencies: "@babel/types" "^7.20.7" @@ -635,9 +635,9 @@ parse5 "^7.0.0" "@types/node@*": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== "@types/node@^10.9.4": version "10.17.60" @@ -650,9 +650,9 @@ integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== "@types/tough-cookie@*": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" - integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.3.tgz#3d06b6769518450871fbc40770b7586334bdfd90" + integrity sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg== "@types/yargs-parser@*": version "21.0.0" @@ -762,12 +762,12 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -babel-jest@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.4.tgz#98dbc45d1c93319c82a8ab4a478b670655dd2585" - integrity sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^29.6.4" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" babel-preset-jest "^29.6.3" @@ -905,9 +905,9 @@ camelcase@^6.0.0, camelcase@^6.2.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== chalk@4.x, chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" @@ -1069,6 +1069,19 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" + cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1176,9 +1189,9 @@ domexception@^4.0.0: resolved "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a" electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== + version "1.4.525" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz#614284f33901fbecd3e90176c0d60590cd939700" + integrity sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA== emittery@^0.13.1: version "0.13.1" @@ -1273,16 +1286,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.4.tgz#a6e6f66d4613717859b2fe3da98a739437b6f4b8" - integrity sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA== +expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^29.6.4" + "@jest/expect-utils" "^29.7.0" jest-get-type "^29.6.3" - jest-matcher-utils "^29.6.4" - jest-message-util "^29.6.3" - jest-util "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -1763,150 +1776,149 @@ jade@0.26.3: commander "0.6.1" mkdirp "0.3.0" -jest-changed-files@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.6.3.tgz#97cfdc93f74fb8af2a1acb0b78f836f1fb40c449" - integrity sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" - jest-util "^29.6.3" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.4.tgz#f074c8d795e0cc0f2ebf0705086b1be6a9a8722f" - integrity sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^29.6.4" - "@jest/expect" "^29.6.4" - "@jest/test-result" "^29.6.4" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^29.6.3" - jest-matcher-utils "^29.6.4" - jest-message-util "^29.6.3" - jest-runtime "^29.6.4" - jest-snapshot "^29.6.4" - jest-util "^29.6.3" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^29.6.3" + pretty-format "^29.7.0" pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.4.tgz#ad52f2dfa1b0291de7ec7f8d7c81ac435521ede0" - integrity sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^29.6.4" - "@jest/test-result" "^29.6.4" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.6.4" - jest-util "^29.6.3" - jest-validate "^29.6.3" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.4.tgz#eff958ee41d4e1ee7a6106d02b74ad9fc427d79e" - integrity sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.6.4" + "@jest/test-sequencer" "^29.7.0" "@jest/types" "^29.6.3" - babel-jest "^29.6.4" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.6.4" - jest-environment-node "^29.6.4" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" jest-get-type "^29.6.3" jest-regex-util "^29.6.3" - jest-resolve "^29.6.4" - jest-runner "^29.6.4" - jest-util "^29.6.3" - jest-validate "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.6.3" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.4.tgz#85aaa6c92a79ae8cd9a54ebae8d5b6d9a513314a" - integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" diff-sequences "^29.6.3" jest-get-type "^29.6.3" - pretty-format "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.6.3.tgz#293dca5188846c9f7c0c2b1bb33e5b11f21645f2" - integrity sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.3.tgz#1956f14f5f0cb8ae0b2e7cabc10bb03ec817c142" - integrity sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" chalk "^4.0.0" jest-get-type "^29.6.3" - jest-util "^29.6.3" - pretty-format "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" jest-environment-jsdom@^29.0.3: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz#0daf44454041f9e1ef7fa82eb1bd43426a82eb1c" - integrity sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz#d206fa3551933c3fd519e5dfdb58a0f5139a837f" + integrity sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA== dependencies: - "@jest/environment" "^29.6.4" - "@jest/fake-timers" "^29.6.4" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-mock "^29.7.0" + jest-util "^29.7.0" jsdom "^20.0.0" -jest-environment-node@^29.0.3, jest-environment-node@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.4.tgz#4ce311549afd815d3cafb49e60a1e4b25f06d29f" - integrity sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ== +jest-environment-node@^29.0.3, jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: - "@jest/environment" "^29.6.4" - "@jest/fake-timers" "^29.6.4" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^29.6.3" - jest-util "^29.6.3" + jest-mock "^29.7.0" + jest-util "^29.7.0" jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.4.tgz#97143ce833829157ea7025204b08f9ace609b96a" - integrity sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" @@ -1915,35 +1927,35 @@ jest-haste-map@^29.6.4: fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.6.3" - jest-util "^29.6.3" - jest-worker "^29.6.4" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz#b9661bc3aec8874e59aff361fa0c6d7cd507ea01" - integrity sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" - pretty-format "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz#327db7ababea49455df3b23e5d6109fe0c709d24" - integrity sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^29.6.4" + jest-diff "^29.7.0" jest-get-type "^29.6.3" - pretty-format "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.3.tgz#bce16050d86801b165f20cfde34dc01d3cf85fbf" - integrity sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^29.6.3" @@ -1951,18 +1963,18 @@ jest-message-util@^29.6.3: chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.6.3" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.3.tgz#433f3fd528c8ec5a76860177484940628bdf5e0a" - integrity sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" - jest-util "^29.6.3" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" @@ -1974,67 +1986,67 @@ jest-regex-util@^29.6.3: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz#20156b33c7eacbb6bb77aeba4bed0eab4a3f8734" - integrity sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" - jest-snapshot "^29.6.4" + jest-snapshot "^29.7.0" -jest-resolve@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.4.tgz#e34cb06f2178b429c38455d98d1a07572ac9faa3" - integrity sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.6.4" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^29.6.3" - jest-validate "^29.6.3" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.4.tgz#b3b8ccb85970fde0fae40c73ee11eb75adccfacf" - integrity sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^29.6.4" - "@jest/environment" "^29.6.4" - "@jest/test-result" "^29.6.4" - "@jest/transform" "^29.6.4" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^29.6.3" - jest-environment-node "^29.6.4" - jest-haste-map "^29.6.4" - jest-leak-detector "^29.6.3" - jest-message-util "^29.6.3" - jest-resolve "^29.6.4" - jest-runtime "^29.6.4" - jest-util "^29.6.3" - jest-watcher "^29.6.4" - jest-worker "^29.6.4" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.4.tgz#b0bc495c9b6b12a0a7042ac34ca9bb85f8cd0ded" - integrity sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA== +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: - "@jest/environment" "^29.6.4" - "@jest/fake-timers" "^29.6.4" - "@jest/globals" "^29.6.4" + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" "@jest/source-map" "^29.6.3" - "@jest/test-result" "^29.6.4" - "@jest/transform" "^29.6.4" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" @@ -2042,46 +2054,46 @@ jest-runtime@^29.6.4: collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.6.4" - jest-message-util "^29.6.3" - jest-mock "^29.6.3" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" jest-regex-util "^29.6.3" - jest-resolve "^29.6.4" - jest-snapshot "^29.6.4" - jest-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.4.tgz#9833eb6b66ff1541c7fd8ceaa42d541f407b4876" - integrity sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.6.4" - "@jest/transform" "^29.6.4" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.6.4" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^29.6.4" + jest-diff "^29.7.0" jest-get-type "^29.6.3" - jest-matcher-utils "^29.6.4" - jest-message-util "^29.6.3" - jest-util "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^29.6.3" + pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.3.tgz#e15c3eac8716440d1ed076f09bc63ace1aebca63" - integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" @@ -2090,51 +2102,51 @@ jest-util@^29.6.3: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.3.tgz#a75fca774cfb1c5758c70d035d30a1f9c2784b4d" - integrity sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^29.6.3" + pretty-format "^29.7.0" -jest-watcher@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.4.tgz#633eb515ae284aa67fd6831f1c9d1b534cf0e0ba" - integrity sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^29.6.4" + "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.6.3" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^29.6.4: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.4.tgz#f34279f4afc33c872b470d4af21b281ac616abd3" - integrity sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" - jest-util "^29.6.3" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.0: - version "29.6.4" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.4.tgz#7c48e67a445ba264b778253b5d78d4ebc9d0a622" - integrity sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw== + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^29.6.4" + "@jest/core" "^29.7.0" "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^29.6.4" + jest-cli "^29.7.0" js-tokens@^4.0.0: version "4.0.0" @@ -2568,10 +2580,10 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pretty-format@^29.6.3: - version "29.6.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.3.tgz#d432bb4f1ca6f9463410c3fb25a0ba88e594ace7" - integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" @@ -2610,9 +2622,9 @@ punycode@^2.1.1: integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== pure-rand@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" - integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + version "6.0.3" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.3.tgz#3c9e6b53c09e52ac3cedffc85ab7c1c7094b38cb" + integrity sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w== querystringify@^2.1.1: version "2.2.0" @@ -2689,9 +2701,9 @@ resolve.exports@^2.0.0: integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== resolve@^1.20.0: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -3120,9 +3132,9 @@ write-file-atomic@^4.0.2: signal-exit "^3.0.7" ws@^8.11.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== xml-name-validator@^4.0.0: version "4.0.0" diff --git a/yarn.lock b/yarn.lock index 06ea1b2218b7fc..0a8ed5680661af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@actions/core@^1.10.0": - version "1.10.0" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.0.tgz#44551c3c71163949a2f06e94d9ca2157a0cfac4f" - integrity sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug== + version "1.10.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.10.1.tgz#61108e7ac40acae95ee36da074fa5850ca4ced8a" + integrity sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g== dependencies: "@actions/http-client" "^2.0.1" uuid "^8.3.2" @@ -156,7 +156,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6": version "0.0.0-9b1adb2ad5a049ea9985734f197dca43dd4d3f1b" - uid cc70f65938ac822d810f8ba44427efa848906cd6 resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#cc70f65938ac822d810f8ba44427efa848906cd6" dependencies: "@angular-devkit/build-angular" "17.0.0-next.6" @@ -294,7 +293,6 @@ "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#26b676bbb6d98d514004cb3dda76a086812d710f": version "0.0.0-9b1adb2ad5a049ea9985734f197dca43dd4d3f1b" - uid "26b676bbb6d98d514004cb3dda76a086812d710f" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#26b676bbb6d98d514004cb3dda76a086812d710f" dependencies: "@yarnpkg/lockfile" "^1.1.0" @@ -331,7 +329,7 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.22.10", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -339,10 +337,10 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== +"@babel/compat-data@^7.22.20", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.20.tgz#8df6e96661209623f1975d66c35ffca66f3306d0" + integrity sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw== "@babel/core@7.22.17": version "7.22.17" @@ -365,20 +363,20 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@7.22.19": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.19.tgz#b38162460a6f3baf2a424bda720b24a8aafea241" - integrity sha512-Q8Yj5X4LHVYTbLCKVz0//2D2aDmHF4xzCdEttYvKOnWvErGsa6geHXD6w46x64n5tP69VfeH+IfSrdyH3MLhwA== +"@babel/core@7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.20.tgz#e3d0eed84c049e2a2ae0a64d27b6a37edec385b7" + integrity sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.22.15" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.22.19" + "@babel/helper-module-transforms" "^7.22.20" "@babel/helpers" "^7.22.15" "@babel/parser" "^7.22.16" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.22.19" + "@babel/traverse" "^7.22.20" "@babel/types" "^7.22.19" convert-source-map "^1.7.0" debug "^4.1.0" @@ -407,7 +405,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@7.22.15", "@babel/generator@^7.22.15": +"@babel/generator@7.22.15", "@babel/generator@^7.22.10", "@babel/generator@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== @@ -417,16 +415,6 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.22.10": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.10.tgz#c92254361f398e160645ac58831069707382b722" - integrity sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A== - dependencies: - "@babel/types" "^7.22.10" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - "@babel/helper-annotate-as-pure@7.22.5", "@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -435,24 +423,13 @@ "@babel/types" "^7.22.5" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz#573e735937e99ea75ea30788b57eb52fab7468c9" - integrity sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ== - dependencies: - "@babel/types" "^7.22.10" - -"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz#01d648bbc25dd88f513d862ee0df27b7d4e67024" - integrity sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.22.15": +"@babel/helper-compilation-targets@^7.22.10", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== @@ -464,14 +441,14 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.11.tgz#4078686740459eeb4af3494a273ac09148dfb213" - integrity sha512-y1grdYL4WzmUDBRGK0pDbIoFd7UZKoDurDzWEoNMYoj1EL+foGRQNyPWDcC+YyegN5y1DUsFFmzjGijB3nSVAQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.22.9" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" @@ -479,9 +456,9 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" @@ -498,10 +475,10 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-function-name@^7.22.5": version "7.22.5" @@ -518,59 +495,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz#b95a144896f6d491ca7863576f820f3628818621" + integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/helper-module-imports@^7.22.15": +"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz#7edf129097a51ccc12443adbc6320e90eab76693" - integrity sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.15" - -"@babel/helper-module-transforms@^7.22.19": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.19.tgz#94b1f281caa6518f02ec0f5ea2b5348e298ce266" - integrity sha512-m6h1cJvn+OJ+R3jOHp30faq5xKJ7VbjwDj5RGgHuRlU9hrMeKsGC+JpihkR5w1g7IfseCPPtZ0r7/hB4UKaYlA== +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.20", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz#da9edc14794babbe7386df438f3768067132f59e" + integrity sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.19" - -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz#40ad2f6950f143900e9c1c72363c0b431a606082" - integrity sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.15" + "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" @@ -585,21 +533,21 @@ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== "@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== +"@babel/helper-replace-supers@7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": @@ -628,50 +576,26 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz#601fa28e4cc06786c18912dca138cec73b882044" - integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== - -"@babel/helper-validator-identifier@^7.22.19": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz#2f34ab1e445f5b95e2e6edfe50ea2449e610583a" - integrity sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== +"@babel/helper-validator-identifier@^7.22.19", "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helper-wrap-function@^7.22.9": - version "7.22.10" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz#d845e043880ed0b8c18bd194a12005cb16d2f614" - integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.10" - -"@babel/helpers@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.11.tgz#b02f5d5f2d7abc21ab59eeed80de410ba70b056a" - integrity sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.11" - "@babel/types" "^7.22.11" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" -"@babel/helpers@^7.22.15": +"@babel/helpers@^7.22.11", "@babel/helpers@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.15.tgz#f09c3df31e86e3ea0b7ff7556d85cdebd47ea6f1" integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== @@ -681,24 +605,19 @@ "@babel/types" "^7.22.15" "@babel/highlight@^7.22.13": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.13.tgz#9cda839e5d3be9ca9e8c26b6dd69e7548f0cbf16" - integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== dependencies: - "@babel/helper-validator-identifier" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@7.22.16", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": +"@babel/parser@7.22.16", "@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.11", "@babel/parser@^7.22.15", "@babel/parser@^7.22.16": version "7.22.16" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4", "@babel/parser@^7.22.11", "@babel/parser@^7.22.5": - version "7.22.14" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.14.tgz#c7de58e8de106e88efca42ce17f0033209dfd245" - integrity sha512-1KucTHgOvaw/LzCVrEOAyXkr9rQlp0A1HiHRYnSUE9dmb8PvPW7o5sscg+5169r54n3vGlbx6GevTE/Iw/P3AQ== - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962" @@ -1343,6 +1262,92 @@ core-js-compat "^3.31.0" semver "^6.3.1" +"@babel/preset-env@7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.20.tgz#de9e9b57e1127ce0a2f580831717f7fb677ceedb" + integrity sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg== + dependencies: + "@babel/compat-data" "^7.22.20" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.19" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" @@ -1358,28 +1363,21 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime-corejs3@^7.16.5": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.11.tgz#bf65b846cb4a03e1594dba9850c4632a992ddc04" - integrity sha512-NhfzUbdWbiE6fCFypbWCPu6AR8xre31EOPF7wwAIJEvGQ2avov04eymayWinCuyXmV1b0+jzoXP/HYzzUYdvwg== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz#7aeb9460598a997b0fe74982a5b02fb9e5d264d9" + integrity sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ== dependencies: core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@7.22.15": +"@babel/runtime@7.22.15", "@babel/runtime@^7.8.4": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@^7.8.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.11.tgz#7a9ba3bbe406ad6f9e8dd4da2ece453eb23a77a4" - integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@7.22.15", "@babel/template@^7.22.15": +"@babel/template@7.22.15", "@babel/template@^7.22.15", "@babel/template@^7.22.5": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== @@ -1388,23 +1386,14 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/traverse@7.22.19", "@babel/traverse@^7.22.19": - version "7.22.19" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.19.tgz#bb2b12b7de9d7fec9e812ed89eea097b941954f8" - integrity sha512-ZCcpVPK64krfdScRbpxF6xA5fz7IOsfMwx1tcACvCzt6JY+0aHkBk7eIU8FRDSZRU5Zei6Z4JfgAxN1bqXGECg== +"@babel/traverse@7.22.20", "@babel/traverse@^7.22.11", "@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.20.tgz#db572d9cb5c79e02d83e5618b82f6991c07584c9" + integrity sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw== dependencies: "@babel/code-frame" "^7.22.13" "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.22.5" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" @@ -1413,39 +1402,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.22.11": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.11.tgz#71ebb3af7a05ff97280b83f05f8865ac94b2027c" - integrity sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ== - dependencies: - "@babel/code-frame" "^7.22.10" - "@babel/generator" "^7.22.10" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.11" - "@babel/types" "^7.22.11" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.17.tgz#b23c203ab3707e3be816043081b4a994fcacec44" - integrity sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.16" - "@babel/types" "^7.22.17" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@7.22.19", "@babel/types@^7.22.19": +"@babel/types@7.22.19", "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.11", "@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.4.4": version "7.22.19" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg== @@ -1454,33 +1411,6 @@ "@babel/helper-validator-identifier" "^7.22.19" to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.10", "@babel/types@^7.22.11", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.11" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.11.tgz#0e65a6a1d4d9cbaa892b2213f6159485fe632ea2" - integrity sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.15.tgz#266cb21d2c5fd0b3931e7a91b6dd72d2f617d282" - integrity sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.15" - to-fast-properties "^2.0.0" - -"@babel/types@^7.22.17": - version "7.22.17" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.17.tgz#f753352c4610ffddf9c8bc6823f9ff03e2303eee" - integrity sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.15" - to-fast-properties "^2.0.0" - "@bazel/bazelisk@^1.7.5": version "1.18.0" resolved "https://registry.yarnpkg.com/@bazel/bazelisk/-/bazelisk-1.18.0.tgz#90ea8fc432ac6a7c83020e47a4bf59cfa2c81020" @@ -1875,9 +1805,9 @@ "@types/node" ">=12.12.47" "@grpc/proto-loader@^0.7.0": - version "0.7.9" - resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.9.tgz#3ca68236f1a0d77566dafa53c715eb31d096279a" - integrity sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ== + version "0.7.10" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.10.tgz#6bf26742b1b54d0a473067743da5d3189d06d720" + integrity sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ== dependencies: lodash.camelcase "^4.3.0" long "^5.0.0" @@ -2689,14 +2619,14 @@ "@material/theme" "15.0.0-canary.a246a4439.0" tslib "^2.1.0" -"@microsoft/api-extractor-model@7.27.6": - version "7.27.6" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.27.6.tgz#308e44cd595d2fb446c6357759ee0675ec37d26e" - integrity sha512-eiCnlayyum1f7fS2nA9pfIod5VCNR1G+Tq84V/ijDrKrOFVa598BLw145nCsGDMoFenV6ajNi2PR5WCwpAxW6Q== +"@microsoft/api-extractor-model@7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.28.0.tgz#33136473abd048ca219a7f0bcb0b80030d712853" + integrity sha512-QIMtUVm1tqiKG+M6ciFgRShcDoovyltaeg+CbyOnyr7SMrp6gg0ojK5/nToMqR9kAvsTS4QVgW4Twl50EoAjcw== dependencies: "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.7" + "@rushstack/node-core-library" "3.60.0" "@microsoft/api-extractor-model@7.28.2": version "7.28.2" @@ -2726,16 +2656,16 @@ typescript "~5.0.4" "@microsoft/api-extractor@^7.24.2": - version "7.36.4" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.36.4.tgz#3bb9fbbbeacaa48eea49150351905a2677a506d9" - integrity sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ== + version "7.37.0" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.37.0.tgz#374a0ef0e166de53a44033c4c59c7f25c96e15e5" + integrity sha512-df/wffWpDhYRw7kzdxeHGsCpim+dC8aFiZlsJb4uFvVPWhBZpDzOhQxSUTFx3Df1ORY+/JjuPR3fDE9Hq+PHzQ== dependencies: - "@microsoft/api-extractor-model" "7.27.6" + "@microsoft/api-extractor-model" "7.28.0" "@microsoft/tsdoc" "0.14.2" "@microsoft/tsdoc-config" "~0.16.1" - "@rushstack/node-core-library" "3.59.7" - "@rushstack/rig-package" "0.4.1" - "@rushstack/ts-command-line" "4.15.2" + "@rushstack/node-core-library" "3.60.0" + "@rushstack/rig-package" "0.5.0" + "@rushstack/ts-command-line" "4.16.0" colors "~1.2.1" lodash "~4.17.15" resolve "~1.22.1" @@ -2903,9 +2833,9 @@ "@octokit/openapi-types" "^18.0.0" "@opentelemetry/api@^1.0.0": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" - integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.6.0.tgz#de2c6823203d6f319511898bb5de7e70f5267e19" + integrity sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g== "@opentelemetry/semantic-conventions@~1.3.0": version "1.3.1" @@ -3054,10 +2984,10 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rushstack/node-core-library@3.59.7": - version "3.59.7" - resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.59.7.tgz#9dcd62b79263e8a5b68465d4bf9124ec86e14b6c" - integrity sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw== +"@rushstack/node-core-library@3.60.0": + version "3.60.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.60.0.tgz#a52ca6b98762e9f64c1735d21456510d2aa956e3" + integrity sha512-PcyrqhILvzU+65wMFybQ2VeGNnU5JzhDq2OvUi3j6jPUxyllM7b2hrRUwCuVaYboewYzIbpzXFzgxe2K7ii1nw== dependencies: colors "~1.2.1" fs-extra "~7.0.1" @@ -3080,10 +3010,10 @@ semver "~7.5.4" z-schema "~5.0.2" -"@rushstack/rig-package@0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.4.1.tgz#ff11bf67dad46f9b4f09db91cf45739ab411ee9f" - integrity sha512-AGRwpqlXNSp9LhUSz4HKI9xCluqQDt/obsQFdv/NYIekF3pTTPzc+HbQsIsjVjYnJ3DcmxOREVMhvrMEjpiq6g== +"@rushstack/rig-package@0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.0.tgz#cca786e08634d12c6fde790d524a410a17f173d9" + integrity sha512-bGnOW4DWHOePDiABKy6qyqYJl9i7fKn4bRucExRVt5QzyPxuVHMl8CMmCabtoNSpXzgG3qymWOrMoa/W2PpJrw== dependencies: resolve "~1.22.1" strip-json-comments "~3.1.1" @@ -3096,10 +3026,10 @@ resolve "~1.22.1" strip-json-comments "~3.1.1" -"@rushstack/ts-command-line@4.15.2": - version "4.15.2" - resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.15.2.tgz#7920e3fa2ab6af129d995ce4424c600da0bf8a93" - integrity sha512-5+C2uoJY8b+odcZD6coEe2XNC4ZjGB4vCMESbqW/8DHRWC/qIHfANdmN9F1wz/lAgxz72i7xRoVtPY2j7e4gpQ== +"@rushstack/ts-command-line@4.16.0": + version "4.16.0" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.16.0.tgz#92d3af993ca5ee271ea130d41f5ce6a9479cae3f" + integrity sha512-WJKhdR9ThK9Iy7t78O3at7I3X4Ssp5RRZay/IQa8NywqkFy/DQbT3iLouodMMdUwLZD9n8n++xLubVd3dkmpkg== dependencies: "@types/argparse" "1.0.38" argparse "~1.0.9" @@ -3220,9 +3150,9 @@ minimatch "^9.0.3" "@types/adm-zip@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.0.tgz#94c90a837ce02e256c7c665a6a1eb295906333c1" - integrity sha512-FCJBJq9ODsQZUNURo5ILAQueuA8WJhRvuihS3ke2iI25mJlfV2LK8jG2Qj2z2AWg8U0FtWWqBHVRetceLskSaw== + version "0.5.1" + resolved "https://registry.yarnpkg.com/@types/adm-zip/-/adm-zip-0.5.1.tgz#2d3ab14cd537b68dc53aebe73d91024ce1373e89" + integrity sha512-3+psmbh60N5JXM2LMkujFqnjMf3KB0LZoIQO73NJvkv57q+384nK/A7pP0v+ZkB/Zrfqn+5xtAyt5OsY+GiYLQ== dependencies: "@types/node" "*" @@ -3247,14 +3177,29 @@ "@types/babel__template" "*" "@types/babel__traverse" "*" -"@types/babel__generator@*", "@types/babel__generator@7.6.4": +"@types/babel__generator@*": + version "7.6.5" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.5.tgz#281f4764bcbbbc51fdded0f25aa587b4ce14da95" + integrity sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__generator@7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" -"@types/babel__template@*", "@types/babel__template@7.4.1": +"@types/babel__template@*": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.2.tgz#843e9f1f47c957553b0c374481dc4772921d6a6b" + integrity sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__template@7.4.1": version "7.4.1" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== @@ -3262,7 +3207,14 @@ "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" -"@types/babel__traverse@*", "@types/babel__traverse@7.20.1": +"@types/babel__traverse@*": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.2.tgz#4ddf99d95cfdd946ff35d2b65c978d9c9bf2645d" + integrity sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw== + dependencies: + "@babel/types" "^7.20.7" + +"@types/babel__traverse@7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== @@ -3270,29 +3222,29 @@ "@babel/types" "^7.20.7" "@types/bluebird@^3.5.27": - version "3.5.38" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.38.tgz#7a671e66750ccd21c9fc9d264d0e1e5330bc9908" - integrity sha512-yR/Kxc0dd4FfwtEoLZMoqJbM/VE/W7hXn/MIjb+axcwag0iFmSPK7OBUZq1YWLynJUoWQkfUrI7T0HDqGApNSg== + version "3.5.39" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.39.tgz#6aaf8bcbf005bb091d06ddaa0f620be078bf6a73" + integrity sha512-0h2lKudcFwHih8NHAgt/uyAIUQDO0AdfJYlWBXD8r+gFDulUi2CMZoQSh2Q5ol1FMaHV9k7/4HtcbA8ABtexmA== "@types/body-parser@*": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.3.tgz#fb558014374f7d9e56c8f34bab2042a3a07d25cd" + integrity sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ== dependencies: "@types/connect" "*" "@types/node" "*" "@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + version "3.5.11" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.11.tgz#fbaa46a1529ea5c5e46cde36e4be6a880db55b84" + integrity sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg== dependencies: "@types/node" "*" "@types/browser-sync@^2.26.3": - version "2.27.0" - resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.0.tgz#28f579ce4cb06e5b69e2701c654df437ab618664" - integrity sha512-CQc8mggMZpKsUAdjm7jyR8uWcFnxuly8xw76ZY4jSLugsZWHLcv7mLVVY591XPaZ2BqbFZT1fxov3hrQFistNg== + version "2.27.1" + resolved "https://registry.yarnpkg.com/@types/browser-sync/-/browser-sync-2.27.1.tgz#e6147254d020e600d1382fc6c4fd9243231ed0ca" + integrity sha512-p/qAU+3dqq/CqobNiiZkIsernNfQe/35QEtor8Oae/WWgMLLhceFogCaAMe7pO4T8Z5WL/Co522YBo2sk/I7AQ== dependencies: "@types/micromatch" "^2" "@types/node" "*" @@ -3318,36 +3270,36 @@ "@types/har-format" "*" "@types/cldrjs@^0.4.22": - version "0.4.24" - resolved "https://registry.yarnpkg.com/@types/cldrjs/-/cldrjs-0.4.24.tgz#50ee2f072231468cb8982d97856d967b217dadc6" - integrity sha512-IXH0rekSjPD0ZDz4gb5U52PW/Fi64vE7C1Q8p2aYAAuzxkGhqux1BZlm+BA5vpV2MmpXhT80MsvYFJxJ+6zNrg== + version "0.4.25" + resolved "https://registry.yarnpkg.com/@types/cldrjs/-/cldrjs-0.4.25.tgz#f0757adf8dbf19db680bcc74a048c7eee01710c8" + integrity sha512-qniOggLcv0pZfta2CQGCigwiniz3PW9lhk/SzSPmzB1Odkb2YGaUvN4SHLS0m23DbEGg4uw4zH8IW18k+mCpHQ== "@types/cli-progress@^3.4.2": - version "3.11.0" - resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.0.tgz#ec79df99b26757c3d1c7170af8422e0fc95eef7e" - integrity sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg== + version "3.11.2" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.2.tgz#c8ff27cf89b46bfbb7faf140432c464d3a62ec4e" + integrity sha512-Yt/8rEJalfa9ve2SbfQnwFHrc9QF52JIZYHW3FDaTMpkCvnns26ueKiPHDxyJ0CS//IqjMINTx7R5Xa7k7uFHQ== dependencies: "@types/node" "*" "@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + version "1.5.1" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz#6e5e3602d93bda975cebc3449e1a318340af9e20" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== dependencies: "@types/express-serve-static-core" "*" "@types/node" "*" "@types/connect@*": - version "3.4.35" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + version "3.4.36" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.36.tgz#e511558c15a39cb29bd5357eebb57bd1459cd1ab" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== dependencies: "@types/node" "*" "@types/convert-source-map@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.0.tgz#a36c2d21963caa18fe32de6cdec3d21a7d2c92b3" - integrity sha512-QUm4YOC/ENo0VjPVl2o8HGyTbHHQGDOw8PCg3rXBucYHKyZN/XjXRbPFAV1tB2FvM0/wyFoDct4cTIctzKrQFg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-2.0.1.tgz#e72e8a3de9d6fe3d8e43d5c101c346de2ff6abdf" + integrity sha512-tm5Eb3AwhibN6ULRaad5TbNO83WoXVZLh2YRGAFH+qWkUz48l9Hu1jc+wJswB7T+ACWAG0cFnTeeQGpwedvlNw== "@types/cookie@^0.4.1": version "0.4.1" @@ -3355,16 +3307,16 @@ integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== "@types/cors@^2.8.12": - version "2.8.13" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.13.tgz#b8ade22ba455a1b8cb3b5d3f35910fd204f84f94" - integrity sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA== + version "2.8.14" + resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.14.tgz#94eeb1c95eda6a8ab54870a3bf88854512f43a92" + integrity sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ== dependencies: "@types/node" "*" "@types/diff@^5.0.0": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.3.tgz#1f89e49ff83b5d200d78964fb896c68498ce1828" - integrity sha512-amrLbRqTU9bXMCc6uX0sWpxsQzRIo9z6MJPkH1pkez/qOxuqSZVuryJAWoBRq94CeG8JxY+VK4Le9HtjQR5T9A== + version "5.0.4" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.4.tgz#ba774c225ee68ce13a090fec16cf34b97a78537b" + integrity sha512-d7489/WO4B65k0SIqxXtviR9+MrPDipWQF6w+5D7YPrqgu6Qb87JsTdWQaNZo7itcdbViQSev3Jaz7dtKO0+Dg== "@types/dom-view-transitions@^1.0.1": version "1.0.1" @@ -3425,16 +3377,16 @@ "@types/serve-static" "*" "@types/filesystem@*": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.32.tgz#307df7cc084a2293c3c1a31151b178063e0a8edf" - integrity sha512-Yuf4jR5YYMR2DVgwuCiP11s0xuVRyPKmz8vo6HBY3CGdeMj8af93CFZX+T82+VD1+UqHOxTq31lO7MI7lepBtQ== + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.33.tgz#808e0048221426b30341a6b19a8193213c72ca55" + integrity sha512-2KedRPzwu2K528vFkoXnnWdsG0MtUwPjuA7pRy4vKxlxHEe8qUDZibYHXJKZZr2Cl/ELdCWYqyb/MKwsUuzBWw== dependencies: "@types/filewriter" "*" "@types/filewriter@*": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.29.tgz#a48795ecadf957f6c0d10e0c34af86c098fa5bee" - integrity sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ== + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.30.tgz#1be7733877589d57c653b8356cefe5fe7c74b89e" + integrity sha512-lB98tui0uxc7erbj0serZfJlHKLNJHwBltPnbmO1WRpL5T325GOHRiQfr2E29V2q+S1brDO63Fpdt6vb3bES9Q== "@types/glob@*": version "8.1.0" @@ -3458,24 +3410,24 @@ integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA== "@types/har-format@*": - version "1.2.12" - resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.12.tgz#05cd257439689c91b6880f4a6b19cc707161cdad" - integrity sha512-P20p/YBrqUBmzD6KhIQ8EiY4/RRzlekL4eCvfQnulFPfjmiGxKIoyCeI7qam5I7oKH3P8EU4ptEi0EfyGoLysw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/@types/har-format/-/har-format-1.2.13.tgz#7ef32562d433166e1ad14e3eb6fcf5c00c8a0ead" + integrity sha512-PwBsCBD3lDODn4xpje3Y1di0aDJp4Ww7aSfMRVw6ysnxD4I7Wmq2mBkSKaDtN403hqH5sp6c9xQUvFYY3+lkBg== "@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz#abe102d06ccda1efdf0ed98c10ccf7f36a785a41" + integrity sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw== "@types/http-errors@*": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.2.tgz#a86e00bbde8950364f8e7846687259ffcd96e8c2" + integrity sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg== "@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + version "1.17.12" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.12.tgz#86e849e9eeae0362548803c37a0a1afc616bd96b" + integrity sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw== dependencies: "@types/node" "*" @@ -3503,21 +3455,21 @@ integrity sha512-e2iJYrdwfxr6WmLHxNjISUgbrbGaRsFHsc9xnrq8SGFzbSYPDZ4lmAkIulAAjqrkZ1z21OJCZsZwWMnxoeX7+A== "@types/jasmine@*", "@types/jasmine@^4.0.0": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-4.3.5.tgz#05c6b401c041b8a4f3303c3a58c9580aac2b898c" - integrity sha512-9YHUdvuNDDRJYXZwHqSsO72Ok0vmqoJbNn73ttyITQp/VA60SarnZ+MPLD37rJAhVoKp+9BWOvJP5tHIRfZylQ== + version "4.3.6" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-4.3.6.tgz#d9855fa9f808138488784610f888046bb9a59aff" + integrity sha512-3N0FpQTeiWjm+Oo1WUYWguUS7E6JLceiGTriFrG8k5PU7zRLJCzLcWURU3wjMbZGS//a2/LgjsnO3QxIlwxt9g== "@types/jasminewd2@^2.0.8": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.10.tgz#ae31c237aa6421bde30f1058b1d20f4577e54443" - integrity sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g== + version "2.0.11" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.11.tgz#53239ff1d169fef041ba9c7a2c171bce5dcee4e5" + integrity sha512-J3ggNCbxnHPsd15lzNZtOdPovtErcIl2vD11VSRq2s+ktQr43ZfqO4ws6YDFNRvUoXWCxD5uXTWuwyXPyT5eqg== dependencies: "@types/jasmine" "*" "@types/json-schema@*", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.13" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.13.tgz#02c24f4363176d2d18fc8b70b9f3c54aba178a85" + integrity sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ== "@types/json5@^0.0.29": version "0.0.29" @@ -3587,9 +3539,9 @@ integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12.12.47", "@types/node@>=13.7.0": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== "@types/node@16.10.9": version "16.10.9" @@ -3607,9 +3559,9 @@ integrity sha512-1RWYiq+5UfozGsU6MwJyFX6BtktcT10XRjvcAQmskCtMcW3tPske88lM/nHv7BQG1w9KBXI1zPGuu5PnNCX14g== "@types/node@^16.11.7": - version "16.18.46" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.46.tgz#9f2102d0ba74a318fcbe170cbff5463f119eab59" - integrity sha512-Mnq3O9Xz52exs3mlxMcQuA7/9VFe/dXcrgAyfjLkABIqxXKOgBRjyazTxUbjsxDa4BP7hhPliyjVTP9RDP14xg== + version "16.18.53" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.53.tgz#21820fe4d5968aaf8071dabd1ee13d24ada1350a" + integrity sha512-vVmHeo4tpF8zsknALU90Hh24VueYdu45ZlXzYWFbom61YR4avJqTFDC3QlWzjuTdAv6/3xHaxiO9NrtVZXrkmw== "@types/normalize-package-data@^2.4.1": version "2.4.1" @@ -3709,9 +3661,9 @@ "@types/ws" "*" "@types/semver@^7.3.4": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.2" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.2.tgz#31f6eec1ed7ec23f4f05608d3a2d381df041f564" + integrity sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw== "@types/send@*", "@types/send@^0.17.1": version "0.17.1" @@ -3758,26 +3710,26 @@ integrity sha512-Jxo2/uif1WpkabfyvWpFmPWFPDdwKUmyL7xWzjtxNALEu2pgce+eISjbf0Vr+SsK/D9savO5kTRcf+COLK5eiQ== "@types/through@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" - integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== + version "0.0.31" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.31.tgz#eb410602641807e74a90c5e951f46686e75eed1c" + integrity sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w== dependencies: "@types/node" "*" "@types/tmp@^0.2.1": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" - integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== + version "0.2.4" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.4.tgz#1e26f791b94a95474f1f3322a721dfb065b876fb" + integrity sha512-Vq3rwM+2KgiLacq68EjTJD9cuJ/ne5pXntWn8B8Rxj25SLkGAhCgooCZ1lhcIcV5OFveJ+s5Cqpi+XKfFM/xZA== "@types/triple-beam@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.2.tgz#38ecb64f01aa0d02b7c8f4222d7c38af6316fef8" - integrity sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.3.tgz#726ae98a5f6418c8f24f9b0f2a9f81a8664876ae" + integrity sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g== "@types/uuid@^9.0.0": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.3.tgz#6cdd939b4316b4f81625de9f06028d848c4a1533" - integrity sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug== + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.4.tgz#e884a59338da907bda8d2ed03e01c5c49d036f1c" + integrity sha512-zAuJWQflfx6dYJM62vna+Sn5aeSWhh3OB+wfUEACNcqUSc0AGc5JKl+ycL1vrH7frGTXhJchYjE1Hak8L819dA== "@types/which@^1.3.2": version "1.3.2" @@ -4136,7 +4088,7 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: +agent-base@^7.0.2, agent-base@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== @@ -4392,6 +4344,22 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" +archiver-utils@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7" + integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== + dependencies: + glob "^7.2.3" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + 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.0" + archiver@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0" @@ -5270,15 +5238,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001517: - version "1.0.30001525" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001525.tgz#d2e8fdec6116ffa36284ca2c33ef6d53612fe1c8" - integrity sha512-/3z+wB4icFt3r0USMwxujAqRvaD/B7rvGTsKhbhSQErVrJvkZCLhgNLJxU8MevahQVH6hCU9FsHdNUFbiwmE7Q== - -caniuse-lite@^1.0.30001520: - version "1.0.30001534" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz#f24a9b2a6d39630bac5c132b5dff89b39a12e7dd" - integrity sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q== +caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001538" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz#9dbc6b9af1ff06b5eb12350c2012b3af56744f3f" + integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw== canonical-path@1.0.0: version "1.0.0" @@ -5531,9 +5494,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-table3@^0.6.3: version "0.6.3" @@ -5799,10 +5762,10 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compress-commons@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" - integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== +compress-commons@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df" + integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== dependencies: buffer-crc32 "^0.2.13" crc32-stream "^4.0.2" @@ -5947,25 +5910,24 @@ conventional-changelog-codemirror@^4.0.0: resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz#3421aced2377552229cef454447aa06e2a319516" integrity sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q== -conventional-changelog-conventionalcommits@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.1.tgz#b47e7d1b3a0c1e370c4c27eea741f06729913f5f" - integrity sha512-VfFJxBmi+LYXeb4pIfZGbuaFCpWZh0qXbUAKP/s6B8tigV6R4D8j5PDlTtMMWawa7+DcNySVoF7kPWz0EMYuCQ== +conventional-changelog-conventionalcommits@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" + integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== dependencies: compare-func "^2.0.0" -conventional-changelog-core@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-6.0.0.tgz#9460a5f320a851167f4b53a9a90cc30f2c2239d1" - integrity sha512-7WPwzTp3eRMot/2mbTAHF8m/0Ue4F/R/sMpSjmhBYi/+xnW2SqnXL/FMuYqEpNC2v3rjzRZ4p+9tYcKfHn02Cg== +conventional-changelog-core@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-7.0.0.tgz#d8879ebb8692cd1fa8126c209e1b3af34d94e113" + integrity sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg== dependencies: "@hutson/parse-repository-url" "^5.0.0" add-stream "^1.0.0" conventional-changelog-writer "^7.0.0" conventional-commits-parser "^5.0.0" git-raw-commits "^4.0.0" - git-remote-origin-url "^2.0.0" - git-semver-tags "^6.0.0" + git-semver-tags "^7.0.0" hosted-git-info "^7.0.0" normalize-package-data "^6.0.0" read-pkg "^8.0.0" @@ -5998,15 +5960,15 @@ conventional-changelog-jshint@^4.0.0: dependencies: compare-func "^2.0.0" -conventional-changelog-preset-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.0.0.tgz#885f7ddc4e09e97ad44bb9eefe45d2c66af9d5f0" - integrity sha512-xYGvKMkJs8o6vnKDbo2v5VcalZmH54lVU+OCvFQvxj3AQKRMJhbKwvBVsSXfQSuhaG9r6mdK8TIMOaiwiStasg== +conventional-changelog-preset-loader@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.1.0.tgz#996bc40d516471c5bf8248fdc30222563b9bcfe6" + integrity sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA== conventional-changelog-writer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-7.0.0.tgz#257c06aa9025edcdf8907d499db3f088571d7e9c" - integrity sha512-9/6vTDd3wDbH9yayZNOq53UWI4QqYlbiLBtWf+alsQA/bBFHG+k3KnQ8Fu/xzHqsbQfzPg3w1H1piWYn/GD9Tw== + version "7.0.1" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-7.0.1.tgz#e64ef74fa8e773cab4124af217f3f02b29eb0a9c" + integrity sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA== dependencies: conventional-commits-filter "^4.0.0" handlebars "^4.7.7" @@ -6016,21 +5978,21 @@ conventional-changelog-writer@^7.0.0: split2 "^4.0.0" conventional-changelog@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-5.0.0.tgz#0b758f72d386e69f27e0eb9abf0c41cb1b0dbd60" - integrity sha512-k0c3lCtY3+k75gyrIoO7WEyBd4HLxu8QmTTPxM4D+vKk9wN06GZ/iaVJXQsGZae3Cezb02Is5PJ70fia3zZG8Q== + version "5.1.0" + resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-5.1.0.tgz#04b36a5ad0518e0323e9d629e3b86e34f7abb7eb" + integrity sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg== dependencies: conventional-changelog-angular "^7.0.0" conventional-changelog-atom "^4.0.0" conventional-changelog-codemirror "^4.0.0" - conventional-changelog-conventionalcommits "^7.0.0" - conventional-changelog-core "^6.0.0" + conventional-changelog-conventionalcommits "^7.0.2" + conventional-changelog-core "^7.0.0" conventional-changelog-ember "^4.0.0" conventional-changelog-eslint "^5.0.0" conventional-changelog-express "^4.0.0" conventional-changelog-jquery "^5.0.0" conventional-changelog-jshint "^4.0.0" - conventional-changelog-preset-loader "^4.0.0" + conventional-changelog-preset-loader "^4.1.0" conventional-commits-filter@^4.0.0: version "4.0.0" @@ -6100,21 +6062,21 @@ copy-webpack-plugin@11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.1.tgz#55f9a7d297c0761a8eb1d31b593e0f5b6ffae964" - integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.2.tgz#8047d1a8b3ac4e639f0d4f66d4431aa3b16e004c" + integrity sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ== dependencies: browserslist "^4.21.10" core-js-pure@^3.30.2: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.1.tgz#5775b88f9062885f67b6d7edce59984e89d276f3" - integrity sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.32.2.tgz#b7dbdac528625cf87eb0523b532eb61551b9a6d1" + integrity sha512-Y2rxThOuNywTjnX/PgA5vWM6CZ9QB9sz9oGeCixV8MqXZO70z/5SHzf9EeBrEBK0PN36DnEBBu9O/aGWzKuMZQ== core-js@^3.6.5: - version "3.32.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.1.tgz#a7d8736a3ed9dd05940c3c4ff32c591bb735be77" - integrity sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ== + version "3.32.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.32.2.tgz#172fb5949ef468f93b4be7841af6ab1f21992db7" + integrity sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ== core-util-is@1.0.2: version "1.0.2" @@ -6139,7 +6101,7 @@ corser@^2.0.1: resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== -cosmiconfig@8.2.0, cosmiconfig@^8.2.0: +cosmiconfig@8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== @@ -6149,15 +6111,25 @@ cosmiconfig@8.2.0, cosmiconfig@^8.2.0: parse-json "^5.0.0" path-type "^4.0.0" +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== crc32-stream@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" - integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33" + integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== dependencies: crc-32 "^1.2.0" readable-stream "^3.4.0" @@ -6711,16 +6683,26 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== +define-data-property@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.0.tgz#0db13540704e1d8d479a0656cf781267531b9451" + integrity sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== define-properties@^1.1.3, define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -7080,8 +7062,7 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" "domino@https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a": - version "2.1.6+git" - uid f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a + version "2.1.6" resolved "https://github.com/angular/domino.git#f2435fe1f9f7c91ade0bd472c4723e5eacd7d19a" domutils@^3.0.1: @@ -7206,9 +7187,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.477: - version "1.4.508" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz#5641ff2f5ba11df4bd960fe6a2f9f70aa8b9af96" - integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== + version "1.4.525" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.525.tgz#614284f33901fbecd3e90176c0d60590cd939700" + integrity sha512-GIZ620hDK4YmIqAWkscG4W6RwY6gOx1y5J6f4JUQwctiJrqH2oxZYU4mXHi35oV32tr630UcepBzSBGJ/WYcZA== emoji-regex@^8.0.0: version "8.0.0" @@ -7334,9 +7315,9 @@ error-ex@^1.2.0, error-ex@^1.3.1, error-ex@^1.3.2: is-arrayish "^0.2.1" es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50: version "0.10.62" @@ -8121,9 +8102,9 @@ fined@^1.0.1: parse-filepath "^1.0.1" firebase-tools@^12.0.0: - version "12.5.2" - resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.2.tgz#d73a561a6c5d934f725a48ddc0f6b81f714f197f" - integrity sha512-sd/nWoLPYN4fRGgCv4EQdXrp+cezgQM/Z5fYyLqiCZgDhsz1POxzUb17k4mdJNlI+YkkAVPNzpErjdbwKGaZoA== + version "12.5.4" + resolved "https://registry.yarnpkg.com/firebase-tools/-/firebase-tools-12.5.4.tgz#5235b857cc0d384b2036cd7a25c812cd487d4746" + integrity sha512-fLE+91tJp3PNZPyB6kN9zfn5rkQWhzPX3mlsAGKTMJUA5TLeZA1YlfBbgPr2DJUO47cHN/9b0BYUQjYcYsBPgw== dependencies: "@google-cloud/pubsub" "^3.0.1" abort-controller "^3.0.0" @@ -8192,9 +8173,9 @@ flagged-respawn@^1.0.0: integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flatten@^1.0.2: version "1.0.3" @@ -8215,9 +8196,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.0.0, follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" @@ -8496,7 +8477,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== @@ -8584,29 +8565,14 @@ git-raw-commits@^4.0.0: meow "^12.0.1" split2 "^4.0.0" -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-6.0.0.tgz#b011ef94ae23ec8121f311d92a5969fc91502e15" - integrity sha512-v5BL6psuUy+Ftuo99141XlOIDoJtKw5+YyDANS7fknSP0iT4cVIanc3toDsH4K+VpIWc19l2/xkwQmXMfloeUA== +git-semver-tags@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-7.0.1.tgz#74426e7d7710e5a263655e78b4c651eed804d63e" + integrity sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q== dependencies: meow "^12.0.1" semver "^7.5.2" -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== - dependencies: - ini "^1.3.2" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -8699,7 +8665,7 @@ glob@^10.2.2: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.1.7, glob@^7.2.0, glob@^7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -8882,6 +8848,13 @@ google-protobuf@^3.6.1: resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4" integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^11.0.2, got@^11.8.2: version "11.8.6" resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" @@ -9191,9 +9164,9 @@ hosted-git-info@^2.1.4: integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.0.tgz#276330b8ad9f4566e82c8ccb16050decc096076b" - integrity sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" + integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== dependencies: lru-cache "^10.0.1" @@ -9348,7 +9321,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@7.0.1, https-proxy-agent@7.0.2, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1: +https-proxy-agent@7.0.1, https-proxy-agent@7.0.2, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0, https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2: version "7.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz#0277e28f13a07d45c663633841e20a40aaafe0ab" integrity sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ== @@ -9429,7 +9402,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== -import-fresh@^3.2.1: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -9495,7 +9468,7 @@ ini@4.1.1: resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -9522,9 +9495,9 @@ inquirer@8.2.6, inquirer@^8.2.0: wrap-ansi "^6.0.1" inquirer@^9.2.7: - version "9.2.10" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.10.tgz#495a846fd6722ffadba896bd9d93e1e5a7add5c7" - integrity sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA== + version "9.2.11" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.11.tgz#e9003755c233a414fceda1891c23bd622cad4a95" + integrity sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g== dependencies: "@ljharb/through" "^2.3.9" ansi-escapes "^4.3.2" @@ -10091,9 +10064,9 @@ isurl@^1.0.0-alpha5: is-object "^1.0.1" jackspeak@^2.0.3: - version "2.3.1" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.1.tgz#ce2effa4c458e053640e61938865a5b5fae98456" - integrity sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A== + version "2.3.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.3.tgz#95e4cbcc03b3eb357bf6bcce14a903fb3d1151e1" + integrity sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: @@ -10168,9 +10141,9 @@ jest-worker@^27.4.5: supports-color "^8.0.0" jiti@^1.18.2: - version "1.19.3" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.3.tgz#ef554f76465b3c2b222dc077834a71f0d4a37569" - integrity sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== jju@^1.1.0, jju@~1.4.0: version "1.4.0" @@ -10650,16 +10623,16 @@ levn@~0.3.0: type-check "~0.3.2" libsodium-wrappers@^0.7.10: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.11.tgz#53bd20606dffcc54ea2122133c7da38218f575f7" - integrity sha512-SrcLtXj7BM19vUKtQuyQKiQCRJPgbpauzl3s0rSwD+60wtHqSUuqcoawlMDheCJga85nKOQwxNYQxf/CKAvs6Q== + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" + integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== dependencies: - libsodium "^0.7.11" + libsodium "^0.7.13" -libsodium@^0.7.11: - version "0.7.11" - resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.11.tgz#cd10aae7bcc34a300cc6ad0ac88fcca674cfbc2e" - integrity sha512-WPfJ7sS53I2s4iM58QxY3Inb83/6mjlYgcmZs7DJsvDlnmVUwNinBCi5vBT43P6bHRy01O4zsMU2CoVR6xJ40A== +libsodium@^0.7.13: + version "0.7.13" + resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" + integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== license-webpack-plugin@4.0.2: version "4.0.2" @@ -11588,9 +11561,9 @@ mute-stream@1.0.0: integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nan@^2.12.1, nan@^2.17.0: - version "2.17.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.17.0.tgz#c0150a2368a182f033e9aa5195ec76ea41a199cb" - integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + version "2.18.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.18.0.tgz#26a6faae7ffbeb293a39660e88a76b82e30b7554" + integrity sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w== nanoid@^3.3.6: version "3.3.6" @@ -12218,19 +12191,19 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz#db42120c64292685dafaf2bd921e223c56bfb13b" - integrity sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA== +pac-proxy-agent@^7.0.0, pac-proxy-agent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz#6b9ddc002ec3ff0ba5fdf4a8a21d363bcc612d75" + integrity sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A== dependencies: "@tootallnate/quickjs-emscripten" "^0.23.0" agent-base "^7.0.2" debug "^4.3.4" get-uri "^6.0.1" http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" pac-resolver "^7.0.0" - socks-proxy-agent "^8.0.1" + socks-proxy-agent "^8.0.2" pac-resolver@^7.0.0: version "7.0.0" @@ -12301,7 +12274,7 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -12683,7 +12656,7 @@ postcss-values-parser@^6.0.2: is-url-superb "^4.0.0" quote-unquote "^1.0.0" -postcss@8.4.29, postcss@^8.1.7, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: +postcss@8.4.29: version "8.4.29" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== @@ -12692,6 +12665,15 @@ postcss@8.4.29, postcss@^8.1.7, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.2 picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@^8.1.7, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.30" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.30.tgz#0e0648d551a606ef2192a26da4cabafcc09c1aa7" + integrity sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + preact-render-to-string@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-6.2.1.tgz#bd4f01f9a6b91b16b281343e665d110487f68d67" @@ -12923,7 +12905,7 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -proxy-agent@6.3.0, proxy-agent@^6.3.0: +proxy-agent@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.0.tgz#72f7bb20eb06049db79f7f86c49342c34f9ba08d" integrity sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og== @@ -12937,6 +12919,20 @@ proxy-agent@6.3.0, proxy-agent@^6.3.0: proxy-from-env "^1.1.0" socks-proxy-agent "^8.0.1" +proxy-agent@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.3.1.tgz#40e7b230552cf44fd23ffaf7c59024b692612687" + integrity sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.1" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.2" + proxy-from-env@^1.0.0, 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" @@ -13276,9 +13272,9 @@ reflect-metadata@^0.1.13, reflect-metadata@^0.1.3: integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -13513,7 +13509,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@1.22.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.21.0, resolve@^1.3.2, resolve@^1.4.0, resolve@~1.22.1: +resolve@1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -13522,6 +13518,15 @@ resolve@1.22.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.21.0, resolve@^1.3.2, resolve@^1.4.0, resolve@~1.22.1: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@~1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" @@ -13672,9 +13677,9 @@ rollup-plugin-terser@^7.0.1: terser "^5.0.0" rollup@^3.27.1: - version "3.29.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.1.tgz#ba53a179d46ac3cd79e162dca6ab70d93cd26f78" - integrity sha512-c+ebvQz0VIH4KhhCpDsI+Bik0eT8ZFEVZEYw0cGMVqIP8zc+gnwl7iXCamTw7vzv2MeuZFZfdx5JJIq+ehzDlg== + version "3.29.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.2.tgz#cbc76cd5b03b9f9e93be991d23a1dff9c6d5b740" + integrity sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A== optionalDependencies: fsevents "~2.3.2" @@ -14308,12 +14313,12 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks-proxy-agent@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" - integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== +socks-proxy-agent@^8.0.1, socks-proxy-agent@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" + integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== dependencies: - agent-base "^7.0.1" + agent-base "^7.0.2" debug "^4.3.4" socks "^2.7.1" @@ -14464,9 +14469,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + version "3.0.15" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz#142460aabaca062bc7cd4cc87b7d50725ed6a4ba" + integrity sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ== spdy-transport@^3.0.0: version "3.0.0" @@ -14509,9 +14514,9 @@ split2@^4.0.0: integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== sprintf-js@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" @@ -14906,9 +14911,9 @@ tar-stream@^3.1.5: streamx "^2.15.0" tar@^6.1.11, tar@^6.1.2: - version "6.1.15" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.15.tgz#c9738b0b98845a3b344d334b8fa3041aaba53a69" - integrity sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A== + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== dependencies: chownr "^2.0.0" fs-minipass "^2.0.0" @@ -14936,7 +14941,7 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" -terser@5.19.4: +terser@5.19.4, terser@^5.0.0, terser@^5.16.8, terser@^5.8.0: version "5.19.4" resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== @@ -14946,16 +14951,6 @@ terser@5.19.4: commander "^2.20.0" source-map-support "~0.5.20" -terser@^5.0.0, terser@^5.16.8, terser@^5.8.0: - version "5.19.3" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.3.tgz#359baeba615aef13db4b8c4d77a2aa0d8814aa9e" - integrity sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -15389,14 +15384,14 @@ typescript@~5.0.4: integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== ua-parser-js@^0.7.21, ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== + version "0.7.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.36.tgz#382c5d6fc09141b6541be2cae446ecfcec284db2" + integrity sha512-CPPLoCts2p7D8VbybttE3P2ylv0OBZEAy7a12DsulIEcAiMtWJy+PBgMXgWDI80D5UwqE8oQPHYnk13tm38M2Q== ua-parser-js@^1.0.33: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + version "1.0.36" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.36.tgz#a9ab6b9bd3a8efb90bb0816674b412717b7c428c" + integrity sha512-znuyCIXzl8ciS3+y3fHJI/2OhQIXbXw9MWC/o3qwyR+RGppjZHrM27CGFSKCJXi2Kctiz537iOu2KnXs1lMQhw== uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" @@ -15671,9 +15666,9 @@ uuid@^8.0.0, uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: version "3.0.1" @@ -16052,9 +16047,9 @@ whatwg-encoding@^2.0.0: iconv-lite "0.6.3" whatwg-fetch@^3.4.1: - version "3.6.18" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz#2f640cdee315abced7daeaed2309abd1e44e62d4" - integrity sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q== + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== whatwg-url@^5.0.0: version "5.0.0" @@ -16205,11 +16200,16 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@8.13.0, ws@>=8.13.0, ws@^8.13.0: +ws@8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== +ws@>=8.13.0, ws@^8.13.0: + version "8.14.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g== + ws@^7.2.3: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" @@ -16449,10 +16449,10 @@ z-schema@~5.0.2: commander "^10.0.0" zip-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" - integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== + version "4.1.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135" + integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== dependencies: - archiver-utils "^2.1.0" - compress-commons "^4.1.0" + archiver-utils "^3.0.4" + compress-commons "^4.1.2" readable-stream "^3.6.0" From dde3fdabbd24b48dd6afd120d23e92a3605eb04d Mon Sep 17 00:00:00 2001 From: Alex Castle Date: Tue, 3 Oct 2023 13:04:07 -0700 Subject: [PATCH 33/57] feat(common): upgrade warning to logged error for lazy-loaded LCP images using NgOptimizedImage (#52004) Upgrade the existing warning so it now logs an error instead, when an LCP element is determined to not be usings the `priority` attribute. Error is logged, not thrown. PR Close #52004 --- aio/content/guide/image-directive.md | 2 +- .../src/directives/ng_optimized_image/lcp_image_observer.ts | 6 +++--- .../image-directive/e2e/lcp-check/lcp-check.e2e-spec.ts | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/aio/content/guide/image-directive.md b/aio/content/guide/image-directive.md index 5aa9118162bd97..7b099b0180f4fe 100644 --- a/aio/content/guide/image-directive.md +++ b/aio/content/guide/image-directive.md @@ -65,7 +65,7 @@ Marking an image as `priority` applies the following optimizations: * Sets `loading=eager` (read more about native lazy loading [here](https://web.dev/browser-level-image-lazy-loading)) * Automatically generates a [preload link element](https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preload) if [rendering on the server](/guide/universal). -Angular displays a warning during development if the LCP element is an image that does not have the `priority` attribute. A page’s LCP element can vary based on a number of factors - such as the dimensions of a user's screen, so a page may have multiple images that should be marked `priority`. See [CSS for Web Vitals](https://web.dev/css-web-vitals/#images-and-largest-contentful-paint-lcp) for more details. +Angular logs an error during development if the LCP element is an image that does not have the `priority` attribute, as this can hurt loading performance significantly. A page’s LCP element can vary based on a number of factors - such as the dimensions of a user's screen, so a page may have multiple images that should be marked `priority`. See [CSS for Web Vitals](https://web.dev/css-web-vitals/#images-and-largest-contentful-paint-lcp) for more details. #### Step 5: Include Height and Width diff --git a/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts b/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts index b464b4583d4767..b440019e27b80c 100644 --- a/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts +++ b/packages/common/src/directives/ng_optimized_image/lcp_image_observer.ts @@ -74,7 +74,7 @@ export class LCPImageObserver implements OnDestroy { if (!img) return; if (!img.priority && !img.alreadyWarnedPriority) { img.alreadyWarnedPriority = true; - logMissingPriorityWarning(imgSrc); + logMissingPriorityError(imgSrc); } if (img.modified && !img.alreadyWarnedModified) { img.alreadyWarnedModified = true; @@ -118,9 +118,9 @@ export class LCPImageObserver implements OnDestroy { } } -function logMissingPriorityWarning(ngSrc: string) { +function logMissingPriorityError(ngSrc: string) { const directiveDetails = imgDirectiveDetails(ngSrc); - console.warn(formatRuntimeError( + console.error(formatRuntimeError( RuntimeErrorCode.LCP_IMG_MISSING_PRIORITY, `${directiveDetails} this image is the Largest Contentful Paint (LCP) ` + `element but was not marked "priority". This image should be marked ` + diff --git a/packages/core/test/bundling/image-directive/e2e/lcp-check/lcp-check.e2e-spec.ts b/packages/core/test/bundling/image-directive/e2e/lcp-check/lcp-check.e2e-spec.ts index b57818dbf88550..f44a44191aef0d 100644 --- a/packages/core/test/bundling/image-directive/e2e/lcp-check/lcp-check.e2e-spec.ts +++ b/packages/core/test/bundling/image-directive/e2e/lcp-check/lcp-check.e2e-spec.ts @@ -29,10 +29,9 @@ describe('NgOptimizedImage directive', () => { // Make sure that only one warning is in the console for image `a.png`, // since the `b.png` should be below the fold and not treated as an LCP element. - const logs = await collectBrowserLogs(logging.Level.WARNING); - expect(logs.length).toEqual(2); + const logs = await collectBrowserLogs(logging.Level.SEVERE); + expect(logs.length).toEqual(1); // Verify that the error code and the image src are present in the error message. expect(logs[0].message).toMatch(/NG02955.*?a\.png/); - expect(logs[1].message).toMatch(/NG02964.*?logo-500w\.jpg/); }); }); From a7fa25306f8ce47d8aa330531382106efec55a55 Mon Sep 17 00:00:00 2001 From: Jeremy Elbourn Date: Tue, 3 Oct 2023 17:54:31 -0700 Subject: [PATCH 34/57] feat(compiler): extract api docs for interfaces (#52006) This adds API doc extraction for interfaces, largely using the same code paths for classes. The primary difference between classes and interfaces is that classes have member _declarations_ while interfaces have member _signatures_. This largely doesn't matter for the purposes of extraction, but the types are distinct with no common base types, so we have to do a fair amount of type unioning and aliasing. PR Close #52006 --- .../src/ngtsc/docs/src/class_extractor.ts | 87 ++++--- .../src/ngtsc/docs/src/entities.ts | 5 + .../src/ngtsc/docs/src/extractor.ts | 6 +- .../src/ngtsc/docs/src/function_extractor.ts | 2 +- .../interface_doc_extraction_spec.ts | 215 ++++++++++++++++++ 5 files changed, 287 insertions(+), 28 deletions(-) create mode 100644 packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts diff --git a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts index f3744880a6bb3f..b5e70c9d26982e 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/class_extractor.ts @@ -14,25 +14,42 @@ import {Reference} from '../../imports'; import {DirectiveMeta, InputMapping, InputOrOutput, MetadataReader, NgModuleMeta, PipeMeta} from '../../metadata'; import {ClassDeclaration} from '../../reflection'; -import {ClassEntry, DirectiveEntry, EntryType, MemberEntry, MemberTags, MemberType, MethodEntry, PipeEntry, PropertyEntry} from './entities'; +import {ClassEntry, DirectiveEntry, EntryType, InterfaceEntry, MemberEntry, MemberTags, MemberType, MethodEntry, PipeEntry, PropertyEntry} from './entities'; import {extractResolvedTypeString} from './type_extractor'; +// For the purpose of extraction, we can largely treat properties and accessors the same. + /** A class member declaration that is *like* a property (including accessors) */ type PropertyDeclarationLike = ts.PropertyDeclaration|ts.AccessorDeclaration; -/** Extractor to pull info for API reference documentation for a TypeScript class. */ +// For the purposes of extraction, we can treat interfaces as identical to classes +// with a couple of shorthand types to normalize over the differences between them. + +/** Type representing either a class declaration ro an interface declaration. */ +type ClassDeclarationLike = ts.ClassDeclaration|ts.InterfaceDeclaration; + +/** Type representing either a class member node or an interface member node. */ +type MemberElement = ts.ClassElement|ts.TypeElement; + +/** Type representing either a class method declaration or an interface method signature. */ +type MethodLike = ts.MethodDeclaration|ts.MethodSignature; + +/** Type representing either a class property declaration or an interface property signature. */ +type PropertyLike = PropertyDeclarationLike|ts.PropertySignature; + +/** Extractor to pull info for API reference documentation for a TypeScript class or interface. */ class ClassExtractor { constructor( - protected declaration: ClassDeclaration&ts.ClassDeclaration, - protected reference: Reference, + protected declaration: ClassDeclaration&ClassDeclarationLike, protected typeChecker: ts.TypeChecker, ) {} /** Extract docs info specific to classes. */ extract(): ClassEntry { return { - name: this.declaration.name!.text, - entryType: EntryType.UndecoratedClass, + name: this.declaration.name.text, + entryType: ts.isInterfaceDeclaration(this.declaration) ? EntryType.Interface : + EntryType.UndecoratedClass, members: this.extractAllClassMembers(this.declaration), description: extractJsDocDescription(this.declaration), jsdocTags: extractJsDocTags(this.declaration), @@ -41,7 +58,7 @@ class ClassExtractor { } /** Extracts doc info for a class's members. */ - protected extractAllClassMembers(classDeclaration: ts.ClassDeclaration): MemberEntry[] { + protected extractAllClassMembers(classDeclaration: ClassDeclarationLike): MemberEntry[] { const members: MemberEntry[] = []; for (const member of classDeclaration.members) { @@ -57,10 +74,10 @@ class ClassExtractor { } /** Extract docs for a class's members (methods and properties). */ - protected extractClassMember(memberDeclaration: ts.ClassElement): MemberEntry|undefined { - if (ts.isMethodDeclaration(memberDeclaration)) { + protected extractClassMember(memberDeclaration: MemberElement): MemberEntry|undefined { + if (this.isMethod(memberDeclaration)) { return this.extractMethod(memberDeclaration); - } else if (ts.isPropertyDeclaration(memberDeclaration)) { + } else if (this.isProperty(memberDeclaration)) { return this.extractClassProperty(memberDeclaration); } else if (ts.isAccessor(memberDeclaration)) { return this.extractGetterSetter(memberDeclaration); @@ -72,7 +89,7 @@ class ClassExtractor { } /** Extracts docs for a class method. */ - protected extractMethod(methodDeclaration: ts.MethodDeclaration): MethodEntry { + protected extractMethod(methodDeclaration: MethodLike): MethodEntry { const functionExtractor = new FunctionExtractor(methodDeclaration, this.typeChecker); return { ...functionExtractor.extract(), @@ -82,7 +99,7 @@ class ClassExtractor { } /** Extracts doc info for a property declaration. */ - protected extractClassProperty(propertyDeclaration: PropertyDeclarationLike): PropertyEntry { + protected extractClassProperty(propertyDeclaration: PropertyLike): PropertyEntry { return { name: propertyDeclaration.name.getText(), type: extractResolvedTypeString(propertyDeclaration, this.typeChecker), @@ -102,8 +119,7 @@ class ClassExtractor { } /** Gets the tags for a member (protected, readonly, static, etc.) */ - protected getMemberTags(member: ts.MethodDeclaration|ts.PropertyDeclaration| - ts.AccessorDeclaration): MemberTags[] { + protected getMemberTags(member: MethodLike|PropertyLike): MemberTags[] { const tags: MemberTags[] = this.getMemberTagsFromModifiers(member.modifiers ?? []); if (member.questionToken) { @@ -144,16 +160,26 @@ class ClassExtractor { * - The member is neither a method nor property * - The member is protected */ - private isMemberExcluded(member: ts.ClassElement): boolean { + private isMemberExcluded(member: MemberElement): boolean { return !member.name || !this.isDocumentableMember(member) || !!member.modifiers?.some(mod => mod.kind === ts.SyntaxKind.PrivateKeyword); } /** Gets whether a class member is a method, property, or accessor. */ - private isDocumentableMember(member: ts.ClassElement): member is ts.MethodDeclaration - |ts.PropertyDeclaration { - return ts.isMethodDeclaration(member) || ts.isPropertyDeclaration(member) || - ts.isAccessor(member); + private isDocumentableMember(member: MemberElement): member is MethodLike|PropertyLike { + return this.isMethod(member) || this.isProperty(member) || ts.isAccessor(member); + } + + /** Gets whether a member is a property. */ + private isProperty(member: MemberElement): member is PropertyLike { + // Classes have declarations, interface have signatures + return ts.isPropertyDeclaration(member) || ts.isPropertySignature(member); + } + + /** Gets whether a member is a method. */ + private isMethod(member: MemberElement): member is MethodLike { + // Classes have declarations, interface have signatures + return ts.isMethodDeclaration(member) || ts.isMethodSignature(member); } } @@ -161,11 +187,11 @@ class ClassExtractor { class DirectiveExtractor extends ClassExtractor { constructor( declaration: ClassDeclaration&ts.ClassDeclaration, - reference: Reference, + protected reference: Reference, protected metadata: DirectiveMeta, checker: ts.TypeChecker, ) { - super(declaration, reference, checker); + super(declaration, checker); } /** Extract docs info for directives and components (including underlying class info). */ @@ -215,11 +241,11 @@ class DirectiveExtractor extends ClassExtractor { class PipeExtractor extends ClassExtractor { constructor( declaration: ClassDeclaration&ts.ClassDeclaration, - reference: Reference, + protected reference: Reference, private metadata: PipeMeta, typeChecker: ts.TypeChecker, ) { - super(declaration, reference, typeChecker); + super(declaration, typeChecker); } override extract(): PipeEntry { @@ -236,11 +262,11 @@ class PipeExtractor extends ClassExtractor { class NgModuleExtractor extends ClassExtractor { constructor( declaration: ClassDeclaration&ts.ClassDeclaration, - reference: Reference, + protected reference: Reference, private metadata: NgModuleMeta, typeChecker: ts.TypeChecker, ) { - super(declaration, reference, typeChecker); + super(declaration, typeChecker); } override extract(): ClassEntry { @@ -272,8 +298,17 @@ export function extractClass( } else if (ngModuleMetadata) { extractor = new NgModuleExtractor(classDeclaration, ref, ngModuleMetadata, typeChecker); } else { - extractor = new ClassExtractor(classDeclaration, ref, typeChecker); + extractor = new ClassExtractor(classDeclaration, typeChecker); } return extractor.extract(); } + +/** Extracts documentation info for an interface. */ +export function extractInterface( + declaration: ts.InterfaceDeclaration, + typeChecker: ts.TypeChecker, + ): InterfaceEntry { + const extractor = new ClassExtractor(declaration, typeChecker); + return extractor.extract(); +} diff --git a/packages/compiler-cli/src/ngtsc/docs/src/entities.ts b/packages/compiler-cli/src/ngtsc/docs/src/entities.ts index 51b58ad6c481e1..8ac07b051b476f 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/entities.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/entities.ts @@ -66,6 +66,11 @@ export interface ClassEntry extends DocEntry { members: MemberEntry[]; } +// From an API doc perspective, class and interfaces are identical. + +/** Documentation entity for a TypeScript interface. */ +export type InterfaceEntry = ClassEntry; + /** Documentation entity for a TypeScript enum. */ export interface EnumEntry extends DocEntry { members: EnumMemberEntry[]; diff --git a/packages/compiler-cli/src/ngtsc/docs/src/extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/extractor.ts index 01fb85d6e4f0d3..3c6803bc75374b 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/extractor.ts @@ -13,7 +13,7 @@ import ts from 'typescript'; import {MetadataReader} from '../../metadata'; import {isNamedClassDeclaration, TypeScriptReflectionHost} from '../../reflection'; -import {extractClass} from './class_extractor'; +import {extractClass, extractInterface} from './class_extractor'; import {extractConstant, isSyntheticAngularConstant} from './constant_extractor'; import {DocEntry} from './entities'; @@ -54,6 +54,10 @@ export class DocsExtractor { entry = extractClass(node, this.metadataReader, this.typeChecker); } + if (ts.isInterfaceDeclaration(node)) { + entry = extractInterface(node, this.typeChecker); + } + if (ts.isFunctionDeclaration(node)) { const functionExtractor = new FunctionExtractor(node, this.typeChecker); entry = functionExtractor.extract(); diff --git a/packages/compiler-cli/src/ngtsc/docs/src/function_extractor.ts b/packages/compiler-cli/src/ngtsc/docs/src/function_extractor.ts index 0ae32d3b5006b3..2aa1d21e1f5914 100644 --- a/packages/compiler-cli/src/ngtsc/docs/src/function_extractor.ts +++ b/packages/compiler-cli/src/ngtsc/docs/src/function_extractor.ts @@ -14,7 +14,7 @@ import {extractResolvedTypeString} from './type_extractor'; export class FunctionExtractor { constructor( - private declaration: ts.FunctionDeclaration|ts.MethodDeclaration, + private declaration: ts.FunctionDeclaration|ts.MethodDeclaration|ts.MethodSignature, private typeChecker: ts.TypeChecker, ) {} diff --git a/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts new file mode 100644 index 00000000000000..b87990ef160e7f --- /dev/null +++ b/packages/compiler-cli/test/ngtsc/doc_extraction/interface_doc_extraction_spec.ts @@ -0,0 +1,215 @@ +/** + * @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 + */ + +import {DocEntry} from '@angular/compiler-cli/src/ngtsc/docs'; +import {EntryType, InterfaceEntry, MemberTags, MemberType, MethodEntry, PropertyEntry} from '@angular/compiler-cli/src/ngtsc/docs/src/entities'; +import {runInEachFileSystem} from '@angular/compiler-cli/src/ngtsc/file_system/testing'; +import {loadStandardTestFiles} from '@angular/compiler-cli/src/ngtsc/testing'; + +import {NgtscTestEnvironment} from '../env'; + +const testFiles = loadStandardTestFiles({fakeCore: true, fakeCommon: true}); + +runInEachFileSystem(os => { + let env!: NgtscTestEnvironment; + + describe('ngtsc interface docs extraction', () => { + beforeEach(() => { + env = NgtscTestEnvironment.setup(testFiles); + env.tsconfig(); + }); + + it('should extract interfaces', () => { + env.write('index.ts', ` + export interface UserProfile {} + + export interface CustomSlider {} + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + expect(docs.length).toBe(2); + expect(docs[0].name).toBe('UserProfile'); + expect(docs[0].entryType).toBe(EntryType.Interface); + expect(docs[1].name).toBe('CustomSlider'); + expect(docs[1].entryType).toBe(EntryType.Interface); + }); + + it('should extract interface members', () => { + env.write('index.ts', ` + export interface UserProfile { + firstName(): string; + age: number; + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(2); + + const methodEntry = interfaceEntry.members[0] as MethodEntry; + expect(methodEntry.memberType).toBe(MemberType.Method); + expect(methodEntry.name).toBe('firstName'); + expect(methodEntry.returnType).toBe('string'); + + const propertyEntry = interfaceEntry.members[1] as PropertyEntry; + expect(propertyEntry.memberType).toBe(MemberType.Property); + expect(propertyEntry.name).toBe('age'); + expect(propertyEntry.type).toBe('number'); + }); + + it('should extract a method with a rest parameter', () => { + env.write('index.ts', ` + export interface UserProfile { + getNames(prefix: string, ...ids: string[]): string[]; + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + const interfaceEntry = docs[0] as InterfaceEntry; + const methodEntry = interfaceEntry.members[0] as MethodEntry; + const [prefixParamEntry, idsParamEntry] = methodEntry.params; + + expect(prefixParamEntry.name).toBe('prefix'); + expect(prefixParamEntry.type).toBe('string'); + expect(prefixParamEntry.isRestParam).toBe(false); + + expect(idsParamEntry.name).toBe('ids'); + expect(idsParamEntry.type).toBe('string[]'); + expect(idsParamEntry.isRestParam).toBe(true); + }); + + it('should extract interface method params', () => { + env.write('index.ts', ` + export interface UserProfile { + setPhone(num: string, area?: string): void; + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(1); + + const methodEntry = interfaceEntry.members[0] as MethodEntry; + expect(methodEntry.memberType).toBe(MemberType.Method); + expect(methodEntry.name).toBe('setPhone'); + expect(methodEntry.params.length).toBe(2); + + const [numParam, areaParam] = methodEntry.params; + expect(numParam.name).toBe('num'); + expect(numParam.isOptional).toBe(false); + expect(numParam.type).toBe('string'); + + expect(areaParam.name).toBe('area'); + expect(areaParam.isOptional).toBe(true); + expect(areaParam.type).toBe('string | undefined'); + }); + + it('should not extract private interface members', () => { + env.write('index.ts', ` + export interface UserProfile { + private ssn: string; + private getSsn(): string; + private static printSsn(): void; + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(0); + }); + + it('should extract member tags', () => { + // Test both properties and methods with zero, one, and multiple tags. + env.write('index.ts', ` + export interface UserProfile { + eyeColor: string; + protected name: string; + readonly age: number; + address?: string; + static country: string; + protected readonly birthday: string; + + getEyeColor(): string; + protected getName(): string; + getAge?(): number; + static getCountry(): string; + protected getBirthday?(): string; + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.members.length).toBe(11); + + const [ + eyeColorMember, + nameMember, + ageMember, + addressMember, + countryMember, + birthdayMember, + getEyeColorMember, + getNameMember, + getAgeMember, + getCountryMember, + getBirthdayMember, + ] = interfaceEntry.members; + + // Properties + expect(eyeColorMember.memberTags.length).toBe(0); + expect(nameMember.memberTags).toEqual([MemberTags.Protected]); + expect(ageMember.memberTags).toEqual([MemberTags.Readonly]); + expect(addressMember.memberTags).toEqual([MemberTags.Optional]); + expect(countryMember.memberTags).toEqual([MemberTags.Static]); + expect(birthdayMember.memberTags).toContain(MemberTags.Protected); + expect(birthdayMember.memberTags).toContain(MemberTags.Readonly); + + // Methods + expect(getEyeColorMember.memberTags.length).toBe(0); + expect(getNameMember.memberTags).toEqual([MemberTags.Protected]); + expect(getAgeMember.memberTags).toEqual([MemberTags.Optional]); + expect(getCountryMember.memberTags).toEqual([MemberTags.Static]); + expect(getBirthdayMember.memberTags).toContain(MemberTags.Protected); + expect(getBirthdayMember.memberTags).toContain(MemberTags.Optional); + }); + + it('should extract getters and setters', () => { + // Test getter-only, a getter + setter, and setter-only. + env.write('index.ts', ` + export interface UserProfile { + get userId(): number; + + get userName(): string; + set userName(value: string); + + set isAdmin(value: boolean); + } + `); + + const docs: DocEntry[] = env.driveDocsExtraction('index.ts'); + const interfaceEntry = docs[0] as InterfaceEntry; + expect(interfaceEntry.entryType).toBe(EntryType.Interface); + + expect(interfaceEntry.members.length).toBe(4); + + const [userIdGetter, userNameGetter, userNameSetter, isAdminSetter, ] = interfaceEntry.members; + + expect(userIdGetter.name).toBe('userId'); + expect(userIdGetter.memberType).toBe(MemberType.Getter); + expect(userNameGetter.name).toBe('userName'); + expect(userNameGetter.memberType).toBe(MemberType.Getter); + expect(userNameSetter.name).toBe('userName'); + expect(userNameSetter.memberType).toBe(MemberType.Setter); + expect(isAdminSetter.name).toBe('isAdmin'); + expect(isAdminSetter.memberType).toBe(MemberType.Setter); + }); + }); +}); From c38846292bb361c0efe8bbcd441a1ce07b326b88 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 4 Oct 2023 13:20:56 -0700 Subject: [PATCH 35/57] docs: release notes for the v15.2.10 release --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34a762b3a32eac..a2db0450a81001 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ + +# 15.2.10 (2023-10-04) +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [9fe08968b8](https://github.com/angular/angular/commit/9fe08968b84b92da47ce91f5d2860b3aa23d2d2b) | fix | throw a critical error when handleFetch fail ([#51989](https://github.com/angular/angular/pull/51989)) | + + + # 17.0.0-next.6 (2023-09-27) ## Breaking Changes From 6441de87ec067120c5ef26e760b28f27943665aa Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 4 Oct 2023 13:59:08 -0700 Subject: [PATCH 36/57] docs: release notes for the v16.2.8 release --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2db0450a81001..4fca13d1384a74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ + +# 16.2.8 (2023-10-04) +### language-service +| Commit | Type | Description | +| -- | -- | -- | +| [b732961fc3](https://github.com/angular/angular/commit/b732961fc3c6eec3cf5508330cc09d6a0a2d8f9a) | fix | Retain correct language service when `ts.Project` reloads ([#51912](https://github.com/angular/angular/pull/51912)) | +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [966ce9790a](https://github.com/angular/angular/commit/966ce9790aa7c9414bcd35b49621f169d67b5669) | fix | throw a critical error when handleFetch fails ([#51960](https://github.com/angular/angular/pull/51960)) | + + + # 15.2.10 (2023-10-04) ### service-worker From fe81ff8cd6948bea5a6212721ea920a8572248e1 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 4 Oct 2023 14:27:05 -0700 Subject: [PATCH 37/57] release: cut the v17.0.0-next.7 release --- CHANGELOG.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fca13d1384a74..09790bf0a4cbbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,53 @@ + +# 17.0.0-next.7 (2023-10-04) +## Deprecations +### core +- Swapping out the context object for `EmbeddedViewRef` + is no longer supported. Support for this was introduced with v12.0.0, but + this pattern is rarely used. There is no replacement, but you can use + simple assignments in most cases, or `Object.assign , or alternatively + still replace the full object by using a `Proxy` (see `NgTemplateOutlet` + as an example). + + Also adds a warning if the deprecated +### animations +| Commit | Type | Description | +| -- | -- | -- | +| [e753278faa](https://github.com/angular/angular/commit/e753278faae79a53e235e0d8e03f89555a712d80) | feat | Add the possibility of lazy loading animations code. ([#50738](https://github.com/angular/angular/pull/50738)) | +### common +| Commit | Type | Description | +| -- | -- | -- | +| [dde3fdabbd](https://github.com/angular/angular/commit/dde3fdabbd24b48dd6afd120d23e92a3605eb04d) | feat | upgrade warning to logged error for lazy-loaded LCP images using NgOptimizedImage ([#52004](https://github.com/angular/angular/pull/52004)) | +### compiler +| Commit | Type | Description | +| -- | -- | -- | +| [a7fa25306f](https://github.com/angular/angular/commit/a7fa25306f8ce47d8aa330531382106efec55a55) | feat | extract api docs for interfaces ([#52006](https://github.com/angular/angular/pull/52006)) | +| [0eae992c4e](https://github.com/angular/angular/commit/0eae992c4e03b7c9039476e03b72e92d662293df) | fix | allow nullable values in for loop block ([#51997](https://github.com/angular/angular/pull/51997)) | +| [9acd2ac98b](https://github.com/angular/angular/commit/9acd2ac98bc3b6ffc5a8d6c19f7290d05fe1f896) | fix | enable block syntax in the linker ([#51979](https://github.com/angular/angular/pull/51979)) | +| [1d871c03a5](https://github.com/angular/angular/commit/1d871c03a523e10bb838cb0f9550595cfbd9d14d) | fix | forward referenced dependencies not identified as deferrable ([#52017](https://github.com/angular/angular/pull/52017)) | +| [02edb43067](https://github.com/angular/angular/commit/02edb4306736e6f12e87a4164c17eca6cbdfe151) | fix | narrow the type of the aliased if block expression ([#51952](https://github.com/angular/angular/pull/51952)) | +| [1beef49d80](https://github.com/angular/angular/commit/1beef49d80809fbb0e7c8e95f17096c39ac8940a) | fix | update the minVersion if component uses block syntax ([#51979](https://github.com/angular/angular/pull/51979)) | +| [e5bca43224](https://github.com/angular/angular/commit/e5bca432248add0a19102f6afeae145f1a33ee8a) | perf | further reduce bundle size using arrow functions ([#52010](https://github.com/angular/angular/pull/52010)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [4f04d1cdab](https://github.com/angular/angular/commit/4f04d1cdab2fc5217566c0c01b7df10c74a93afa) | feat | add new list reconcilation algorithm ([#51980](https://github.com/angular/angular/pull/51980)) | +| [43e6fb0606](https://github.com/angular/angular/commit/43e6fb0606e15584dcb4478ad4eaa8e825dda83e) | feat | enable block syntax ([#51994](https://github.com/angular/angular/pull/51994)) | +| [a54713c831](https://github.com/angular/angular/commit/a54713c8316787eea160cfdb7f2778a087fe59ed) | feat | implement ɵgetInjectorMetadata debug API ([#51900](https://github.com/angular/angular/pull/51900)) | +| [7d42dc3c02](https://github.com/angular/angular/commit/7d42dc3c023391e12ea607beb227fd4426e1694d) | feat | the new list reconciliation algorithm for built-in for ([#51980](https://github.com/angular/angular/pull/51980)) | +| [4f69d620d9](https://github.com/angular/angular/commit/4f69d620d94663592780b2875acbc2b1918775f9) | fix | deferred blocks not removing content immediately when animations are enabled ([#51971](https://github.com/angular/angular/pull/51971)) | +| [9b9e11fcaf](https://github.com/angular/angular/commit/9b9e11fcaf5d8d639ff1d7b8feddb01751b47e14) | refactor | deprecate allowing full context object to be replaced in `EmbeddedViewRef` ([#51887](https://github.com/angular/angular/pull/51887)) | +### language-service +| Commit | Type | Description | +| -- | -- | -- | +| [08482f2c7d](https://github.com/angular/angular/commit/08482f2c7dcbcd100981dfb266a6e63f64432328) | fix | Retain correct language service when `ts.Project` reloads ([#51912](https://github.com/angular/angular/pull/51912)) | +### service-worker +| Commit | Type | Description | +| -- | -- | -- | +| [cc7973f5a5](https://github.com/angular/angular/commit/cc7973f5a5cddbc5288db7d572757819327a40c3) | fix | throw a critical error when handleFetch fails ([#51960](https://github.com/angular/angular/pull/51960)) | + + + # 16.2.8 (2023-10-04) ### language-service diff --git a/package.json b/package.json index cab9064dbb1954..931ff11aa92888 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "17.0.0-next.6", + "version": "17.0.0-next.7", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular", From f93352481b58ba19ec0085a29421ffea83b0744e Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Fri, 29 Sep 2023 14:44:46 +0000 Subject: [PATCH 38/57] ci: migrate saucelabs bazel job to Github Actions (#51945) Use Github Actions to run saucelabs bazel jobs PR Close #51945 --- .circleci/config.yml | 45 ----------------------------- .github/workflows/ci-privileged.yml | 28 ++++++++++++++++++ tools/defaults.bzl | 4 +++ 3 files changed, 32 insertions(+), 45 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 738b684ca80df2..3a07ff7faf98bd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -249,33 +249,6 @@ jobs: - ./ng - ./bazel_repository_cache - # NOTE: This is currently limited to main builds only. See the `monitoring` configuration. - saucelabs: - executor: - name: default-executor - # In order to avoid the bottleneck of having a slow host machine, we acquire a better - # container for this job. This is necessary because we launch a lot of browsers concurrently - # and therefore the tunnel and Karma need to process a lot of file requests and tests. - resource_class: xlarge - environment: - NUMBER_OF_PARALLEL_BROWSERS: 2 - steps: - - custom_attach_workspace - - init_environment - - init_saucelabs_environment - - run: - name: Start Saucelabs daemon service - command: yarn bazel run //tools/saucelabs-daemon/background-service -- ${NUMBER_OF_PARALLEL_BROWSERS} - background: true - - run: - name: Run Bazel tests on Saucelabs - command: | - TESTS=$(./node_modules/.bin/bazelisk query --output label '(kind(karma_web_test, ...) intersect attr("tags", "saucelabs", ...)) except attr("tags", "fixme-saucelabs", ...)') - yarn bazel test --config=saucelabs --jobs=${NUMBER_OF_PARALLEL_BROWSERS} ${TESTS} - no_output_timeout: 40m - - notify_webhook_on_fail: - webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL - # The `build-npm-packages` tasks exist for backwards-compatibility with old scripts and # tests that rely on the pre-Bazel `dist/packages-dist` output structure (build.sh). # Having multiple jobs that independently build in this manner duplicates some work; we build @@ -375,21 +348,3 @@ workflows: # Get the artifacts to publish from the build-packages-dist job # since the publishing script expects the legacy outputs layout. - build-npm-packages - - monitoring: - jobs: - - setup - - saucelabs: - # Testing saucelabs via Bazel currently taking longer than the legacy saucelabs job as it - # each karma_web_test target is provisioning and tearing down browsers which is adding - # a lot of overhead. Running once daily in the main branch to avoid wasting resources and - # slowing down CI for PRs. - # TODO: Run this job on all branches (including PRs) once karma_web_test targets can - # share provisioned browsers and we can remove the legacy saucelabs job. - requires: - - setup - triggers: - - schedule: - <<: *only_on_main_branch - # Runs monitoring jobs at 10:00AM every day. - cron: '0 10 * * *' diff --git a/.github/workflows/ci-privileged.yml b/.github/workflows/ci-privileged.yml index 3e908e5f93b455..bf33d92d4679ee 100644 --- a/.github/workflows/ci-privileged.yml +++ b/.github/workflows/ci-privileged.yml @@ -62,3 +62,31 @@ jobs: run: KARMA_WEB_TEST_MODE=SL_REQUIRED yarn karma start ./karma-js.conf.js --single-run - name: Stop Saucelabs tunnel service run: ./tools/saucelabs/sauce-service.sh stop + + bazel-saucelabs: + runs-on: ubuntu-latest-4core + env: + JOBS: 2 + steps: + - name: Initialize environment + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@1befe6d24fd5cab818e7f8bada40ab364781b8a8 + with: + cache-node-modules: true + # Checking out the pull request commit is intended here as we need to run the changed code tests. + ref: ${{ github.event.pull_request.head.sha }} + - name: Install node modules + run: yarn install --frozen-lockfile + - name: Setup Bazel + uses: angular/dev-infra/github-actions/bazel/setup@1befe6d24fd5cab818e7f8bada40ab364781b8a8 + - name: Setup Bazel Remote Caching + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - name: Set up Sauce Tunnel Daemon + run: yarn bazel run //tools/saucelabs-daemon/background-service -- $JOBS & + env: + SAUCE_TUNNEL_IDENTIFIER: angular-framework-${{ github.run_number }} + SAUCE_USERNAME: ${{ vars.SAUCE_USERNAME }} + SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} + - 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", ...)') + yarn bazel test --config=saucelabs --jobs=$JOBS ${TESTS} diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 8ddcd9c4354759..49fdf23755e6ec 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -338,6 +338,10 @@ def karma_web_test_suite( tags = tags + [ "manual", "no-remote-exec", + # Requires network to be able to access saucelabs daemon + "requires-network", + # Prevent the sandbox from being used so that it can communicate with the saucelabs daemon + "no-sandbox", "saucelabs", ], configuration_env_vars = ["KARMA_WEB_TEST_MODE"], From 2da3551a703ebef401d76a8e88e388437e851d85 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 19 Jun 2023 18:08:16 +0200 Subject: [PATCH 39/57] feat(benchpress): report gc and render time spent in script (#50771) GC and render events can happen _while_ running scripts as well as outside of the script blocks. The new metric entries capture both the gc and render time happening in the scrip blocks. PR Close #50771 --- .../benchpress/src/metric/perflog_metric.ts | 8 +++- .../test/metric/perflog_metric_spec.ts | 40 +++++++++++++++++-- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/packages/benchpress/src/metric/perflog_metric.ts b/packages/benchpress/src/metric/perflog_metric.ts index 7e1dd52de75b8b..459933a1ee4ec7 100644 --- a/packages/benchpress/src/metric/perflog_metric.ts +++ b/packages/benchpress/src/metric/perflog_metric.ts @@ -72,13 +72,15 @@ export class PerflogMetric extends Metric { override describe(): {[key: string]: string} { const res: {[key: string]: any} = { 'scriptTime': 'script execution time in ms, including gc and render', - 'pureScriptTime': 'script execution time in ms, without gc nor render' + 'pureScriptTime': 'script execution time in ms, without gc nor render', }; if (this._perfLogFeatures.render) { res['renderTime'] = 'render time in ms'; + res['renderTimeInScript'] = 'render time in ms while executing script (usually means reflow)'; } if (this._perfLogFeatures.gc) { res['gcTime'] = 'gc time in ms'; + res['gcTimeInScript'] = 'gc time in ms while executing scripts'; res['gcAmount'] = 'gc amount in kbytes'; res['majorGcTime'] = 'time of major gcs in ms'; if (this._forceGc) { @@ -380,7 +382,11 @@ export class PerflogMetric extends Metric { if (frameTimes.length > 0) { this._addFrameMetrics(result, frameTimes); } + + result['renderTimeInScript'] = renderTimeInScript; + result['gcTimeInScript'] = gcTimeInScript; result['pureScriptTime'] = result['scriptTime'] - gcTimeInScript - renderTimeInScript; + return result; } diff --git a/packages/benchpress/test/metric/perflog_metric_spec.ts b/packages/benchpress/test/metric/perflog_metric_spec.ts index 2b7832d01f5d11..f0c323e17ab554 100644 --- a/packages/benchpress/test/metric/perflog_metric_spec.ts +++ b/packages/benchpress/test/metric/perflog_metric_spec.ts @@ -80,18 +80,19 @@ describe('perflog metric', () => { expect( sortedKeys(createMetric([[]], new PerfLogFeatures({render: true, gc: false})).describe())) - .toEqual(['pureScriptTime', 'renderTime', 'scriptTime']); + .toEqual(['pureScriptTime', 'renderTime', 'renderTimeInScript', 'scriptTime']); expect(sortedKeys(createMetric([[]], null!).describe())).toEqual([ - 'gcAmount', 'gcTime', 'majorGcTime', 'pureScriptTime', 'renderTime', 'scriptTime' + 'gcAmount', 'gcTime', 'gcTimeInScript', 'majorGcTime', 'pureScriptTime', 'renderTime', + 'renderTimeInScript', 'scriptTime' ]); expect(sortedKeys(createMetric([[]], new PerfLogFeatures({render: true, gc: true}), { forceGc: true }).describe())) .toEqual([ - 'forcedGcAmount', 'forcedGcTime', 'gcAmount', 'gcTime', 'majorGcTime', 'pureScriptTime', - 'renderTime', 'scriptTime' + 'forcedGcAmount', 'forcedGcTime', 'gcAmount', 'gcTime', 'gcTimeInScript', 'majorGcTime', + 'pureScriptTime', 'renderTime', 'renderTimeInScript', 'scriptTime' ]); @@ -528,6 +529,21 @@ describe('perflog metric', () => { }); }); + it('should support renderTimeInScript metric', done => { + aggregate([ + eventFactory.start('script', 0), + eventFactory.start('render', 1), + eventFactory.end('render', 3), + eventFactory.end('script', 5), + ]).then((data) => { + expect(data['renderTimeInScript']).toBe(2); + expect(data['renderTime']).toBe(2); + expect(data['pureScriptTime']).toBe(3); + expect(data['scriptTime']).toBe(5); + done(); + }); + }); + it('should support gcTime/gcAmount metric', done => { aggregate([ eventFactory.start('gc', 0, {'usedHeapSize': 2500}), @@ -551,6 +567,22 @@ describe('perflog metric', () => { }); }); + it('should support gcTimeInScript metric', done => { + aggregate([ + eventFactory.start('script', 0), + eventFactory.start('gc', 1, {'usedHeapSize': 2500}), + eventFactory.end('gc', 3, {'usedHeapSize': 1000, 'majorGc': false}), + eventFactory.end('script', 5), + + ]).then((data) => { + expect(data['gcTimeInScript']).toBe(2); + expect(data['gcTime']).toBe(2); + expect(data['pureScriptTime']).toBe(3); + expect(data['scriptTime']).toBe(5); + done(); + }); + }); + it('should support pureScriptTime = scriptTime-gcTime-renderTime', done => { aggregate([ eventFactory.start('script', 0), eventFactory.start('gc', 1, {'usedHeapSize': 1000}), From e12a10256cdc192d06116509969e8156edf59b20 Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Thu, 28 Sep 2023 19:17:41 +0000 Subject: [PATCH 40/57] ci: migrate snapshot publishing from CircleCI to GHA (#51957) Migrate the snapshot publishing from CircleCI to GHA PR Close #51957 --- .circleci/config.yml | 346 +------------------------- .github/workflows/ci.yml | 19 ++ scripts/ci/publish-build-artifacts.sh | 2 +- 3 files changed, 26 insertions(+), 341 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3a07ff7faf98bd..9454be12fd03b8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,350 +1,16 @@ -# Configuration file for https://circleci.com/gh/angular/angular +# This config is remaining in place to prevent pull requests failing because of CircleCI config missing. -# Note: YAML anchors allow an object to be re-used, reducing duplication. -# The ampersand declares an alias for an object, then later the `<<: *name` -# syntax dereferences it. -# See https://blog.daemonl.com/2016/02/yaml.html -# To validate changes, use an online parser, eg. -# https://yaml-online-parser.appspot.com/ - -# CircleCI configuration version -# Version 2.1 allows for extra config reuse features -# https://circleci.com/docs/2.0/reusing-config/#getting-started-with-config-reuse version: 2.1 -# We don't want to include the current branch name in the cache key because that would prevent -# PRs from being able to restore the cache since the branch names are always different for PRs. -# The cache key should only consist of dynamic values that change whenever something in the -# cache changes. For example: -# 1) yarn lock file changes --> cached "node_modules" are different. -# 2) bazel repository definitions change --> cached bazel repositories are different. -# Windows needs its own cache key because binaries in node_modules are different. -# **NOTE 1 **: In order to avoid the cache from growing indefinitely and causing slow-downs, we invalidate the cache monthly. -# (See https://support.circleci.com/hc/en-us/articles/360012618473-Creating-a-daily-cache.) -# **NOTE 2 **: If you change the cache key prefix, also sync the cache_key_fallback to match. -# **NOTE 3 **: Keep the static part of the cache key as prefix to enable correct fallbacks. -# **NOTE 4 **: To make sure modified patches can be applied without needing to manually update the cache key, -# the fallback cache key will not match if patches have been modified. -# See https://circleci.com/docs/2.0/caching/#restoring-cache for how prefixes work in CircleCI. -var_3: &cache_key v8-angular-node-16-{{ checksum "month.txt" }}-{{ checksum "patches.hash"}}-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }}-{{ checksum "aio/yarn.lock" }} -# We invalidate the cache if the Bazel version changes because otherwise the `bazelisk` cache -# folder will contain all previously used versions and ultimately cause the cache restoring to -# be slower due to its growing size. -var_4: &cache_key_fallback v8-angular-node-16-{{ checksum "month.txt" }}-{{ checksum "patches.hash"}}-{{ checksum ".bazelversion" }} - -# Windows needs its own cache key because binaries in node_modules are different. -var_3_win: &cache_key_win v10-angular-win-node-16-{{ checksum "month.txt" }}-{{ checksum "patches.hash"}}-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }} -var_4_win: &cache_key_win_fallback v10-angular-win-node-16-{{ checksum "month.txt" }}-{{ checksum "patches.hash"}}-{{ checksum ".bazelversion" }} - -# Workspace initially persisted by the `setup` job, and then enhanced by `build-npm-packages`. -# https://circleci.com/docs/2.0/workflows/#using-workspaces-to-share-data-among-jobs -# https://circleci.com/blog/deep-diving-into-circleci-workspaces/ -var_5: &workspace_location ~/ - -# Filter to run a job on builds for pull requests only. -var_6: &only_on_pull_requests - filters: - branches: - only: - - /pull\/\d+/ - -# Filter to skip a job on builds for pull requests. -var_7: &skip_on_pull_requests - filters: - branches: - ignore: - - /pull\/\d+/ - -# Filter to run a job on builds for the main branch only. -var_8: &only_on_main_branch - filters: - branches: - only: - - main - -# Filter to run a job on all releasable branches. -var_9: &only_release_branches - filters: - branches: - only: - - main - - /\d+\.\d+\.x/ - -# CircleCI orbs -# https://circleci.com/developer/orbs. -orbs: - node: circleci/node@5.0.1 - devinfra: angular/dev-infra@1.0.8 - -# Executor Definitions -# https://circleci.com/docs/2.0/reusing-config/#authoring-reusable-executors -# **NOTE 1**: Pin to exact images using an ID (SHA). See https://circleci.com/docs/2.0/circleci-images/#using-a-docker-image-id-to-pin-an-image-to-a-fixed-version. -# (Using the tag in not necessary when pinning by ID, but include it anyway for documentation purposes.) -# **NOTE 2**: If you change the version of the docker images, also change the `cache_key` suffix. -# **NOTE 3**: If you change the version of Node.js provided by the docker images, also update `.devcontainer/recommended-Dockerfile` to match the new version. -executors: - default-executor: - parameters: - resource_class: - type: string - default: medium - docker: - - image: cimg/node:18.13.0 - resource_class: << parameters.resource_class >> - working_directory: ~/ng - - test-browser-executor: - parameters: - resource_class: - type: string - default: medium - docker: - - image: cimg/node:18.13.0-browsers - resource_class: << parameters.resource_class >> - working_directory: ~/ng - - windows-executor: - working_directory: ~/ng - resource_class: windows.2xlarge - shell: bash - machine: - image: windows-server-2019-vs2019:201908-02 - -# Command Definitions -# https://circleci.com/docs/2.0/reusing-config/#authoring-reusable-commands -commands: - custom_attach_workspace: - description: Attach workspace at a predefined location - steps: - - attach_workspace: - at: *workspace_location - - # Install java runtime which is required by some integration tests such as - # //integration:hello_world__closure_test, //integration:i18n_test and - # //integration:ng_elements_test to run the closure compiler - install_java: - description: Install java - steps: - - run: - name: Install java - command: | - sudo apt-get update - # Install java runtime - sudo apt-get install default-jre - - # Initializes the CI environment by setting up common environment variables. - init_environment: - description: Initializing environment (setting up variables) - steps: - - run: - name: Set up environment - environment: - CIRCLE_GIT_BASE_REVISION: << pipeline.git.base_revision >> - CIRCLE_GIT_REVISION: << pipeline.git.revision >> - command: ./.circleci/env.sh - - devinfra/setup-bazel-remote-exec - - run: - # Configure git as the CircleCI `checkout` command does. - # This is needed because we only checkout on the setup job. - # Add GitHub to known hosts - name: Configure git - command: | - mkdir -p ~/.ssh - echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=' >> ~/.ssh/known_hosts - git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true - git config --global gc.auto 0 || true - - init_saucelabs_environment: - description: Sets up a domain that resolves to the local host. - steps: - - run: - name: Preparing environment for running tests on Sauce Labs. - command: | - # 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 (i.e. the CircleCI VM). - # More context can be found in: https://github.com/angular/angular/pull/35171. - setPublicVar SAUCE_LOCALHOST_ALIAS_DOMAIN "angular-ci.local" - setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev) - - run: - # Sets up a local domain in the machine's host file that resolves to the local - # host. This domain is helpful in Sauce Labs tests where devices are not able to - # properly resolve `localhost` or `127.0.0.1` through the sauce-connect tunnel. - name: Setting up alias domain for local host. - command: echo "127.0.0.1 $SAUCE_LOCALHOST_ALIAS_DOMAIN" | sudo tee -a /etc/hosts - - save_month_to_file: - description: Store the current year and month in a file, so that it can be used for computing the cache key. - steps: - - run: - name: Save month to file - # Note: Make sure this file is excluded in the `.gitignore` as otherwise the - # snapshot stamping would have the `-with-local-changes` suffix. - command: date +%Y-%m > month.txt - - capture_patches_for_cache_key: - description: Hashes all patches so that the cache can be reset upon changes. - steps: - - run: | - md5sum tools/esm-interop/patches/npm/* > patches.hash - - yarn_install: - description: Install dependencies - steps: - - run: - name: Running Yarn install - command: yarn install --frozen-lockfile --non-interactive --cache-folder ~/.cache/yarn - # Yarn's requests sometimes take more than 10mins to complete (especially on Windows). - no_output_timeout: 45m - - notify_webhook_on_fail: - description: Notify a webhook about failure - parameters: - # `webhook_url_env_var` are secret env vars defined in CircleCI project settings. - # The URLs come from https://angular-team.slack.com/apps/A0F7VRE7N-circleci. - webhook_url_env_var: - type: env_var_name - steps: - - run: - when: on_fail - command: | - notificationJson="{\"text\":\":x: \`$CIRCLE_JOB\` job for $CIRCLE_BRANCH branch failed on build $CIRCLE_BUILD_NUM: $CIRCLE_BUILD_URL :scream:\"}" - curl --request POST --header "Content-Type: application/json" --data "$notificationJson" ${<< parameters.webhook_url_env_var >>} - -# Job definitions -# Jobs can include parameters that are passed in the workflow job invocation. -# https://circleci.com/docs/2.0/reusing-config/#authoring-parameterized-jobs jobs: - setup: - executor: default-executor - steps: - - checkout - - save_month_to_file - - capture_patches_for_cache_key - - init_environment - - devinfra/rebase-pr-on-target-branch: - base_revision: << pipeline.git.base_revision >> - head_revision: << pipeline.git.revision >> - # This cache is saved in the build-npm-packages so that Bazel cache is also included. - - restore_cache: - keys: - - *cache_key - - *cache_key_fallback - - yarn_install - - run: yarn --cwd aio install --frozen-lockfile --non-interactive --cache-folder ~/.cache/yarn - # Make the bazel directories and add a file to them if they don't exist already so that - # persist_to_workspace does not fail. - - run: | - if [ ! -d ~/bazel_repository_cache ]; then - mkdir ~/bazel_repository_cache - touch ~/bazel_repository_cache/MARKER - fi - # Persist any changes at this point to be reused by further jobs. - # **NOTE**: To add new content to the workspace, always persist on the same root. - - persist_to_workspace: - root: *workspace_location - paths: - - ./ng - - ./bazel_repository_cache - - # The `build-npm-packages` tasks exist for backwards-compatibility with old scripts and - # tests that rely on the pre-Bazel `dist/packages-dist` output structure (build.sh). - # Having multiple jobs that independently build in this manner duplicates some work; we build - # the bazel packages more than once. Even though we have a remote cache, these jobs will - # typically run in parallel so up-to-date outputs will not be available at the time the build - # starts. - build-npm-packages: - executor: - name: default-executor - resource_class: xlarge - steps: - - custom_attach_workspace - - init_environment - - run: yarn build - - # Save the npm packages from //packages/... for other workflow jobs to read - - persist_to_workspace: - root: *workspace_location - paths: - - ng/dist/packages-dist - - ng/dist/angular-in-memory-web-api-dist - - ng/dist/zone.js-dist - - # Save dependencies and bazel repository cache to use on subsequent runs. - - save_cache: - key: *cache_key - paths: - - ~/.cache/yarn - - ~/bazel_repository_cache - - ~/.cache/bazelisk - - # This job updates the content of repos like github.com/angular/core-builds - # for every green build on angular/angular. - publish_snapshot: - executor: default-executor - steps: - - custom_attach_workspace - - init_environment - # CircleCI has a config setting to force SSH for all github connections - # This is not compatible with our mechanism of using a Personal Access Token - # Clear the global setting - - run: git config --global --unset "url.ssh://git@github.com.insteadof" - - run: - name: Prepare GitHub credentials - command: echo "https://${SNAPSHOT_BUILDS_GITHUB_TOKEN}:@github.com" > ${HOME}/.git_credentials - - run: ./scripts/ci/publish-build-artifacts.sh - - aio_monitoring_stable: - executor: test-browser-executor - steps: - - custom_attach_workspace - - init_environment - - run: setPublicVar_CI_STABLE_BRANCH - - run: - name: Check out `aio/` and yarn from the stable branch - command: | - git fetch origin $CI_STABLE_BRANCH - git checkout --force origin/$CI_STABLE_BRANCH -- aio/ .yarn/ .yarnrc - # Ignore yarn's engines check, because we checked out `aio/package.json` from the stable - # branch and there could be a node version skew, which is acceptable in this monitoring job. - - run: yarn config set ignore-engines true - - run: - name: Run tests against https://angular.io/ - command: ./aio/scripts/test-production.sh https://angular.io/ $CI_AIO_MIN_PWA_SCORE - - notify_webhook_on_fail: - webhook_url_env_var: SLACK_CARETAKER_WEBHOOK_URL - - notify_webhook_on_fail: - webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL - - aio_monitoring_next: - executor: test-browser-executor + pass: + docker: + - image: cimg/base:2022.05 steps: - - custom_attach_workspace - - init_environment - - run: - name: Run tests against https://next.angular.io/ - command: ./aio/scripts/test-production.sh https://next.angular.io/ $CI_AIO_MIN_PWA_SCORE - - notify_webhook_on_fail: - webhook_url_env_var: SLACK_CARETAKER_WEBHOOK_URL - - notify_webhook_on_fail: - webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL + - run: echo "This too shall pass (always)" workflows: version: 2 default_workflow: jobs: - - setup: - filters: - branches: - ignore: g3 - - build-npm-packages: - requires: - - setup - - publish_snapshot: - <<: *only_release_branches - requires: - # Get the artifacts to publish from the build-packages-dist job - # since the publishing script expects the legacy outputs layout. - - build-npm-packages + - pass diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7ee7c4820a913e..3a3588941c433e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -195,6 +195,25 @@ jobs: env: SLACK_BOT_TOKEN: ${{ secrets.ANGULAR_ROBOT_SLACK_TOKEN }} + publish-snapshots: + if: github.event_name == 'push' + runs-on: + labels: ubuntu-latest + steps: + - name: Initialize environment + uses: angular/dev-infra/github-actions/npm/checkout-and-setup-node@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + with: + cache-node-modules: true + - name: Setup Bazel + uses: angular/dev-infra/github-actions/bazel/setup@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - name: Setup Bazel RBE + uses: angular/dev-infra/github-actions/bazel/configure-remote@ba9b4487ced515e5b4d87edd681a3bd9792444d6 + - name: Install node modules + run: yarn install --frozen-lockfile + - run: echo "https://${{secrets.SNAPSHOT_BUILDS_GITHUB_TOKEN}}:@github.com" > ${HOME}/.git_credentials + - run: yarn build + - run: ./scripts/ci/publish-build-artifacts.sh + zone-js: runs-on: labels: ubuntu-latest-4core diff --git a/scripts/ci/publish-build-artifacts.sh b/scripts/ci/publish-build-artifacts.sh index 7ffd2a043b3000..b89a74be2c8ec9 100755 --- a/scripts/ci/publish-build-artifacts.sh +++ b/scripts/ci/publish-build-artifacts.sh @@ -152,7 +152,7 @@ function publishAllBuilds() { } # See docs/DEVELOPER.md for help -CUR_BRANCH=${CI_BRANCH:-$(git symbolic-ref --short HEAD)} +CUR_BRANCH=$(git symbolic-ref --short HEAD) if [ $# -gt 0 ]; then ORG=$1 publishAllBuilds "ssh" From a3b0891031e7ef4ab05adc17ab8f338de8ce1067 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Wed, 4 Oct 2023 15:51:26 +0000 Subject: [PATCH 41/57] docs: update Angular CLI help [main] (#52022) Updated Angular CLI help contents. PR Close #52022 --- aio/content/cli/help/build-info.json | 2 +- aio/content/cli/help/build.json | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/aio/content/cli/help/build-info.json b/aio/content/cli/help/build-info.json index 66e4b7d48c9143..3f233d8384e881 100644 --- a/aio/content/cli/help/build-info.json +++ b/aio/content/cli/help/build-info.json @@ -1,4 +1,4 @@ { "branchName": "refs/heads/main", - "sha": "6d32d42937014cab4c903b84f60f62ec7b299673" + "sha": "5a247ebd1af164de5cece8c87681b94c80197439" } \ No newline at end of file diff --git a/aio/content/cli/help/build.json b/aio/content/cli/help/build.json index 8477d158f1fa62..ca8dbd2561af78 100644 --- a/aio/content/cli/help/build.json +++ b/aio/content/cli/help/build.json @@ -121,6 +121,12 @@ "type": "boolean", "description": "Translate the bundles in one or more locales." }, + { + "name": "named-chunks", + "type": "boolean", + "default": false, + "description": "Use file name for lazy loaded chunks." + }, { "name": "optimization", "type": "boolean", From 91c4da6709eadd5ef33867296826942b3d660776 Mon Sep 17 00:00:00 2001 From: Thomas Wilkinson Date: Wed, 4 Oct 2023 15:46:53 -0500 Subject: [PATCH 42/57] refactor(router): move location methods into state_manager.ts (#52032) This is a preparatory refactor to enable a new version of state_manager.ts that uses the Navigation API rather than History API PR Close #52032 --- packages/router/src/router.ts | 34 +++++++++++++--------------- packages/router/src/state_manager.ts | 19 +++++++++++++++- packages/router/test/router.spec.ts | 6 ++--- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index fa0f165b591c71..a0b6aa2d76752c 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -75,7 +75,7 @@ export class Router { return this.stateManager.rawUrlTree; } private disposed = false; - private locationSubscription?: SubscriptionLike; + private nonRouterCurrentEntryChangeSubscription?: SubscriptionLike; private isNgZoneEnabled = false; private readonly console = inject(Console); @@ -233,8 +233,8 @@ export class Router { initialNavigation(): void { this.setUpLocationChangeListener(); if (!this.navigationTransitions.hasRequestedNavigation) { - const state = this.location.getState() as RestoredState; - this.navigateToSyncWithBrowser(this.location.path(true), IMPERATIVE_NAVIGATION, state); + this.navigateToSyncWithBrowser( + this.location.path(true), IMPERATIVE_NAVIGATION, this.stateManager.restoredState()); } } @@ -247,17 +247,15 @@ export class Router { // Don't need to use Zone.wrap any more, because zone.js // already patch onPopState, so location change callback will // run into ngZone - if (!this.locationSubscription) { - this.locationSubscription = this.location.subscribe(event => { - const source = event['type'] === 'popstate' ? 'popstate' : 'hashchange'; - if (source === 'popstate') { - // The `setTimeout` was added in #12160 and is likely to support Angular/AngularJS - // hybrid apps. - setTimeout(() => { - this.navigateToSyncWithBrowser(event['url']!, source, event.state); - }, 0); - } - }); + if (!this.nonRouterCurrentEntryChangeSubscription) { + this.nonRouterCurrentEntryChangeSubscription = + this.stateManager.nonRouterCurrentEntryChange((url, state) => { + // The `setTimeout` was added in #12160 and is likely to support Angular/AngularJS + // hybrid apps. + setTimeout(() => { + this.navigateToSyncWithBrowser(url, 'popstate', state); + }, 0); + }); } } @@ -269,7 +267,7 @@ export class Router { * the Router needs to respond to ensure its internal state matches. */ private navigateToSyncWithBrowser( - url: string, source: NavigationTrigger, state: RestoredState|undefined) { + url: string, source: NavigationTrigger, state: RestoredState|null|undefined) { const extras: NavigationExtras = {replaceUrl: true}; // TODO: restoredState should always include the entire state, regardless @@ -348,9 +346,9 @@ export class Router { /** Disposes of the router. */ dispose(): void { this.navigationTransitions.complete(); - if (this.locationSubscription) { - this.locationSubscription.unsubscribe(); - this.locationSubscription = undefined; + if (this.nonRouterCurrentEntryChangeSubscription) { + this.nonRouterCurrentEntryChangeSubscription.unsubscribe(); + this.nonRouterCurrentEntryChangeSubscription = undefined; } this.disposed = true; this.eventsSubscription.unsubscribe(); diff --git a/packages/router/src/state_manager.ts b/packages/router/src/state_manager.ts index c595d19f009a04..3f0579d57e8508 100644 --- a/packages/router/src/state_manager.ts +++ b/packages/router/src/state_manager.ts @@ -8,6 +8,7 @@ import {Location} from '@angular/common'; import {inject, Injectable} from '@angular/core'; +import {SubscriptionLike} from 'rxjs'; import {BeforeActivateRoutes, Event, NavigationCancel, NavigationCancellationCode, NavigationEnd, NavigationError, NavigationSkipped, NavigationStart, PrivateRouterEvents, RoutesRecognized} from './events'; import {isBrowserTriggeredNavigation, Navigation, RestoredState} from './navigation_transition'; @@ -76,6 +77,12 @@ export class StateManager { */ private currentPageId: number = 0; lastSuccessfulId: number = -1; + + /** Returns the current state from the browser. */ + restoredState(): RestoredState|null|undefined { + return this.location.getState() as RestoredState | null | undefined; + } + /** * The ɵrouterPageId of whatever page is currently active in the browser history. This is * important for computing the target page id for new navigations because we need to ensure each @@ -85,8 +92,9 @@ export class StateManager { if (this.canceledNavigationResolution !== 'computed') { return this.currentPageId; } - return (this.location.getState() as RestoredState | null)?.ɵrouterPageId ?? this.currentPageId; + return this.restoredState()?.ɵrouterPageId ?? this.currentPageId; } + routerState = createEmptyState(this.currentUrlTree, null); private stateMemento = this.createStateMemento(); @@ -98,6 +106,15 @@ export class StateManager { }; } + nonRouterCurrentEntryChange( + listener: (url: string, state: RestoredState|null|undefined) => void): SubscriptionLike { + return this.location.subscribe(event => { + if (event['type'] === 'popstate') { + listener(event['url']!, event.state as RestoredState | null | undefined); + } + }); + } + handleNavigationEvent(e: Event|PrivateRouterEvents, currentTransition: Navigation) { if (e instanceof NavigationStart) { this.stateMemento = this.createStateMemento(); diff --git a/packages/router/test/router.spec.ts b/packages/router/test/router.spec.ts index 4a1ac6667b34ee..63c8fd757546ab 100644 --- a/packages/router/test/router.spec.ts +++ b/packages/router/test/router.spec.ts @@ -87,15 +87,15 @@ describe('Router', () => { it('should be idempotent', inject([Router, Location], (r: Router, location: Location) => { r.setUpLocationChangeListener(); - const a = (r).locationSubscription; + const a = (r).nonRouterCurrentEntryChangeSubscription; r.setUpLocationChangeListener(); - const b = (r).locationSubscription; + const b = (r).nonRouterCurrentEntryChangeSubscription; expect(a).toBe(b); r.dispose(); r.setUpLocationChangeListener(); - const c = (r).locationSubscription; + const c = (r).nonRouterCurrentEntryChangeSubscription; expect(c).not.toBe(b); })); From 4427e1ebc29f5541cfe6a404f212de4359441812 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Thu, 5 Oct 2023 12:06:53 +0000 Subject: [PATCH 43/57] feat(core): create function to assert not running inside reactive context (#52049) Some functions or code should never run inside reactive contexts. A function to assert that will help putting guard rails in place. PR Close #52049 --- goldens/public-api/core/errors.md | 2 ++ goldens/public-api/core/index.md | 3 ++ .../src/core_reactivity_export_internal.ts | 3 ++ packages/core/src/errors.ts | 1 + .../core/src/render3/reactivity/asserts.ts | 30 +++++++++++++++++++ packages/core/src/signals/index.ts | 2 +- packages/core/src/signals/src/graph.ts | 4 +++ 7 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/render3/reactivity/asserts.ts diff --git a/goldens/public-api/core/errors.md b/goldens/public-api/core/errors.md index ea2252c33ccf3a..b760317afcf7e0 100644 --- a/goldens/public-api/core/errors.md +++ b/goldens/public-api/core/errors.md @@ -19,6 +19,8 @@ export const enum RuntimeErrorCode { // (undocumented) APPLICATION_REF_ALREADY_DESTROYED = 406, // (undocumented) + ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT = 602, + // (undocumented) ASYNC_INITIALIZERS_STILL_RUNNING = 405, // (undocumented) BOOTSTRAP_COMPONENTS_NOT_FOUND = -403, diff --git a/goldens/public-api/core/index.md b/goldens/public-api/core/index.md index 82a8a330f614c2..0d7cea177c7689 100644 --- a/goldens/public-api/core/index.md +++ b/goldens/public-api/core/index.md @@ -128,6 +128,9 @@ export function asNativeElements(debugEls: DebugElement[]): any; // @public export function assertInInjectionContext(debugFn: Function): void; +// @public +export function assertNotInReactiveContext(debugFn: Function, extraContext?: string): void; + // @public export function assertPlatform(requiredToken: any): PlatformRef; diff --git a/packages/core/src/core_reactivity_export_internal.ts b/packages/core/src/core_reactivity_export_internal.ts index 3babac351f6fb3..0f6c1f6f4f9d9e 100644 --- a/packages/core/src/core_reactivity_export_internal.ts +++ b/packages/core/src/core_reactivity_export_internal.ts @@ -27,4 +27,7 @@ export { ZoneAwareQueueingScheduler as ɵZoneAwareQueueingScheduler, FlushableEffectRunner as ɵFlushableEffectRunner, } from './render3/reactivity/effect'; +export { + assertNotInReactiveContext, +} from './render3/reactivity/asserts'; // clang-format on diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index fa1dc032b72526..1098594fcca1bc 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -83,6 +83,7 @@ export const enum RuntimeErrorCode { // Signal Errors SIGNAL_WRITE_FROM_ILLEGAL_CONTEXT = 600, REQUIRE_SYNC_WITHOUT_SYNC_EMIT = 601, + ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT = 602, // Styling Errors diff --git a/packages/core/src/render3/reactivity/asserts.ts b/packages/core/src/render3/reactivity/asserts.ts new file mode 100644 index 00000000000000..ec8e6a0498b047 --- /dev/null +++ b/packages/core/src/render3/reactivity/asserts.ts @@ -0,0 +1,30 @@ +/** + * @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 + */ + +import {RuntimeError, RuntimeErrorCode} from '../../errors'; +import {getActiveConsumer} from '../../signals'; + +/** + * Asserts that the current stack frame is not within a reactive context. Useful + * to disallow certain code from running inside a reactive context (see {@link toSignal}). + * + * @param debugFn a reference to the function making the assertion (used for the error message). + * + * @publicApi + */ +export function assertNotInReactiveContext(debugFn: Function, extraContext?: string): void { + // Taking a `Function` instead of a string name here prevents the unminified name of the function + // from being retained in the bundle regardless of minification. + if (getActiveConsumer() !== null) { + throw new RuntimeError( + RuntimeErrorCode.ASSERTION_NOT_INSIDE_REACTIVE_CONTEXT, + ngDevMode && + `${debugFn.name}() cannot be called from within a reactive context.${ + extraContext ? ` ${extraContext}` : ''}`); + } +} diff --git a/packages/core/src/signals/index.ts b/packages/core/src/signals/index.ts index 9beebf16ebf3d1..96af013d57f525 100644 --- a/packages/core/src/signals/index.ts +++ b/packages/core/src/signals/index.ts @@ -9,7 +9,7 @@ export {defaultEquals, isSignal, Signal, SIGNAL, ValueEqualityFn} from './src/api'; export {computed, CreateComputedOptions} from './src/computed'; export {setThrowInvalidWriteToSignalError} from './src/errors'; -export {consumerAfterComputation, consumerBeforeComputation, consumerDestroy, isInNotificationPhase, producerAccessed, producerNotifyConsumers, producerUpdatesAllowed, producerUpdateValueVersion, REACTIVE_NODE, ReactiveNode, setActiveConsumer} from './src/graph'; +export {consumerAfterComputation, consumerBeforeComputation, consumerDestroy, getActiveConsumer, isInNotificationPhase, producerAccessed, producerNotifyConsumers, producerUpdatesAllowed, producerUpdateValueVersion, REACTIVE_NODE, ReactiveNode, setActiveConsumer} from './src/graph'; export {CreateSignalOptions, setPostSignalSetFn, signal, WritableSignal} from './src/signal'; export {untracked} from './src/untracked'; export {Watch, watch, WatchCleanupFn, WatchCleanupRegisterFn} from './src/watch'; diff --git a/packages/core/src/signals/src/graph.ts b/packages/core/src/signals/src/graph.ts index 9e0c4191988b57..e580c8032fac36 100644 --- a/packages/core/src/signals/src/graph.ts +++ b/packages/core/src/signals/src/graph.ts @@ -26,6 +26,10 @@ export function setActiveConsumer(consumer: ReactiveNode|null): ReactiveNode|nul return prev; } +export function getActiveConsumer(): ReactiveNode|null { + return activeConsumer; +} + export function isInNotificationPhase(): boolean { return inNotificationPhase; } From ced66d4007784de1ed38d7fcd82fd1c6db9b8436 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 29 Sep 2023 12:53:56 +0000 Subject: [PATCH 44/57] revert: fix(core): allow `toSignal` in reactive contexts (#52049) Revert (with improvements of): dcf18dc74c260253bbf394626beb712a831824f3 We recently landed a change that allows `toSignal` to be called from within reactive contexts (e.g. `effect`/`computed`). After more thorough investigatio and consideration with the team, we feel like allowing `toSignal` to be called in such contexts is encouraging non-ideal / hard-to-notice code patterns. e.g. a new subscription to an observable is made every time `toSignal` is invoked. There is no caching done here. Additionally, multiple new subscriptions can trigger unintended side-effects- that may slow down the app, result in incorrect/unexpected behavior or perform unnecessary work. Users should instead move the `toSignal` call outside of the `computed` or `effect` and then read the signal values from within their `computed`. e.g. ```ts computed(() => { const smth = toSignal(coldObservable$) return smth() + 2; } ``` --> should instead be: ```ts const smth = toSignal(coldObsverable$); computed(() => smth() + 2); ``` In cases where a new subscription for each invocation is actually intended, a manual subscription can be made. That way it's also much more obvious to users that they are triggering side-effects every time, or causing new subscriptions. PR Close #52049 --- packages/core/rxjs-interop/src/to_signal.ts | 44 ++++++++++++------- .../core/rxjs-interop/test/to_signal_spec.ts | 39 +++++++++++++--- 2 files changed, 59 insertions(+), 24 deletions(-) diff --git a/packages/core/rxjs-interop/src/to_signal.ts b/packages/core/rxjs-interop/src/to_signal.ts index 5135b635cda192..f203bb43e7a505 100644 --- a/packages/core/rxjs-interop/src/to_signal.ts +++ b/packages/core/rxjs-interop/src/to_signal.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {assertInInjectionContext, computed, DestroyRef, inject, Injector, signal, Signal, untracked, WritableSignal, ɵRuntimeError, ɵRuntimeErrorCode} from '@angular/core'; +import {assertInInjectionContext, assertNotInReactiveContext, computed, DestroyRef, inject, Injector, signal, Signal, WritableSignal, ɵRuntimeError, ɵRuntimeErrorCode} from '@angular/core'; import {Observable, Subscribable} from 'rxjs'; /** @@ -159,6 +159,12 @@ export function toSignal( options: ToSignalOptions&{requireSync: true}): Signal; export function toSignal( source: Observable|Subscribable, options?: ToSignalOptions): Signal { + ngDevMode && + assertNotInReactiveContext( + toSignal, + 'Invoking `toSignal` causes new subscriptions every time. ' + + 'Consider moving `toSignal` outside of the reactive context and read the signal value where needed.'); + const requiresCleanup = !options?.manualCleanup; requiresCleanup && !options?.injector && assertInInjectionContext(toSignal); const cleanupRef = @@ -175,24 +181,28 @@ export function toSignal( state = signal>({kind: StateKind.Value, value: options?.initialValue as U}); } - untracked(() => { - const sub = source.subscribe({ - next: value => state.set({kind: StateKind.Value, value}), - error: error => state.set({kind: StateKind.Error, error}), - // Completion of the Observable is meaningless to the signal. Signals don't have a concept of - // "complete". - }); - - if (ngDevMode && options?.requireSync && state().kind === StateKind.NoValue) { - throw new ɵRuntimeError( - ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT, - '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.'); - } - - // Unsubscribe when the current context is destroyed, if requested. - cleanupRef?.onDestroy(sub.unsubscribe.bind(sub)); + // Note: This code cannot run inside a reactive context (see assertion above). If we'd support + // this, we would subscribe to the observable outside of the current reactive context, avoiding + // that side-effect signal reads/writes are attribute to the current consumer. The current + // consumer only needs to be notified when the `state` signal changes through the observable + // subscription. Additional context (related to async pipe): + // https://github.com/angular/angular/pull/50522. + const sub = source.subscribe({ + next: value => state.set({kind: StateKind.Value, value}), + error: error => state.set({kind: StateKind.Error, error}), + // Completion of the Observable is meaningless to the signal. Signals don't have a concept of + // "complete". }); + if (ngDevMode && options?.requireSync && state().kind === StateKind.NoValue) { + throw new ɵRuntimeError( + ɵRuntimeErrorCode.REQUIRE_SYNC_WITHOUT_SYNC_EMIT, + '`toSignal()` called with `requireSync` but `Observable` did not emit synchronously.'); + } + + // Unsubscribe when the current context is destroyed, if requested. + cleanupRef?.onDestroy(sub.unsubscribe.bind(sub)); + // The actual returned signal is a `computed` of the `State` signal, which maps the various states // to either values or errors. return computed(() => { diff --git a/packages/core/rxjs-interop/test/to_signal_spec.ts b/packages/core/rxjs-interop/test/to_signal_spec.ts index 41f14594aed3c8..bde37d8cc593cc 100644 --- a/packages/core/rxjs-interop/test/to_signal_spec.ts +++ b/packages/core/rxjs-interop/test/to_signal_spec.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {computed, EnvironmentInjector, Injector, runInInjectionContext} from '@angular/core'; +import {ChangeDetectionStrategy, Component, computed, EnvironmentInjector, Injector, runInInjectionContext} from '@angular/core'; import {toSignal} from '@angular/core/rxjs-interop'; +import {TestBed} from '@angular/core/testing'; import {BehaviorSubject, ReplaySubject, Subject} from 'rxjs'; describe('toSignal()', () => { @@ -109,17 +110,16 @@ describe('toSignal()', () => { expect(counter()).toBe(1); }); - it('should allow toSignal creation in a reactive context - issue 51027', () => { + it('should not allow toSignal creation in a reactive context', () => { const counter$ = new BehaviorSubject(1); - - const injector = Injector.create([]); - const doubleCounter = computed(() => { - const counter = toSignal(counter$, {requireSync: true, injector}); + const counter = toSignal(counter$, {requireSync: true}); return counter() * 2; }); - expect(doubleCounter()).toBe(2); + expect(() => doubleCounter()) + .toThrowError( + /toSignal\(\) cannot be called from within a reactive context. Invoking `toSignal` causes new subscriptions every time./); }); describe('with no initial value', () => { @@ -173,6 +173,31 @@ describe('toSignal()', () => { expect(counter()).not.toBeNull(); })); }); + + describe('in a @Component', () => { + it('should support `toSignal` as a class member initializer', () => { + @Component({ + template: '{{counter()}}', + changeDetection: ChangeDetectionStrategy.OnPush, + }) + class TestCmp { + // Component creation should not run inside the template effect/consumer, + // hence using `toSignal` should be allowed/supported. + counter$ = new Subject(); + counter = toSignal(this.counter$); + } + + const fixture = TestBed.createComponent(TestCmp); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe(''); + + fixture.componentInstance.counter$.next(2); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('2'); + }); + }); }); function test(fn: () => void|Promise): () => Promise { From a687ef9d27ca519cc323b4abbb0f9d04601b34bc Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 5 Oct 2023 12:27:30 +0200 Subject: [PATCH 45/57] refactor(compiler): handle incomplete blocks in the lexer (#52047) Updates the lexer to parse blocks as incomplete, instead of throwing errors. This will allow us to better handle them further down in the pipeline. PR Close #52047 --- packages/compiler/src/ml_parser/lexer.ts | 25 +++++-- packages/compiler/src/ml_parser/tokens.ts | 20 +++-- .../compiler/test/ml_parser/lexer_spec.ts | 73 ++++++++++++++----- 3 files changed, 83 insertions(+), 35 deletions(-) diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index aceffc275e3b8d..8ab09b013ce37b 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -244,7 +244,8 @@ class _Tokenizer { private _consumeBlockStart(start: CharacterCursor) { this._beginToken(TokenType.BLOCK_OPEN_START, start); - this._endToken([this._getBlockName()]); + const startToken = this._endToken([this._getBlockName()]); + if (this._cursor.peek() === chars.$LPAREN) { // Advance past the opening paren. this._cursor.advance(); @@ -252,14 +253,22 @@ class _Tokenizer { this._consumeBlockParameters(); // Allow spaces before the closing paren. this._attemptCharCodeUntilFn(isNotWhitespace); - // Skip over the closing paren. - this._requireCharCode(chars.$RPAREN); - // Allow spaces after the paren. - this._attemptCharCodeUntilFn(isNotWhitespace); + + if (this._attemptCharCode(chars.$RPAREN)) { + // Allow spaces after the paren. + this._attemptCharCodeUntilFn(isNotWhitespace); + } else { + startToken.type = TokenType.INCOMPLETE_BLOCK_OPEN; + return; + } + } + + if (this._attemptCharCode(chars.$LBRACE)) { + this._beginToken(TokenType.BLOCK_OPEN_END); + this._endToken([]); + } else { + startToken.type = TokenType.INCOMPLETE_BLOCK_OPEN; } - this._beginToken(TokenType.BLOCK_OPEN_END); - this._requireCharCode(chars.$LBRACE); - this._endToken([]); } private _consumeBlockEnd(start: CharacterCursor) { diff --git a/packages/compiler/src/ml_parser/tokens.ts b/packages/compiler/src/ml_parser/tokens.ts index 1ed1a363ca8f7c..f71b5ac3ac0b49 100644 --- a/packages/compiler/src/ml_parser/tokens.ts +++ b/packages/compiler/src/ml_parser/tokens.ts @@ -37,16 +37,17 @@ export const enum TokenType { BLOCK_OPEN_END, BLOCK_CLOSE, BLOCK_PARAMETER, + INCOMPLETE_BLOCK_OPEN, EOF, } -export type Token = - TagOpenStartToken|TagOpenEndToken|TagOpenEndVoidToken|TagCloseToken|IncompleteTagOpenToken| - TextToken|InterpolationToken|EncodedEntityToken|CommentStartToken|CommentEndToken| - CdataStartToken|CdataEndToken|AttributeNameToken|AttributeQuoteToken|AttributeValueTextToken| - AttributeValueInterpolationToken|DocTypeToken|ExpansionFormStartToken|ExpansionCaseValueToken| - ExpansionCaseExpressionStartToken|ExpansionCaseExpressionEndToken|ExpansionFormEndToken| - EndOfFileToken|BlockParameterToken|BlockOpenStartToken|BlockOpenEndToken|BlockCloseToken; +export type Token = TagOpenStartToken|TagOpenEndToken|TagOpenEndVoidToken|TagCloseToken| + IncompleteTagOpenToken|TextToken|InterpolationToken|EncodedEntityToken|CommentStartToken| + CommentEndToken|CdataStartToken|CdataEndToken|AttributeNameToken|AttributeQuoteToken| + AttributeValueTextToken|AttributeValueInterpolationToken|DocTypeToken|ExpansionFormStartToken| + ExpansionCaseValueToken|ExpansionCaseExpressionStartToken|ExpansionCaseExpressionEndToken| + ExpansionFormEndToken|EndOfFileToken|BlockParameterToken|BlockOpenStartToken|BlockOpenEndToken| + BlockCloseToken|IncompleteBlockOpenToken; export type InterpolatedTextToken = TextToken|InterpolationToken|EncodedEntityToken; @@ -195,3 +196,8 @@ export interface BlockCloseToken extends TokenBase { type: TokenType.BLOCK_CLOSE; parts: []; } + +export interface IncompleteBlockOpenToken extends TokenBase { + type: TokenType.INCOMPLETE_BLOCK_OPEN; + parts: [name: string]; +} diff --git a/packages/compiler/test/ml_parser/lexer_spec.ts b/packages/compiler/test/ml_parser/lexer_spec.ts index 238cf0c5fa4e31..b9bdfcd18e70a2 100644 --- a/packages/compiler/test/ml_parser/lexer_spec.ts +++ b/packages/compiler/test/ml_parser/lexer_spec.ts @@ -1955,21 +1955,20 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u ]); }); - it('should unclosed parameters', () => { - expect(tokenizeAndHumanizeErrors(`@foo (a === b {hello}`)).toEqual([ - [null, 'Unexpected character "EOF"', '0:21'] - ]); - }); - - it('should report stray parentheses in the parameter position', () => { - expect(tokenizeAndHumanizeErrors(`@foo a === b) {hello}`)).toEqual([ - [TokenType.BLOCK_OPEN_END, 'Unexpected character "="', '0:7'] + it('should parse block with unclosed parameters', () => { + expect(tokenizeAndHumanizeParts(`@foo (a === b {hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo'], + [TokenType.BLOCK_PARAMETER, 'a === b {hello}'], + [TokenType.EOF], ]); }); - it('should report missing block opening brace', () => { - expect(tokenizeAndHumanizeErrors(`@foo (a === b) hello}`)).toEqual([ - [TokenType.BLOCK_OPEN_END, 'Unexpected character "h"', '0:15'] + it('should parse block with stray parentheses in the parameter position', () => { + expect(tokenizeAndHumanizeParts(`@foo a === b) {hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo a'], + [TokenType.TEXT, '=== b) {hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], ]); }); @@ -1984,14 +1983,12 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u }); it('should report unclosed object literal inside a parameter', () => { - expect(tokenizeAndHumanizeErrors(`@foo ({invalid: true) hello}`)).toEqual([ - [TokenType.BLOCK_OPEN_END, 'Unexpected character "h"', '0:22'], - ]); - }); - - it('should block parameters without parentheses', () => { - expect(tokenizeAndHumanizeErrors(`@foo a === b {hello}`)).toEqual([ - [TokenType.BLOCK_OPEN_END, 'Unexpected character "="', '0:7'] + expect(tokenizeAndHumanizeParts(`@foo ({invalid: true) hello}`)).toEqual([ + [TokenType.INCOMPLETE_BLOCK_OPEN, 'foo'], + [TokenType.BLOCK_PARAMETER, '{invalid: true'], + [TokenType.TEXT, 'hello'], + [TokenType.BLOCK_CLOSE], + [TokenType.EOF], ]); }); @@ -2145,6 +2142,42 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [TokenType.EOF], ]); }); + + it('should parse an incomplete block start without parameters with surrounding text', () => { + expect(tokenizeAndHumanizeParts('My email frodo@baggins.com')).toEqual([ + [TokenType.TEXT, 'My email frodo'], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'baggins'], + [TokenType.TEXT, '.com'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start at the end of the input', () => { + expect(tokenizeAndHumanizeParts('My username is @frodo')).toEqual([ + [TokenType.TEXT, 'My username is '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'frodo'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start with parentheses but without params', () => { + expect(tokenizeAndHumanizeParts('Use the @Input() decorator')).toEqual([ + [TokenType.TEXT, 'Use the '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'Input'], + [TokenType.TEXT, 'decorator'], + [TokenType.EOF], + ]); + }); + + it('should parse an incomplete block start with parentheses and params', () => { + expect(tokenizeAndHumanizeParts('Use @Input({alias: "foo"}) to alias the input')).toEqual([ + [TokenType.TEXT, 'Use '], + [TokenType.INCOMPLETE_BLOCK_OPEN, 'Input'], + [TokenType.BLOCK_PARAMETER, '{alias: "foo"}'], + [TokenType.TEXT, 'to alias the input'], + [TokenType.EOF], + ]); + }); }); }); } From a90d85ad40080636909f9c6ad98b7dc7a37207fc Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 5 Oct 2023 13:28:35 +0200 Subject: [PATCH 46/57] refactor(compiler): recover from incomplete blocks (#52047) Adds some logic to treat incomplete blocks as empty blocks so that we can recover from them. Also logs an error about the incomplete block. PR Close #52047 --- packages/compiler/src/ml_parser/parser.ts | 43 ++++++++++++---- .../test/ml_parser/html_parser_spec.ts | 49 +++++++++++++++++-- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/packages/compiler/src/ml_parser/parser.ts b/packages/compiler/src/ml_parser/parser.ts index c48dacb8d32b71..45aaca43e8f4a0 100644 --- a/packages/compiler/src/ml_parser/parser.ts +++ b/packages/compiler/src/ml_parser/parser.ts @@ -12,7 +12,7 @@ import * as html from './ast'; import {NAMED_ENTITIES} from './entities'; import {tokenize, TokenizeOptions} from './lexer'; import {getNsPrefix, mergeNsAndName, splitNsName, TagDefinition} from './tags'; -import {AttributeNameToken, AttributeQuoteToken, BlockCloseToken, BlockOpenStartToken, BlockParameterToken, CdataStartToken, CommentStartToken, ExpansionCaseExpressionEndToken, ExpansionCaseExpressionStartToken, ExpansionCaseValueToken, ExpansionFormStartToken, IncompleteTagOpenToken, InterpolatedAttributeToken, InterpolatedTextToken, TagCloseToken, TagOpenStartToken, TextToken, Token, TokenType} from './tokens'; +import {AttributeNameToken, AttributeQuoteToken, BlockCloseToken, BlockOpenStartToken, BlockParameterToken, CdataStartToken, CommentStartToken, ExpansionCaseExpressionEndToken, ExpansionCaseExpressionStartToken, ExpansionCaseValueToken, ExpansionFormStartToken, IncompleteBlockOpenToken, IncompleteTagOpenToken, InterpolatedAttributeToken, InterpolatedTextToken, TagCloseToken, TagOpenStartToken, TextToken, Token, TokenType} from './tokens'; /** Nodes that can contain other nodes. */ type NodeContainer = html.Element|html.Block; @@ -90,6 +90,9 @@ class _TreeBuilder { } else if (this._peek.type === TokenType.BLOCK_CLOSE) { this._closeVoidElement(); this._consumeBlockClose(this._advance()); + } else if (this._peek.type === TokenType.INCOMPLETE_BLOCK_OPEN) { + this._closeVoidElement(); + this._consumeIncompleteBlock(this._advance()); } else { // Skip all other tokens... this._advance(); @@ -473,22 +476,42 @@ class _TreeBuilder { const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); const block = new html.Block(token.parts[0], parameters, [], span, startSpan); this._pushContainer(block, false); - return block; } private _consumeBlockClose(token: BlockCloseToken) { - const previousContainer = this._getContainer(); - if (!this._popContainer(null, html.Block, token.sourceSpan)) { - const context = previousContainer instanceof html.Element ? - `There is an unclosed "${ - previousContainer.name}" HTML tag that may have to be closed first.` : - `The block may have been closed earlier.`; - this.errors.push( - TreeError.create(null, token.sourceSpan, `Unexpected closing block. ${context}`)); + this.errors.push(TreeError.create( + null, token.sourceSpan, + `Unexpected closing block. The block may have been closed earlier. ` + + `If you meant to write the } character, you should use the "}" ` + + `HTML entity instead.`)); } } + private _consumeIncompleteBlock(token: IncompleteBlockOpenToken) { + const parameters: html.BlockParameter[] = []; + + while (this._peek.type === TokenType.BLOCK_PARAMETER) { + const paramToken = this._advance(); + parameters.push(new html.BlockParameter(paramToken.parts[0], paramToken.sourceSpan)); + } + + const end = this._peek.sourceSpan.fullStart; + const span = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); + // Create a separate `startSpan` because `span` will be modified when there is an `end` span. + const startSpan = new ParseSourceSpan(token.sourceSpan.start, end, token.sourceSpan.fullStart); + const block = new html.Block(token.parts[0], parameters, [], span, startSpan); + this._pushContainer(block, false); + + // Incomplete blocks don't have children so we close them immediately and report an error. + this._popContainer(null, html.Block, null); + + this.errors.push(TreeError.create( + token.parts[0], span, + `Incomplete block "${token.parts[0]}". If you meant to write the @ character, ` + + `you should use the "@" HTML entity instead.`)); + } + private _getContainer(): NodeContainer|null { return this._containerStack.length > 0 ? this._containerStack[this._containerStack.length - 1] : null; diff --git a/packages/compiler/test/ml_parser/html_parser_spec.ts b/packages/compiler/test/ml_parser/html_parser_spec.ts index 6e0764f8602178..c048aba5bceddc 100644 --- a/packages/compiler/test/ml_parser/html_parser_spec.ts +++ b/packages/compiler/test/ml_parser/html_parser_spec.ts @@ -886,9 +886,11 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} it('should report an unexpected block close', () => { const errors = parser.parse('hello}', 'TestComp').errors; expect(errors.length).toEqual(1); - expect(humanizeErrors(errors)).toEqual([ - [null, 'Unexpected closing block. The block may have been closed earlier.', '0:5'] - ]); + expect(humanizeErrors(errors)).toEqual([[ + null, + 'Unexpected closing block. The block may have been closed earlier. If you meant to write the } character, you should use the "}" HTML entity instead.', + '0:5' + ]]); }); it('should report unclosed tags inside of a block', () => { @@ -896,7 +898,7 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} expect(errors.length).toEqual(1); expect(humanizeErrors(errors)).toEqual([[ null, - 'Unexpected closing block. There is an unclosed "strong" HTML tag that may have to be closed first.', + 'Unexpected closing block. The block may have been closed earlier. If you meant to write the } character, you should use the "}" HTML entity instead.', '0:19' ]]); }); @@ -910,7 +912,11 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} 'Unexpected closing tag "div". It may happen when the tag has already been closed by another tag. For more info see https://www.w3.org/TR/html5/syntax.html#closing-elements-that-have-implied-end-tags', '0:22' ], - [null, 'Unexpected closing block. The block may have been closed earlier.', '0:28'], + [ + null, + 'Unexpected closing block. The block may have been closed earlier. If you meant to write the } character, you should use the "}" HTML entity instead.', + '0:28' + ], ]); }); @@ -946,6 +952,39 @@ import {humanizeDom, humanizeDomSourceSpans, humanizeLineColumn, humanizeNodes} [html.Text, 'r', 3, ['r'], 'r'], ]); }); + + it('should parse an incomplete block with no parameters', () => { + const result = parser.parse('Use the @Input() decorator', 'TestComp'); + + expect(humanizeNodes(result.rootNodes, true)).toEqual([ + [html.Text, 'Use the ', 0, ['Use the '], 'Use the '], + [html.Block, 'Input', 0, '@Input() ', '@Input() ', null], + [html.Text, 'decorator', 0, ['decorator'], 'decorator'], + ]); + + expect(humanizeErrors(result.errors)).toEqual([[ + 'Input', + 'Incomplete block "Input". If you meant to write the @ character, you should use the "@" HTML entity instead.', + '0:8' + ]]); + }); + + it('should parse an incomplete block with no parameters', () => { + const result = parser.parse('Use @Input({alias: "foo"}) to alias your input', 'TestComp'); + + expect(humanizeNodes(result.rootNodes, true)).toEqual([ + [html.Text, 'Use ', 0, ['Use '], 'Use '], + [html.Block, 'Input', 0, '@Input({alias: "foo"}) ', '@Input({alias: "foo"}) ', null], + [html.BlockParameter, '{alias: "foo"}', '{alias: "foo"}'], + [html.Text, 'to alias your input', 0, ['to alias your input'], 'to alias your input'], + ]); + + expect(humanizeErrors(result.errors)).toEqual([[ + 'Input', + 'Incomplete block "Input". If you meant to write the @ character, you should use the "@" HTML entity instead.', + '0:4' + ]]); + }); }); describe('source spans', () => { From 40c53577b83a6e1676060c5c2bbe128ff127325f Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 5 Oct 2023 13:57:47 +0200 Subject: [PATCH 47/57] refactor(compiler): introduce unknown block node (#52047) Adds an `UnknownBlock` node to the Ivy AST to represent blocks that haven't been recognized by the compiler. This will make it easier to integrate blocks into the language service. PR Close #52047 --- .../src/ngtsc/typecheck/extended/api/api.ts | 3 ++- packages/compiler/src/compiler.ts | 2 +- packages/compiler/src/render3/r3_ast.ts | 10 ++++++++++ .../src/render3/r3_template_transform.ts | 5 ++++- .../compiler/src/render3/view/t2_binder.ts | 5 ++++- packages/compiler/src/render3/view/template.ts | 1 + .../compiler/test/render3/r3_ast_spans_spec.ts | 4 ++++ .../test/render3/r3_template_transform_spec.ts | 18 +++++++++++++++--- .../compiler/test/render3/util/expression.ts | 1 + .../schematics/utils/template_ast_visitor.ts | 3 ++- .../language-service/src/template_target.ts | 2 ++ 11 files changed, 46 insertions(+), 8 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts b/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts index 6776e5564e5305..3962b899494340 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/extended/api/api.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {AST, ASTWithSource, ParseSourceSpan, RecursiveAstVisitor, TmplAstBoundAttribute, TmplAstBoundDeferredTrigger, TmplAstBoundEvent, TmplAstBoundText, TmplAstContent, TmplAstDeferredBlock, TmplAstDeferredBlockError, TmplAstDeferredBlockLoading, TmplAstDeferredBlockPlaceholder, TmplAstDeferredTrigger, TmplAstElement, TmplAstForLoopBlock, TmplAstForLoopBlockEmpty, TmplAstIcu, TmplAstIfBlock, TmplAstIfBlockBranch, TmplAstNode, TmplAstRecursiveVisitor, TmplAstReference, TmplAstSwitchBlock, TmplAstSwitchBlockCase, TmplAstTemplate, TmplAstText, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler'; +import {AST, ASTWithSource, ParseSourceSpan, RecursiveAstVisitor, TmplAstBoundAttribute, TmplAstBoundDeferredTrigger, TmplAstBoundEvent, TmplAstBoundText, TmplAstContent, TmplAstDeferredBlock, TmplAstDeferredBlockError, TmplAstDeferredBlockLoading, TmplAstDeferredBlockPlaceholder, TmplAstDeferredTrigger, TmplAstElement, TmplAstForLoopBlock, TmplAstForLoopBlockEmpty, TmplAstIcu, TmplAstIfBlock, TmplAstIfBlockBranch, TmplAstNode, TmplAstRecursiveVisitor, TmplAstReference, TmplAstSwitchBlock, TmplAstSwitchBlockCase, TmplAstTemplate, TmplAstText, TmplAstTextAttribute, TmplAstUnknownBlock, TmplAstVariable} from '@angular/compiler'; import ts from 'typescript'; import {NgCompilerOptions} from '../../../core/api'; @@ -147,6 +147,7 @@ class TemplateVisitor extends RecursiveAstVisitor implem visitVariable(variable: TmplAstVariable): void {} visitReference(reference: TmplAstReference): void {} visitTextAttribute(attribute: TmplAstTextAttribute): void {} + visitUnknownBlock(block: TmplAstUnknownBlock): void {} visitBoundAttribute(attribute: TmplAstBoundAttribute): void { this.visitAst(attribute.value); } diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index aeba06b744ba87..ec8c58017919e6 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -64,7 +64,7 @@ export {SourceMap} from './output/source_map'; export * from './injectable_compiler_2'; export * from './render3/partial/api'; export * from './render3/view/api'; -export {BoundAttribute as TmplAstBoundAttribute, BoundEvent as TmplAstBoundEvent, BoundText as TmplAstBoundText, Content as TmplAstContent, Element as TmplAstElement, Icu as TmplAstIcu, Node as TmplAstNode, RecursiveVisitor as TmplAstRecursiveVisitor, Reference as TmplAstReference, Template as TmplAstTemplate, Text as TmplAstText, TextAttribute as TmplAstTextAttribute, Variable as TmplAstVariable, DeferredBlock as TmplAstDeferredBlock, DeferredBlockPlaceholder as TmplAstDeferredBlockPlaceholder, DeferredBlockLoading as TmplAstDeferredBlockLoading, DeferredBlockError as TmplAstDeferredBlockError, DeferredTrigger as TmplAstDeferredTrigger, BoundDeferredTrigger as TmplAstBoundDeferredTrigger, IdleDeferredTrigger as TmplAstIdleDeferredTrigger, ImmediateDeferredTrigger as TmplAstImmediateDeferredTrigger, HoverDeferredTrigger as TmplAstHoverDeferredTrigger, TimerDeferredTrigger as TmplAstTimerDeferredTrigger, InteractionDeferredTrigger as TmplAstInteractionDeferredTrigger, ViewportDeferredTrigger as TmplAstViewportDeferredTrigger, SwitchBlock as TmplAstSwitchBlock, SwitchBlockCase as TmplAstSwitchBlockCase, ForLoopBlock as TmplAstForLoopBlock, ForLoopBlockEmpty as TmplAstForLoopBlockEmpty, IfBlock as TmplAstIfBlock, IfBlockBranch as TmplAstIfBlockBranch, DeferredBlockTriggers as TmplAstDeferredBlockTriggers} from './render3/r3_ast'; +export {BoundAttribute as TmplAstBoundAttribute, BoundEvent as TmplAstBoundEvent, BoundText as TmplAstBoundText, Content as TmplAstContent, Element as TmplAstElement, Icu as TmplAstIcu, Node as TmplAstNode, RecursiveVisitor as TmplAstRecursiveVisitor, Reference as TmplAstReference, Template as TmplAstTemplate, Text as TmplAstText, TextAttribute as TmplAstTextAttribute, Variable as TmplAstVariable, DeferredBlock as TmplAstDeferredBlock, DeferredBlockPlaceholder as TmplAstDeferredBlockPlaceholder, DeferredBlockLoading as TmplAstDeferredBlockLoading, DeferredBlockError as TmplAstDeferredBlockError, DeferredTrigger as TmplAstDeferredTrigger, BoundDeferredTrigger as TmplAstBoundDeferredTrigger, IdleDeferredTrigger as TmplAstIdleDeferredTrigger, ImmediateDeferredTrigger as TmplAstImmediateDeferredTrigger, HoverDeferredTrigger as TmplAstHoverDeferredTrigger, TimerDeferredTrigger as TmplAstTimerDeferredTrigger, InteractionDeferredTrigger as TmplAstInteractionDeferredTrigger, ViewportDeferredTrigger as TmplAstViewportDeferredTrigger, SwitchBlock as TmplAstSwitchBlock, SwitchBlockCase as TmplAstSwitchBlockCase, ForLoopBlock as TmplAstForLoopBlock, ForLoopBlockEmpty as TmplAstForLoopBlockEmpty, IfBlock as TmplAstIfBlock, IfBlockBranch as TmplAstIfBlockBranch, DeferredBlockTriggers as TmplAstDeferredBlockTriggers, UnknownBlock as TmplAstUnknownBlock} from './render3/r3_ast'; export * from './render3/view/t2_api'; export * from './render3/view/t2_binder'; export {Identifiers as R3Identifiers} from './render3/r3_identifiers'; diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index fae9a91e476fae..40d6aefdf5abb2 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -309,6 +309,14 @@ export class IfBlockBranch implements Node { } } +export class UnknownBlock implements Node { + constructor(public name: string, public sourceSpan: ParseSourceSpan) {} + + visit(visitor: Visitor): Result { + return visitor.visitUnknownBlock(this); + } +} + export class Template implements Node { constructor( // tagName is the name of the container element, if applicable. @@ -399,6 +407,7 @@ export interface Visitor { visitForLoopBlockEmpty(block: ForLoopBlockEmpty): Result; visitIfBlock(block: IfBlock): Result; visitIfBlockBranch(block: IfBlockBranch): Result; + visitUnknownBlock(block: UnknownBlock): Result; } export class RecursiveVisitor implements Visitor { @@ -461,6 +470,7 @@ export class RecursiveVisitor implements Visitor { visitBoundText(text: BoundText): void {} visitIcu(icu: Icu): void {} visitDeferredTrigger(trigger: DeferredTrigger): void {} + visitUnknownBlock(block: UnknownBlock): void {} } diff --git a/packages/compiler/src/render3/r3_template_transform.ts b/packages/compiler/src/render3/r3_template_transform.ts index 1c37c0dfb1eef8..5706b60a30ed57 100644 --- a/packages/compiler/src/render3/r3_template_transform.ts +++ b/packages/compiler/src/render3/r3_template_transform.ts @@ -382,7 +382,10 @@ class HtmlAstToIvyAst implements html.Visitor { errorMessage = `Unrecognized block @${block.name}.`; } - result = {node: null, errors: [new ParseError(block.sourceSpan, errorMessage)]}; + result = { + node: new t.UnknownBlock(block.name, block.sourceSpan), + errors: [new ParseError(block.sourceSpan, errorMessage)], + }; break; } diff --git a/packages/compiler/src/render3/view/t2_binder.ts b/packages/compiler/src/render3/view/t2_binder.ts index 7989a984edcbab..3f4cb764209f21 100644 --- a/packages/compiler/src/render3/view/t2_binder.ts +++ b/packages/compiler/src/render3/view/t2_binder.ts @@ -8,7 +8,7 @@ import {AST, BindingPipe, ImplicitReceiver, PropertyRead, PropertyWrite, RecursiveAstVisitor, SafePropertyRead} from '../../expression_parser/ast'; import {SelectorMatcher} from '../../selector'; -import {BoundAttribute, BoundDeferredTrigger, BoundEvent, BoundText, Content, DeferredBlock, DeferredBlockError, DeferredBlockLoading, DeferredBlockPlaceholder, DeferredTrigger, Element, ForLoopBlock, ForLoopBlockEmpty, HoverDeferredTrigger, Icu, IfBlock, IfBlockBranch, InteractionDeferredTrigger, Node, Reference, SwitchBlock, SwitchBlockCase, Template, Text, TextAttribute, Variable, ViewportDeferredTrigger, Visitor} from '../r3_ast'; +import {BoundAttribute, BoundDeferredTrigger, BoundEvent, BoundText, Content, DeferredBlock, DeferredBlockError, DeferredBlockLoading, DeferredBlockPlaceholder, DeferredTrigger, Element, ForLoopBlock, ForLoopBlockEmpty, HoverDeferredTrigger, Icu, IfBlock, IfBlockBranch, InteractionDeferredTrigger, Node, Reference, SwitchBlock, SwitchBlockCase, Template, Text, TextAttribute, UnknownBlock, Variable, ViewportDeferredTrigger, Visitor} from '../r3_ast'; import {BoundTarget, DirectiveMeta, ReferenceTarget, ScopedNode, Target, TargetBinder} from './t2_api'; import {createCssSelector} from './template'; @@ -207,6 +207,7 @@ class Scope implements Visitor { visitTextAttribute(attr: TextAttribute) {} visitIcu(icu: Icu) {} visitDeferredTrigger(trigger: DeferredTrigger) {} + visitUnknownBlock(block: UnknownBlock) {} private maybeDeclare(thing: Reference|Variable) { // Declare something with a name, as long as that name isn't taken. @@ -447,6 +448,7 @@ class DirectiveBinder implements Visitor { visitBoundText(text: BoundText): void {} visitIcu(icu: Icu): void {} visitDeferredTrigger(trigger: DeferredTrigger): void {} + visitUnknownBlock(block: UnknownBlock) {} } /** @@ -590,6 +592,7 @@ class TemplateBinder extends RecursiveAstVisitor implements Visitor { visitText(text: Text) {} visitContent(content: Content) {} visitTextAttribute(attribute: TextAttribute) {} + visitUnknownBlock(block: UnknownBlock) {} visitIcu(icu: Icu): void { Object.keys(icu.vars).forEach(key => icu.vars[key].visit(this)); Object.keys(icu.placeholders).forEach(key => icu.placeholders[key].visit(this)); diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 4e275542038d6b..b6233f1f2f817b 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -1054,6 +1054,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver readonly visitIfBlockBranch = invalid; readonly visitSwitchBlockCase = invalid; readonly visitForLoopBlockEmpty = invalid; + readonly visitUnknownBlock = invalid; visitBoundText(text: t.BoundText) { if (this.i18n) { diff --git a/packages/compiler/test/render3/r3_ast_spans_spec.ts b/packages/compiler/test/render3/r3_ast_spans_spec.ts index 988114844ea23d..1c83b653e5caf0 100644 --- a/packages/compiler/test/render3/r3_ast_spans_spec.ts +++ b/packages/compiler/test/render3/r3_ast_spans_spec.ts @@ -204,6 +204,10 @@ class R3AstSourceSpans implements t.Visitor { this.visitAll([block.children]); } + visitUnknownBlock(block: t.UnknownBlock): void { + this.result.push(['UnknownBlock', humanizeSpan(block.sourceSpan)]); + } + private visitAll(nodes: t.Node[][]) { nodes.forEach(node => t.visitAll(this, node)); } diff --git a/packages/compiler/test/render3/r3_template_transform_spec.ts b/packages/compiler/test/render3/r3_template_transform_spec.ts index f95eb4ba39dc96..af64263ec9e02f 100644 --- a/packages/compiler/test/render3/r3_template_transform_spec.ts +++ b/packages/compiler/test/render3/r3_template_transform_spec.ts @@ -170,6 +170,10 @@ class R3AstHumanizer implements t.Visitor { this.visitAll([block.children]); } + visitUnknownBlock(block: t.UnknownBlock): void { + this.result.push(['UnknownBlock', block.name]); + } + private visitAll(nodes: t.Node[][]) { nodes.forEach(node => t.visitAll(this, node)); } @@ -1100,7 +1104,7 @@ describe('R3 template transform', () => { it('should report unclosed parenthesis in `on` trigger', () => { expect(() => parse('@defer (on viewport(button) {hello}')) - .toThrowError(/Unexpected character "EOF"/); + .toThrowError(/Incomplete block "defer"/); }); it('should report incorrect closing parenthesis in `on` trigger', () => { @@ -1109,7 +1113,7 @@ describe('R3 template transform', () => { }); it('should report stray closing parenthesis in `on` trigger', () => { - expect(() => parse('@defer (on idle)) {hello}')).toThrowError(/Unexpected character "\)"/); + expect(() => parse('@defer (on idle)) {hello}')).toThrowError(/Unexpected character "EOF"/); }); it('should report non-identifier token usage in `on` trigger', () => { @@ -1565,7 +1569,7 @@ describe('R3 template transform', () => { expect(() => parse(`@for ((a of b(); track c) {hello}`)) .toThrowError(/Unexpected end of expression: b\(/); expect(() => parse(`@for (a of b); track c) {hello}`)) - .toThrowError(/Unexpected character ";"/); + .toThrowError(/Unexpected character "EOF"/); }); it('should report unrecognized for loop parameters', () => { @@ -1849,4 +1853,12 @@ describe('R3 template transform', () => { }); }); }); + + describe('unknown blocks', () => { + it('should parse unknown blocks', () => { + expectFromHtml('@unknown {}', true /* ignoreError */).toEqual([ + ['UnknownBlock', 'unknown'], + ]); + }); + }); }); diff --git a/packages/compiler/test/render3/util/expression.ts b/packages/compiler/test/render3/util/expression.ts index 0162ee22d16289..c3209f71d0f5d2 100644 --- a/packages/compiler/test/render3/util/expression.ts +++ b/packages/compiler/test/render3/util/expression.ts @@ -138,6 +138,7 @@ class ExpressionSourceHumanizer extends e.RecursiveAstVisitor implements t.Visit } visitContent(ast: t.Content) {} visitText(ast: t.Text) {} + visitUnknownBlock(block: t.UnknownBlock) {} visitIcu(ast: t.Icu) { for (const key of Object.keys(ast.vars)) { ast.vars[key].visit(this); diff --git a/packages/core/schematics/utils/template_ast_visitor.ts b/packages/core/schematics/utils/template_ast_visitor.ts index 7f9f4e81f2e310..e9004ad3ba0429 100644 --- a/packages/core/schematics/utils/template_ast_visitor.ts +++ b/packages/core/schematics/utils/template_ast_visitor.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import type {TmplAstBoundAttribute, TmplAstBoundEvent, TmplAstBoundText, TmplAstContent, TmplAstDeferredBlock, TmplAstDeferredBlockError, TmplAstDeferredBlockLoading, TmplAstDeferredBlockPlaceholder, TmplAstDeferredTrigger, TmplAstElement, TmplAstIfBlockBranch, TmplAstForLoopBlock, TmplAstForLoopBlockEmpty, TmplAstIcu, TmplAstIfBlock, TmplAstNode, TmplAstRecursiveVisitor, TmplAstReference, TmplAstSwitchBlock, TmplAstSwitchBlockCase, TmplAstTemplate, TmplAstText, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler'; +import type {TmplAstBoundAttribute, TmplAstBoundEvent, TmplAstBoundText, TmplAstContent, TmplAstDeferredBlock, TmplAstDeferredBlockError, TmplAstDeferredBlockLoading, TmplAstDeferredBlockPlaceholder, TmplAstDeferredTrigger, TmplAstElement, TmplAstIfBlockBranch, TmplAstForLoopBlock, TmplAstForLoopBlockEmpty, TmplAstIcu, TmplAstIfBlock, TmplAstNode, TmplAstRecursiveVisitor, TmplAstReference, TmplAstSwitchBlock, TmplAstSwitchBlockCase, TmplAstTemplate, TmplAstText, TmplAstTextAttribute, TmplAstVariable, TmplAstUnknownBlock} from '@angular/compiler'; /** * A base class that can be used to implement a Render3 Template AST visitor. @@ -46,6 +46,7 @@ export class TemplateAstVisitor implements TmplAstRecursiveVisitor { visitDeferredBlockError(block: TmplAstDeferredBlockError): void {} visitDeferredBlockLoading(block: TmplAstDeferredBlockLoading): void {} visitDeferredTrigger(trigger: TmplAstDeferredTrigger): void {} + visitUnknownBlock(block: TmplAstUnknownBlock): void {} visitSwitchBlock(block: TmplAstSwitchBlock): void {} visitSwitchBlockCase(block: TmplAstSwitchBlockCase): void {} visitForLoopBlock(block: TmplAstForLoopBlock): void {} diff --git a/packages/language-service/src/template_target.ts b/packages/language-service/src/template_target.ts index b0431fea2f368b..0646017609d29e 100644 --- a/packages/language-service/src/template_target.ts +++ b/packages/language-service/src/template_target.ts @@ -528,6 +528,8 @@ class TemplateTargetVisitor implements t.Visitor { this.visitAll(block.children); } + visitUnknownBlock(block: t.UnknownBlock) {} + visitAll(nodes: t.Node[]) { for (const node of nodes) { this.visit(node); From caa8eb28d56d692e4f4317ed28fd572898aeee92 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 2 Oct 2023 14:55:44 -0700 Subject: [PATCH 48/57] refactor(core): add `after` and `minimum` parameter support to `@defer` blocks (#52009) This commit adds runtime code to support `after` and `minimum` parameters in the `@placeholder` and `@loading` blocks. The code uses the `TimerScheduler` service added earlier for `on timer` triggers. PR Close #52009 --- .../core/src/render3/instructions/defer.ts | 132 ++++++++-- packages/core/src/render3/interfaces/defer.ts | 42 +++- packages/core/test/acceptance/defer_spec.ts | 236 +++++++++++++++++- 3 files changed, 389 insertions(+), 21 deletions(-) diff --git a/packages/core/src/render3/instructions/defer.ts b/packages/core/src/render3/instructions/defer.ts index 28650966c01d23..d1f6fee833f9c3 100644 --- a/packages/core/src/render3/instructions/defer.ts +++ b/packages/core/src/render3/instructions/defer.ts @@ -17,7 +17,7 @@ import {assertIndexInDeclRange, assertLContainer, assertLView, assertTNodeForLVi import {bindingUpdated} from '../bindings'; import {getComponentDef, getDirectiveDef, getPipeDef} from '../definition'; import {CONTAINER_HEADER_OFFSET, LContainer} from '../interfaces/container'; -import {DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockConfig, DeferBlockInternalState, DeferBlockState, DeferBlockTriggers, DeferDependenciesLoadingState, DeferredLoadingBlockConfig, DeferredPlaceholderBlockConfig, DependencyResolverFn, LDeferBlockDetails, TDeferBlockDetails} from '../interfaces/defer'; +import {DEFER_BLOCK_STATE, DeferBlockBehavior, DeferBlockConfig, DeferBlockInternalState, DeferBlockState, DeferBlockTriggers, DeferDependenciesLoadingState, DeferredLoadingBlockConfig, DeferredPlaceholderBlockConfig, DependencyResolverFn, LDeferBlockDetails, LOADING_AFTER_CLEANUP_FN, LOADING_AFTER_SLOT, MINIMUM_SLOT, NEXT_DEFER_BLOCK_STATE, STATE_IS_FROZEN_UNTIL, TDeferBlockDetails} from '../interfaces/defer'; import {DependencyDef, DirectiveDefList, PipeDefList} from '../interfaces/definition'; import {TContainerNode, TNode} from '../interfaces/node'; import {isDestroyed, isLContainer, isLView} from '../interfaces/type_checks'; @@ -101,9 +101,13 @@ export function ɵɵdefer( populateDehydratedViewsInLContainer(lContainer, tNode, lView); // Init instance-specific defer details and store it. - const lDetails = []; - lDetails[DEFER_BLOCK_STATE] = DeferBlockInternalState.Initial; - setLDeferBlockDetails(lView, adjustedIndex, lDetails as LDeferBlockDetails); + const lDetails: LDeferBlockDetails = [ + null, // NEXT_DEFER_BLOCK_STATE + DeferBlockInternalState.Initial, // DEFER_BLOCK_STATE + null, // STATE_IS_FROZEN_UNTIL + null // LOADING_AFTER_CLEANUP_FN + ]; + setLDeferBlockDetails(lView, adjustedIndex, lDetails); } /** @@ -611,6 +615,26 @@ function getTemplateIndexForState( } } +/** + * Returns a minimum amount of time that a given state should be rendered for, + * taking into account `minimum` parameter value. If the `minimum` value is + * not specified - returns `null`. + */ +function getMinimumDurationForState( + tDetails: TDeferBlockDetails, currentState: DeferBlockState): number|null { + if (currentState === DeferBlockState.Placeholder) { + return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null; + } else if (currentState === DeferBlockState.Loading) { + return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null; + } + return null; +} + +/** Retrieves the value of the `after` parameter on the @loading block. */ +function getLoadingBlockAfter(tDetails: TDeferBlockDetails): number|null { + return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null; +} + /** * Transitions a defer block to the new state. Updates the necessary * data structures and renders corresponding block. @@ -622,6 +646,7 @@ function getTemplateIndexForState( export function renderDeferBlockState( newState: DeferBlockState, tNode: TNode, lContainer: LContainer): void { const hostLView = lContainer[PARENT]; + const hostTView = hostLView[TVIEW]; // Check if this view is not destroyed. Since the loading process was async, // the view might end up being destroyed by the time rendering happens. @@ -631,15 +656,97 @@ export function renderDeferBlockState( ngDevMode && assertTNodeForLView(tNode, hostLView); const lDetails = getLDeferBlockDetails(hostLView, tNode); + const tDetails = getTDeferBlockDetails(hostTView, tNode); ngDevMode && assertDefined(lDetails, 'Expected a defer block state defined'); + const now = Date.now(); + const currentState = lDetails[DEFER_BLOCK_STATE]; + + if (!isValidStateChange(currentState, newState) || + !isValidStateChange(lDetails[NEXT_DEFER_BLOCK_STATE] ?? -1, newState)) + return; + + if (lDetails[STATE_IS_FROZEN_UNTIL] === null || lDetails[STATE_IS_FROZEN_UNTIL] <= now) { + lDetails[STATE_IS_FROZEN_UNTIL] = null; + + const loadingAfter = getLoadingBlockAfter(tDetails); + const inLoadingAfterPhase = lDetails[LOADING_AFTER_CLEANUP_FN] !== null; + if (newState === DeferBlockState.Loading && loadingAfter !== null && !inLoadingAfterPhase) { + // Trying to render loading, but it has an `after` config, + // so schedule an update action after a timeout. + lDetails[NEXT_DEFER_BLOCK_STATE] = newState; + const cleanupFn = + scheduleDeferBlockUpdate(loadingAfter, lDetails, tNode, lContainer, hostLView); + lDetails[LOADING_AFTER_CLEANUP_FN] = cleanupFn; + } else { + // If we transition to a complete or an error state and there is a pending + // operation to render loading after a timeout - invoke a cleanup operation, + // which stops the timer. + if (newState > DeferBlockState.Loading && inLoadingAfterPhase) { + lDetails[LOADING_AFTER_CLEANUP_FN]!(); + lDetails[LOADING_AFTER_CLEANUP_FN] = null; + lDetails[NEXT_DEFER_BLOCK_STATE] = null; + } + + applyDeferBlockStateToDom(newState, lDetails, lContainer, hostLView, tNode); + + const duration = getMinimumDurationForState(tDetails, newState); + if (duration !== null) { + lDetails[STATE_IS_FROZEN_UNTIL] = now + duration; + scheduleDeferBlockUpdate(duration, lDetails, tNode, lContainer, hostLView); + } + } + } else { + // We are still rendering the previous state. + // Update the `NEXT_DEFER_BLOCK_STATE`, which would be + // picked up once it's time to transition to the next state. + lDetails[NEXT_DEFER_BLOCK_STATE] = newState; + } +} + +/** + * Schedules an update operation after a specified timeout. + */ +function scheduleDeferBlockUpdate( + timeout: number, lDetails: LDeferBlockDetails, tNode: TNode, lContainer: LContainer, + hostLView: LView): VoidFunction { + const callback = () => { + const nextState = lDetails[NEXT_DEFER_BLOCK_STATE]; + lDetails[STATE_IS_FROZEN_UNTIL] = null; + lDetails[NEXT_DEFER_BLOCK_STATE] = null; + if (nextState !== null) { + renderDeferBlockState(nextState, tNode, lContainer); + } + }; + // TODO: this needs refactoring to make `TimerScheduler` that is used inside + // of the `scheduleTimerTrigger` function tree-shakable. + return scheduleTimerTrigger(timeout, callback, hostLView, true); +} + +/** + * Checks whether we can transition to the next state. + * + * We transition to the next state if the previous state was represented + * with a number that is less than the next state. For example, if the current + * state is "loading" (represented as `1`), we should not show a placeholder + * (represented as `0`), but we can show a completed state (represented as `2`) + * or an error state (represented as `3`). + */ +function isValidStateChange( + currentState: DeferBlockState|DeferBlockInternalState, newState: DeferBlockState): boolean { + return currentState < newState; +} + +/** + * Applies changes to the DOM to reflect a given state. + */ +function applyDeferBlockStateToDom( + newState: DeferBlockState, lDetails: LDeferBlockDetails, lContainer: LContainer, + hostLView: LView, tNode: TNode) { const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode); - // Note: we transition to the next state if the previous state was represented - // with a number that is less than the next state. For example, if the current - // state is "loading" (represented as `2`), we should not show a placeholder - // (represented as `1`). - if (lDetails[DEFER_BLOCK_STATE] < newState && stateTmplIndex !== null) { + + if (stateTmplIndex !== null) { lDetails[DEFER_BLOCK_STATE] = newState; const hostTView = hostLView[TVIEW]; const adjustedIndex = stateTmplIndex + HEADER_OFFSET; @@ -832,13 +939,9 @@ function triggerDeferBlock(lView: LView, tNode: TNode) { if (!shouldTriggerDeferBlock(injector)) return; const tDetails = getTDeferBlockDetails(tView, tNode); - - // Condition is triggered, try to render loading state and start downloading. - // Note: if a block is in a loading, completed or an error state, this call would be a noop. - renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer); - switch (tDetails.loadingState) { case DeferDependenciesLoadingState.NOT_STARTED: + renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer); triggerResourceLoading(tDetails, lView); // The `loadingState` might have changed to "loading". @@ -848,6 +951,7 @@ function triggerDeferBlock(lView: LView, tNode: TNode) { } break; case DeferDependenciesLoadingState.IN_PROGRESS: + renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer); renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer); break; case DeferDependenciesLoadingState.COMPLETE: diff --git a/packages/core/src/render3/interfaces/defer.ts b/packages/core/src/render3/interfaces/defer.ts index 2c936477347cb5..e62492c3e2d540 100644 --- a/packages/core/src/render3/interfaces/defer.ts +++ b/packages/core/src/render3/interfaces/defer.ts @@ -43,11 +43,17 @@ export enum DeferDependenciesLoadingState { FAILED, } +/** Slot index where `minimum` parameter value is stored. */ +export const MINIMUM_SLOT = 0; + +/** Slot index where `after` parameter value is stored. */ +export const LOADING_AFTER_SLOT = 1; + /** Configuration object for a loading block as it is stored in the component constants. */ export type DeferredLoadingBlockConfig = [minimumTime: number|null, afterTime: number|null]; /** Configuration object for a placeholder block as it is stored in the component constants. */ -export type DeferredPlaceholderBlockConfig = [afterTime: number|null]; +export type DeferredPlaceholderBlockConfig = [minimumTime: number|null]; /** * Describes the data shared across all instances of a defer block. @@ -133,11 +139,14 @@ export enum DeferBlockInternalState { Initial = -1, } -/** - * A slot in the `LDeferBlockDetails` array that contains a number - * that represent a current block state that is being rendered. - */ -export const DEFER_BLOCK_STATE = 0; +export const NEXT_DEFER_BLOCK_STATE = 0; +// Note: it's *important* to keep the state in this slot, because this slot +// is used by runtime logic to differentiate between LViews, LContainers and +// other types (see `isLView` and `isLContainer` functions). In case of defer +// blocks, this slot would always be a number. +export const DEFER_BLOCK_STATE = 1; +export const STATE_IS_FROZEN_UNTIL = 2; +export const LOADING_AFTER_CLEANUP_FN = 3; /** * Describes instance-specific defer block data. @@ -147,7 +156,28 @@ export const DEFER_BLOCK_STATE = 0; * (which would require per-instance state). */ export interface LDeferBlockDetails extends Array { + /** + * Currently rendered block state. + */ [DEFER_BLOCK_STATE]: DeferBlockState|DeferBlockInternalState; + + /** + * Block state that was requested when another state was rendered. + */ + [NEXT_DEFER_BLOCK_STATE]: DeferBlockState|null; + + /** + * Timestamp indicating when the current state can be switched to + * the next one, in case teh current state has `minimum` parameter. + */ + [STATE_IS_FROZEN_UNTIL]: number|null; + + /** + * Contains a reference to a cleanup function which cancels a timeout + * when Angular waits before rendering loading state. This is used when + * the loading block has the `after` parameter configured. + */ + [LOADING_AFTER_CLEANUP_FN]: VoidFunction|null; } /** diff --git a/packages/core/test/acceptance/defer_spec.ts b/packages/core/test/acceptance/defer_spec.ts index 649c75281b863a..ff4bfd9bc544d3 100644 --- a/packages/core/test/acceptance/defer_spec.ts +++ b/packages/core/test/acceptance/defer_spec.ts @@ -9,7 +9,7 @@ import {ɵPLATFORM_BROWSER_ID as PLATFORM_BROWSER_ID} from '@angular/common'; import {Component, Input, NgZone, PLATFORM_ID, QueryList, Type, ViewChildren, ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR} from '@angular/core'; import {getComponentDef} from '@angular/core/src/render3/definition'; -import {DeferBlockBehavior, fakeAsync, flush, TestBed} from '@angular/core/testing'; +import {ComponentFixture, DeferBlockBehavior, fakeAsync, flush, TestBed, tick} from '@angular/core/testing'; /** * Clears all associated directive defs from a given component class. @@ -65,6 +65,95 @@ function timer(delay: number): Promise { }); } +/** + * Allows to verify behavior of defer blocks by providing a set of + * [time, expected output] pairs. Also allows to provide a function + * instead of an expected output string, in which case the function + * is invoked at a specified time. + */ +async function verifyTimeline( + fixture: ComponentFixture, + ...slots: Array<[time: number, expected: string|VoidFunction]>) { + for (let i = 0; i < slots.length; i++) { + const timeToWait = i === 0 ? slots[0][0] : (slots[i][0] - slots[i - 1][0]); + const slotValue = slots[i][1]; + // This is an action, just invoke a function. + if (typeof slotValue === 'function') { + slotValue(); + } + tick(timeToWait); + fixture.detectChanges(); + if (typeof slotValue === 'string') { + const actual = fixture.nativeElement.textContent.trim(); + expect(actual).withContext(`${slots[i][0]}ms`).toBe(slotValue); + } + } +} + + +/** + * Given a template, creates a component fixture and returns + * a set of helper functions to trigger rendering of prefetching + * of a defer block. + */ +function createFixture(template: string) { + @Component({ + selector: 'nested-cmp', + standalone: true, + template: '{{ block }}', + }) + class NestedCmp { + @Input() block!: string; + } + + @Component({ + standalone: true, + selector: 'simple-app', + imports: [NestedCmp], + template, + }) + class MyCmp { + trigger = false; + prefetchTrigger = false; + } + + let loadingTimeout = 0; + const deferDepsInterceptor = { + intercept() { + return () => { + return [dynamicImportOf(NestedCmp, loadingTimeout)]; + }; + } + }; + + TestBed.configureTestingModule({ + providers: [ + ...COMMON_PROVIDERS, + {provide: ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR, useValue: deferDepsInterceptor}, + ], + deferBlockBehavior: DeferBlockBehavior.Playthrough, + }); + + clearDirectiveDefs(MyCmp); + + const fixture = TestBed.createComponent(MyCmp); + fixture.detectChanges(); + + const trigger = (loadingResourcesTime: number) => () => { + loadingTimeout = loadingResourcesTime; + fixture.componentInstance.trigger = true; + fixture.detectChanges(); + }; + + const triggerPrefetch = (loadingResourcesTime: number) => () => { + loadingTimeout = loadingResourcesTime; + fixture.componentInstance.prefetchTrigger = true; + fixture.detectChanges(); + }; + + return {trigger, triggerPrefetch, fixture}; +} + // Set `PLATFORM_ID` to a browser platform value to trigger defer loading // while running tests in Node. const COMMON_PROVIDERS = [{provide: PLATFORM_ID, useValue: PLATFORM_BROWSER_ID}]; @@ -294,6 +383,151 @@ describe('@defer', () => { }); }); + describe('minimum and after conditions', () => { + it('should support minimum and after conditions', fakeAsync(() => { + const {trigger, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @loading (after 100ms; minimum 150ms) { + Loading + } @placeholder (minimum 100ms) { + Placeholder + } @error { + Error + } + `); + + verifyTimeline( + fixture, + [50, 'Placeholder'], + [100, trigger(170)], + [150, 'Placeholder'], + [250, 'Loading'], + [300, 'Loading'], + [450, 'Main'], + ); + })); + + it('should support @placeholder with `minimum`', fakeAsync(() => { + const {trigger, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @placeholder (minimum 100ms) { + Placeholder + } + `); + + verifyTimeline( + fixture, + [0, trigger(40)], + [90, 'Placeholder'], + [100, 'Main'], + ); + })); + + it('should keep rendering @placeholder if trigger happened later', fakeAsync(() => { + const {trigger, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @placeholder (minimum 100ms) { + Placeholder + } + `); + + verifyTimeline( + fixture, + [0, 'Placeholder'], + [50, trigger(20)], + [90, 'Placeholder'], + [100, 'Main'], + ); + })); + + it('should transition from @placeholder to primary content ' + + 'if it was prefetched', + fakeAsync(() => { + const {trigger, triggerPrefetch, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @placeholder (minimum 100ms) { + Placeholder + } + `); + + verifyTimeline( + fixture, + [0, 'Placeholder'], + [20, triggerPrefetch(20)], + [150, 'Placeholder'], + [200, trigger(0)], + [225, 'Main'], + ); + })); + + it('should support @loading with `minimum`', fakeAsync(() => { + const {trigger, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @loading (minimum 100ms) { + Loading + } + `); + + verifyTimeline( + fixture, + [0, trigger(20)], + // Even though loading happened in 20ms, + // we still render @loading block for longer + // period of time, since there was `minimum` defined. + [95, 'Loading'], + [100, 'Main'], + ); + })); + + it('should support @loading with `after` and `minimum`', fakeAsync(() => { + const {trigger, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @loading (after 100ms; minimum 150ms) { + Loading + } + `); + + verifyTimeline( + fixture, + [0, trigger(150)], + [50, ''], + // Start showing loading after `after` ms. + [100, 'Loading'], + [150, 'Loading'], + [200, 'Loading'], + // Render main content after `after` + `minimum` ms. + [300, 'Main'], + ); + })); + + it('should skip @loading when resources were prefetched', fakeAsync(() => { + const {trigger, triggerPrefetch, fixture} = createFixture(` + @defer (when trigger; prefetch when prefetchTrigger) { + + } @loading (minimum 100ms) { + Loading + } + `); + + verifyTimeline( + fixture, + [0, triggerPrefetch(50)], + [50, ''], + [75, ''], + [100, trigger(0)], + // We go directly into the final state, since + // resources were already preloaded. + [125, 'Main'], + ); + })); + }); + describe('error handling', () => { it('should render an error block when loading fails', async () => { @Component({ From 65786b2b96ba198034ff23bb14571a659a491b50 Mon Sep 17 00:00:00 2001 From: Matt Lewis Date: Wed, 4 Oct 2023 14:41:22 +0100 Subject: [PATCH 49/57] fix(platform-browser): prevent duplicate stylesheets from being created (#52019) Fixes a bug with REMOVE_STYLES_ON_COMPONENT_DESTROY when a component is destroyed and re-created, its previous stylesheets will not be re-used and instead a new stylesheet will still be created each time. PR Close #52019 --- .../src/dom/shared_styles_host.ts | 35 +++++++++++-------- .../test/dom/dom_renderer_spec.ts | 25 +++++++++++++ .../test/dom/shared_styles_host_spec.ts | 9 +++++ 3 files changed, 54 insertions(+), 15 deletions(-) diff --git a/packages/platform-browser/src/dom/shared_styles_host.ts b/packages/platform-browser/src/dom/shared_styles_host.ts index 61f6d58285b242..73e5e5cf37c3a1 100644 --- a/packages/platform-browser/src/dom/shared_styles_host.ts +++ b/packages/platform-browser/src/dom/shared_styles_host.ts @@ -16,7 +16,7 @@ const APP_ID_ATTRIBUTE_NAME = 'ng-app-id'; export class SharedStylesHost implements OnDestroy { // Maps all registered host nodes to a list of style nodes that have been added to the host node. private readonly styleRef = new Map < string /** Style string */, { - elements: HTMLStyleElement[]; + elements: Map; usage: number; } > (); @@ -84,6 +84,9 @@ export class SharedStylesHost implements OnDestroy { removeHost(hostNode: Node): void { this.hostNodes.delete(hostNode); + for (const {elements} of this.styleRef.values()) { + elements.delete(hostNode); + } } private getAllStyles(): IterableIterator { @@ -125,11 +128,17 @@ export class SharedStylesHost implements OnDestroy { } const usage = nonNegativeNumber(delta); - map.set(style, {usage, elements: []}); + map.set(style, {usage, elements: new Map()}); return usage; } - private getStyleElement(host: Node, style: string): HTMLStyleElement { + private getStyleElement( + host: Node, style: string, + existingStyleElements: Map|undefined): HTMLStyleElement { + const existingStyleElement = existingStyleElements?.get(host); + if (existingStyleElement) { + return existingStyleElement; + } const styleNodesInDOM = this.styleNodesInDOM; const styleEl = styleNodesInDOM?.get(style); if (styleEl?.parentNode === host) { @@ -162,23 +171,19 @@ export class SharedStylesHost implements OnDestroy { } private addStyleToHost(host: Node, style: string): void { - const styleEl = this.getStyleElement(host, style); + const styleRef = this.styleRef; + const styleResult = styleRef.get(style)!; // This will always be defined in `changeUsageCount` + const styleEl = this.getStyleElement(host, style, styleResult.elements); host.appendChild(styleEl); - const styleRef = this.styleRef; - const styleResult = styleRef.get(style); - if (styleResult) { - if (styleResult.usage === 0) { - disableStylesheet(styleEl); - } else { - enableStylesheet(styleEl); - } - - styleResult.elements.push(styleEl); + if (styleResult.usage === 0) { + disableStylesheet(styleEl); } else { - styleRef.set(style, {elements: [styleEl], usage: 1}); + enableStylesheet(styleEl); } + + styleResult.elements.set(host, styleEl); } private resetHostNodes(): void { diff --git a/packages/platform-browser/test/dom/dom_renderer_spec.ts b/packages/platform-browser/test/dom/dom_renderer_spec.ts index 9bd251783fc009..7c0bcb23293dc7 100644 --- a/packages/platform-browser/test/dom/dom_renderer_spec.ts +++ b/packages/platform-browser/test/dom/dom_renderer_spec.ts @@ -262,6 +262,31 @@ import {expect} from '@angular/platform-browser/testing/src/matchers'; expect(styles?.length).toBe(1); expect(styles?.[0].nativeElement.disabled).toBeTrue(); }); + + it('should not add duplicate stylesheets', async () => { + const fixture = TestBed.createComponent(SomeAppForCleanUp); + const compInstance = fixture.componentInstance; + compInstance.showEmulatedComponents = false; + compInstance.componentTwoInstanceHidden = true; + + fixture.detectChanges(); + // verify style is in DOM + expect(await styleCount(fixture, '.none')).toBe(1); + + // Remove a single instance of the component. + compInstance.componentOneInstanceHidden = true; + fixture.detectChanges(); + + // Verify style is still in DOM + expect(await styleCount(fixture, '.none')).toBe(1); + + // Re-create the component + compInstance.componentOneInstanceHidden = false; + fixture.detectChanges(); + + // Verify there is only 1 style + expect(await styleCount(fixture, '.none')).toBe(1); + }); }); }); } diff --git a/packages/platform-browser/test/dom/shared_styles_host_spec.ts b/packages/platform-browser/test/dom/shared_styles_host_spec.ts index 1a65eb5d9fa8a3..63ce70e45be735 100644 --- a/packages/platform-browser/test/dom/shared_styles_host_spec.ts +++ b/packages/platform-browser/test/dom/shared_styles_host_spec.ts @@ -61,5 +61,14 @@ import {expect} from '@angular/platform-browser/testing/src/matchers'; ssh.addHost(someHost); expect(someHost.innerHTML).toEqual(''); }); + + it('should not add duplicate style nodes', () => { + ssh.addHost(someHost); + const styles = ['a {};']; + ssh.addStyles(styles); + ssh.disableStyles(styles); + ssh.addStyles(styles); + expect(someHost.innerHTML).toEqual(''); + }); }); } From 5464bea73c25f2ab8d48f47ec97e86598d442e40 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 3 Oct 2023 05:05:30 +0000 Subject: [PATCH 50/57] build: update github/codeql-action action to v2.21.9 (#51992) See associated pull request for more information. PR Close #51992 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index bf2af14e954f24..7830b6665ecec6 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@6a28655e3dcb49cb0840ea372fd6d17733edd8a4 # v2.21.8 + uses: github/codeql-action/upload-sarif@ddccb873888234080b77e9bc2d4764d5ccaaccf9 # v2.21.9 with: sarif_file: results.sarif From 04169e15d0e5b278308c4308c799f6bd2eb1806b Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Wed, 4 Oct 2023 15:28:55 -0700 Subject: [PATCH 51/57] refactor(language-service): Prepare to support blocks in the langauge service (#52038) Two key refactors to enable deeper language service support for blocks: (1) We now generate accurate source spans for the various block types. Additionally, all the top-level source spans for a block are now *inclusive* of all the connected or descending blocks. This helps the language service visit connected blocks. (2) The language service's template visitor was previously skipping over the AST nodes corresponding to several block types. We are now careful to visit all such nodes. PR Close #52038 --- packages/compiler/src/render3/r3_ast.ts | 22 +- .../compiler/src/render3/r3_control_flow.ts | 44 ++- .../src/render3/r3_deferred_blocks.ts | 18 +- .../test/render3/r3_ast_spans_spec.ts | 10 +- .../language-service/src/template_target.ts | 7 +- .../test/legacy/template_target_spec.ts | 263 ++++++++++++++++++ 6 files changed, 334 insertions(+), 30 deletions(-) diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index 40d6aefdf5abb2..bdcaa83c7e2261 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -210,8 +210,8 @@ export class DeferredBlock implements Node { public children: Node[], triggers: DeferredBlockTriggers, prefetchTriggers: DeferredBlockTriggers, public placeholder: DeferredBlockPlaceholder|null, public loading: DeferredBlockLoading|null, public error: DeferredBlockError|null, - public sourceSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan, - public endSourceSpan: ParseSourceSpan|null) { + public sourceSpan: ParseSourceSpan, public mainBlockSpan: ParseSourceSpan, + public startSourceSpan: ParseSourceSpan, public endSourceSpan: ParseSourceSpan|null) { this.triggers = triggers; this.prefetchTriggers = prefetchTriggers; // We cache the keys since we know that they won't change and we @@ -228,16 +228,14 @@ export class DeferredBlock implements Node { this.visitTriggers(this.definedTriggers, this.triggers, visitor); this.visitTriggers(this.definedPrefetchTriggers, this.prefetchTriggers, visitor); visitAll(visitor, this.children); - this.placeholder && visitor.visitDeferredBlockPlaceholder(this.placeholder); - this.loading && visitor.visitDeferredBlockLoading(this.loading); - this.error && visitor.visitDeferredBlockError(this.error); + const remainingBlocks = + [this.placeholder, this.loading, this.error].filter(x => x !== null) as Array; + visitAll(visitor, remainingBlocks); } private visitTriggers( keys: (keyof DeferredBlockTriggers)[], triggers: DeferredBlockTriggers, visitor: Visitor) { - for (const key of keys) { - visitor.visitDeferredTrigger(triggers[key]!); - } + visitAll(visitor, keys.map(k => triggers[k]!)); } } @@ -272,7 +270,8 @@ export class ForLoopBlock implements Node { public item: Variable, public expression: ASTWithSource, public trackBy: ASTWithSource, public contextVariables: ForLoopBlockContext, public children: Node[], public empty: ForLoopBlockEmpty|null, public sourceSpan: ParseSourceSpan, - public startSourceSpan: ParseSourceSpan, public endSourceSpan: ParseSourceSpan|null) {} + public mainBlockSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan, + public endSourceSpan: ParseSourceSpan|null) {} visit(visitor: Visitor): Result { return visitor.visitForLoopBlock(this); @@ -282,7 +281,7 @@ export class ForLoopBlock implements Node { export class ForLoopBlockEmpty implements Node { constructor( public children: Node[], public sourceSpan: ParseSourceSpan, - public startSourceSpan: ParseSourceSpan) {} + public startSourceSpan: ParseSourceSpan, public endSourceSpan: ParseSourceSpan|null) {} visit(visitor: Visitor): Result { return visitor.visitForLoopBlockEmpty(this); @@ -302,7 +301,8 @@ export class IfBlock implements Node { export class IfBlockBranch implements Node { constructor( public expression: AST|null, public children: Node[], public expressionAlias: Variable|null, - public sourceSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan) {} + public sourceSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan, + public endSourceSpan: ParseSourceSpan|null) {} visit(visitor: Visitor): Result { return visitor.visitIfBlockBranch(this); diff --git a/packages/compiler/src/render3/r3_control_flow.ts b/packages/compiler/src/render3/r3_control_flow.ts index 643d88a8032c25..07c60781fa8180 100644 --- a/packages/compiler/src/render3/r3_control_flow.ts +++ b/packages/compiler/src/render3/r3_control_flow.ts @@ -64,7 +64,7 @@ export function createIfBlock( if (mainBlockParams !== null) { branches.push(new t.IfBlockBranch( mainBlockParams.expression, html.visitAll(visitor, ast.children, ast.children), - mainBlockParams.expressionAlias, ast.sourceSpan, ast.startSourceSpan)); + mainBlockParams.expressionAlias, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan)); } // Assumes that the structure is valid since we validated it above. @@ -77,16 +77,28 @@ export function createIfBlock( if (params !== null) { branches.push(new t.IfBlockBranch( params.expression, children, params.expressionAlias, block.sourceSpan, - block.startSourceSpan)); + block.startSourceSpan, block.endSourceSpan)); } } else if (block.name === 'else') { - branches.push( - new t.IfBlockBranch(null, children, null, block.sourceSpan, block.startSourceSpan)); + branches.push(new t.IfBlockBranch( + null, children, null, block.sourceSpan, block.startSourceSpan, block.endSourceSpan)); } } + // The outer IfBlock should have a span that encapsulates all branches. + const ifBlockStartSourceSpan = + branches.length > 0 ? branches[0].startSourceSpan : ast.startSourceSpan; + const ifBlockEndSourceSpan = + branches.length > 0 ? branches[branches.length - 1].endSourceSpan : ast.endSourceSpan; + + let wholeSourceSpan = ast.sourceSpan; + const lastBranch = branches[branches.length - 1]; + if (lastBranch !== undefined) { + wholeSourceSpan = new ParseSourceSpan(ifBlockStartSourceSpan.start, lastBranch.sourceSpan.end); + } + return { - node: new t.IfBlock(branches, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan), + node: new t.IfBlock(branches, wholeSourceSpan, ast.startSourceSpan, ifBlockEndSourceSpan), errors, }; } @@ -109,21 +121,29 @@ export function createForLoop( } else { empty = new t.ForLoopBlockEmpty( html.visitAll(visitor, block.children, block.children), block.sourceSpan, - block.startSourceSpan); + block.startSourceSpan, block.endSourceSpan); } } else { errors.push(new ParseError(block.sourceSpan, `Unrecognized @for loop block "${block.name}"`)); } } + if (params !== null) { if (params.trackBy === null) { + // TODO: We should not fail here, and instead try to produce some AST for the language + // service. errors.push(new ParseError(ast.sourceSpan, '@for loop must have a "track" expression')); } else { + // The `for` block has a main span that includes the `empty` branch. For only the span of the + // main `for` body, use `mainSourceSpan`. + const endSpan = empty?.endSourceSpan ?? ast.endSourceSpan; + const sourceSpan = + new ParseSourceSpan(ast.sourceSpan.start, endSpan?.end ?? ast.sourceSpan.end); node = new t.ForLoopBlock( params.itemName, params.expression, params.trackBy, params.context, - html.visitAll(visitor, ast.children, ast.children), empty, ast.sourceSpan, - ast.startSourceSpan, ast.endSourceSpan); + html.visitAll(visitor, ast.children, ast.children), empty, sourceSpan, ast.sourceSpan, + ast.startSourceSpan, endSpan); } } @@ -231,8 +251,12 @@ function parseForLoopParameters( // Fill out any variables that haven't been defined explicitly. for (const variableName of ALLOWED_FOR_LOOP_LET_VARIABLES) { if (!result.context.hasOwnProperty(variableName)) { - result.context[variableName] = - new t.Variable(variableName, variableName, block.startSourceSpan, block.startSourceSpan); + // Give ambiently-available context variables empty spans at the end of the start of the `for` + // block, since they are not explicitly defined. + const emptySpanAfterForBlockStart = + new ParseSourceSpan(block.startSourceSpan.end, block.startSourceSpan.end); + result.context[variableName] = new t.Variable( + variableName, variableName, emptySpanAfterForBlockStart, emptySpanAfterForBlockStart); } } diff --git a/packages/compiler/src/render3/r3_deferred_blocks.ts b/packages/compiler/src/render3/r3_deferred_blocks.ts index 8183172041ca9b..9f6637941c0ba3 100644 --- a/packages/compiler/src/render3/r3_deferred_blocks.ts +++ b/packages/compiler/src/render3/r3_deferred_blocks.ts @@ -7,7 +7,7 @@ */ import * as html from '../ml_parser/ast'; -import {ParseError} from '../parse_util'; +import {ParseError, ParseSourceSpan} from '../parse_util'; import {BindingParser} from '../template_parser/binding_parser'; import * as t from './r3_ast'; @@ -47,9 +47,23 @@ export function createDeferredBlock( const {placeholder, loading, error} = parseConnectedBlocks(connectedBlocks, errors, visitor); const {triggers, prefetchTriggers} = parsePrimaryTriggers(ast.parameters, bindingParser, errors, placeholder); + + // The `defer` block has a main span encompassing all of the connected branches as well. For the + // span of only the first "main" branch, use `mainSourceSpan`. + let lastEndSourceSpan = ast.endSourceSpan; + let endOfLastSourceSpan = ast.sourceSpan.end; + if (connectedBlocks.length > 0) { + const lastConnectedBlock = connectedBlocks[connectedBlocks.length - 1]; + lastEndSourceSpan = lastConnectedBlock.endSourceSpan; + endOfLastSourceSpan = lastConnectedBlock.sourceSpan.end; + } + + const mainDeferredSourceSpan = new ParseSourceSpan(ast.sourceSpan.start, endOfLastSourceSpan); + const node = new t.DeferredBlock( html.visitAll(visitor, ast.children, ast.children), triggers, prefetchTriggers, placeholder, - loading, error, ast.sourceSpan, ast.startSourceSpan, ast.endSourceSpan); + loading, error, mainDeferredSourceSpan, ast.sourceSpan, ast.startSourceSpan, + lastEndSourceSpan); return {node, errors}; } diff --git a/packages/compiler/test/render3/r3_ast_spans_spec.ts b/packages/compiler/test/render3/r3_ast_spans_spec.ts index 1c83b653e5caf0..92cb8e9b43ea6a 100644 --- a/packages/compiler/test/render3/r3_ast_spans_spec.ts +++ b/packages/compiler/test/render3/r3_ast_spans_spec.ts @@ -623,7 +623,7 @@ describe('R3 AST source spans', () => { expectFromHtml(html).toEqual([ [ 'DeferredBlock', - '@defer (when isVisible() && foo; on hover(button), timer(10s), idle, immediate, interaction(button), viewport(container); prefetch on immediate; prefetch when isDataLoaded()) {}', + '@defer (when isVisible() && foo; on hover(button), timer(10s), idle, immediate, interaction(button), viewport(container); prefetch on immediate; prefetch when isDataLoaded()) {}@loading (minimum 1s; after 100ms) {Loading...}@placeholder (minimum 500) {Placeholder content!}@error {Loading failed :(}', '@defer (when isVisible() && foo; on hover(button), timer(10s), idle, immediate, interaction(button), viewport(container); prefetch on immediate; prefetch when isDataLoaded()) {', '}' ], @@ -691,7 +691,8 @@ describe('R3 AST source spans', () => { expectFromHtml(html).toEqual([ [ - 'ForLoopBlock', '@for (item of items.foo.bar; track item.id) {

{{ item }}

}', + 'ForLoopBlock', + '@for (item of items.foo.bar; track item.id) {

{{ item }}

}@empty {There were no items in the list.}', '@for (item of items.foo.bar; track item.id) {', '}' ], ['Element', '

{{ item }}

', '

', '

'], @@ -710,8 +711,9 @@ describe('R3 AST source spans', () => { expectFromHtml(html).toEqual([ [ - 'IfBlock', '@if (cond.expr; as foo) {Main case was true!}', '@if (cond.expr; as foo) {', - '}' + 'IfBlock', + '@if (cond.expr; as foo) {Main case was true!}@else if (other.expr) {Extra case was true!}@else {False case!}', + '@if (cond.expr; as foo) {', '}' ], [ 'IfBlockBranch', '@if (cond.expr; as foo) {Main case was true!}', diff --git a/packages/language-service/src/template_target.ts b/packages/language-service/src/template_target.ts index 0646017609d29e..3ddbc7da14ff80 100644 --- a/packages/language-service/src/template_target.ts +++ b/packages/language-service/src/template_target.ts @@ -507,11 +507,12 @@ class TemplateTargetVisitor implements t.Visitor { } visitForLoopBlock(block: t.ForLoopBlock) { - block.item.visit(this); + this.visit(block.item); this.visitAll(Object.values(block.contextVariables)); this.visitBinding(block.expression); + this.visitBinding(block.trackBy); this.visitAll(block.children); - block.empty?.visit(this); + block.empty && this.visit(block.empty); } visitForLoopBlockEmpty(block: t.ForLoopBlockEmpty) { @@ -524,7 +525,7 @@ class TemplateTargetVisitor implements t.Visitor { visitIfBlockBranch(block: t.IfBlockBranch) { block.expression && this.visitBinding(block.expression); - block.expressionAlias?.visit(this); + block.expressionAlias && this.visit(block.expressionAlias); this.visitAll(block.children); } diff --git a/packages/language-service/test/legacy/template_target_spec.ts b/packages/language-service/test/legacy/template_target_spec.ts index d62e9f49dc87eb..3c0c910cceda96 100644 --- a/packages/language-service/test/legacy/template_target_spec.ts +++ b/packages/language-service/test/legacy/template_target_spec.ts @@ -266,6 +266,16 @@ describe('getTargetAtPosition for template AST', () => { expect((node as t.Reference).name).toBe('foo'); }); + it('should locate local reference read', () => { + const {errors, nodes, position} = parse(` {{myIn¦putFoo.value}}`); + expect(errors).toBe(null); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('myInputFoo'); + }); + it('should locate template reference key via the ref- notation', () => { const {errors, nodes, position} = parse(``); expect(errors).toBe(null); @@ -874,3 +884,256 @@ describe('unclosed elements', () => { expect((node as t.Element).name).toBe('li'); }); }); + +describe('blocks', () => { + it('should visit switch block', () => { + const {nodes, position} = parse(`@swi¦tch (foo) { @case (bar) { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.SwitchBlock); + }); + + it('should visit switch block test expression', () => { + const {nodes, position} = parse(`@switch (fo¦o) { @case (bar) { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit case block', () => { + const {nodes, position} = parse(`@switch (foo) { @c¦ase (bar) { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.SwitchBlockCase); + }); + + it('should visit case expression', () => { + const {nodes, position} = parse(`@switch (foo) { @case (b¦ar) { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('bar'); + }); + + it('should visit case body', () => { + const {nodes, position} = parse(`@switch (foo) { @case (bar) { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Element); + expect((node as t.Element).name).toBe('span'); + }); + + it('should visit default block on switch', () => { + const {nodes, position} = parse(`@switch (foo) { @d¦efault { } }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.SwitchBlockCase); + }); + + it('should visit if block main branch', () => { + const {nodes, position} = parse(`@i¦f (title) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.IfBlockBranch); + }); + + it('should visit if condition of if block', () => { + const {nodes, position} = parse(`@if (tit¦le) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('title'); + }); + + it('should visit else condition of else if block', () => { + const {nodes, position} = parse(`@if (title) { } @else if (ti¦tle)`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('title'); + }); + + it('should visit alias declaration of if block', () => { + const {nodes, position} = parse(`@if (title; as fo¦o) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(node).toBeInstanceOf(t.Variable); + expect((node as t.Variable).name).toBe('foo'); + }); + + it('should visit alias usage of if block', () => { + const {nodes, position} = parse(`@if (title; as foo) { {{ fo¦o }} }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit keyword in for blocks', () => { + const {nodes, position} = parse(`@fo¦r (foo of bar; track foo) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.ForLoopBlock); + }); + + it('should visit LHS of expression in for blocks', () => { + const {nodes, position} = parse(`@for (fo¦o of bar; track foo) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Variable); + expect((node as t.Variable).name).toBe('foo'); + }); + + it('should visit RHS of expression in for blocks', () => { + const {nodes, position} = parse(`@for (foo of ba¦r; track foo) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('bar'); + }); + + it('should visit track expression in for blocks', () => { + const {nodes, position} = parse(`@for (foo of bar; track f¦oo) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit LHS of assignment expression in for blocks', () => { + const {nodes, position} = parse(`@for (foo of bar; track foo; let i¦1 = $index) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Variable); + expect((node as t.Variable).name).toBe('i1'); + expect((node as t.Variable).value).toBe('$index'); + }); + + it('should visit RHS of assignment expression in for blocks', () => { + const {nodes, position} = parse(`@for (foo of bar; track foo; let i1 = $i¦ndex) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Variable); + expect((node as t.Variable).name).toBe('i1'); + expect((node as t.Variable).value).toBe('$index'); + }); + + + it('should visit for block body in for blocks', () => { + const {nodes, position} = parse(`@for (foo of bar; track foo) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Element); + expect((node as t.Element).name).toBe('span'); + }); + + it('should visit empty block in for blocks', () => { + const {nodes, position} = + parse(`@for (foo of bar; track foo; let i1 = $index) { } @em¦pty { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.ForLoopBlockEmpty); + }); + + it('should visit empty block body in for blocks', () => { + const {nodes, position} = parse(`@for (foo of bar; track foo) { } @empty { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.Element); + expect((node as t.Element).name).toBe('span'); + }); + + it('should visit body of if block', () => { + const {nodes, position} = parse(`@if (title; as foo) { {{ fo¦o }} }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit when conditions on defer blocks', () => { + const {nodes, position} = parse(`@defer (when fo¦o) { }`); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit numeric on conditions on defer blocks', () => { + const {nodes, position} = parse(` @defer (on timer(2¦s)) { } `); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.TimerDeferredTrigger); + expect((node as t.TimerDeferredTrigger).delay).toBe(2000); + }); + + // TODO: Should the parser ingest a property read for `localRef`, instead of a string? + // (Talk to Kristiyan?) + // xit('should visit on conditions on defer blocks', () => { + // const {nodes, position} = parse(` + //
+ // @defer (on viewport(local¦Ref)) { } + // `); + // const {context} = getTargetAtPosition(nodes, position)!; + // const {node} = context as SingleNodeTarget; + // expect(isExpressionNode(node!)).toBe(true); + // expect(node).toBeInstanceOf(e.PropertyRead); + // expect((node as e.PropertyRead).name).toBe('localRef'); + // }); + + it('should visit secondary blocks on defer blocks', () => { + const {nodes, position} = parse(`@defer { } @er¦ror { } `); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.DeferredBlockError); + }); + + it('should descend into secondary blocks on defer blocks', () => { + const {nodes, position} = parse(`@defer (on immediate) { } @error { {{fo¦o}} } `); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isExpressionNode(node!)).toBe(true); + expect(node).toBeInstanceOf(e.PropertyRead); + expect((node as e.PropertyRead).name).toBe('foo'); + }); + + it('should visit placeholder blocks on defer blocks', () => { + const {nodes, position} = parse(`@defer { } @placehol¦der { } `); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.DeferredBlockPlaceholder); + }); + + it('should visit loading blocks on defer blocks', () => { + const {nodes, position} = parse(`@defer { } @load¦ing { } `); + const {context} = getTargetAtPosition(nodes, position)!; + const {node} = context as SingleNodeTarget; + expect(isTemplateNode(node!)).toBe(true); + expect(node).toBeInstanceOf(t.DeferredBlockLoading); + }); +}); From c7ff9dff2c14aba70e92b9e216a2d4d97d6ef71e Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 19 Sep 2023 13:40:43 +0200 Subject: [PATCH 52/57] fix(core): drop mutate function from the signals public API (#51821) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change removes the `mutate` method from the `WritableSignal` interface and completely drops it from the public API surface. The initial API proposal for Angular signals included the mutate method, allowing in-place modification of JS objects, without changing their references (identity). This was based on the reasoning that identity change on modification is not necessary as we can send the “modified” notification through the signals graph. Unfortunately the signal-specific change notification is lost as soon as we read signal value outside of a reactive context (outside of a reactive graph). In other words - any code outside of the Angular signals library can’t know that an object is modified. Secondly, to make the mutate method work, we’ve defaulted the signal value equality function to the one that considers non-primitive values as always different. This is unfortunate for people working with immutable data structures (this is notably the case for the popular state management libraries) as the default equality function de-optimizes memoization in computed, making the application less performant. Given the above reasons we prefer to remove the mutate method in the signals library - at least for now. There are just too many sharp edges and tradeoffs that we don’t fully understand yet. BREAKING CHANGE: The `mutate` method was removed from the `WritableSignal` interface and completely dropped from the public API surface. As an alternative please use the update method and make immutable changes to the object. Example before: ```typescript items.mutate(itemsArray => itemsArray.push(newItem)); ``` Example after: ```typescript items.update(itemsArray => [itemsArray, …newItem]); ``` PR Close #51821 --- goldens/public-api/core/index.md | 1 - packages/core/src/signals/src/api.ts | 7 +-- packages/core/src/signals/src/signal.ts | 21 ------- packages/core/test/signals/signal_spec.ts | 72 ++++++++--------------- 4 files changed, 27 insertions(+), 74 deletions(-) diff --git a/goldens/public-api/core/index.md b/goldens/public-api/core/index.md index 0d7cea177c7689..191cec0c74bb6d 100644 --- a/goldens/public-api/core/index.md +++ b/goldens/public-api/core/index.md @@ -1629,7 +1629,6 @@ export abstract class ViewRef extends ChangeDetectorRef { // @public export interface WritableSignal extends Signal { asReadonly(): Signal; - mutate(mutatorFn: (value: T) => void): void; set(value: T): void; update(updateFn: (value: T) => T): void; } diff --git a/packages/core/src/signals/src/api.ts b/packages/core/src/signals/src/api.ts index be956b1b2ca01c..5a220c6d380466 100644 --- a/packages/core/src/signals/src/api.ts +++ b/packages/core/src/signals/src/api.ts @@ -53,10 +53,5 @@ export type ValueEqualityFn = (a: T, b: T) => boolean; * @developerPreview */ export function defaultEquals(a: T, b: T) { - // `Object.is` compares two values using identity semantics which is desired behavior for - // primitive values. If `Object.is` determines two values to be equal we need to make sure that - // those don't represent objects (we want to make sure that 2 objects are always considered - // "unequal"). The null check is needed for the special case of JavaScript reporting null values - // as objects (`typeof null === 'object'`). - return (a === null || typeof a !== 'object') && Object.is(a, b); + return Object.is(a, b); } diff --git a/packages/core/src/signals/src/signal.ts b/packages/core/src/signals/src/signal.ts index e22d87885046e8..102ceb945ba352 100644 --- a/packages/core/src/signals/src/signal.ts +++ b/packages/core/src/signals/src/signal.ts @@ -35,12 +35,6 @@ export interface WritableSignal extends Signal { */ update(updateFn: (value: T) => T): void; - /** - * Update the current value by mutating it in-place, and - * notify any dependents. - */ - mutate(mutatorFn: (value: T) => void): void; - /** * Returns a readonly version of this signal. Readonly signals can be accessed to read their value * but can't be changed using set, update or mutate methods. The readonly signals do _not_ have @@ -79,7 +73,6 @@ export function signal(initialValue: T, options?: CreateSignalOptions): Wr signalFn.set = signalSetFn; signalFn.update = signalUpdateFn; - signalFn.mutate = signalMutateFn; signalFn.asReadonly = signalAsReadonlyFn; (signalFn as any)[SIGNAL] = node; @@ -133,23 +126,9 @@ function signalSetFn(this: SignalFn, newValue: T) { } function signalUpdateFn(this: SignalFn, updater: (value: T) => T): void { - if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); - } - signalSetFn.call(this as any, updater(this[SIGNAL].value) as any); } -function signalMutateFn(this: SignalFn, mutator: (value: T) => void): void { - const node = this[SIGNAL]; - if (!producerUpdatesAllowed()) { - throwInvalidWriteToSignalError(); - } - // Mutate bypasses equality checks as it's by definition changing the value. - mutator(node.value); - signalValueChanged(node); -} - function signalAsReadonlyFn(this: SignalFn) { const node = this[SIGNAL]; if (node.readonlyFn === undefined) { diff --git a/packages/core/test/signals/signal_spec.ts b/packages/core/test/signals/signal_spec.ts index d805b98d99af94..51c837a6af0205 100644 --- a/packages/core/test/signals/signal_spec.ts +++ b/packages/core/test/signals/signal_spec.ts @@ -24,18 +24,6 @@ describe('signals', () => { expect(counter()).toEqual(1); }); - it('should have mutate function for mutable, out of bound updates', () => { - const state = signal(['a']); - const derived = computed(() => state().join(':')); - - expect(derived()).toEqual('a'); - - state.mutate((s) => { - s.push('b'); - }); - expect(derived()).toEqual('a:b'); - }); - it('should not update signal when new value is equal to the previous one', () => { const state = signal('aaa', {equal: (a, b) => a.length === b.length}); expect(state()).toEqual('aaa'); @@ -72,31 +60,32 @@ describe('signals', () => { expect(upper()).toEqual('D'); }); - it('should consider objects as non-equal with the default equality function', () => { - let stateValue: unknown = {}; - const state = signal(stateValue); - let computeCount = 0; - const derived = computed(() => `${typeof state()}:${++computeCount}`); - expect(derived()).toEqual('object:1'); - - // reset signal value to the same object instance, expect change notification - state.set(stateValue); - expect(derived()).toEqual('object:2'); - - // reset signal value to a different object instance, expect change notification - stateValue = {}; - state.set(stateValue); - expect(derived()).toEqual('object:3'); - - // reset signal value to a different object type, expect change notification - stateValue = []; - state.set(stateValue); - expect(derived()).toEqual('object:4'); - - // reset signal value to the same array instance, expect change notification - state.set(stateValue); - expect(derived()).toEqual('object:5'); - }); + it('should consider objects as equal based on their identity with the default equality function', + () => { + let stateValue: unknown = {}; + const state = signal(stateValue); + let computeCount = 0; + const derived = computed(() => `${typeof state()}:${++computeCount}`); + expect(derived()).toEqual('object:1'); + + // reset signal value to the same object instance, expect NO change notification + state.set(stateValue); + expect(derived()).toEqual('object:1'); + + // reset signal value to a different object instance, expect change notification + stateValue = {}; + state.set(stateValue); + expect(derived()).toEqual('object:2'); + + // reset signal value to a different object type, expect change notification + stateValue = []; + state.set(stateValue); + expect(derived()).toEqual('object:3'); + + // reset signal value to the same array instance, expect NO change notification + state.set(stateValue); + expect(derived()).toEqual('object:3'); + }); it('should allow converting writable signals to their readonly counterpart', () => { const counter = signal(0); @@ -106,8 +95,6 @@ describe('signals', () => { expect(readOnlyCounter.set).toBeUndefined(); // @ts-expect-error expect(readOnlyCounter.update).toBeUndefined(); - // @ts-expect-error - expect(readOnlyCounter.mutate).toBeUndefined(); const double = computed(() => readOnlyCounter() * 2); expect(double()).toBe(0); @@ -142,13 +129,6 @@ describe('signals', () => { expect(log).toBe(1); }); - it('should call the post-signal-set fn when invoking .mutate()', () => { - const counter = signal(0); - - counter.mutate(() => {}); - expect(log).toBe(1); - }); - it('should not call the post-signal-set fn when the value doesn\'t change', () => { const counter = signal(0); From 5b88d136affdaa35e7015c00281b86cae040321b Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 4 Oct 2023 18:04:11 +0200 Subject: [PATCH 53/57] feat(core): mark core signal APIs as stable (#51821) This change marks core signal APIs as stable and exit developer preview for the main signal building blocks. PR Close #51821 --- packages/core/src/signals/src/api.ts | 8 -------- packages/core/src/signals/src/computed.ts | 4 ---- packages/core/src/signals/src/signal.ts | 6 ------ packages/core/src/signals/src/untracked.ts | 2 -- 4 files changed, 20 deletions(-) diff --git a/packages/core/src/signals/src/api.ts b/packages/core/src/signals/src/api.ts index 5a220c6d380466..7c693f5e4db02d 100644 --- a/packages/core/src/signals/src/api.ts +++ b/packages/core/src/signals/src/api.ts @@ -20,8 +20,6 @@ export const SIGNAL = /* @__PURE__ */ Symbol('SIGNAL'); * call it. * * Ordinary values can be turned into `Signal`s with the `signal` function. - * - * @developerPreview */ export type Signal = (() => T)&{ [SIGNAL]: unknown; @@ -29,8 +27,6 @@ export type Signal = (() => T)&{ /** * Checks if the given `value` is a reactive `Signal`. - * - * @developerPreview */ export function isSignal(value: unknown): value is Signal { return typeof value === 'function' && (value as Signal)[SIGNAL] !== undefined; @@ -38,8 +34,6 @@ export function isSignal(value: unknown): value is Signal { /** * A comparison function which can determine if two values are equal. - * - * @developerPreview */ export type ValueEqualityFn = (a: T, b: T) => boolean; @@ -49,8 +43,6 @@ export type ValueEqualityFn = (a: T, b: T) => boolean; * * This allows signals to hold non-primitive values (arrays, objects, other collections) and still * propagate change notification upon explicit mutation without identity change. - * - * @developerPreview */ export function defaultEquals(a: T, b: T) { return Object.is(a, b); diff --git a/packages/core/src/signals/src/computed.ts b/packages/core/src/signals/src/computed.ts index b1ba995d13696a..0d2480be010ac2 100644 --- a/packages/core/src/signals/src/computed.ts +++ b/packages/core/src/signals/src/computed.ts @@ -11,8 +11,6 @@ import {consumerAfterComputation, consumerBeforeComputation, producerAccessed, p /** * Options passed to the `computed` creation function. - * - * @developerPreview */ export interface CreateComputedOptions { /** @@ -23,8 +21,6 @@ export interface CreateComputedOptions { /** * Create a computed `Signal` which derives a reactive value from an expression. - * - * @developerPreview */ export function computed(computation: () => T, options?: CreateComputedOptions): Signal { const node: ComputedNode = Object.create(COMPUTED_NODE); diff --git a/packages/core/src/signals/src/signal.ts b/packages/core/src/signals/src/signal.ts index 102ceb945ba352..0e1a26c957aa0b 100644 --- a/packages/core/src/signals/src/signal.ts +++ b/packages/core/src/signals/src/signal.ts @@ -20,8 +20,6 @@ let postSignalSetFn: (() => void)|null = null; /** * A `Signal` with a value that can be mutated via a setter interface. - * - * @developerPreview */ export interface WritableSignal extends Signal { /** @@ -45,8 +43,6 @@ export interface WritableSignal extends Signal { /** * Options passed to the `signal` creation function. - * - * @developerPreview */ export interface CreateSignalOptions { /** @@ -58,8 +54,6 @@ export interface CreateSignalOptions { /** * Create a `Signal` that can be set or updated directly. - * - * @developerPreview */ export function signal(initialValue: T, options?: CreateSignalOptions): WritableSignal { const node: SignalNode = Object.create(SIGNAL_NODE); diff --git a/packages/core/src/signals/src/untracked.ts b/packages/core/src/signals/src/untracked.ts index 5d1a60498a3276..c8cdf4ea7ea74c 100644 --- a/packages/core/src/signals/src/untracked.ts +++ b/packages/core/src/signals/src/untracked.ts @@ -11,8 +11,6 @@ import {setActiveConsumer} from './graph'; /** * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function * can, optionally, return a value. - * - * @developerPreview */ export function untracked(nonReactiveReadsFn: () => T): T { const prevConsumer = setActiveConsumer(null); From 0fb742402ec558534ac65208e018e44858bcdade Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 5 Oct 2023 13:14:11 +0200 Subject: [PATCH 54/57] test(core): move control flow acceptance tests (#52045) Moves each control flow test (if, switch, for) into their corresponding file. PR Close #52045 --- .../control_flow_exploration_spec.ts | 502 ------------------ .../test/acceptance/control_flow_for_spec.ts | 178 +++++++ .../test/acceptance/control_flow_if_spec.ts | 238 +++++++++ .../acceptance/control_flow_switch_spec.ts | 109 ++++ 4 files changed, 525 insertions(+), 502 deletions(-) delete mode 100644 packages/core/test/acceptance/control_flow_exploration_spec.ts create mode 100644 packages/core/test/acceptance/control_flow_for_spec.ts create mode 100644 packages/core/test/acceptance/control_flow_if_spec.ts create mode 100644 packages/core/test/acceptance/control_flow_switch_spec.ts diff --git a/packages/core/test/acceptance/control_flow_exploration_spec.ts b/packages/core/test/acceptance/control_flow_exploration_spec.ts deleted file mode 100644 index 80042b3b3a6757..00000000000000 --- a/packages/core/test/acceptance/control_flow_exploration_spec.ts +++ /dev/null @@ -1,502 +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 - */ - - -import {Component, Pipe, PipeTransform} from '@angular/core'; -import {TestBed} from '@angular/core/testing'; - -describe('control flow', () => { - // Basic shared pipe used during testing. - @Pipe({name: 'multiply', pure: true, standalone: true}) - class MultiplyPipe implements PipeTransform { - transform(value: number, amount: number) { - return value * amount; - } - } - - describe('if', () => { - it('should add and remove views based on conditions change', () => { - @Component({standalone: true, template: '@if (show) {Something} @else {Nothing}'}) - class TestComponent { - show = true; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - expect(fixture.nativeElement.textContent).toBe('Something'); - - fixture.componentInstance.show = false; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('Nothing'); - }); - - it('should expose expression value in context', () => { - @Component({ - standalone: true, - template: '@if (show; as alias) {{{show}} aliased to {{alias}}}', - }) - class TestComponent { - show: any = true; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('true aliased to true'); - - fixture.componentInstance.show = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1 aliased to 1'); - }); - - it('should not expose the aliased expression to `if` and `else if` blocks', () => { - @Component({ - standalone: true, - template: ` - @if (value === 1; as alias) { - If: {{value}} as {{alias || 'unavailable'}} - } @else if (value === 2) { - ElseIf: {{value}} as {{alias || 'unavailable'}} - } @else { - Else: {{value}} as {{alias || 'unavailable'}} - } - `, - }) - class TestComponent { - value = 1; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent.trim()).toBe('If: 1 as true'); - - fixture.componentInstance.value = 2; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent.trim()).toBe('ElseIf: 2 as unavailable'); - - fixture.componentInstance.value = 3; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent.trim()).toBe('Else: 3 as unavailable'); - }); - - it('should expose the context to nested conditional blocks', () => { - @Component({ - standalone: true, - imports: [MultiplyPipe], - template: ` - @if (value | multiply:2; as root) { - Root: {{value}}/{{root}} - - @if (value | multiply:3; as inner) { - Inner: {{value}}/{{root}}/{{inner}} - - @if (value | multiply:4; as innermost) { - Innermost: {{value}}/{{root}}/{{inner}}/{{innermost}} - } - } - } - `, - }) - class TestComponent { - value = 1; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - let content = fixture.nativeElement.textContent; - expect(content).toContain('Root: 1/2'); - expect(content).toContain('Inner: 1/2/3'); - expect(content).toContain('Innermost: 1/2/3/4'); - - fixture.componentInstance.value = 2; - fixture.detectChanges(); - content = fixture.nativeElement.textContent; - expect(content).toContain('Root: 2/4'); - expect(content).toContain('Inner: 2/4/6'); - expect(content).toContain('Innermost: 2/4/6/8'); - }); - - it('should expose the context to listeners inside nested conditional blocks', () => { - let logs: any[] = []; - - @Component({ - standalone: true, - imports: [MultiplyPipe], - template: ` - @if (value | multiply:2; as root) { - - - @if (value | multiply:3; as inner) { - - - @if (value | multiply:4; as innermost) { - - } - } - } - `, - }) - class TestComponent { - value = 1; - - log(value: any) { - logs.push(value); - } - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - const buttons = - Array.from(fixture.nativeElement.querySelectorAll('button')); - buttons.forEach(button => button.click()); - fixture.detectChanges(); - - expect(logs).toEqual([['Root', 1, 2], ['Inner', 1, 2, 3], ['Innermost', 1, 2, 3, 4]]); - - logs = []; - fixture.componentInstance.value = 2; - fixture.detectChanges(); - - buttons.forEach(button => button.click()); - fixture.detectChanges(); - expect(logs).toEqual([['Root', 2, 4], ['Inner', 2, 4, 6], ['Innermost', 2, 4, 6, 8]]); - }); - - it('should expose expression value passed through a pipe in context', () => { - @Component({ - standalone: true, - template: '@if (value | multiply:2; as alias) {{{value}} aliased to {{alias}}}', - imports: [MultiplyPipe], - }) - class TestComponent { - value = 1; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1 aliased to 2'); - - fixture.componentInstance.value = 4; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('4 aliased to 8'); - }); - - // QUESTION: fundamental mismatch between the "template" and "container" concepts - // those 2 calls to the ɵɵtemplate instruction will generate comment nodes and LContainer - it('should destroy all views if there is nothing to display', () => { - @Component({ - standalone: true, - template: '@if (show) {Something}', - }) - class TestComponent { - show = true; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('Something'); - - fixture.componentInstance.show = false; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe(''); - }); - - it('should be able to use pipes in conditional expressions', () => { - @Component({ - standalone: true, - imports: [MultiplyPipe], - template: ` - @if ((value | multiply:2) === 2) { - one - } @else if ((value | multiply:2) === 4) { - two - } @else { - nothing - } - `, - }) - class TestComponent { - value = 0; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - expect(fixture.nativeElement.textContent.trim()).toBe('nothing'); - - fixture.componentInstance.value = 2; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent.trim()).toBe('two'); - - fixture.componentInstance.value = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent.trim()).toBe('one'); - }); - }); - - describe('switch', () => { - // Open question: == vs. === for comparison - // == is the current Angular implementation - // === is used by JavaScript semantics - it('should show a template based on a matching case', () => { - @Component({ - standalone: true, - template: ` - @switch (case) { - @case (0) {case 0} - @case (1) {case 1} - @default {default} - } - ` - }) - class TestComponent { - case = 0; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - expect(fixture.nativeElement.textContent).toBe('case 0'); - - fixture.componentInstance.case = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('case 1'); - - fixture.componentInstance.case = 5; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('default'); - }); - - it('should be able to use a pipe in the switch expression', () => { - @Component({ - standalone: true, - imports: [MultiplyPipe], - template: ` - @switch (case | multiply:2) { - @case (0) {case 0} - @case (2) {case 2} - @default {default} - } - ` - }) - class TestComponent { - case = 0; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - expect(fixture.nativeElement.textContent).toBe('case 0'); - - fixture.componentInstance.case = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('case 2'); - - fixture.componentInstance.case = 5; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('default'); - }); - - it('should be able to use a pipe in the case expression', () => { - @Component({ - standalone: true, - imports: [MultiplyPipe], - template: ` - @switch (case) { - @case (1 | multiply:2) {case 2} - @case (2 | multiply:2) {case 4} - @default {default} - } - ` - }) - class TestComponent { - case = 0; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - - expect(fixture.nativeElement.textContent).toBe('default'); - - fixture.componentInstance.case = 4; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('case 4'); - - fixture.componentInstance.case = 2; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('case 2'); - }); - }); - - describe('for', () => { - it('should create, remove and move views corresponding to items in a collection', () => { - @Component({ - template: '@for ((item of items); track item; let idx = $index) {{{item}}({{idx}})|}', - }) - class TestComponent { - items = [1, 2, 3]; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); - - fixture.componentInstance.items.pop(); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|'); - - fixture.componentInstance.items.push(3); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); - - fixture.componentInstance.items[0] = 3; - fixture.componentInstance.items[2] = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('3(0)|2(1)|1(2)|'); - }); - - it('should work correctly with trackBy index', () => { - @Component({ - template: '@for ((item of items); track idx; let idx = $index) {{{item}}({{idx}})|}', - }) - class TestComponent { - items = [1, 2, 3]; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); - - fixture.componentInstance.items.pop(); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|'); - - fixture.componentInstance.items.push(3); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); - - fixture.componentInstance.items[0] = 3; - fixture.componentInstance.items[2] = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('3(0)|2(1)|1(2)|'); - }); - - it('should support empty blocks', () => { - @Component({ - template: '@for ((item of items); track idx; let idx = $index) {|} @empty {Empty}', - }) - class TestComponent { - items: number[]|null|undefined = [1, 2, 3]; - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('|||'); - - fixture.componentInstance.items = []; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('Empty'); - - fixture.componentInstance.items = [0, 1]; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('||'); - - fixture.componentInstance.items = null; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('Empty'); - - fixture.componentInstance.items = [0]; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('|'); - - fixture.componentInstance.items = undefined; - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('Empty'); - }); - - it('should have access to the host context in the track function', () => { - let offsetReads = 0; - - @Component({template: '@for ((item of items); track $index + offset) {{{item}}}'}) - class TestComponent { - items = ['a', 'b', 'c']; - - get offset() { - offsetReads++; - return 0; - } - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('abc'); - expect(offsetReads).toBeGreaterThan(0); - - const prevReads = offsetReads; - // explicitly modify the DOM text node to make sure that the list reconciliation algorithm - // based on tracking indices overrides it. - fixture.debugElement.childNodes[1].nativeNode.data = 'x'; - fixture.componentInstance.items.shift(); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('bc'); - expect(offsetReads).toBeGreaterThan(prevReads); - }); - - it('should be able to access component properties in the tracking function from a loop at the root of the template', - () => { - const calls = new Set(); - - @Component({ - template: `@for ((item of items); track trackingFn(item, compProp)) {{{item}}}`, - }) - class TestComponent { - items = ['a', 'b']; - compProp = 'hello'; - - trackingFn(item: string, message: string) { - calls.add(`${item}:${message}`); - return item; - } - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); - }); - - it('should be able to access component properties in the tracking function from a nested template', - () => { - const calls = new Set(); - - @Component({ - template: ` - @if (true) { - @if (true) { - @if (true) { - @for ((item of items); track trackingFn(item, compProp)) {{{item}}} - } - } - } - `, - }) - class TestComponent { - items = ['a', 'b']; - compProp = 'hello'; - - trackingFn(item: string, message: string) { - calls.add(`${item}:${message}`); - return item; - } - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); - }); - }); -}); diff --git a/packages/core/test/acceptance/control_flow_for_spec.ts b/packages/core/test/acceptance/control_flow_for_spec.ts new file mode 100644 index 00000000000000..f8eab4a2a1eb7f --- /dev/null +++ b/packages/core/test/acceptance/control_flow_for_spec.ts @@ -0,0 +1,178 @@ +/** + * @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 + */ + + +import {Component} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; + +describe('control flow - for', () => { + it('should create, remove and move views corresponding to items in a collection', () => { + @Component({ + template: '@for ((item of items); track item; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 2, 3]; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + + fixture.componentInstance.items.pop(); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|'); + + fixture.componentInstance.items.push(3); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + + fixture.componentInstance.items[0] = 3; + fixture.componentInstance.items[2] = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('3(0)|2(1)|1(2)|'); + }); + + it('should work correctly with trackBy index', () => { + @Component({ + template: '@for ((item of items); track idx; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 2, 3]; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + + fixture.componentInstance.items.pop(); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|'); + + fixture.componentInstance.items.push(3); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + + fixture.componentInstance.items[0] = 3; + fixture.componentInstance.items[2] = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('3(0)|2(1)|1(2)|'); + }); + + it('should support empty blocks', () => { + @Component({ + template: '@for ((item of items); track idx; let idx = $index) {|} @empty {Empty}', + }) + class TestComponent { + items: number[]|null|undefined = [1, 2, 3]; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('|||'); + + fixture.componentInstance.items = []; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Empty'); + + fixture.componentInstance.items = [0, 1]; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('||'); + + fixture.componentInstance.items = null; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Empty'); + + fixture.componentInstance.items = [0]; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('|'); + + fixture.componentInstance.items = undefined; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Empty'); + }); + + it('should have access to the host context in the track function', () => { + let offsetReads = 0; + + @Component({template: '@for ((item of items); track $index + offset) {{{item}}}'}) + class TestComponent { + items = ['a', 'b', 'c']; + + get offset() { + offsetReads++; + return 0; + } + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('abc'); + expect(offsetReads).toBeGreaterThan(0); + + const prevReads = offsetReads; + // explicitly modify the DOM text node to make sure that the list reconciliation algorithm + // based on tracking indices overrides it. + fixture.debugElement.childNodes[1].nativeNode.data = 'x'; + fixture.componentInstance.items.shift(); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('bc'); + expect(offsetReads).toBeGreaterThan(prevReads); + }); + + it('should be able to access component properties in the tracking function from a loop at the root of the template', + () => { + const calls = new Set(); + + @Component({ + template: `@for ((item of items); track trackingFn(item, compProp)) {{{item}}}`, + }) + class TestComponent { + items = ['a', 'b']; + compProp = 'hello'; + + trackingFn(item: string, message: string) { + calls.add(`${item}:${message}`); + return item; + } + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); + }); + + it('should be able to access component properties in the tracking function from a nested template', + () => { + const calls = new Set(); + + @Component({ + template: ` + @if (true) { + @if (true) { + @if (true) { + @for ((item of items); track trackingFn(item, compProp)) {{{item}}} + } + } + } + `, + }) + class TestComponent { + items = ['a', 'b']; + compProp = 'hello'; + + trackingFn(item: string, message: string) { + calls.add(`${item}:${message}`); + return item; + } + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); + }); +}); diff --git a/packages/core/test/acceptance/control_flow_if_spec.ts b/packages/core/test/acceptance/control_flow_if_spec.ts new file mode 100644 index 00000000000000..13abe681db534f --- /dev/null +++ b/packages/core/test/acceptance/control_flow_if_spec.ts @@ -0,0 +1,238 @@ +/** + * @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 + */ + + +import {Component, Pipe, PipeTransform} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; + +// Basic shared pipe used during testing. +@Pipe({name: 'multiply', pure: true, standalone: true}) +class MultiplyPipe implements PipeTransform { + transform(value: number, amount: number) { + return value * amount; + } +} + +describe('control flow - if', () => { + it('should add and remove views based on conditions change', () => { + @Component({standalone: true, template: '@if (show) {Something} @else {Nothing}'}) + class TestComponent { + show = true; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('Something'); + + fixture.componentInstance.show = false; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Nothing'); + }); + + it('should expose expression value in context', () => { + @Component({ + standalone: true, + template: '@if (show; as alias) {{{show}} aliased to {{alias}}}', + }) + class TestComponent { + show: any = true; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('true aliased to true'); + + fixture.componentInstance.show = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1 aliased to 1'); + }); + + it('should not expose the aliased expression to `if` and `else if` blocks', () => { + @Component({ + standalone: true, + template: ` + @if (value === 1; as alias) { + If: {{value}} as {{alias || 'unavailable'}} + } @else if (value === 2) { + ElseIf: {{value}} as {{alias || 'unavailable'}} + } @else { + Else: {{value}} as {{alias || 'unavailable'}} + } + `, + }) + class TestComponent { + value = 1; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent.trim()).toBe('If: 1 as true'); + + fixture.componentInstance.value = 2; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent.trim()).toBe('ElseIf: 2 as unavailable'); + + fixture.componentInstance.value = 3; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent.trim()).toBe('Else: 3 as unavailable'); + }); + + it('should expose the context to nested conditional blocks', () => { + @Component({ + standalone: true, + imports: [MultiplyPipe], + template: ` + @if (value | multiply:2; as root) { + Root: {{value}}/{{root}} + + @if (value | multiply:3; as inner) { + Inner: {{value}}/{{root}}/{{inner}} + + @if (value | multiply:4; as innermost) { + Innermost: {{value}}/{{root}}/{{inner}}/{{innermost}} + } + } + } + `, + }) + class TestComponent { + value = 1; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + let content = fixture.nativeElement.textContent; + expect(content).toContain('Root: 1/2'); + expect(content).toContain('Inner: 1/2/3'); + expect(content).toContain('Innermost: 1/2/3/4'); + + fixture.componentInstance.value = 2; + fixture.detectChanges(); + content = fixture.nativeElement.textContent; + expect(content).toContain('Root: 2/4'); + expect(content).toContain('Inner: 2/4/6'); + expect(content).toContain('Innermost: 2/4/6/8'); + }); + + it('should expose the context to listeners inside nested conditional blocks', () => { + let logs: any[] = []; + + @Component({ + standalone: true, + imports: [MultiplyPipe], + template: ` + @if (value | multiply:2; as root) { + + + @if (value | multiply:3; as inner) { + + + @if (value | multiply:4; as innermost) { + + } + } + } + `, + }) + class TestComponent { + value = 1; + + log(value: any) { + logs.push(value); + } + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + const buttons = Array.from(fixture.nativeElement.querySelectorAll('button')); + buttons.forEach(button => button.click()); + fixture.detectChanges(); + + expect(logs).toEqual([['Root', 1, 2], ['Inner', 1, 2, 3], ['Innermost', 1, 2, 3, 4]]); + + logs = []; + fixture.componentInstance.value = 2; + fixture.detectChanges(); + + buttons.forEach(button => button.click()); + fixture.detectChanges(); + expect(logs).toEqual([['Root', 2, 4], ['Inner', 2, 4, 6], ['Innermost', 2, 4, 6, 8]]); + }); + + it('should expose expression value passed through a pipe in context', () => { + @Component({ + standalone: true, + template: '@if (value | multiply:2; as alias) {{{value}} aliased to {{alias}}}', + imports: [MultiplyPipe], + }) + class TestComponent { + value = 1; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1 aliased to 2'); + + fixture.componentInstance.value = 4; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('4 aliased to 8'); + }); + + // QUESTION: fundamental mismatch between the "template" and "container" concepts + // those 2 calls to the ɵɵtemplate instruction will generate comment nodes and LContainer + it('should destroy all views if there is nothing to display', () => { + @Component({ + standalone: true, + template: '@if (show) {Something}', + }) + class TestComponent { + show = true; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('Something'); + + fixture.componentInstance.show = false; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe(''); + }); + + it('should be able to use pipes in conditional expressions', () => { + @Component({ + standalone: true, + imports: [MultiplyPipe], + template: ` + @if ((value | multiply:2) === 2) { + one + } @else if ((value | multiply:2) === 4) { + two + } @else { + nothing + } + `, + }) + class TestComponent { + value = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent.trim()).toBe('nothing'); + + fixture.componentInstance.value = 2; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent.trim()).toBe('two'); + + fixture.componentInstance.value = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent.trim()).toBe('one'); + }); +}); diff --git a/packages/core/test/acceptance/control_flow_switch_spec.ts b/packages/core/test/acceptance/control_flow_switch_spec.ts new file mode 100644 index 00000000000000..86ea5bf2f353d4 --- /dev/null +++ b/packages/core/test/acceptance/control_flow_switch_spec.ts @@ -0,0 +1,109 @@ +/** + * @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 + */ + +import {Component, Pipe, PipeTransform} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; + +// Basic shared pipe used during testing. +@Pipe({name: 'multiply', pure: true, standalone: true}) +class MultiplyPipe implements PipeTransform { + transform(value: number, amount: number) { + return value * amount; + } +} + +describe('control flow - switch', () => { + it('should show a template based on a matching case', () => { + @Component({ + standalone: true, + template: ` + @switch (case) { + @case (0) {case 0} + @case (1) {case 1} + @default {default} + } + ` + }) + class TestComponent { + case = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('case 0'); + + fixture.componentInstance.case = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('case 1'); + + fixture.componentInstance.case = 5; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('default'); + }); + + it('should be able to use a pipe in the switch expression', () => { + @Component({ + standalone: true, + imports: [MultiplyPipe], + template: ` + @switch (case | multiply:2) { + @case (0) {case 0} + @case (2) {case 2} + @default {default} + } + ` + }) + class TestComponent { + case = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('case 0'); + + fixture.componentInstance.case = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('case 2'); + + fixture.componentInstance.case = 5; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('default'); + }); + + it('should be able to use a pipe in the case expression', () => { + @Component({ + standalone: true, + imports: [MultiplyPipe], + template: ` + @switch (case) { + @case (1 | multiply:2) {case 2} + @case (2 | multiply:2) {case 4} + @default {default} + } + ` + }) + class TestComponent { + case = 0; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + + expect(fixture.nativeElement.textContent).toBe('default'); + + fixture.componentInstance.case = 4; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('case 4'); + + fixture.componentInstance.case = 2; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('case 2'); + }); +}); From 05d1fac41fdc251ac027f9eeb4e806ee3c6aeea4 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 5 Oct 2023 13:29:39 +0200 Subject: [PATCH 55/57] test(core): more tests around built-in for (#52045) Add some more tests around list diffing (created in a different branch while working in the list diffing). PR Close #52045 --- .../test/acceptance/control_flow_for_spec.ts | 220 ++++++++++++------ 1 file changed, 149 insertions(+), 71 deletions(-) diff --git a/packages/core/test/acceptance/control_flow_for_spec.ts b/packages/core/test/acceptance/control_flow_for_spec.ts index f8eab4a2a1eb7f..77f5d95fd25bdf 100644 --- a/packages/core/test/acceptance/control_flow_for_spec.ts +++ b/packages/core/test/acceptance/control_flow_for_spec.ts @@ -96,83 +96,161 @@ describe('control flow - for', () => { expect(fixture.nativeElement.textContent).toBe('Empty'); }); - it('should have access to the host context in the track function', () => { - let offsetReads = 0; + describe('trackBy', () => { + it('should have access to the host context in the track function', () => { + let offsetReads = 0; + + @Component({template: '@for ((item of items); track $index + offset) {{{item}}}'}) + class TestComponent { + items = ['a', 'b', 'c']; + + get offset() { + offsetReads++; + return 0; + } + } - @Component({template: '@for ((item of items); track $index + offset) {{{item}}}'}) - class TestComponent { - items = ['a', 'b', 'c']; + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('abc'); + expect(offsetReads).toBeGreaterThan(0); + + const prevReads = offsetReads; + // explicitly modify the DOM text node to make sure that the list reconciliation algorithm + // based on tracking indices overrides it. + fixture.debugElement.childNodes[1].nativeNode.data = 'x'; + fixture.componentInstance.items.shift(); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('bc'); + expect(offsetReads).toBeGreaterThan(prevReads); + }); + + it('should be able to access component properties in the tracking function from a loop at the root of the template', + () => { + const calls = new Set(); + + @Component({ + template: `@for ((item of items); track trackingFn(item, compProp)) {{{item}}}`, + }) + class TestComponent { + items = ['a', 'b']; + compProp = 'hello'; + + trackingFn(item: string, message: string) { + calls.add(`${item}:${message}`); + return item; + } + } - get offset() { - offsetReads++; - return 0; - } - } + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); + }); + + it('should be able to access component properties in the tracking function from a nested template', + () => { + const calls = new Set(); + + @Component({ + template: ` + @if (true) { + @if (true) { + @if (true) { + @for ((item of items); track trackingFn(item, compProp)) {{{item}}} + } + } + } + `, + }) + class TestComponent { + items = ['a', 'b']; + compProp = 'hello'; + + trackingFn(item: string, message: string) { + calls.add(`${item}:${message}`); + return item; + } + } - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('abc'); - expect(offsetReads).toBeGreaterThan(0); - - const prevReads = offsetReads; - // explicitly modify the DOM text node to make sure that the list reconciliation algorithm - // based on tracking indices overrides it. - fixture.debugElement.childNodes[1].nativeNode.data = 'x'; - fixture.componentInstance.items.shift(); - fixture.detectChanges(); - expect(fixture.nativeElement.textContent).toBe('bc'); - expect(offsetReads).toBeGreaterThan(prevReads); + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); + }); }); - it('should be able to access component properties in the tracking function from a loop at the root of the template', - () => { - const calls = new Set(); + describe('list diffing and view operations', () => { + it('should delete views in the middle', () => { + @Component({ + template: '@for (item of items; track item; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 2, 3]; + } - @Component({ - template: `@for ((item of items); track trackingFn(item, compProp)) {{{item}}}`, - }) - class TestComponent { - items = ['a', 'b']; - compProp = 'hello'; + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + + // delete in the middle + fixture.componentInstance.items.splice(1, 1); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|3(1)|'); + }); + + it('should insert views in the middle', () => { + @Component({ + template: '@for (item of items; track item; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 3]; + } - trackingFn(item: string, message: string) { - calls.add(`${item}:${message}`); - return item; - } - } - - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); - }); - - it('should be able to access component properties in the tracking function from a nested template', - () => { - const calls = new Set(); - - @Component({ - template: ` - @if (true) { - @if (true) { - @if (true) { - @for ((item of items); track trackingFn(item, compProp)) {{{item}}} - } - } - } - `, - }) - class TestComponent { - items = ['a', 'b']; - compProp = 'hello'; - - trackingFn(item: string, message: string) { - calls.add(`${item}:${message}`); - return item; - } - } + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|3(1)|'); + + + // add in the middle + fixture.componentInstance.items.splice(1, 0, 2); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); + }); + + it('should replace different items', () => { + @Component({ + template: '@for (item of items; track item; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 2, 3]; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|'); - const fixture = TestBed.createComponent(TestComponent); - fixture.detectChanges(); - expect([...calls].sort()).toEqual(['a:hello', 'b:hello']); - }); + + // an item in the middle stays the same, the rest gets replaced + fixture.componentInstance.items = [5, 2, 7]; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('5(0)|2(1)|7(2)|'); + }); + + it('should move and delete items', () => { + @Component({ + template: '@for (item of items; track item; let idx = $index) {{{item}}({{idx}})|}', + }) + class TestComponent { + items = [1, 2, 3, 4, 5, 6]; + } + + const fixture = TestBed.createComponent(TestComponent); + fixture.detectChanges(false); + expect(fixture.nativeElement.textContent).toBe('1(0)|2(1)|3(2)|4(3)|5(4)|6(5)|'); + + // move 5 and do some other delete other operations + fixture.componentInstance.items = [5, 3, 7]; + fixture.detectChanges(); + expect(fixture.nativeElement.textContent).toBe('5(0)|3(1)|7(2)|'); + }); + }); }); From 760bfdc4bfec924a4cb3cb60aeb229fc6093a6e9 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 4 Oct 2023 14:49:50 -0700 Subject: [PATCH 56/57] refactor(http): warn when `HttpClient` doesn't use fetch during SSR (#52037) This commit adds a logic to produce a warning in case HttpClient doesn't use fetch during SSR. It's recommended to use `fetch` for performance and compatibility reasons. PR Close #52037 --- goldens/public-api/common/http/errors.md | 4 +- packages/common/http/src/errors.ts | 1 + packages/common/http/src/interceptor.ts | 30 +++++++++- packages/common/http/test/provider_spec.ts | 67 +++++++++++++++++++++- 4 files changed, 97 insertions(+), 5 deletions(-) diff --git a/goldens/public-api/common/http/errors.md b/goldens/public-api/common/http/errors.md index ae48758405b8ee..d361cc89d86112 100644 --- a/goldens/public-api/common/http/errors.md +++ b/goldens/public-api/common/http/errors.md @@ -7,7 +7,9 @@ // @public export const enum RuntimeErrorCode { // (undocumented) - MISSING_JSONP_MODULE = -2800 + MISSING_JSONP_MODULE = -2800, + // (undocumented) + NOT_USING_FETCH_BACKEND_IN_SSR = 2801 } // (No @packageDocumentation comment for this package) diff --git a/packages/common/http/src/errors.ts b/packages/common/http/src/errors.ts index 3a0f584ec73eb9..3b0964dcbcf0d5 100644 --- a/packages/common/http/src/errors.ts +++ b/packages/common/http/src/errors.ts @@ -12,4 +12,5 @@ */ export const enum RuntimeErrorCode { MISSING_JSONP_MODULE = -2800, + NOT_USING_FETCH_BACKEND_IN_SSR = 2801, } diff --git a/packages/common/http/src/interceptor.ts b/packages/common/http/src/interceptor.ts index faf868e122b078..8d83eb5f5a2fb5 100644 --- a/packages/common/http/src/interceptor.ts +++ b/packages/common/http/src/interceptor.ts @@ -6,11 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ -import {EnvironmentInjector, inject, Injectable, InjectionToken, ɵInitialRenderPendingTasks as InitialRenderPendingTasks} from '@angular/core'; +import {isPlatformServer} from '@angular/common'; +import {EnvironmentInjector, inject, Injectable, InjectionToken, PLATFORM_ID, ɵConsole as Console, ɵformatRuntimeError as formatRuntimeError, ɵInitialRenderPendingTasks as InitialRenderPendingTasks} from '@angular/core'; import {Observable} from 'rxjs'; import {finalize} from 'rxjs/operators'; import {HttpBackend, HttpHandler} from './backend'; +import {RuntimeErrorCode} from './errors'; +import {FetchBackend} from './fetch'; import {HttpRequest} from './request'; import {HttpEvent} from './response'; @@ -220,6 +223,13 @@ export function legacyInterceptorFnFactory(): HttpInterceptorFn { }; } +let fetchBackendWarningDisplayed = false; + +/** Internal function to reset the flag in tests */ +export function resetFetchBackendWarningFlag() { + fetchBackendWarningDisplayed = false; +} + @Injectable() export class HttpInterceptorHandler extends HttpHandler { private chain: ChainedInterceptorFn|null = null; @@ -233,6 +243,24 @@ export class HttpInterceptorHandler extends HttpHandler { // is used. const primaryHttpBackend = inject(PRIMARY_HTTP_BACKEND, {optional: true}); this.backend = primaryHttpBackend ?? backend; + + // We strongly recommend using fetch backend for HTTP calls when SSR is used + // for an application. The logic below checks if that's the case and produces + // a warning otherwise. + if ((typeof ngDevMode === 'undefined' || ngDevMode) && !fetchBackendWarningDisplayed) { + const isServer = isPlatformServer(injector.get(PLATFORM_ID)); + if (isServer && !(this.backend instanceof FetchBackend)) { + fetchBackendWarningDisplayed = true; + injector.get(Console).warn(formatRuntimeError( + RuntimeErrorCode.NOT_USING_FETCH_BACKEND_IN_SSR, + 'Angular detected that `HttpClient` is not configured ' + + 'to use `fetch` APIs. It\'s strongly recommended to ' + + 'enable `fetch` for applications that use Server-Side Rendering ' + + 'for better performance and compatibility. ' + + 'To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` ' + + 'call at the root of the application.')); + } + } } override handle(initialRequest: HttpRequest): Observable> { diff --git a/packages/common/http/test/provider_spec.ts b/packages/common/http/test/provider_spec.ts index 3bcafba91af6d0..f0c1fe14ba589d 100644 --- a/packages/common/http/test/provider_spec.ts +++ b/packages/common/http/test/provider_spec.ts @@ -13,10 +13,10 @@ import {createEnvironmentInjector, EnvironmentInjector, inject, InjectionToken, import {TestBed} from '@angular/core/testing'; import {EMPTY, Observable} from 'rxjs'; -import {HttpInterceptorFn} from '../src/interceptor'; +import {HttpInterceptorFn, resetFetchBackendWarningFlag} from '../src/interceptor'; import {provideHttpClient, withFetch, withInterceptors, withInterceptorsFromDi, withJsonpSupport, withNoXsrfProtection, withRequestsMadeViaParent, withXsrfConfiguration} from '../src/provider'; -describe('provideHttp', () => { +describe('provideHttpClient', () => { beforeEach(() => { setCookie(''); TestBed.resetTestingModule(); @@ -390,10 +390,25 @@ describe('provideHttp', () => { describe('fetch support', () => { it('withFetch', () => { + resetFetchBackendWarningFlag(); + + const consoleWarnSpy = spyOn(console, 'warn'); + TestBed.resetTestingModule(); - TestBed.configureTestingModule({providers: [provideHttpClient(withFetch())]}); + TestBed.configureTestingModule({ + providers: [ + // Setting this flag to verify that there are no + // `console.warn` produced for cases when `fetch` + // is enabled and we are running in a browser. + {provide: PLATFORM_ID, useValue: 'browser'}, + provideHttpClient(withFetch()), + ] + }); const fetchBackend = TestBed.inject(HttpBackend); expect(fetchBackend).toBeInstanceOf(FetchBackend); + + // Make sure there are no warnings produced. + expect(consoleWarnSpy.calls.count()).toBe(0); }); it('withFetch should always override the backend', () => { @@ -411,6 +426,52 @@ describe('provideHttp', () => { const handler = TestBed.inject(HttpHandler); expect((handler as any).backend).toBeInstanceOf(FetchBackend); }); + + it('should not warn if fetch is not configured when running in a browser', () => { + resetFetchBackendWarningFlag(); + + const consoleWarnSpy = spyOn(console, 'warn'); + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + // Setting this flag to verify that there are no + // `console.warn` produced for cases when `fetch` + // is enabled and we are running in a browser. + {provide: PLATFORM_ID, useValue: 'browser'}, + provideHttpClient(), + ] + }); + + TestBed.inject(HttpHandler); + + // Make sure there are no warnings produced. + expect(consoleWarnSpy.calls.count()).toBe(0); + }); + + it('should warn during SSR if fetch is not configured', () => { + resetFetchBackendWarningFlag(); + + const consoleWarnSpy = spyOn(console, 'warn'); + + TestBed.resetTestingModule(); + TestBed.configureTestingModule({ + providers: [ + // Setting this flag to verify that there is a + // `console.warn` produced in case `fetch` is not + // enabled while running code on the server. + {provide: PLATFORM_ID, useValue: 'server'}, + provideHttpClient(), + ] + }); + + TestBed.inject(HttpHandler); + + expect(consoleWarnSpy.calls.count()).toBe(1); + expect(consoleWarnSpy.calls.argsFor(0)[0]) + .toContain( + 'NG02801: Angular detected that `HttpClient` is not configured to use `fetch` APIs.'); + }); }); }); From 22fa9fe488dd72b2f65b8a3951d492c1f178b387 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 5 Oct 2023 11:53:11 -0700 Subject: [PATCH 57/57] docs: recommend enabling `fetch` support in HttpClient when using SSR (#52056) PR Close #52056 --- packages/common/http/src/provider.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/common/http/src/provider.ts b/packages/common/http/src/provider.ts index b7e61511fcc7e2..90e942b2969615 100644 --- a/packages/common/http/src/provider.ts +++ b/packages/common/http/src/provider.ts @@ -57,6 +57,19 @@ function makeHttpFeature( * feature functions to `provideHttpClient`. For example, HTTP interceptors can be added using the * `withInterceptors(...)` feature. * + *
+ * + * It's strongly recommended to enable + * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API) for applications that use + * Server-Side Rendering for better performance and compatibility. To enable `fetch`, add + * `withFetch()` feature to the `provideHttpClient()` call at the root of the application: + * + * ``` + * provideHttpClient(withFetch()); + * ``` + * + *
+ * * @see {@link withInterceptors} * @see {@link withInterceptorsFromDi} * @see {@link withXsrfConfiguration}