diff --git a/.github/workflows/build-dev-app.yml b/.github/workflows/build-dev-app.yml index b4f66ba4fe10..aaa8689de703 100644 --- a/.github/workflows/build-dev-app.yml +++ b/.github/workflows/build-dev-app.yml @@ -34,7 +34,7 @@ jobs: # the number of concurrent actions is determined based on the host resources. - run: bazel build //src/dev-app:web_package --symlink_prefix=dist/ --jobs=32 - - uses: angular/dev-infra/github-actions/deploy-previews/pack-and-upload-artifact@9931e1a8d1b62fcd2267e89f9993a494856cc1cd + - uses: angular/dev-infra/github-actions/previews/pack-and-upload-artifact@9931e1a8d1b62fcd2267e89f9993a494856cc1cd with: workflow-artifact-name: 'dev-app' pull-number: '${{github.event.pull_request.number}}' diff --git a/.github/workflows/deploy-dev-app.yml b/.github/workflows/deploy-dev-app.yml index f5ebf5d7f970..d538c9c49dea 100644 --- a/.github/workflows/deploy-dev-app.yml +++ b/.github/workflows/deploy-dev-app.yml @@ -33,7 +33,7 @@ jobs: npx -y firebase-tools@latest target:clear --project ${{env.PREVIEW_PROJECT}} hosting dev-app npx -y firebase-tools@latest target:apply --project ${{env.PREVIEW_PROJECT}} hosting dev-app ${{env.PREVIEW_SITE}} - - uses: angular/dev-infra/github-actions/deploy-previews/upload-artifacts-to-firebase@9931e1a8d1b62fcd2267e89f9993a494856cc1cd + - uses: angular/dev-infra/github-actions/previews/upload-artifacts-to-firebase@9931e1a8d1b62fcd2267e89f9993a494856cc1cd with: github-token: '${{secrets.GITHUB_TOKEN}}' workflow-artifact-name: 'dev-app' diff --git a/.stylelintrc.json b/.stylelintrc.json index 29b064b77863..40a5afcb9783 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -11,7 +11,6 @@ "./tools/stylelint/no-nested-mixin.ts", "./tools/stylelint/no-concrete-rules.ts", "./tools/stylelint/no-top-level-ampersand-in-mixin.ts", - "./tools/stylelint/theme-mixin-api.ts", "./tools/stylelint/no-import.ts", "./tools/stylelint/single-line-comment-only.ts", "./tools/stylelint/no-unused-import.ts", @@ -33,7 +32,6 @@ "filePattern": "**/!(*-example.css)" } ], - "material/theme-mixin-api": true, "material/selector-no-deep": true, "material/no-nested-mixin": true, "material/no-unused-import": true, @@ -143,38 +141,5 @@ "resolveNestedSelectors": true } ] - }, - "overrides": [ - { - "files": [ - "**/_button-theme.scss", - "**/_card-theme.scss", - "**/_checkbox-theme.scss", - "**/_column-resize-theme.scss", - "**/_core-theme.scss", - "**/_datepicker-theme.scss", - "**/_fab-theme.scss", - "**/_form-field-theme.scss", - "**/_icon-button-theme.scss", - "**/_input-theme.scss", - "**/_list-theme.scss", - "**/_optgroup-theme.scss", - "**/_option-theme.scss", - "**/_paginator-theme.scss", - "**/_popover-edit-theme.scss", - "**/_progress-bar-theme.scss", - "**/_pseudo-checkbox-theme.scss", - "**/_radio-theme.scss", - "**/_ripple-theme.scss", - "**/_slide-toggle-theme.scss", - "**/_slider-theme.scss", - "**/_sort-theme.scss", - "**/_stepper-theme.scss", - "**/_tree-theme.scss" - ], - "rules": { - "material/theme-mixin-api": false - } - } - ] + } } diff --git a/CHANGELOG.md b/CHANGELOG.md index c88fa574a599..25c9632b7710 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,89 @@ + +# 17.0.0-next.4 "titanium-turtle" (2023-09-20) +### cdk +| Commit | Type | Description | +| -- | -- | -- | +| [2409e7071](https://github.com/angular/components/commit/2409e7071a4c1e035a6f212249e96ba36d7aeb4f) | fix | **schematics:** account for single string in styles and new styleUrl ([#27798](https://github.com/angular/components/pull/27798)) | +| [31187abae](https://github.com/angular/components/commit/31187abae619cf76e7f0a7771ca6e5900a50e90c) | fix | **scrolling:** unsubscribe from scrolled stream when viewport is destroyed ([#27800](https://github.com/angular/components/pull/27800)) | +### material +| Commit | Type | Description | +| -- | -- | -- | +| [8c3d8d645](https://github.com/angular/components/commit/8c3d8d645857a381cb2a752a600796c36338ea9e) | fix | **form-field:** style the cursor the same way as the rest of the input ([#26491](https://github.com/angular/components/pull/26491)) ([#27795](https://github.com/angular/components/pull/27795)) | +| [c7db4960e](https://github.com/angular/components/commit/c7db4960e16d0f74b0764cfa5be752392e8c30f6) | fix | **list:** Emit tokens under mixin root selector ([#27711](https://github.com/angular/components/pull/27711)) | + + + + +# 16.2.5 "cardboard-plane" (2023-09-20) +### cdk +| Commit | Type | Description | +| -- | -- | -- | +| [80acf7910](https://github.com/angular/components/commit/80acf7910bfd114a129995551b19574a9844f583) | fix | **scrolling:** unsubscribe from scrolled stream when viewport is destroyed ([#27800](https://github.com/angular/components/pull/27800)) | +### material +| Commit | Type | Description | +| -- | -- | -- | +| [158d5f37a](https://github.com/angular/components/commit/158d5f37abfcf457720c79558aee9215fb26607d) | fix | **form-field:** style the cursor the same way as the rest of the input ([#26491](https://github.com/angular/components/pull/26491)) ([#27795](https://github.com/angular/components/pull/27795)) | + + + + +# 17.0.0-next.3 "rock-rock" (2023-09-13) +### material +| Commit | Type | Description | +| -- | -- | -- | +| [db06fa8d89](https://github.com/angular/components/commit/db06fa8d8939d793f598bc3dbedc96a5a71c0db0) | fix | **autocomplete:** requireSelection incorrectly resetting value when there are no options ([#27781](https://github.com/angular/components/pull/27781)) | + + + + +# 16.2.4 "wood-wagon" (2023-09-13) +### material +| Commit | Type | Description | +| -- | -- | -- | +| [38ebf49060](https://github.com/angular/components/commit/38ebf4906057b2e7ad6d6cec881268339f43c972) | fix | **autocomplete:** requireSelection incorrectly resetting value when there are no options ([#27781](https://github.com/angular/components/pull/27781)) | + + + + +# 17.0.0-next.2 "metal-monkey" (2023-09-07) +## Breaking Changes +### multiple +- - Themes are now more strictly validated when calling Angular Material + theme mixins. For example, calling `mat.button-typography` with a theme + has `typography: null` is now an error. + - The `mat.legacy-typography-hierarchy` mixin has been removed in favor + of `mat.typography-hierarchy` +### material +| Commit | Type | Description | +| -- | -- | -- | +| [cac7a41f7b](https://github.com/angular/components/commit/cac7a41f7b7a6034d8049be77fe53a082c3aa5f2) | fix | **dialog:** css structure change ([#27510](https://github.com/angular/components/pull/27510)) | +| [726fc069e3](https://github.com/angular/components/commit/726fc069e3bed2fcbc9b53de02ee7ce18c2fce5d) | fix | **tabs:** add aria-hidden to inactive tabs ([#27742](https://github.com/angular/components/pull/27742)) | +### cdk +| Commit | Type | Description | +| -- | -- | -- | +| [aa1d01d169](https://github.com/angular/components/commit/aa1d01d1696360d25e18cb0328f56b9fca9d71c4) | fix | **drag-drop:** constrainPosition now working well with boundary ([#27730](https://github.com/angular/components/pull/27730)) | +| [8eb494e975](https://github.com/angular/components/commit/8eb494e975bb75e52c9c81ad68d3d4b993546dfe) | fix | **menu:** run change detection for changes to overlay ref of trigger ([#27726](https://github.com/angular/components/pull/27726)) | +### multiple +| Commit | Type | Description | +| -- | -- | -- | +| [90465a1882](https://github.com/angular/components/commit/90465a1882028144a8e56eabc03b4cc93947df9f) | refactor | convert components to theme inspection API (round 4) ([#27740](https://github.com/angular/components/pull/27740)) | + + + + +# 16.2.3 "plastic-part" (2023-09-07) +### cdk +| Commit | Type | Description | +| -- | -- | -- | +| [ffd4209318](https://github.com/angular/components/commit/ffd4209318cdc5dc3e1e247698712679ebdf93d7) | fix | **drag-drop:** constrainPosition now working well with boundary ([#27730](https://github.com/angular/components/pull/27730)) | +| [08dd2322ac](https://github.com/angular/components/commit/08dd2322accbac10cdb93181d51770cb4db7cf68) | fix | **menu:** run change detection for changes to overlay ref of trigger ([#27726](https://github.com/angular/components/pull/27726)) | +### material +| Commit | Type | Description | +| -- | -- | -- | +| [72a5d1eedc](https://github.com/angular/components/commit/72a5d1eedc090cbd08d3aaed30cea6c05601272e) | fix | **tabs:** add aria-hidden to inactive tabs ([#27742](https://github.com/angular/components/pull/27742)) | + + + # 16.2.2 "baryte-barnacle" (2023-08-30) ### cdk diff --git a/integration/ng-add-standalone/BUILD.bazel b/integration/ng-add-standalone/BUILD.bazel index 7c3b72becc47..60f89634de2c 100644 --- a/integration/ng-add-standalone/BUILD.bazel +++ b/integration/ng-add-standalone/BUILD.bazel @@ -25,7 +25,7 @@ node_integration_test( # Generate a new standalone project with the default options. # Skip installation since we installed the dependencies already. - "yarn ng new --defaults --standalone --skip-install --style=scss --name=%s" % APP_NAME, + "yarn ng new --defaults --standalone --skip-install --style=scss --skip-git --name=%s" % APP_NAME, # Delete the package.json that the CLI generated since we want to use the existing one. "rm -f %s/package.json" % APP_NAME, # Delete the Karma config since we need to use a headless browser. diff --git a/integration/ng-add-standalone/_angular.json b/integration/ng-add-standalone/_angular.json index 6bf2d373a7e8..89c9f37927ef 100644 --- a/integration/ng-add-standalone/_angular.json +++ b/integration/ng-add-standalone/_angular.json @@ -22,11 +22,11 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/ng-add-standalone", "index": "src/index.html", - "main": "src/main.ts", + "browser": "src/main.ts", "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", @@ -51,12 +51,9 @@ "outputHashing": "all" }, "development": { - "buildOptimizer": false, "optimization": false, - "vendorChunk": true, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true } }, "defaultConfiguration": "production" diff --git a/integration/ng-add-standalone/package.json b/integration/ng-add-standalone/package.json index 7c5d992df9d2..e1c5ee01f262 100644 --- a/integration/ng-add-standalone/package.json +++ b/integration/ng-add-standalone/package.json @@ -10,24 +10,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.0.0-next.7", + "@angular/animations": "^17.0.0-next.4", "@angular/cdk": "file:../../dist/releases/cdk", - "@angular/common": "^16.0.0-next.7", - "@angular/compiler": "^16.0.0-next.7", - "@angular/core": "^16.0.0-next.7", - "@angular/forms": "^16.0.0-next.7", + "@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/material": "file:../../dist/releases/material", - "@angular/platform-browser": "^16.0.0-next.7", - "@angular/platform-browser-dynamic": "^16.0.0-next.7", - "@angular/router": "^16.0.0-next.7", + "@angular/platform-browser": "^17.0.0-next.4", + "@angular/platform-browser-dynamic": "^17.0.0-next.4", + "@angular/router": "^17.0.0-next.4", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.0-next.7", - "@angular/cli": "~16.0.0-next.7", - "@angular/compiler-cli": "^16.0.0-next.7", + "@angular-devkit/build-angular": "^17.0.0-next.4", + "@angular/cli": "^17.0.0-next.4", + "@angular/compiler-cli": "^17.0.0-next.4", "@types/jasmine": "~4.3.0", "jasmine-core": "~4.6.0", "karma": "~6.4.0", diff --git a/integration/ng-add-standalone/yarn.lock b/integration/ng-add-standalone/yarn.lock index 984ab1081ffe..6acd0e9c0283 100644 --- a/integration/ng-add-standalone/yarn.lock +++ b/integration/ng-add-standalone/yarn.lock @@ -2,15 +2,7 @@ # yarn lockfile v1 -"@ampproject/remapping@2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@ampproject/remapping@^2.1.0", "@ampproject/remapping@^2.2.0": +"@ampproject/remapping@2.2.1", "@ampproject/remapping@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== @@ -18,118 +10,122 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1600.0-next.7": - version "0.1600.0-next.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1600.0-next.7.tgz#5fc753941ac0db2f012be58503cdb5be14c086e4" - integrity sha512-O8Cz66V8Xb07Q6j836diDRO03zc7XthpCrCa4MJkcD+m0sgaJm1fwsOZBb+DyBBKhzeOE4eIQjo+BlZNv/9Uvw== - dependencies: - "@angular-devkit/core" "16.0.0-next.7" - rxjs "7.8.0" - -"@angular-devkit/build-angular@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-16.0.0-next.7.tgz#fb3f0cb8cbd4989f9594b391d335bd6c4760133f" - integrity sha512-ROmyZPiyohYpc74yQ9Gw2Lio3pQeCLOJhGZGUr6/3F0/ZZ1POpWW9MjBg9qO129nrHMYVcI+yAVgT8xNa6my7Q== - dependencies: - "@ampproject/remapping" "2.2.0" - "@angular-devkit/architect" "0.1600.0-next.7" - "@angular-devkit/build-webpack" "0.1600.0-next.7" - "@angular-devkit/core" "16.0.0-next.7" - "@babel/core" "7.21.4" - "@babel/generator" "7.21.4" - "@babel/helper-annotate-as-pure" "7.18.6" - "@babel/helper-split-export-declaration" "7.18.6" - "@babel/plugin-proposal-async-generator-functions" "7.20.7" - "@babel/plugin-transform-async-to-generator" "7.20.7" - "@babel/plugin-transform-runtime" "7.21.4" - "@babel/preset-env" "7.21.4" - "@babel/runtime" "7.21.0" - "@babel/template" "7.20.7" +"@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== + dependencies: + "@angular-devkit/core" "17.0.0-next.4" + 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== + 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" + "@babel/core" "7.22.17" + "@babel/generator" "7.22.15" + "@babel/helper-annotate-as-pure" "7.22.5" + "@babel/helper-split-export-declaration" "7.22.6" + "@babel/plugin-transform-async-generator-functions" "7.22.15" + "@babel/plugin-transform-async-to-generator" "7.22.5" + "@babel/plugin-transform-runtime" "7.22.15" + "@babel/preset-env" "7.22.15" + "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "16.0.0-next.7" + "@ngtools/webpack" "17.0.0-next.4" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" - autoprefixer "10.4.14" - babel-loader "9.1.2" + autoprefixer "10.4.15" + babel-loader "9.1.3" babel-plugin-istanbul "6.1.1" - browserslist "4.21.5" - cacache "17.0.4" + browser-sync "2.29.3" + browserslist "^4.21.5" chokidar "3.5.3" copy-webpack-plugin "11.0.0" - critters "0.0.16" - css-loader "6.7.3" - esbuild-wasm "0.17.15" - glob "8.1.0" - https-proxy-agent "5.0.1" - inquirer "8.2.4" + critters "0.0.20" + css-loader "6.8.1" + esbuild-wasm "0.19.2" + 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" jsonc-parser "3.2.0" karma-source-map-support "1.4.0" - less "4.1.3" + less "4.2.0" less-loader "11.1.0" license-webpack-plugin "4.0.2" loader-utils "3.2.1" - magic-string "0.30.0" - mini-css-extract-plugin "2.7.5" + magic-string "0.30.3" + mini-css-extract-plugin "2.7.6" + mrmime "1.0.1" open "8.4.2" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" - piscina "3.2.0" - postcss "8.4.21" - postcss-loader "7.2.3" + picomatch "2.3.1" + piscina "4.1.0" + postcss "8.4.29" + postcss-loader "7.3.3" resolve-url-loader "5.0.0" - rxjs "7.8.0" - sass "1.60.0" - sass-loader "13.2.2" - semver "7.3.8" + rxjs "7.8.1" + sass "1.66.1" + sass-loader "13.3.2" + semver "7.5.4" source-map-loader "4.0.1" source-map-support "0.5.21" - terser "5.16.8" + terser "5.19.4" text-table "0.2.0" tree-kill "1.2.2" - tslib "2.5.0" - vite "4.2.1" - webpack "5.77.0" - webpack-dev-middleware "6.0.2" - webpack-dev-server "4.13.2" - webpack-merge "5.8.0" + tslib "2.6.2" + vite "4.4.9" + webpack "5.88.2" + webpack-dev-middleware "6.1.1" + webpack-dev-server "4.15.1" + webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.17.15" + esbuild "0.19.2" -"@angular-devkit/build-webpack@0.1600.0-next.7": - version "0.1600.0-next.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1600.0-next.7.tgz#f8233da68ba4c129f64c2180a01c6d1007ecdcd6" - integrity sha512-Y78hu/ne85qxYxGFBhp+00+hHnK4Y2MFljlg1JyMPFol0NL/Lsyfg+oTFSbg9X23xIz+feVq1WsHdEuCcjpbVQ== +"@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== dependencies: - "@angular-devkit/architect" "0.1600.0-next.7" - rxjs "7.8.0" + "@angular-devkit/architect" "0.1700.0-next.4" + rxjs "7.8.1" -"@angular-devkit/core@16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-16.0.0-next.7.tgz#37e989bde75f6c833863b06d100c8388594af215" - integrity sha512-ZTG1t2b6QM0F0qU4OJQvvX2555NzQuqTqOQvPszPgL7iLXppZ9QXU7sV+kASHZH6oGgAj0E8Cw961H3cZBRZbQ== +"@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== dependencies: ajv "8.12.0" ajv-formats "2.1.1" jsonc-parser "3.2.0" - rxjs "7.8.0" + picomatch "2.3.1" + rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-16.0.0-next.7.tgz#90ee0441c397c207c10da2beb1d35d6b799150c9" - integrity sha512-qckzFR0xifyDPcNZqrvWaw5BF3jjW2H3zYTE/0Mja6c8EUQ7x+AjWkW7/Afnz5axGAIW7uJaYEEw0Y6/k+SV8Q== +"@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== dependencies: - "@angular-devkit/core" "16.0.0-next.7" + "@angular-devkit/core" "17.0.0-next.4" jsonc-parser "3.2.0" - magic-string "0.30.0" + magic-string "0.30.3" ora "5.4.1" - rxjs "7.8.0" + rxjs "7.8.1" -"@angular/animations@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-16.0.0-next.7.tgz#9786d8dac13c26fb193601df4dd331eaa4a180e3" - integrity sha512-Lq7ys3cQ1RsI8IJ+uDaFSGDWHVGV+n6kMk3hxIN62bhGtwvj2AYdbbjJskTcNCFbK3RAscjp2VevC/A4Eb2i6w== +"@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== dependencies: tslib "^2.3.0" @@ -140,43 +136,43 @@ optionalDependencies: parse5 "^7.1.2" -"@angular/cli@~16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-16.0.0-next.7.tgz#79cfe4ab201407896a92ab5cd6f16cc8a73a6941" - integrity sha512-ZSEtob/3SAmCXQG5/57QyxnzzXZuPmXdUJszl0imQfzbIPT4f2iRWQs8Yz4O7FC5KvVhO8418/3lcsoKfJjrBw== +"@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== dependencies: - "@angular-devkit/architect" "0.1600.0-next.7" - "@angular-devkit/core" "16.0.0-next.7" - "@angular-devkit/schematics" "16.0.0-next.7" - "@schematics/angular" "16.0.0-next.7" + "@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" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" - ini "4.0.0" - inquirer "8.2.4" + ini "4.1.1" + inquirer "8.2.6" jsonc-parser "3.2.0" - npm-package-arg "10.1.0" - npm-pick-manifest "8.0.1" + npm-package-arg "11.0.1" + npm-pick-manifest "9.0.0" open "8.4.2" ora "5.4.1" - pacote "15.1.1" - resolve "1.22.1" - semver "7.3.8" + pacote "17.0.4" + resolve "1.22.4" + semver "7.5.4" symbol-observable "4.0.0" - yargs "17.7.1" + yargs "17.7.2" -"@angular/common@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-16.0.0-next.7.tgz#661f1bd47e27a80ecf89281ce99e3937ef7a9f99" - integrity sha512-ZhhGCF7hfiIauj/LaSs5QreNhgcMBjfNxiYSCc77aRsFhyQ5quiPqpi/c3X8j3DNjklHG7GZ42OkrDKaewdhkQ== +"@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== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-16.0.0-next.7.tgz#b99504ede7e4e3620dc5087b83a357ec8ad79aac" - integrity sha512-fLAKwSb1iN4sbRx2B75pTV/sYS4Vph2zqepEPdkKX651FRlyNCg+K2Qel+sn0Rk+MZfvNjzQUkQpzxYvJV8FhA== +"@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== dependencies: - "@babel/core" "7.19.3" + "@babel/core" "7.22.5" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" @@ -185,24 +181,24 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-16.0.0-next.7.tgz#15058e4390defb5db094d64e1a2f9c9587691533" - integrity sha512-u3dTbPbpxHlXUL/jYh5bO2/bmJBKjQDDLqe6wMNzXW0yY4cJxmhsEElqpZQF+7Xdjyug0uvQn5chAoLuNOn5ng== +"@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== dependencies: tslib "^2.3.0" -"@angular/core@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-16.0.0-next.7.tgz#f1fca1309d4194ad8f6b5e4b0c06fc6737fbcd7e" - integrity sha512-promQyWZm1UvTpX7jgW9glTHqY+F0FLYQ/FVY5h2v+JQ+srVxGQ3MhXVLygo7KxDnxZjGtcZ+INyFjJ6SquPbA== +"@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== dependencies: tslib "^2.3.0" -"@angular/forms@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-16.0.0-next.7.tgz#4f9ef2e86c60f1319242ceec009d66befc73a290" - integrity sha512-IsN5B/ASrfvMdMq+19ObvDAmwoySigTOOjNGwId4x+CE2SVPPazeL70fPHaPhQkKwqVecdEL4/Vo068nybJG9w== +"@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== dependencies: tslib "^2.3.0" @@ -258,24 +254,24 @@ "@material/typography" "15.0.0-canary.3b5b55e31.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.0.0-next.7.tgz#619c48578c0e93f295963a79bc5085d4faa6887c" - integrity sha512-0RdGjHkLBbwKkddQA4f3YNAcFzgJmJWTKvg0GQ2WNSgfbdY9VNlouF1YHh7GHOjqg+rPRn0dr6o7Mm+zD2ejCw== +"@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== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-16.0.0-next.7.tgz#30c280ebe1629d6e44d2b709bde4de8c46afef0e" - integrity sha512-BT0VGVVhtl9ioLaCPizZ3w38D7Gm0KT6kF6XtovkhDJBftlTq568H3jH8TV0sRY89QgSsPzkPs6tMTuD13DUFQ== +"@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== dependencies: tslib "^2.3.0" -"@angular/router@^16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-16.0.0-next.7.tgz#085efdcb49d60c986c59ae1a9c501076e5021a9b" - integrity sha512-BOhP54J9y1KBerdIF9eLOQpLgdulLtN14figqXsSvOgPBKoANRHYEVlD0o1mUbxyUk+ehAgHKMY8O3/RqIS5rg== +"@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== dependencies: tslib "^2.3.0" @@ -291,33 +287,67 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.4": +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== -"@babel/core@7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== +"@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/core@7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.17.tgz#2f9b0b395985967203514b24ee50f9fd0639c866" + integrity sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ== dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@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.17" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.17" + "@babel/types" "^7.22.17" + 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/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== + 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" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/core@7.21.4", "@babel/core@^7.12.3": +"@babel/core@^7.12.3": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== @@ -338,7 +368,17 @@ json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@7.21.4", "@babel/generator@^7.19.3", "@babel/generator@^7.21.4": +"@babel/generator@7.22.15", "@babel/generator@^7.22.15", "@babel/generator@^7.22.5": + 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.15" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/generator@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== @@ -348,22 +388,28 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": +"@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" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + 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/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.4": +"@babel/helper-compilation-targets@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== @@ -374,21 +420,33 @@ lru-cache "^5.1.1" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== +"@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== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + 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.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.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" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== @@ -396,31 +454,37 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-create-regexp-features-plugin@^7.22.5": + 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-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" +"@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-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": +"@babel/helper-function-name@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== @@ -428,6 +492,14 @@ "@babel/template" "^7.20.7" "@babel/types" "^7.21.0" +"@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" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -435,21 +507,35 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@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" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.21.0" + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.22.5": + 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.15" -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": +"@babel/helper-module-imports@^7.18.6": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== dependencies: "@babel/types" "^7.21.4" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": +"@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.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== @@ -463,39 +549,51 @@ "@babel/traverse" "^7.21.2" "@babel/types" "^7.21.2" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + 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/types" "^7.18.6" + "@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-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.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@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" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@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.18.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz#dabaa50622b3b4670bd6546fc8db23eb12d89da0" + integrity sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.17" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@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== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.20.2": version "7.20.2" @@ -504,14 +602,28 @@ dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": +"@babel/helper-split-export-declaration@7.22.6", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -523,27 +635,41 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + 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.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": + 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-option@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== +"@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-wrap-function@^7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz#222ac3ff9cc8f9b617cc1e5db75c0b538e722801" + integrity sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q== dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.17" -"@babel/helpers@^7.19.0", "@babel/helpers@^7.21.0": +"@babel/helpers@^7.21.0": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== @@ -552,6 +678,15 @@ "@babel/traverse" "^7.21.0" "@babel/types" "^7.21.0" +"@babel/helpers@^7.22.15", "@babel/helpers@^7.22.5": + 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.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -561,155 +696,45 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.14.7", "@babel/parser@^7.19.3", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": +"@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== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - 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.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.22.5": + 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-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== +"@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" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -746,12 +771,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -816,301 +855,434 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@7.22.15", "@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-async-to-generator@7.22.5", "@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-runtime@7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/preset-env@7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.15.tgz#142716f8e00bc030dae5b2ac6a46fbd8b3e18ff8" + integrity sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag== + dependencies: + "@babel/compat-data" "^7.22.9" + "@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.20.0" + "@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" @@ -1120,54 +1292,69 @@ "@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-transform-arrow-functions" "^7.20.7" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.0" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@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.15" + 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" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" @@ -1176,14 +1363,21 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.21.0", "@babel/runtime@^7.8.4": +"@babel/runtime@7.22.15": + 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.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" -"@babel/template@7.20.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": +"@babel/template@^7.20.7": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== @@ -1192,7 +1386,16 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.19.3", "@babel/traverse@^7.20.5", "@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": +"@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== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== @@ -1208,7 +1411,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.3", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.22.5": + 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.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4", "@babel/types@^7.4.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== @@ -1217,6 +1436,15 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5": + 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" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -1227,121 +1455,243 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@esbuild/android-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz#893ad71f3920ccb919e1757c387756a9bca2ef42" - integrity sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA== - -"@esbuild/android-arm@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.15.tgz#143e0d4e4c08c786ea410b9a7739779a9a1315d8" - integrity sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg== - -"@esbuild/android-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.15.tgz#d2d12a7676b2589864281b2274355200916540bc" - integrity sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ== - -"@esbuild/darwin-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz#2e88e79f1d327a2a7d9d06397e5232eb0a473d61" - integrity sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA== - -"@esbuild/darwin-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz#9384e64c0be91388c57be6d3a5eaf1c32a99c91d" - integrity sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg== - -"@esbuild/freebsd-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz#2ad5a35bc52ebd9ca6b845dbc59ba39647a93c1a" - integrity sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg== - -"@esbuild/freebsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz#b513a48446f96c75fda5bef470e64d342d4379cd" - integrity sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ== - -"@esbuild/linux-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz#9697b168175bfd41fa9cc4a72dd0d48f24715f31" - integrity sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA== - -"@esbuild/linux-arm@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz#5b22062c54f48cd92fab9ffd993732a52db70cd3" - integrity sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw== - -"@esbuild/linux-ia32@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz#eb28a13f9b60b5189fcc9e98e1024f6b657ba54c" - integrity sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q== - -"@esbuild/linux-loong64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz#32454bdfe144cf74b77895a8ad21a15cb81cfbe5" - integrity sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ== - -"@esbuild/linux-mips64el@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz#af12bde0d775a318fad90eb13a0455229a63987c" - integrity sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ== - -"@esbuild/linux-ppc64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz#34c5ed145b2dfc493d3e652abac8bd3baa3865a5" - integrity sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg== - -"@esbuild/linux-riscv64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz#87bd515e837f2eb004b45f9e6a94dc5b93f22b92" - integrity sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA== - -"@esbuild/linux-s390x@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz#20bf7947197f199ddac2ec412029a414ceae3aa3" - integrity sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg== - -"@esbuild/linux-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz#31b93f9c94c195e852c20cd3d1914a68aa619124" - integrity sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg== - -"@esbuild/netbsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz#8da299b3ac6875836ca8cdc1925826498069ac65" - integrity sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA== - -"@esbuild/openbsd-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz#04a1ec3d4e919714dba68dcf09eeb1228ad0d20c" - integrity sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w== - -"@esbuild/sunos-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz#6694ebe4e16e5cd7dab6505ff7c28f9c1c695ce5" - integrity sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ== - -"@esbuild/win32-arm64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz#1f95b2564193c8d1fee8f8129a0609728171d500" - integrity sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q== - -"@esbuild/win32-ia32@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz#c362b88b3df21916ed7bcf75c6d09c6bf3ae354a" - integrity sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w== - -"@esbuild/win32-x64@0.17.15": - version "0.17.15" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz#c2e737f3a201ebff8e2ac2b8e9f246b397ad19b8" - integrity sha512-DjDa9ywLUUmjhV2Y9wUTIF+1XsmuFGvZoCmOWkli1XcNAh5t25cc7fgsCx4Zi/Uurep3TTLyDiKATgGEg61pkA== +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + 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-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-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/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-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/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-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/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-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-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-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-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-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-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-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-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/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/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/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/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-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-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== "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1358,14 +1708,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" @@ -1380,15 +1722,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/source-map@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== dependencies: "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" @@ -1398,7 +1740,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2118,10 +2460,10 @@ "@material/theme" "15.0.0-canary.3b5b55e31.0" tslib "^2.1.0" -"@ngtools/webpack@16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.0.0-next.7.tgz#63ad4d55f5374b0830e9b0333f276d17a58e261a" - integrity sha512-B+ytc1MhQQBuSG4epkFvSpxsAzLE7RHlVNOUroJkw5S6sZ1zogL4067SZJNRUbvFudyVw9p8a76syvR+ZXDSjg== +"@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== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2144,6 +2486,16 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/agent@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.1.1.tgz#31095663b8feef27ec3eccd5254a35b8fc70353a" + integrity sha512-6RlbiOAi6L6uUYF4/CDEkDZQnKw0XDsFJVrEpnib8rAx2WRMOsUyAdgnvDpX/fdkDWxtqE+NHwF465llI2wR0g== + dependencies: + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.1" + "@npmcli/fs@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" @@ -2159,19 +2511,19 @@ dependencies: semver "^7.3.5" -"@npmcli/git@^4.0.0": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" - integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== +"@npmcli/git@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" + integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== dependencies: - "@npmcli/promise-spawn" "^6.0.0" - lru-cache "^7.4.4" - npm-pick-manifest "^8.0.0" + "@npmcli/promise-spawn" "^7.0.0" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^3.0.0" + which "^4.0.0" "@npmcli/installed-package-contents@^2.0.1": version "2.0.2" @@ -2194,54 +2546,94 @@ resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" - integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== +"@npmcli/promise-spawn@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" + integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== dependencies: - which "^3.0.0" + which "^4.0.0" -"@npmcli/run-script@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" - integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== +"@npmcli/run-script@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.1.tgz#18eebaed96214357f618a82510411319181417bd" + integrity sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g== dependencies: "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^6.0.0" + "@npmcli/promise-spawn" "^7.0.0" node-gyp "^9.0.0" read-package-json-fast "^3.0.0" - which "^3.0.0" + which "^4.0.0" -"@schematics/angular@16.0.0-next.7": - version "16.0.0-next.7" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-16.0.0-next.7.tgz#e3ac4c6b869128a11a7cc482e88f0c88d433560c" - integrity sha512-rTk8GQtt3sOUP5f3avvaJMbBzLCjQdbxpUYhAx0IgvRJujmiXAkvNRl/y94L3ZiRkADYyVz1Moe9KiBGuLj54A== +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@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== dependencies: - "@angular-devkit/core" "16.0.0-next.7" - "@angular-devkit/schematics" "16.0.0-next.7" + "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/schematics" "17.0.0-next.4" jsonc-parser "3.2.0" -"@sigstore/protobuf-specs@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" - integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== +"@sigstore/bundle@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" + integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + +"@sigstore/protobuf-specs@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.1.0.tgz#801f4b5f60e13ecd1925117a7d084ab7b2199f01" + integrity sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw== + dependencies: + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + make-fetch-happen "^13.0.0" + +"@sigstore/tuf@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" + integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + tuf-js "^2.1.0" "@socket.io/component-emitter@~3.1.0": version "3.1.0" 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" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== -"@tufjs/models@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.1.tgz#cc8bb0478188b4b6e58d5528668212724aac87ac" - integrity sha512-AY0VoG/AXdlSOocuREfPoEW4SNhOPp/7fw6mpAxfVIny1uZ+0fEtMoCi7NhELSlqQIRLMu7RgfKhkxT+AJ+EXg== +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.0.tgz#c7ab241cf11dd29deb213d6817dabb8c99ce0863" + integrity sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== dependencies: - minimatch "^7.4.2" + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.3" "@types/body-parser@*": version "1.19.2" @@ -2306,10 +2698,10 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== +"@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.17.33" @@ -2394,10 +2786,10 @@ dependencies: "@types/node" "*" -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== +"@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" "*" @@ -2406,127 +2798,137 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34" integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A== -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@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" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2542,7 +2944,7 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -abab@^2.0.6: +abab@^2.0.3, abab@^2.0.5, 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== @@ -2560,12 +2962,35 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +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@^8.5.0, acorn@^8.7.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" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +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@^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.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +acorn@^8.7.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -2585,6 +3010,13 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +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== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" @@ -2663,6 +3095,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2677,6 +3114,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -2720,24 +3162,48 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -autoprefixer@10.4.14: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ== + +async@^2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@10.4.15: + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -babel-loader@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" - integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== +axios@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-loader@9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== dependencies: - find-cache-dir "^3.3.2" + find-cache-dir "^4.0.0" schema-utils "^4.0.0" babel-plugin-istanbul@6.1.1: @@ -2751,29 +3217,29 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" balanced-match@^1.0.0: version "1.0.2" @@ -2887,7 +3353,69 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@4.21.5, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: +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" + integrity sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ== + dependencies: + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + +browser-sync-ui@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz#35e2ce3b470dce6b7219307cac7278bf324a0f16" + integrity sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg== + dependencies: + async-each-series "0.1.1" + chalk "4.1.2" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^4.4.1" + stream-throttle "^0.1.3" + +browser-sync@2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1" + integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg== + dependencies: + browser-sync-client "^2.29.3" + browser-sync-ui "^2.29.3" + bs-recipes "1.3.4" + chalk "4.1.2" + chokidar "^3.5.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^4.0.1" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.1" + micromatch "^4.0.2" + opn "5.3.0" + portscanner "2.2.0" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "^4.4.1" + ua-parser-js "^1.0.33" + yargs "^17.3.1" + +browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.5: version "4.21.5" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== @@ -2897,6 +3425,21 @@ browserslist@4.21.5, browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4 node-releases "^2.0.8" update-browserslist-db "^1.0.10" +browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2927,25 +3470,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@17.0.4: - version "17.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.4.tgz#5023ed892ba8843e3b7361c26d0ada37e146290c" - integrity sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cacache@^16.1.0: version "16.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" @@ -2970,21 +3494,20 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" -cacache@^17.0.0: - version "17.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.5.tgz#6dbec26c11f1f6a2b558bc11ed3316577c339ebc" - integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== +cacache@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.0.tgz#17a9ecd6e1be2564ebe6cdca5f7cfed2bfeb6ddc" + integrity sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w== dependencies: "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" - glob "^9.3.1" - lru-cache "^7.7.1" - minipass "^4.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" p-map "^4.0.0" - promise-inflight "^1.0.1" ssri "^10.0.0" tar "^6.1.11" unique-filename "^3.0.0" @@ -3007,21 +3530,17 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.30001449: version "1.0.30001495" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz" integrity sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg== -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +caniuse-lite@^1.0.30001517, 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== -chalk@^4.1.0, chalk@^4.1.1: +chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3029,6 +3548,15 @@ chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3147,15 +3675,22 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== -commander@^2.20.0: +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.2.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +common-path-prefix@^3.0.0: + version "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== compressible@~2.0.16: version "2.0.18" @@ -3182,11 +3717,26 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" @@ -3253,12 +3803,12 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.25.1: - version "3.30.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.0.tgz#99aa2789f6ed2debfa1df3232784126ee97f4d80" - integrity sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg== +core-js-compat@^3.31.0: + 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.5" + browserslist "^4.21.10" core-util-is@~1.0.0: version "1.0.3" @@ -3273,34 +3823,30 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig-typescript-loader@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== - -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== +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.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" -critters@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.16.tgz#ffa2c5561a65b43c53b940036237ce72dcebfe93" - integrity sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A== +critters@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.20.tgz#08ddb961550ab7b3a59370537e4f01df208f7646" + integrity sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw== dependencies: chalk "^4.1.0" - css-select "^4.2.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - postcss "^8.3.7" + css-select "^5.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.2" + htmlparser2 "^8.0.2" + postcss "^8.4.23" pretty-bytes "^5.3.0" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3309,32 +3855,32 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-loader@6.7.3: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== +css-loader@6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.3.8" -css-select@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" nth-check "^2.0.1" -css-what@^6.0.1: +css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -3344,17 +3890,43 @@ 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" + custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== +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" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== -debug@2.6.9: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3368,6 +3940,13 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, d dependencies: ms "2.1.2" +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3375,6 +3954,11 @@ debug@^3.2.6: dependencies: ms "^2.1.1" +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== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -3394,6 +3978,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -3414,11 +4003,21 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== + di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -3453,35 +4052,61 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== +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: - domelementtype "^2.2.0" + webidl-conversions "^5.0.0" -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== + dependencies: + lodash "^4.17.10" + +eazy-logger@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" + integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" + chalk "4.1.2" ee-first@1.1.1: version "1.1.1" @@ -3493,17 +4118,27 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.355.tgz#539484310e5a94133bc3df8ba4b6a9dde7a506a4" integrity sha512-056hxzEE4l667YeOccgjhRr5fTiwZ6EIJ4FpzGps4k3YcS8iAhiaBYUBrv5E2LDQJsussscv9EEUwAYKnv+ZKg== +electron-to-chromium@^1.4.477: + version "1.4.520" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz#c19c25a10d87bd88a9aae2b76cae9235a50c2994" + integrity sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.2: +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -3515,11 +4150,27 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" +engine.io-client@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002" + integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + engine.io-parser@~5.0.3: version "5.0.6" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.6.tgz#7811244af173e157295dec9b2718dfe42a64ef45" integrity sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw== +engine.io-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + engine.io@~6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.4.1.tgz#8056b4526a88e779f9c280d820422d4e3eeaaae5" @@ -3536,10 +4187,10 @@ engine.io@~6.4.1: engine.io-parser "~5.0.3" ws "~8.11.0" -enhanced-resolve@^5.10.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" - integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -3549,10 +4200,10 @@ ent@~2.2.0: resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@^4.3.0, entities@^4.4.0: version "4.4.0" @@ -3583,43 +4234,71 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -esbuild-wasm@0.17.15: - version "0.17.15" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.15.tgz#e8c9c9d46bd6a0c1ed100cf85c4265f3c9b14cac" - integrity sha512-ZETv4K3rvtKu8gXMxFZ0YgrPWO0MQl4bC9TCXkmjHAiw3vdDccRPwVDjnOaTs5LUPhy6kiBK7QnjcjnVjHt8Aw== - -esbuild@0.17.15, esbuild@^0.17.5: - version "0.17.15" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.15.tgz#209ebc87cb671ffb79574db93494b10ffaf43cbc" - integrity sha512-LBUV2VsUIc/iD9ME75qhT4aJj0r75abCVS0jakhFzOtR7TQsqQA5w0tZ+KTKnwl3kXE0MhskNdHDh/I5aCR1Zw== +es-module-lexer@^1.2.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz#c1b0dd5ada807a3b3155315911f364dc4e909db1" + integrity sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q== + +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@0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" + integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== + 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@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: - "@esbuild/android-arm" "0.17.15" - "@esbuild/android-arm64" "0.17.15" - "@esbuild/android-x64" "0.17.15" - "@esbuild/darwin-arm64" "0.17.15" - "@esbuild/darwin-x64" "0.17.15" - "@esbuild/freebsd-arm64" "0.17.15" - "@esbuild/freebsd-x64" "0.17.15" - "@esbuild/linux-arm" "0.17.15" - "@esbuild/linux-arm64" "0.17.15" - "@esbuild/linux-ia32" "0.17.15" - "@esbuild/linux-loong64" "0.17.15" - "@esbuild/linux-mips64el" "0.17.15" - "@esbuild/linux-ppc64" "0.17.15" - "@esbuild/linux-riscv64" "0.17.15" - "@esbuild/linux-s390x" "0.17.15" - "@esbuild/linux-x64" "0.17.15" - "@esbuild/netbsd-x64" "0.17.15" - "@esbuild/openbsd-x64" "0.17.15" - "@esbuild/sunos-x64" "0.17.15" - "@esbuild/win32-arm64" "0.17.15" - "@esbuild/win32-ia32" "0.17.15" - "@esbuild/win32-x64" "0.17.15" + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" escalade@^3.1.1: version "3.1.1" @@ -3636,6 +4315,17 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -3644,7 +4334,7 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -3671,7 +4361,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -3762,6 +4452,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.11: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -3806,6 +4507,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw== + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -3832,16 +4546,15 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -3849,16 +4562,41 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + 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== -follow-redirects@^1.0.0: +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== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +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" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -3869,11 +4607,20 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -3979,16 +4726,16 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@8.1.0, glob@^8.0.1: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^10.2.2: + version "10.3.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" + integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: version "7.2.3" @@ -4002,15 +4749,16 @@ glob@^7.1.3, glob@^7.1.4, glob@^7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.3.0, glob@^9.3.1: - version "9.3.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.4.tgz#e75dee24891a80c25cc7ee1dd327e126b98679af" - integrity sha512-qaSc49hojMOv1EPM4EuyITjDSgSKI0rthoHnvE81tcOi1SCVndHko7auqxdQ14eiQG2NDBJBE86+2xIrbIvrbA== +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" globals@^11.1.0: version "11.12.0" @@ -4033,6 +4781,13 @@ 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: + 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" @@ -4079,12 +4834,12 @@ hdr-histogram-percentiles-obj@^3.0.0: resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== -hosted-git-info@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" - integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== +hosted-git-info@^7.0.0: + 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 "^7.5.1" + lru-cache "^10.0.1" hpack.js@^2.1.6: version "2.1.6" @@ -4096,6 +4851,13 @@ 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-entities@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" @@ -4106,6 +4868,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-cache-semantics@^4.1.0, http-cache-semantics@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" @@ -4142,6 +4914,15 @@ 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" @@ -4151,7 +4932,15 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy-middleware@^2.0.3: +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy-middleware@2.0.6, http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -4171,7 +4960,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: +https-proxy-agent@7.0.2, https-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + +https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -4232,12 +5029,17 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== + immutable@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== -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== @@ -4278,15 +5080,15 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.0.0.tgz#35b4b0ba3bb9a3feb8c50dbf92fb1671efda88eb" - integrity sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -inquirer@8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== +inquirer@8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -4302,7 +5104,7 @@ inquirer@8.2.4: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" ip@^2.0.0: version "2.0.0" @@ -4331,13 +5133,20 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.11.0, is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.8.1: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" @@ -4370,6 +5179,13 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4387,6 +5203,11 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +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-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -4402,6 +5223,11 @@ is-what@^3.14.1: resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -4424,6 +5250,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -4471,6 +5302,15 @@ istanbul-reports@^3.0.5: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.0.3: + 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: + "@pkgjs/parseargs" "^0.11.0" + jasmine-core@^4.1.0, jasmine-core@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.0.tgz#6884fc3d5b66bf293e422751eed6d6da217c38f5" @@ -4485,6 +5325,11 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +jiti@^1.18.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4505,6 +5350,39 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +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" @@ -4535,7 +5413,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json5@^2.1.2, json5@^2.2.1, json5@^2.2.2: +json5@^2.1.2, json5@^2.2.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== @@ -4545,6 +5423,13 @@ jsonc-parser@3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -4630,7 +5515,7 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klona@^2.0.4, klona@^2.0.6: +klona@^2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== @@ -4650,10 +5535,10 @@ less-loader@11.1.0: dependencies: klona "^2.0.4" -less@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== +less@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -4674,6 +5559,11 @@ license-webpack-plugin@4.0.2: dependencies: webpack-sources "^3.0.0" +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -4698,6 +5588,16 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +localtunnel@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" + integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== + dependencies: + axios "0.21.4" + debug "4.3.2" + openurl "1.1.1" + yargs "17.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -4705,12 +5605,24 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash@^4.17.21: +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== + +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4734,6 +5646,11 @@ log4js@^6.4.1: rfdc "^1.3.0" streamroller "^3.1.5" +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4748,17 +5665,17 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== -magic-string@0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" - integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== +magic-string@0.30.3: + version "0.30.3" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" + integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" + "@jridgewell/sourcemap-codec" "^1.4.15" make-dir@^2.1.0: version "2.1.0" @@ -4768,7 +5685,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -4797,25 +5714,21 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz#ed83dd3685b97f75607156d2721848f6eca561b9" - integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== +make-fetch-happen@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" + integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" ssri "^10.0.0" media-typer@0.3.0: @@ -4863,13 +5776,18 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -4885,10 +5803,10 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== +mini-css-extract-plugin@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -4897,7 +5815,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -4918,10 +5836,10 @@ minimatch@^7.4.2: dependencies: brace-expansion "^2.0.1" -minimatch@^8.0.2: - version "8.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.3.tgz#0415cb9bb0c1d8ac758c8a673eb1d288e13f5e75" - integrity sha512-tEEvU9TkZgnFDCtpnrEYnPsjT7iUx42aXfs4bzmQ5sMA09/6hZY0jeZcGkXyDagiBOvkUjNo8Viom+Me6+2x7g== +minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" @@ -4995,11 +5913,16 @@ minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: dependencies: yallist "^4.0.0" -minipass@^4.0.0, minipass@^4.0.2, minipass@^4.2.4: +minipass@^4.0.0: version "4.2.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.5.tgz#9e0e5256f1e3513f8c34691dd68549e85b2c8ceb" integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -5008,6 +5931,11 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -5020,6 +5948,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mrmime@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -5048,7 +5981,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nanoid@^3.3.4: +nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== @@ -5111,6 +6044,11 @@ node-gyp@^9.0.0: tar "^6.1.2" which "^2.0.2" +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" @@ -5123,12 +6061,12 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" -normalize-package-data@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" - integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== +normalize-package-data@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" + integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -5162,44 +6100,44 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@10.1.0, npm-package-arg@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" - integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== +npm-package-arg@11.0.1, npm-package-arg@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" proc-log "^3.0.0" semver "^7.3.5" validate-npm-package-name "^5.0.0" -npm-packlist@^7.0.0: - version "7.0.4" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" - integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== +npm-packlist@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.0.tgz#4e7f51fe1d5e69b19508ed8dc6cd3ae2e7b38c17" + integrity sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw== dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" - integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== +npm-pick-manifest@9.0.0, npm-pick-manifest@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" + integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== dependencies: npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" semver "^7.3.5" -npm-registry-fetch@^14.0.0: - version "14.0.3" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz#8545e321c2b36d2c6fe6e009e77e9f0e527f547b" - integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== +npm-registry-fetch@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.0.0.tgz#7529dd7c64c16a1bc8af72f99df73dfe98bb9549" + integrity sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ== dependencies: - make-fetch-happen "^11.0.0" - minipass "^4.0.0" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" proc-log "^3.0.0" npm-run-path@^4.0.1: @@ -5226,6 +6164,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.0: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5236,6 +6179,11 @@ 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-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== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -5283,6 +6231,18 @@ open@8.4.2, open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA== + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + ora@5.4.1, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -5310,6 +6270,13 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -5317,6 +6284,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -5337,27 +6311,27 @@ 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== -pacote@15.1.1: - version "15.1.1" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.1.tgz#94d8c6e0605e04d427610b3aacb0357073978348" - integrity sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ== +pacote@17.0.4: + version "17.0.4" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.4.tgz#4bac6c0745967bde96985ec12fbbfc8dea7140e8" + integrity sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg== dependencies: - "@npmcli/git" "^4.0.0" + "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^6.0.1" - "@npmcli/run-script" "^6.0.0" - cacache "^17.0.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^7.0.0" + cacache "^18.0.0" fs-minipass "^3.0.0" - minipass "^4.0.0" - npm-package-arg "^10.0.0" - npm-packlist "^7.0.0" - npm-pick-manifest "^8.0.0" - npm-registry-fetch "^14.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^16.0.0" proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^6.0.0" + read-package-json "^7.0.0" read-package-json-fast "^3.0.0" - sigstore "^1.0.0" + sigstore "^2.0.0" ssri "^10.0.0" tar "^6.1.11" @@ -5373,7 +6347,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.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== @@ -5397,13 +6371,6 @@ parse5-html-rewriting-stream@7.0.0: parse5 "^7.0.0" parse5-sax-parser "^7.0.0" -parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" @@ -5411,7 +6378,7 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -5433,6 +6400,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5448,13 +6420,13 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.6.1: - version "1.6.3" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.6.3.tgz#4eba7183d64ef88b63c7d330bddc3ba279dc6c40" - integrity sha512-RAmB+n30SlN+HnNx6EbcpoDy9nwdpcGPnEKrJnu6GZoDWBdIjo1UQMVtW2ybtC7LC2oKLcMq8y5g8WnKLiod9g== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: - lru-cache "^7.14.1" - minipass "^4.0.2" + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@0.1.7: version "0.1.7" @@ -5471,7 +6443,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@2.3.1, picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -5481,10 +6453,10 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -piscina@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" - integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== +piscina@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.1.0.tgz#809578ee3ab2ecf4cf71c2a062100b4b95a85b96" + integrity sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -5492,21 +6464,28 @@ piscina@3.2.0: optionalDependencies: nice-napi "^1.0.2" -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== dependencies: - find-up "^4.0.0" + find-up "^6.3.0" -postcss-loader@7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.2.3.tgz#c2d491a769102e0aac228d53fb1ad376cc158bb2" - integrity sha512-H/PIjgbn2q7zFnmUMPvEupIFnOAg+fYWC/4F6DugK8uPITVYyEflnSjLFV0u20B3Qi88PzPiAlzn8hBSu3f8oA== +portscanner@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" + integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== dependencies: - cosmiconfig "^8.1.3" - cosmiconfig-typescript-loader "^4.3.0" - klona "^2.0.6" + async "^2.6.0" + is-number-like "^1.0.3" + +postcss-loader@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== + dependencies: + cosmiconfig "^8.2.0" + jiti "^1.18.2" semver "^7.3.8" postcss-modules-extract-imports@^3.0.0: @@ -5514,10 +6493,10 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -5550,7 +6529,16 @@ 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.21, postcss@^8.2.14, postcss@^8.3.7, postcss@^8.4.19, postcss@^8.4.21: +postcss@8.4.29, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.2.14, postcss@^8.4.21: version "8.4.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== @@ -5600,7 +6588,12 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -punycode@^2.1.0: +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: version "2.3.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== @@ -5617,6 +6610,11 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +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" @@ -5629,7 +6627,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -5644,7 +6642,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -raw-body@2.5.2: +raw-body@2.5.2, raw-body@^2.3.2: version "2.5.2" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== @@ -5662,14 +6660,14 @@ read-package-json-fast@^3.0.0: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -read-package-json@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.1.tgz#566cb06bc05dbddefba4607e9096d5a9efbcd836" - integrity sha512-AaHqXxfAVa+fNL07x8iAghfKOds/XXsu7zoouIVsbm7PEbQ3nMWXlvjcbrNLjElnUHWQtAo4QEa0RXuvD4XlpA== +read-package-json@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-7.0.0.tgz#d605c9dcf6bc5856da24204aa4e9518ee9714be0" + integrity sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg== dependencies: - glob "^9.3.0" + glob "^10.2.2" json-parse-even-better-errors "^3.0.0" - normalize-package-data "^5.0.0" + normalize-package-data "^6.0.0" npm-normalize-package-bin "^3.0.0" readable-stream@^2.0.1: @@ -5723,10 +6721,15 @@ regenerator-runtime@^0.13.11: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -5790,16 +6793,16 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +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== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^1.14.2, resolve@^1.22.1: +resolve@^1.14.2: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -5808,6 +6811,14 @@ resolve@^1.14.2, resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw== + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -5843,10 +6854,10 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^3.18.0: - version "3.20.2" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" - integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== +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== optionalDependencies: fsevents "~2.3.2" @@ -5862,7 +6873,19 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@7.8.0, rxjs@^7.5.5, rxjs@~7.8.0: +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== + +rxjs@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +rxjs@^7.5.5, rxjs@~7.8.0: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== @@ -5889,18 +6912,17 @@ safevalues@^0.3.4: resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.2.tgz#f97e803993b24012c10d7ba9676548bf7a6b18b9" - integrity sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA== +sass-loader@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== dependencies: - klona "^2.0.6" neo-async "^2.6.2" -sass@1.60.0: - version "1.60.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81" - integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ== +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== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -5911,7 +6933,14 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^3.1.0, schema-utils@^3.1.1: +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: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -5920,6 +6949,15 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" @@ -5942,10 +6980,10 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@7.3.8, semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== +semver@7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -5954,11 +6992,42 @@ semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -5985,7 +7054,7 @@ serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-index@^1.9.1: +serve-index@1.9.1, serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -5998,6 +7067,16 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -6008,6 +7087,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6061,14 +7145,20 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sigstore@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.2.0.tgz#ae5b31dac75c2d31e7873897e2862f0d0b205bce" - integrity sha512-Fr9+W1nkBSIZCkJQR7jDn/zI0UXNsVpp+7mDQkCnZOIxG9p6yNXBx9xntHsfUyYHE55XDkkVV3+rYbrkzAeesA== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" + integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== dependencies: - "@sigstore/protobuf-specs" "^0.1.0" - make-fetch-happen "^11.0.1" - tuf-js "^1.0.0" + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/sign" "^2.1.0" + "@sigstore/tuf" "^2.1.0" slash@^4.0.0: version "4.0.0" @@ -6087,6 +7177,16 @@ socket.io-adapter@~2.5.2: dependencies: ws "~8.11.0" +socket.io-client@^4.4.1: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" + integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + socket.io-parser@~4.2.1: version "4.2.2" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.2.tgz#1dd384019e25b7a3d374877f492ab34f2ad0d206" @@ -6095,6 +7195,14 @@ socket.io-parser@~4.2.1: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + socket.io@^4.4.1: version "4.6.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.6.1.tgz#62ec117e5fce0692fa50498da9347cfb52c3bc70" @@ -6125,7 +7233,16 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.6.2: +socks-proxy-agent@^8.0.1: + 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.2" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.6.2, socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -6155,7 +7272,7 @@ source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6243,6 +7360,24 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg== + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ== + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + streamroller@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.5.tgz#1263182329a45def1ffaef58d31b15d13d2ee7ff" @@ -6252,7 +7387,7 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6261,6 +7396,15 @@ streamroller@^3.1.5: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6275,13 +7419,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -6318,6 +7469,11 @@ 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== + tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -6335,24 +7491,24 @@ tar@^6.1.11, tar@^6.1.2: mkdirp "^1.0.3" yallist "^4.0.0" -terser-webpack-plugin@^5.1.3: - version "5.3.7" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz#ef760632d24991760f339fe9290deb936ad1ffc7" - integrity sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw== +terser-webpack-plugin@^5.3.7: + version "5.3.9" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== dependencies: "@jridgewell/trace-mapping" "^0.3.17" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" - terser "^5.16.5" + terser "^5.16.8" -terser@5.16.8, terser@^5.16.5: - version "5.16.8" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.8.tgz#ccde583dabe71df3f4ed02b65eb6532e0fae15d5" - integrity sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA== +terser@5.19.4, terser@^5.16.8: + version "5.19.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" @@ -6411,23 +7567,46 @@ 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" + +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" + tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -tslib@2.5.0, tslib@^2.1.0, tslib@^2.3.0: +tslib@2.6.2, tslib@^2.0.3: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@^2.1.0, tslib@^2.3.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tuf-js@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.2.tgz#09ca04a89783b739e67dd796f6562e3940628aea" - integrity sha512-gBfbnS6khluxjvoFCpRV0fhWT265xNfpiNXOcBX0Ze6HGbPhe93UG5V5DdKcgm/aXsMadnY76l/h6j63GmJS5g== +tuf-js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" + integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== dependencies: - "@tufjs/models" "1.0.1" - make-fetch-happen "^11.0.1" + "@tufjs/models" "2.0.0" + debug "^4.3.4" + make-fetch-happen "^13.0.0" type-fest@^0.21.3: version "0.21.3" @@ -6448,13 +7627,18 @@ typed-assert@^1.0.8: integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== "typescript@file:../../node_modules/typescript": - version "5.1.3" + version "5.2.2" 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== +ua-parser-js@^1.0.33: + 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== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -6511,6 +7695,11 @@ 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== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -6524,6 +7713,14 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -6531,6 +7728,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.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" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -6566,15 +7771,14 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.1.tgz#6c2eb337b0dfd80a9ded5922163b94949d7fc254" - integrity sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg== +vite@4.4.9: + version "4.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" + integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.18.0" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2" @@ -6583,6 +7787,20 @@ 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" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -6605,10 +7823,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-dev-middleware@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.0.2.tgz#4aab69257378e01d6fe964a8b2d07e8a87623ebc" - integrity sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ== +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" + integrity sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ== dependencies: colorette "^2.0.10" memfs "^3.4.12" @@ -6627,10 +7855,10 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@4.13.2: - version "4.13.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== +webpack-dev-server@4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -6638,7 +7866,7 @@ webpack-dev-server@4.13.2: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -6663,10 +7891,10 @@ webpack-dev-server@4.13.2: webpack-dev-middleware "^5.3.1" ws "^8.13.0" -webpack-merge@5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== +webpack-merge@5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -6683,22 +7911,22 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -webpack@5.77.0: - version "5.77.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.77.0.tgz#dea3ad16d7ea6b84aa55fa42f4eac9f30e7eb9b4" - integrity sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q== +webpack@5.88.2: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" @@ -6707,9 +7935,9 @@ webpack@5.77.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" + terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" webpack-sources "^3.2.3" @@ -6727,6 +7955,27 @@ 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-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@^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@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -6741,12 +7990,12 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -which@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" - integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== dependencies: - isexe "^2.0.0" + isexe "^3.1.1" wide-align@^1.1.5: version "1.1.5" @@ -6760,7 +8009,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -6769,11 +8018,34 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + ws@^8.13.0: version "8.13.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" @@ -6784,6 +8056,21 @@ ws@~8.11.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== +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== + +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== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -6809,10 +8096,23 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.1, yargs@^17.2.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@17.7.2, yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -6835,6 +8135,24 @@ yargs@^16.1.1: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.2.1: + version "17.7.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" + integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zone.js@~0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.13.0.tgz#4c735cb8ef49312b58c0ad13451996dc2b202a6d" diff --git a/integration/ng-add/BUILD.bazel b/integration/ng-add/BUILD.bazel index 8c78d7aa3312..136854d8efd0 100644 --- a/integration/ng-add/BUILD.bazel +++ b/integration/ng-add/BUILD.bazel @@ -25,7 +25,7 @@ node_integration_test( # Generate a new project with the default options. # Skip installation since we installed the dependencies already. - "yarn ng new --defaults --skip-install --style=scss --name=%s" % APP_NAME, + "yarn ng new --defaults --skip-install --style=scss --skip-git --name=%s" % APP_NAME, # Delete the package.json that the CLI generated since we want to use the existing one. "rm -f %s/package.json" % APP_NAME, # Delete the Karma config since we need to use a headless browser. diff --git a/integration/ng-add/_angular.json b/integration/ng-add/_angular.json index c64701515fc6..fb6855331515 100644 --- a/integration/ng-add/_angular.json +++ b/integration/ng-add/_angular.json @@ -8,9 +8,6 @@ "schematics": { "@schematics/angular:component": { "style": "scss" - }, - "@schematics/angular:application": { - "strict": true } }, "root": "", @@ -18,11 +15,11 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/ng-add", "index": "src/index.html", - "main": "src/main.ts", + "browser": "src/main.ts", "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", @@ -47,12 +44,9 @@ "outputHashing": "all" }, "development": { - "buildOptimizer": false, "optimization": false, - "vendorChunk": true, "extractLicenses": false, - "sourceMap": true, - "namedChunks": true + "sourceMap": true } }, "defaultConfiguration": "production" diff --git a/integration/ng-add/package.json b/integration/ng-add/package.json index 6409f0c09e44..a18aa12eff65 100644 --- a/integration/ng-add/package.json +++ b/integration/ng-add/package.json @@ -10,24 +10,24 @@ }, "private": true, "dependencies": { - "@angular/animations": "^16.0.0-next.7", + "@angular/animations": "^17.0.0-next.4", "@angular/cdk": "file:../../dist/releases/cdk", - "@angular/common": "^16.0.0-next.7", - "@angular/compiler": "^16.0.0-next.7", - "@angular/core": "^16.0.0-next.7", - "@angular/forms": "^16.0.0-next.7", + "@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/material": "file:../../dist/releases/material", - "@angular/platform-browser": "^16.0.0-next.7", - "@angular/platform-browser-dynamic": "^16.0.0-next.7", - "@angular/router": "^16.0.0-next.7", + "@angular/platform-browser": "^17.0.0-next.4", + "@angular/platform-browser-dynamic": "^17.0.0-next.4", + "@angular/router": "^17.0.0-next.4", "rxjs": "~7.5.0", "tslib": "^2.3.0", "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.0.0-next.7", - "@angular/cli": "^16.0.0-next.7", - "@angular/compiler-cli": "^16.0.0-next.7", + "@angular-devkit/build-angular": "^17.0.0-next.4", + "@angular/cli": "^17.0.0-next.4", + "@angular/compiler-cli": "^17.0.0-next.4", "@types/jasmine": "~3.9.0", "@types/node": "^12.11.1", "glob": "^7.2.0", diff --git a/integration/ng-add/yarn.lock b/integration/ng-add/yarn.lock index e0409fc85217..1080ef204084 100644 --- a/integration/ng-add/yarn.lock +++ b/integration/ng-add/yarn.lock @@ -18,119 +18,122 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1600.0-rc.1": - version "0.1600.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1600.0-rc.1.tgz#4fe6440ee7beab5ee7b79e2ff122b568af4dee46" - integrity sha512-aTXkQc04lUITnk1ZzYz29lrdmODE9OEcl0qgmbMuQdnDPi5bFilp5OaLjTFjfBKNDLznf+proUpwDjLlv5U8aQ== +"@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== dependencies: - "@angular-devkit/core" "16.0.0-rc.1" - rxjs "7.8.0" + "@angular-devkit/core" "17.0.0-next.4" + rxjs "7.8.1" -"@angular-devkit/build-angular@^16.0.0-next.7": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-16.0.0-rc.1.tgz#a3f83f48ce37d44ff9f669b036623bab50076e4f" - integrity sha512-+YBByF8RnWmLO0OBG4DkRwmJXA77Q6vYETdKtoZna2m6romrVdcZZ0XwkkNdEptLgmbx/Z4DTnt7cq0IQEw1iw== +"@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== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1600.0-rc.1" - "@angular-devkit/build-webpack" "0.1600.0-rc.1" - "@angular-devkit/core" "16.0.0-rc.1" - "@babel/core" "7.21.4" - "@babel/generator" "7.21.4" - "@babel/helper-annotate-as-pure" "7.18.6" - "@babel/helper-split-export-declaration" "7.18.6" - "@babel/plugin-proposal-async-generator-functions" "7.20.7" - "@babel/plugin-transform-async-to-generator" "7.20.7" - "@babel/plugin-transform-runtime" "7.21.4" - "@babel/preset-env" "7.21.4" - "@babel/runtime" "7.21.0" - "@babel/template" "7.20.7" + "@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" + "@babel/core" "7.22.17" + "@babel/generator" "7.22.15" + "@babel/helper-annotate-as-pure" "7.22.5" + "@babel/helper-split-export-declaration" "7.22.6" + "@babel/plugin-transform-async-generator-functions" "7.22.15" + "@babel/plugin-transform-async-to-generator" "7.22.5" + "@babel/plugin-transform-runtime" "7.22.15" + "@babel/preset-env" "7.22.15" + "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "16.0.0-rc.1" + "@ngtools/webpack" "17.0.0-next.4" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" - autoprefixer "10.4.14" - babel-loader "9.1.2" + autoprefixer "10.4.15" + babel-loader "9.1.3" babel-plugin-istanbul "6.1.1" - browserslist "4.21.5" - cacache "17.0.5" + browser-sync "2.29.3" + browserslist "^4.21.5" chokidar "3.5.3" copy-webpack-plugin "11.0.0" - critters "0.0.16" - css-loader "6.7.3" - esbuild-wasm "0.17.16" - glob "8.1.0" - https-proxy-agent "5.0.1" - inquirer "8.2.4" + critters "0.0.20" + css-loader "6.8.1" + esbuild-wasm "0.19.2" + 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" jsonc-parser "3.2.0" karma-source-map-support "1.4.0" - less "4.1.3" + less "4.2.0" less-loader "11.1.0" license-webpack-plugin "4.0.2" loader-utils "3.2.1" - magic-string "0.30.0" - mini-css-extract-plugin "2.7.5" + magic-string "0.30.3" + mini-css-extract-plugin "2.7.6" mrmime "1.0.1" open "8.4.2" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" - piscina "3.2.0" - postcss "8.4.21" - postcss-loader "7.2.4" + picomatch "2.3.1" + piscina "4.1.0" + postcss "8.4.29" + postcss-loader "7.3.3" resolve-url-loader "5.0.0" - rxjs "7.8.0" - sass "1.62.0" - sass-loader "13.2.2" - semver "7.4.0" + rxjs "7.8.1" + sass "1.66.1" + sass-loader "13.3.2" + semver "7.5.4" source-map-loader "4.0.1" source-map-support "0.5.21" - terser "5.17.1" + terser "5.19.4" text-table "0.2.0" tree-kill "1.2.2" - tslib "2.5.0" - vite "4.2.2" - webpack "5.79.0" - webpack-dev-middleware "6.0.2" - webpack-dev-server "4.13.2" - webpack-merge "5.8.0" + tslib "2.6.2" + vite "4.4.9" + webpack "5.88.2" + webpack-dev-middleware "6.1.1" + webpack-dev-server "4.15.1" + webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.17.16" + esbuild "0.19.2" -"@angular-devkit/build-webpack@0.1600.0-rc.1": - version "0.1600.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1600.0-rc.1.tgz#47b9b7d5a6d5ca46468f38d1f043668ecfd8dff5" - integrity sha512-fgmhRwR5KQmOLTNNm4zTCszfQkj6ZOMjEkukO6mg17iirv4CvWcXZoTTlP4YESHtW9gIhxgWy5joKQD2tpTieA== +"@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== dependencies: - "@angular-devkit/architect" "0.1600.0-rc.1" - rxjs "7.8.0" + "@angular-devkit/architect" "0.1700.0-next.4" + rxjs "7.8.1" -"@angular-devkit/core@16.0.0-rc.1": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-16.0.0-rc.1.tgz#548c8704d2a83e0ec8b9ba9d0c8117366e95201c" - integrity sha512-pY8ECAnrXespVSuay/cJap8auhZ/dgsFXPkY2AfaR02s/+yViWLdlWHldl9zhzPJMrPM2PodKYkqvRXz3HYgCQ== +"@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== dependencies: ajv "8.12.0" ajv-formats "2.1.1" jsonc-parser "3.2.0" - rxjs "7.8.0" + picomatch "2.3.1" + rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@16.0.0-rc.1": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-16.0.0-rc.1.tgz#67341a1609a4d02db0355571eb8f6223e4d80bca" - integrity sha512-RJmqAWTOycg4+SSorN4uajh1keh6WEMtJlac1mfGk4jAV/qSO1JmgDLaoP0UBdfXBS3JiofIXD4UNWKXl/A2QA== +"@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== dependencies: - "@angular-devkit/core" "16.0.0-rc.1" + "@angular-devkit/core" "17.0.0-next.4" jsonc-parser "3.2.0" - magic-string "0.30.0" + magic-string "0.30.3" ora "5.4.1" - rxjs "7.8.0" + rxjs "7.8.1" -"@angular/animations@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-16.0.0-rc.2.tgz#ed136f1b30fbd905f5e5d1eb29f546b2474023ba" - integrity sha512-gezRsrEDBx7k2D7/gO4Tg1bFfAiUdh3Hb57Bvzd7Q58Rrqq4WOPGcAGihFLZB05GUp9hd51Zg4cbSS48frC7QQ== +"@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== dependencies: tslib "^2.3.0" @@ -141,43 +144,43 @@ optionalDependencies: parse5 "^7.1.2" -"@angular/cli@^16.0.0-next.7": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-16.0.0-rc.1.tgz#6be47f7fb199bad521f93a23a64e6a33bb5663e2" - integrity sha512-Ankyh9cUdh3mrFg9OUswew2yGtXML5SN5Lx2BReyfM06P5KcCRBof1wKC/etmpR5UXifAM4+2oPKYN2rfl4RLQ== +"@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== dependencies: - "@angular-devkit/architect" "0.1600.0-rc.1" - "@angular-devkit/core" "16.0.0-rc.1" - "@angular-devkit/schematics" "16.0.0-rc.1" - "@schematics/angular" "16.0.0-rc.1" + "@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" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" - ini "4.0.0" - inquirer "8.2.4" + ini "4.1.1" + inquirer "8.2.6" jsonc-parser "3.2.0" - npm-package-arg "10.1.0" - npm-pick-manifest "8.0.1" + npm-package-arg "11.0.1" + npm-pick-manifest "9.0.0" open "8.4.2" ora "5.4.1" - pacote "15.1.1" - resolve "1.22.2" - semver "7.4.0" + pacote "17.0.4" + resolve "1.22.4" + semver "7.5.4" symbol-observable "4.0.0" - yargs "17.7.1" + yargs "17.7.2" -"@angular/common@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-16.0.0-rc.2.tgz#51e43b3f97855e80528f53fdff092710e64c81e0" - integrity sha512-G3oe1V28VuYNAkmLQasAq6p6aKRzUFdRzChIjVvT+WfBQhLYe+Hr2prHH7NkF9s07sU9KJMibBLQdxDpCIeJxQ== +"@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== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-16.0.0-rc.2.tgz#dc95ab32a2561b2dd529f531b44ba231daddf2d4" - integrity sha512-JdjA44ZdBe4FBtPaisNIGoMyJt9LlASwf8uP3LiqTCGA5RL+YzbPnVV/ay2/DehNddAOUbyYGrv15uPKbr1kjw== +"@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== dependencies: - "@babel/core" "7.19.3" + "@babel/core" "7.22.5" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" @@ -186,24 +189,24 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-16.0.0-rc.2.tgz#ae7b0fbd89bc3ff3f46365d9068067a24d093e4e" - integrity sha512-eeT7qlDyeSZT9bKaWugoA/DBIIKajsUfEeZjt6NLszC+BjrmnAUUcMN5Vy6Sda2BghwRAfmjfPk6CT9luTUfFA== +"@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== dependencies: tslib "^2.3.0" -"@angular/core@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-16.0.0-rc.2.tgz#ee2ec9f468b4ccd334961de158216014dc85e1f1" - integrity sha512-T+OkDrkpsTbQKSzIA1Rv6mJdEw+Hyg2sGidQc2SEqp+qEIvTsUgEQMFVvop8Td4YM5cCgHDbgIYdy2BK+X1UFw== +"@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== dependencies: tslib "^2.3.0" -"@angular/forms@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-16.0.0-rc.2.tgz#c83232b56374d6379e1b247eedcc67b0b53c9397" - integrity sha512-O5r/+D/QOrU+EGNKk/ynnmv61EXCmry3ED5ixmVjPHcCGTxjwFjZed1qcvpqRr3+DcJsT8ShL0hZiRhOTqSGiQ== +"@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== dependencies: tslib "^2.3.0" @@ -259,24 +262,24 @@ "@material/typography" "15.0.0-canary.3b5b55e31.0" tslib "^2.3.0" -"@angular/platform-browser-dynamic@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.0.0-rc.2.tgz#46d4ea7799ace8b7d6341b1d975f4a547106d671" - integrity sha512-xi06a7ZAsl3brtStT8+Wfx7AepKzpI5FAqBuy74Y4RqNhtuo8e60pYxus3gNo3GqAVUmLmGALocE0GOw1Lx70A== +"@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== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-16.0.0-rc.2.tgz#ef8c9331a2ebc846e4755a40c124e9aaf80cc3f7" - integrity sha512-a84nlV1J92OooXuqSHwu5eQ7+dgDmjLmvdH4FwiufaeHSCDWNx7v3inL3P4t25LwQOW3t3PyQ8GNBUSQ6wAxIQ== +"@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== dependencies: tslib "^2.3.0" -"@angular/router@^16.0.0-next.7": - version "16.0.0-rc.2" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-16.0.0-rc.2.tgz#7f25eab1b11c1383ea5d0c44e89664b340d2393e" - integrity sha512-Ysg1icbuN34lrmgSjOSWLpKxVDrU3M+A317DRnusgta5P8vdcQDzaAmaAYFcACgWvtfAKPOfczKg9MRxsdPFDw== +"@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== dependencies: tslib "^2.3.0" @@ -292,64 +295,60 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.22.5": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0": +"@babel/compat-data@^7.20.0": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== -"@babel/compat-data@^7.20.5": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.14.tgz#4106fc8b755f3e3ee0a0a7c27dde5de1d2b2baf8" - integrity sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw== - -"@babel/compat-data@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.4.tgz#457ffe647c480dff59c2be092fc3acf71195c87f" - integrity sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g== +"@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/core@7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== +"@babel/core@7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.17.tgz#2f9b0b395985967203514b24ee50f9fd0639c866" + integrity sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ== dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@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.17" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.17" + "@babel/types" "^7.22.17" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" -"@babel/core@7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.4.tgz#c6dc73242507b8e2a27fd13a9c1814f9fa34a659" - integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== +"@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== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helpers" "^7.21.0" - "@babel/parser" "^7.21.4" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.4" - "@babel/types" "^7.21.4" + "@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" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -377,25 +376,16 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@7.21.4", "@babel/generator@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.4.tgz#64a94b7448989f421f919d5239ef553b37bb26bc" - integrity sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA== +"@babel/generator@7.22.15", "@babel/generator@^7.22.15", "@babel/generator@^7.22.5": + 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.21.4" + "@babel/types" "^7.22.15" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.19.3", "@babel/generator@^7.20.7": - version "7.20.14" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.14.tgz#9fa772c9f86a46c6ac9b321039400712b96f64ce" - integrity sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg== - dependencies: - "@babel/types" "^7.20.7" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - "@babel/generator@^7.20.1", "@babel/generator@^7.20.2": version "7.20.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" @@ -405,22 +395,28 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@7.18.6", "@babel/helper-annotate-as-pure@^7.18.6": +"@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" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + 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/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.15" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": +"@babel/helper-compilation-targets@^7.20.0": version "7.20.0" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== @@ -430,54 +426,31 @@ browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.19.3", "@babel/helper-compilation-targets@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" - integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz#770cd1ce0889097ceacb99418ee6934ef0572656" - integrity sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg== +"@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== dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" - integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz#3a017163dc3c2ba7deb9a7950849a9586ea24c18" - integrity sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" + 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.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.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" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6": version "7.19.0" @@ -487,39 +460,37 @@ "@babel/helper-annotate-as-pure" "^7.18.6" regexpu-core "^5.1.0" -"@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz#40411a8ab134258ad2cf3a3d987ec6aa0723cee5" - integrity sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA== +"@babel/helper-create-regexp-features-plugin@^7.22.5": + 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.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" + semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" "@babel/helper-environment-visitor@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" +"@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-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": +"@babel/helper-function-name@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== @@ -527,13 +498,13 @@ "@babel/template" "^7.18.10" "@babel/types" "^7.19.0" -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== +"@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" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" @@ -542,19 +513,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@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" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-member-expression-to-functions@^7.20.7", "@babel/helper-member-expression-to-functions@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz#319c6a940431a133897148515877d2f3269c3ba5" - integrity sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q== +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.22.5": + 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.21.0" + "@babel/types" "^7.22.15" "@babel/helper-module-imports@^7.18.6": version "7.18.6" @@ -563,14 +534,14 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== +"@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.21.4" + "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.2": +"@babel/helper-module-transforms@^7.20.2": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== @@ -584,78 +555,51 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.2" -"@babel/helper-module-transforms@^7.19.0", "@babel/helper-module-transforms@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" - integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.17", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + 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.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.10" - "@babel/types" "^7.20.7" + "@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.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" - integrity sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ== +"@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" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.2" - "@babel/types" "^7.21.2" + "@babel/types" "^7.22.5" -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@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.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@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.18.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" +"@babel/helper-plugin-utils@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz#dabaa50622b3b4670bd6546fc8db23eb12d89da0" + integrity sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.17" -"@babel/helper-replace-supers@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz#243ecd2724d2071532b2c8ad2f0f9f083bcae331" - integrity sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A== +"@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== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.20.7" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.20.2": version "7.20.2" @@ -664,14 +608,28 @@ dependencies: "@babel/types" "^7.20.2" -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: - "@babel/types" "^7.20.0" + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@7.22.6", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@7.18.6", "@babel/helper-split-export-declaration@^7.18.6": +"@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== @@ -683,39 +641,39 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + 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.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": + 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-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== +"@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-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz#89f18335cff1152373222f76a4b37799636ae8b1" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== +"@babel/helper-wrap-function@^7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz#222ac3ff9cc8f9b617cc1e5db75c0b538e722801" + integrity sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q== dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helpers@^7.19.0": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.13.tgz#e3cb731fb70dc5337134cadc24cbbad31cc87ad2" - integrity sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.13" - "@babel/types" "^7.20.7" + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.17" "@babel/helpers@^7.20.1": version "7.20.1" @@ -726,14 +684,14 @@ "@babel/traverse" "^7.20.1" "@babel/types" "^7.20.0" -"@babel/helpers@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.0.tgz#9dd184fb5599862037917cdc9eecb84577dc4e7e" - integrity sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA== +"@babel/helpers@^7.22.15", "@babel/helpers@^7.22.5": + 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.20.7" - "@babel/traverse" "^7.21.0" - "@babel/types" "^7.21.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" "@babel/highlight@^7.18.6": version "7.18.6" @@ -744,165 +702,45 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@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== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": version "7.20.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== -"@babel/parser@^7.19.3", "@babel/parser@^7.20.13", "@babel/parser@^7.20.7": - version "7.20.15" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.15.tgz#eec9f36d8eaf0948bb88c87a46784b5ee9fd0c89" - integrity sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg== - -"@babel/parser@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.4.tgz#94003fdfc520bbe2875d4ae557b43ddb6d880f17" - integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - 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.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@7.20.7", "@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/parser@^7.22.15", "@babel/parser@^7.22.16", "@babel/parser@^7.22.5": + 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-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== +"@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" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -939,12 +777,26 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -1009,301 +861,434 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz#bea332b0e8b2dab3dafe55a163d8227531ab0551" - integrity sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ== +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@7.20.7", "@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@7.22.15", "@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== +"@babel/plugin-transform-async-to-generator@7.22.5", "@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz#704cc2fd155d1c996551db8276d55b9d46e4d0aa" - integrity sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ== +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/template" "^7.20.7" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-for-of@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz#964108c9988de1a60b4be2354a7d7e245f36e86e" - integrity sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ== +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.21.2": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz#6ff5070e71e3192ef2b7e39820a06fb78e3058e7" - integrity sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA== +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== dependencies: - "@babel/helper-module-transforms" "^7.21.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-simple-access" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" -"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-runtime@7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.21.4.tgz#a952482e634a8dd8271a3fe5459a16eb10739c58" - integrity sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw== - dependencies: - "@babel/compat-data" "^7.21.4" - "@babel/helper-compilation-targets" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" +"@babel/plugin-transform-runtime@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.15.tgz#142716f8e00bc030dae5b2ac6a46fbd8b3e18ff8" + integrity sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag== + dependencies: + "@babel/compat-data" "^7.22.9" + "@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.20.0" + "@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" @@ -1313,54 +1298,69 @@ "@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-transform-arrow-functions" "^7.20.7" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.20.7" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.0" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.2" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.20.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.4" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + "@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.15" + 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" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" @@ -1369,12 +1369,12 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" - integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== +"@babel/runtime@7.22.15": + 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.13.11" + regenerator-runtime "^0.14.0" "@babel/runtime@^7.8.4": version "7.20.1" @@ -1383,15 +1383,6 @@ dependencies: regenerator-runtime "^0.13.10" -"@babel/template@7.20.7", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@babel/template@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" @@ -1401,7 +1392,16 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1": +"@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== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.1": version "7.20.1" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== @@ -1417,39 +1417,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.19.3", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.13": - version "7.20.13" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.13.tgz#817c1ba13d11accca89478bd5481b2d168d07473" - integrity sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.13" - "@babel/types" "^7.20.7" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.20.7", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.4.tgz#a836aca7b116634e97a6ed99976236b3282c9d36" - integrity sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.4" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.4" - "@babel/types" "^7.21.4" +"@babel/traverse@^7.22.15", "@babel/traverse@^7.22.17", "@babel/traverse@^7.22.5": + 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.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.4.4": +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.4.4": version "7.20.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== @@ -1458,22 +1442,13 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.19.3", "@babel/types@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== +"@babel/types@^7.22.15", "@babel/types@^7.22.17", "@babel/types@^7.22.5": + 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.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" "@colors/colors@1.5.0": @@ -1486,231 +1461,243 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@esbuild/android-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.16.tgz#7b18cab5f4d93e878306196eed26b6d960c12576" - integrity sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q== - -"@esbuild/android-arm64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz#164b054d58551f8856285f386e1a8f45d9ba3a31" - integrity sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg== - -"@esbuild/android-arm@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.16.tgz#5c47f6a7c2cada6ed4b4d4e72d8c66e76d812812" - integrity sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw== - -"@esbuild/android-arm@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.17.tgz#1b3b5a702a69b88deef342a7a80df4c894e4f065" - integrity sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg== - -"@esbuild/android-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.16.tgz#8686a6e98359071ffd5312046551943e7244c51a" - integrity sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow== - -"@esbuild/android-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.17.tgz#6781527e3c4ea4de532b149d18a2167f06783e7f" - integrity sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA== - -"@esbuild/darwin-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.16.tgz#aa79fbf447630ca0696a596beba962a775bbf394" - integrity sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA== - -"@esbuild/darwin-arm64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz#c5961ef4d3c1cc80dafe905cc145b5a71d2ac196" - integrity sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ== - -"@esbuild/darwin-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.16.tgz#d5d68ee510507104da7e7503224c647c957e163e" - integrity sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ== - -"@esbuild/darwin-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz#b81f3259cc349691f67ae30f7b333a53899b3c20" - integrity sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg== - -"@esbuild/freebsd-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.16.tgz#b00b4cc8c2e424907cfe3a607384ab24794edd52" - integrity sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA== - -"@esbuild/freebsd-arm64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz#db846ad16cf916fd3acdda79b85ea867cb100e87" - integrity sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA== - -"@esbuild/freebsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.16.tgz#84af4430a07730b50bbc945a90cf7036c1853b76" - integrity sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g== - -"@esbuild/freebsd-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz#4dd99acbaaba00949d509e7c144b1b6ef9e1815b" - integrity sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw== - -"@esbuild/linux-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.16.tgz#35571d15de6272c862d9ce6341372fb3cef0f266" - integrity sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA== - -"@esbuild/linux-arm64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz#7f9274140b2bb9f4230dbbfdf5dc2761215e30f6" - integrity sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw== - -"@esbuild/linux-arm@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.16.tgz#b65c7cd5b0eadd08f91aab66b9dda81b6a4b2a70" - integrity sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw== - -"@esbuild/linux-arm@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz#5c8e44c2af056bb2147cf9ad13840220bcb8948b" - integrity sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg== - -"@esbuild/linux-ia32@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.16.tgz#673a68cb251ce44a00a6422ada29064c5a1cd2c0" - integrity sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA== - -"@esbuild/linux-ia32@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz#18a6b3798658be7f46e9873fa0c8d4bec54c9212" - integrity sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q== - -"@esbuild/linux-loong64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.16.tgz#477e2da34ab46ffdbf4740fa6441e80045249385" - integrity sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ== - -"@esbuild/linux-loong64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz#a8d93514a47f7b4232716c9f02aeb630bae24c40" - integrity sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw== - -"@esbuild/linux-mips64el@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.16.tgz#e1e9687bbdaa831d7c34edc9278200982c1a4bf4" - integrity sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA== - -"@esbuild/linux-mips64el@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz#4784efb1c3f0eac8133695fa89253d558149ee1b" - integrity sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A== - -"@esbuild/linux-ppc64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.16.tgz#2f19075d63622987e86e83a4b7866cd57b796c60" - integrity sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q== - -"@esbuild/linux-ppc64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz#ef6558ec5e5dd9dc16886343e0ccdb0699d70d3c" - integrity sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ== - -"@esbuild/linux-riscv64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.16.tgz#bbf40a38f03ba2434fe69b5ceeec5d13c742b329" - integrity sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA== - -"@esbuild/linux-riscv64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz#13a87fdbcb462c46809c9d16bcf79817ecf9ce6f" - integrity sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA== - -"@esbuild/linux-s390x@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.16.tgz#d2b8c0779ccd2b7917cdf0fab8831a468e0f9c01" - integrity sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw== - -"@esbuild/linux-s390x@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz#83cb16d1d3ac0dca803b3f031ba3dc13f1ec7ade" - integrity sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ== - -"@esbuild/linux-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.16.tgz#da48b39cfdc1b12a74976625f583f031eac43590" - integrity sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g== - -"@esbuild/linux-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz#7bc400568690b688e20a0c94b2faabdd89ae1a79" - integrity sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg== - -"@esbuild/netbsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.16.tgz#ddef985aed37cc81908d2573b66c0299dbc49037" - integrity sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA== - -"@esbuild/netbsd-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz#1b5dcfbc4bfba80e67a11e9148de836af5b58b6c" - integrity sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA== - -"@esbuild/openbsd-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.16.tgz#85035bf89efd66e9068bc72aa6bb85a2c317d090" - integrity sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew== - -"@esbuild/openbsd-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz#e275098902291149a5dcd012c9ea0796d6b7adff" - integrity sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA== - -"@esbuild/sunos-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.16.tgz#16338ecab854cb2d831cc9ee9cc21ef69566e1f3" - integrity sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag== - -"@esbuild/sunos-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz#10603474866f64986c0370a2d4fe5a2bb7fee4f5" - integrity sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q== - -"@esbuild/win32-arm64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.16.tgz#423f46bb744aff897a5f74435469e1ef4952e343" - integrity sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg== - -"@esbuild/win32-arm64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz#521a6d97ee0f96b7c435930353cc4e93078f0b54" - integrity sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q== - -"@esbuild/win32-ia32@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.16.tgz#1978be5b192c7063bd2c8d5960eb213e1964740e" - integrity sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA== - -"@esbuild/win32-ia32@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz#56f88462ebe82dad829dc2303175c0e0ccd8e38e" - integrity sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ== - -"@esbuild/win32-x64@0.17.16": - version "0.17.16" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.16.tgz#260f19b0a3300d22c3a3f52722c671dc561edaa3" - integrity sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg== - -"@esbuild/win32-x64@0.17.17": - version "0.17.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz#2b577b976e6844106715bbe0cdc57cd1528063f9" - integrity sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg== +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + 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-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-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/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-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/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-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/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-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-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-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-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-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-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-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-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/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/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/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/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-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-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== "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1762,11 +1749,24 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.15": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.17": version "0.3.18" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" @@ -2490,10 +2490,10 @@ "@material/theme" "15.0.0-canary.3b5b55e31.0" tslib "^2.1.0" -"@ngtools/webpack@16.0.0-rc.1": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.0.0-rc.1.tgz#f4b597e78f121425b59cca6d3f2da30599f1e611" - integrity sha512-FmXM2DaYz8fxS4Kat7Z3vgp+V3Wst0HsxEdB/KAyvTjt/7XEtge9fNv5XO4nuC6drC/e8JNe3T8ooLqoXzOikw== +"@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== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2516,6 +2516,16 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/agent@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.1.1.tgz#31095663b8feef27ec3eccd5254a35b8fc70353a" + integrity sha512-6RlbiOAi6L6uUYF4/CDEkDZQnKw0XDsFJVrEpnib8rAx2WRMOsUyAdgnvDpX/fdkDWxtqE+NHwF465llI2wR0g== + dependencies: + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.1" + "@npmcli/fs@^2.1.0": version "2.1.2" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" @@ -2531,20 +2541,19 @@ dependencies: semver "^7.3.5" -"@npmcli/git@^4.0.0": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.3.tgz#354db5fe1f29696303638e191d8538ee9b01b4bb" - integrity sha512-8cXNkDIbnXPVbhXMmQ7/bklCAjtmPaXfI9aEM4iH+xSuEHINLMHhlfESvVwdqmHJRJkR48vNJTSUvoF6GRPSFA== +"@npmcli/git@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" + integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== dependencies: - "@npmcli/promise-spawn" "^6.0.0" - lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^8.0.0" + "@npmcli/promise-spawn" "^7.0.0" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^3.0.0" + which "^4.0.0" "@npmcli/installed-package-contents@^2.0.1": version "2.0.1" @@ -2567,43 +2576,95 @@ resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.1.tgz#2bf718579ad0ca2c5bd364c6a9de3e2fa6be2b00" - integrity sha512-+hcUpxgx0vEpDJI9Cn+lkTdKLoqKBXFCVps5H7FujEU2vLOp6KwqjLlxbnz8Wzgm8oEqW/u5FeNAXSFjLdCD0A== +"@npmcli/promise-spawn@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" + integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== dependencies: - which "^3.0.0" + which "^4.0.0" -"@npmcli/run-script@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" - integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== +"@npmcli/run-script@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.1.tgz#18eebaed96214357f618a82510411319181417bd" + integrity sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g== dependencies: "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^6.0.0" + "@npmcli/promise-spawn" "^7.0.0" node-gyp "^9.0.0" read-package-json-fast "^3.0.0" - which "^3.0.0" + which "^4.0.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@schematics/angular@16.0.0-rc.1": - version "16.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-16.0.0-rc.1.tgz#3cf429143a82ccfdcdbae50e185ca57f1594a4aa" - integrity sha512-+ob+UKb4NC2FX+5AOTk4ht85ZatOlWNLtLNbykzps+dmwEM8CWP7ETuiup9Jo9m7GQEr8r78I+3/HkDeOXygmQ== +"@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== dependencies: - "@angular-devkit/core" "16.0.0-rc.1" - "@angular-devkit/schematics" "16.0.0-rc.1" + "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/schematics" "17.0.0-next.4" jsonc-parser "3.2.0" +"@sigstore/bundle@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" + integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + +"@sigstore/protobuf-specs@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.1.0.tgz#801f4b5f60e13ecd1925117a7d084ab7b2199f01" + integrity sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw== + dependencies: + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + make-fetch-happen "^13.0.0" + +"@sigstore/tuf@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" + integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + tuf-js "^2.1.0" + "@socket.io/component-emitter@~3.1.0": version "3.1.0" 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" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.0.tgz#c7ab241cf11dd29deb213d6817dabb8c99ce0863" + integrity sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.3" + "@types/body-parser@*": version "1.19.2" resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" @@ -2758,10 +2819,10 @@ dependencies: "@types/node" "*" -"@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== +"@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" "*" @@ -2770,127 +2831,137 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz#48c46eab21e0730921986ce742563ae83fe7fe34" integrity sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A== -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@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" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2906,7 +2977,7 @@ resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -abab@^2.0.6: +abab@^2.0.3, abab@^2.0.5, 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== @@ -2924,10 +2995,33 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== +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" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +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@^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.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== acorn@^8.5.0, acorn@^8.7.1: version "8.8.1" @@ -2949,6 +3043,13 @@ agent-base@6, agent-base@^6.0.2: dependencies: debug "4" +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== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" @@ -3037,6 +3138,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -3051,6 +3157,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -3094,24 +3205,48 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -autoprefixer@10.4.14: - version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== +async-each-series@0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ== + +async@^2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@10.4.15: + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -babel-loader@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" - integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== +axios@0.21.4: + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== + dependencies: + follow-redirects "^1.14.0" + +babel-loader@9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" + integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== dependencies: - find-cache-dir "^3.3.2" + find-cache-dir "^4.0.0" schema-utils "^4.0.0" babel-plugin-istanbul@6.1.1: @@ -3125,29 +3260,29 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.2" balanced-match@^1.0.0: version "1.0.2" @@ -3243,17 +3378,69 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@4.21.5, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== +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" + integrity sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ== dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + +browser-sync-ui@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz#35e2ce3b470dce6b7219307cac7278bf324a0f16" + integrity sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg== + dependencies: + async-each-series "0.1.1" + chalk "4.1.2" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^4.4.1" + stream-throttle "^0.1.3" + +browser-sync@2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1" + integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg== + dependencies: + browser-sync-client "^2.29.3" + browser-sync-ui "^2.29.3" + bs-recipes "1.3.4" + chalk "4.1.2" + chokidar "^3.5.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^4.0.1" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.1" + micromatch "^4.0.2" + opn "5.3.0" + portscanner "2.2.0" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "^4.4.1" + ua-parser-js "^1.0.33" + yargs "^17.3.1" -browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: +browserslist@^4.14.5, browserslist@^4.21.3: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== @@ -3263,6 +3450,31 @@ browserslist@^4.14.5, browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + +bs-recipes@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3293,25 +3505,6 @@ bytes@3.1.2: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -cacache@17.0.5: - version "17.0.5" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.5.tgz#6dbec26c11f1f6a2b558bc11ed3316577c339ebc" - integrity sha512-Y/PRQevNSsjAPWykl9aeGz8Pr+OI6BYM9fYDNMvOkuUiG9IhG4LEmaYrZZZvioMUEQ+cBCxT0v8wrnCURccyKA== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^9.3.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cacache@^16.1.0: version "16.1.3" resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" @@ -3336,21 +3529,20 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" -cacache@^17.0.0: - version "17.0.2" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.2.tgz#ff2bd029bf45099b3fe711f56fbf138b846c8d6d" - integrity sha512-rYUs2x4OjSgCQND7nTrh21AHIBFgd7s/ctAYvU3a8u+nK+R5YaX/SFPDYz4Azz7SGL6+6L9ZZWI4Kawpb7grzQ== +cacache@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.0.tgz#17a9ecd6e1be2564ebe6cdca5f7cfed2bfeb6ddc" + integrity sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w== dependencies: "@npmcli/fs" "^3.1.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" p-map "^4.0.0" - promise-inflight "^1.0.1" ssri "^10.0.0" tar "^6.1.11" unique-filename "^3.0.0" @@ -3373,21 +3565,17 @@ camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001449: version "1.0.30001495" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz" integrity sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg== -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +caniuse-lite@^1.0.30001517, 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== -chalk@^4.1.0, chalk@^4.1.1: +chalk@4.1.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3395,6 +3583,15 @@ chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" @@ -3513,15 +3710,22 @@ colorette@^2.0.10: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== -commander@^2.20.0: +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.2.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +common-path-prefix@^3.0.0: + version "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== compressible@~2.0.16: version "2.0.18" @@ -3548,11 +3752,26 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +connect-history-api-fallback@^1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== + connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +connect@3.6.6: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.0" + parseurl "~1.3.2" + utils-merge "1.0.1" + connect@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" @@ -3619,12 +3838,12 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== +core-js-compat@^3.31.0: + 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.4" + browserslist "^4.21.10" core-util-is@~1.0.0: version "1.0.3" @@ -3639,34 +3858,30 @@ cors@~2.8.5: object-assign "^4" vary "^1" -cosmiconfig-typescript-loader@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== - -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== +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.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" -critters@0.0.16: - version "0.0.16" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.16.tgz#ffa2c5561a65b43c53b940036237ce72dcebfe93" - integrity sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A== +critters@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.20.tgz#08ddb961550ab7b3a59370537e4f01df208f7646" + integrity sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw== dependencies: chalk "^4.1.0" - css-select "^4.2.0" - parse5 "^6.0.1" - parse5-htmlparser2-tree-adapter "^6.0.1" - postcss "^8.3.7" + css-select "^5.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.2" + htmlparser2 "^8.0.2" + postcss "^8.4.23" pretty-bytes "^5.3.0" -cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3675,32 +3890,32 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -css-loader@6.7.3: - version "6.7.3" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== +css-loader@6.8.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== dependencies: icss-utils "^5.1.0" - postcss "^8.4.19" + postcss "^8.4.21" postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" + postcss-modules-local-by-default "^4.0.3" postcss-modules-scope "^3.0.0" postcss-modules-values "^4.0.0" postcss-value-parser "^4.2.0" semver "^7.3.8" -css-select@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== dependencies: boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" nth-check "^2.0.1" -css-what@^6.0.1: +css-what@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -3710,17 +3925,43 @@ 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" + custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg== +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" integrity sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg== -debug@2.6.9: +debug@2.6.9, debug@^2.2.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -3734,6 +3975,13 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3, debug@^4.3.4, debug@~4.3.1, d dependencies: ms "2.1.2" +debug@4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -3741,6 +3989,11 @@ debug@^3.2.6: dependencies: ms "^2.1.1" +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== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -3760,6 +4013,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -3780,11 +4038,21 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +dev-ip@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A== + di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -3819,35 +4087,61 @@ dom-serialize@^2.2.1: extend "^3.0.0" void-elements "^2.0.0" -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== +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" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== dependencies: - domelementtype "^2.2.0" + lodash "^4.17.10" -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== +eazy-logger@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" + integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" + chalk "4.1.2" ee-first@1.1.1: version "1.1.1" @@ -3864,17 +4158,27 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.299.tgz#faa2069cd4879a73e540e533178db5c618768d41" integrity sha512-lQ7ijJghH6pCGbfWXr6EY+KYCMaRSjgsY925r1p/TlpSfVM1VjHTcn1gAc15VM4uwti283X6QtjPTXdpoSGiZQ== +electron-to-chromium@^1.4.477: + version "1.4.520" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz#c19c25a10d87bd88a9aae2b76cae9235a50c2994" + integrity sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@~1.0.2: +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== @@ -3886,11 +4190,27 @@ encoding@^0.1.13: dependencies: iconv-lite "^0.6.2" +engine.io-client@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-6.5.2.tgz#8709e22c291d4297ae80318d3c8baeae71f0e002" + integrity sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.11.0" + xmlhttprequest-ssl "~2.0.0" + engine.io-parser@~5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.0.4.tgz#0b13f704fa9271b3ec4f33112410d8f3f41d0fc0" integrity sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== +engine.io-parser@~5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.1.tgz#9f213c77512ff1a6cc0c7a86108a7ffceb16fcfb" + integrity sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ== + engine.io@~6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.2.0.tgz#003bec48f6815926f2b1b17873e576acd54f41d0" @@ -3907,10 +4227,10 @@ engine.io@~6.2.0: engine.io-parser "~5.0.3" ws "~8.2.3" -enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -3920,10 +4240,10 @@ ent@~2.2.0: resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== entities@^4.3.0, entities@^4.4.0: version "4.4.0" @@ -3959,66 +4279,66 @@ es-module-lexer@^1.2.1: resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== -esbuild-wasm@0.17.16: - version "0.17.16" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.16.tgz#d50c2a937ea637cdb52a3c62c3fc4b3f2106c06f" - integrity sha512-o5DNFwnYThm9LXYIEoZEnJrk7cI08GwVjHKMUHDFSN8vo0y8eKdEOAgNH3rSoBK/8E34PeKr1UO0liEBIH/GFQ== +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@0.17.16: - version "0.17.16" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.16.tgz#5efec24a8ff29e0c157359f27e1b5532a728b720" - integrity sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg== +esbuild@0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" + integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== optionalDependencies: - "@esbuild/android-arm" "0.17.16" - "@esbuild/android-arm64" "0.17.16" - "@esbuild/android-x64" "0.17.16" - "@esbuild/darwin-arm64" "0.17.16" - "@esbuild/darwin-x64" "0.17.16" - "@esbuild/freebsd-arm64" "0.17.16" - "@esbuild/freebsd-x64" "0.17.16" - "@esbuild/linux-arm" "0.17.16" - "@esbuild/linux-arm64" "0.17.16" - "@esbuild/linux-ia32" "0.17.16" - "@esbuild/linux-loong64" "0.17.16" - "@esbuild/linux-mips64el" "0.17.16" - "@esbuild/linux-ppc64" "0.17.16" - "@esbuild/linux-riscv64" "0.17.16" - "@esbuild/linux-s390x" "0.17.16" - "@esbuild/linux-x64" "0.17.16" - "@esbuild/netbsd-x64" "0.17.16" - "@esbuild/openbsd-x64" "0.17.16" - "@esbuild/sunos-x64" "0.17.16" - "@esbuild/win32-arm64" "0.17.16" - "@esbuild/win32-ia32" "0.17.16" - "@esbuild/win32-x64" "0.17.16" - -esbuild@^0.17.5: - version "0.17.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.17.tgz#fa906ab11b11d2ed4700f494f4f764229b25c916" - integrity sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA== + "@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@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== optionalDependencies: - "@esbuild/android-arm" "0.17.17" - "@esbuild/android-arm64" "0.17.17" - "@esbuild/android-x64" "0.17.17" - "@esbuild/darwin-arm64" "0.17.17" - "@esbuild/darwin-x64" "0.17.17" - "@esbuild/freebsd-arm64" "0.17.17" - "@esbuild/freebsd-x64" "0.17.17" - "@esbuild/linux-arm" "0.17.17" - "@esbuild/linux-arm64" "0.17.17" - "@esbuild/linux-ia32" "0.17.17" - "@esbuild/linux-loong64" "0.17.17" - "@esbuild/linux-mips64el" "0.17.17" - "@esbuild/linux-ppc64" "0.17.17" - "@esbuild/linux-riscv64" "0.17.17" - "@esbuild/linux-s390x" "0.17.17" - "@esbuild/linux-x64" "0.17.17" - "@esbuild/netbsd-x64" "0.17.17" - "@esbuild/openbsd-x64" "0.17.17" - "@esbuild/sunos-x64" "0.17.17" - "@esbuild/win32-arm64" "0.17.17" - "@esbuild/win32-ia32" "0.17.17" - "@esbuild/win32-x64" "0.17.17" + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" escalade@^3.1.1: version "3.1.1" @@ -4035,6 +4355,17 @@ escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + eslint-scope@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -4043,7 +4374,7 @@ eslint-scope@5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4070,7 +4401,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -etag@~1.8.1: +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== @@ -4161,6 +4492,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.11: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -4205,6 +4547,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw== + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -4231,16 +4586,15 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" -find-up@^4.0.0, find-up@^4.1.0: +find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== @@ -4248,16 +4602,41 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + 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== -follow-redirects@^1.0.0: +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== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +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" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -4268,11 +4647,20 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== -fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-extra@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4378,16 +4766,16 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== +glob@^10.2.2: + version "10.3.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.4.tgz#c85c9c7ab98669102b6defda76d35c5b1ef9766f" + integrity sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" + foreground-child "^3.1.0" + jackspeak "^2.0.3" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.0: version "7.2.3" @@ -4412,16 +4800,6 @@ glob@^8.0.1: minimatch "^5.0.1" once "^1.3.0" -glob@^9.3.1: - version "9.3.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4443,6 +4821,13 @@ 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.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +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" @@ -4489,12 +4874,12 @@ hdr-histogram-percentiles-obj@^3.0.0: resolved "https://registry.yarnpkg.com/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz#9409f4de0c2dda78e61de2d9d78b1e9f3cba283c" integrity sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw== -hosted-git-info@^6.0.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" - integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== +hosted-git-info@^7.0.0: + 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 "^7.5.1" + lru-cache "^10.0.1" hpack.js@^2.1.6: version "2.1.6" @@ -4506,6 +4891,13 @@ 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-entities@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" @@ -4516,6 +4908,16 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + http-cache-semantics@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -4557,6 +4959,15 @@ 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" @@ -4566,7 +4977,15 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy-middleware@^2.0.3: +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy-middleware@2.0.6, http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== @@ -4586,7 +5005,15 @@ http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -https-proxy-agent@5.0.1, https-proxy-agent@^5.0.0: +https-proxy-agent@7.0.2, https-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + +https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -4647,12 +5074,17 @@ image-size@~0.5.0: resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== +immutable@^3: + version "3.8.2" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg== + immutable@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== -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== @@ -4693,15 +5125,15 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== -ini@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.0.0.tgz#35b4b0ba3bb9a3feb8c50dbf92fb1671efda88eb" - integrity sha512-t0ikzf5qkSFqRl1e6ejKBe+Tk2bsQd8ivEkcisyGXsku2t8NvXZ1Y3RRz5vxrDgOrTBOi13CvGsVoI5wVpd7xg== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -inquirer@8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== +inquirer@8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -4717,7 +5149,7 @@ inquirer@8.2.4: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" ip@^2.0.0: version "2.0.0" @@ -4746,10 +5178,10 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -4792,6 +5224,13 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-number-like@^1.0.3: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== + dependencies: + lodash.isfinite "^3.3.2" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -4809,6 +5248,11 @@ is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" +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-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -4824,6 +5268,11 @@ is-what@^3.14.1: resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -4846,6 +5295,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -4903,6 +5357,15 @@ istanbul-reports@^3.0.0: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.0.3: + 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: + "@pkgjs/parseargs" "^0.11.0" + jasmine-core@^3.6.0: version "3.99.1" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.99.1.tgz#5bfa4b2d76618868bfac4c8ff08bb26fffa4120d" @@ -4922,6 +5385,11 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" +jiti@^1.18.2: + version "1.20.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42" + integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA== + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4942,6 +5410,39 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +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" @@ -4977,7 +5478,7 @@ json5@^2.1.2, json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -json5@^2.2.2: +json5@^2.2.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== @@ -4987,6 +5488,13 @@ jsonc-parser@3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w== + optionalDependencies: + graceful-fs "^4.1.6" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5077,11 +5585,6 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - launch-editor@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" @@ -5097,10 +5600,10 @@ less-loader@11.1.0: dependencies: klona "^2.0.4" -less@4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" - integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== +less@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== dependencies: copy-anything "^2.0.1" parse-node-version "^1.0.1" @@ -5121,6 +5624,11 @@ license-webpack-plugin@4.0.2: dependencies: webpack-sources "^3.0.0" +limiter@^1.0.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" + integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -5145,6 +5653,16 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +localtunnel@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-2.0.2.tgz#528d50087151c4790f89c2db374fe7b0a48501f0" + integrity sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug== + dependencies: + axios "0.21.4" + debug "4.3.2" + openurl "1.1.1" + yargs "17.1.1" + locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -5152,12 +5670,24 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== -lodash@^4.17.21: +lodash.isfinite@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA== + +lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -5181,6 +5711,11 @@ log4js@^6.4.1: rfdc "^1.3.0" streamroller "^3.1.3" +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5195,22 +5730,17 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.7.1: version "7.14.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.14.1.tgz#8da8d2f5f59827edb388e63e459ac23d6d408fea" integrity sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA== -lru-cache@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.0.tgz#19efafa9d08d1c08eb8efd78876075f0b8b1b07b" - integrity sha512-qFXQEwchrZcMVen2uIDceR8Tii6kCJak5rzDStfEM0qA3YLMswaxIEZO0DhIbJ3aqaJiDjt+3crlplOb0tDtKQ== - -magic-string@0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" - integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== +magic-string@0.30.3: + version "0.30.3" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" + integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" + "@jridgewell/sourcemap-codec" "^1.4.15" make-dir@^2.1.0: version "2.1.0" @@ -5220,7 +5750,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -5249,47 +5779,21 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^7.0.0" ssri "^9.0.0" -make-fetch-happen@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.0.1.tgz#b3c51663d018d9e11d57fdd4393a4c5a1a7d56eb" - integrity sha512-clv3IblugXn2CDUmqFhNzii3rjKa46u5wNeivc+QlLXkGI5FjLX3rGboo+y2kwf1pd8W0iDiC384cemeDtw9kw== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz#ed83dd3685b97f75607156d2721848f6eca561b9" - integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== +make-fetch-happen@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" + integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" ssri "^10.0.0" media-typer@0.3.0: @@ -5344,13 +5848,18 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== + mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -5366,10 +5875,10 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@2.7.5: - version "2.7.5" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== +mini-css-extract-plugin@2.7.6: + version "2.7.6" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== dependencies: schema-utils "^4.0.0" @@ -5378,7 +5887,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@^3.0.4, minimatch@^3.1.1: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -5392,17 +5901,10 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" - integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== +minimatch@^9.0.1, minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" @@ -5481,15 +5983,10 @@ minipass@^4.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.0.3.tgz#00bfbaf1e16e35e804f4aa31a7c1f6b8d9f0ee72" integrity sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw== -minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" @@ -5499,6 +5996,11 @@ minizlib@^2.1.1, minizlib@^2.1.2: minipass "^3.0.0" yallist "^4.0.0" +mitt@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.2.0.tgz#cb24e6569c806e31bd4e3995787fe38a04fdf90d" + integrity sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw== + mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -5612,6 +6114,11 @@ node-gyp@^9.0.0: tar "^6.1.2" which "^2.0.2" +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -5629,12 +6136,12 @@ nopt@^6.0.0: dependencies: abbrev "^1.0.0" -normalize-package-data@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" - integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== +normalize-package-data@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" + integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -5668,54 +6175,44 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" - integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== - dependencies: - hosted-git-info "^6.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-package-arg@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.0.0.tgz#a34f4a4208a937074b1fff0943a684fbacc83977" - integrity sha512-7dkh8mRp7s0KwVHKIVJnFCJQ2B34gOGnzgBjDGyprycmARq/82SX/lhilQ95ZuacP/G/1gsS345iAkKmxWBQ2Q== +npm-package-arg@11.0.1, npm-package-arg@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" proc-log "^3.0.0" semver "^7.3.5" validate-npm-package-name "^5.0.0" -npm-packlist@^7.0.0: - version "7.0.2" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.2.tgz#f24177ce5b3593223348157bcc3eff1db8fae7d6" - integrity sha512-d2+7RMySjVXssww23rV5NuIq1NzGvM04OlI5kwnvtYKfFTAPVs6Zxmxns2HRtJEA1oNj7D/BbFXeVAOLmW3N3Q== +npm-packlist@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.0.tgz#4e7f51fe1d5e69b19508ed8dc6cd3ae2e7b38c17" + integrity sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw== dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" - integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== +npm-pick-manifest@9.0.0, npm-pick-manifest@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" + integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== dependencies: npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" semver "^7.3.5" -npm-registry-fetch@^14.0.0: - version "14.0.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.2.tgz#f637630d9005aeebe4d7411226fb11fa1628c5e8" - integrity sha512-TMenrMagFA9KF81E2bkS5XRyzERK4KXu70vgXt5+i8FcrFeLNgNsc6e5hekTqjDwPDkL3HGn/holWcXDMfnFgw== +npm-registry-fetch@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.0.0.tgz#7529dd7c64c16a1bc8af72f99df73dfe98bb9549" + integrity sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ== dependencies: - make-fetch-happen "^11.0.0" - minipass "^3.1.6" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" proc-log "^3.0.0" npm-run-path@^4.0.1: @@ -5742,6 +6239,11 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +nwsapi@^2.2.0: + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + object-assign@^4: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5752,6 +6254,11 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +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== + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -5808,6 +6315,18 @@ open@^8.0.9: is-docker "^2.1.1" is-wsl "^2.2.0" +openurl@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" + integrity sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA== + +opn@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + dependencies: + is-wsl "^1.1.0" + ora@5.4.1, ora@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" @@ -5835,6 +6354,13 @@ p-limit@^2.2.0: dependencies: p-try "^2.0.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -5842,6 +6368,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -5862,27 +6395,27 @@ 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== -pacote@15.1.1: - version "15.1.1" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.1.tgz#94d8c6e0605e04d427610b3aacb0357073978348" - integrity sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ== +pacote@17.0.4: + version "17.0.4" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.4.tgz#4bac6c0745967bde96985ec12fbbfc8dea7140e8" + integrity sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg== dependencies: - "@npmcli/git" "^4.0.0" + "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^6.0.1" - "@npmcli/run-script" "^6.0.0" - cacache "^17.0.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^7.0.0" + cacache "^18.0.0" fs-minipass "^3.0.0" - minipass "^4.0.0" - npm-package-arg "^10.0.0" - npm-packlist "^7.0.0" - npm-pick-manifest "^8.0.0" - npm-registry-fetch "^14.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^16.0.0" proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^6.0.0" + read-package-json "^7.0.0" read-package-json-fast "^3.0.0" - sigstore "^1.0.0" + sigstore "^2.0.0" ssri "^10.0.0" tar "^6.1.11" @@ -5898,7 +6431,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.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== @@ -5922,13 +6455,6 @@ parse5-html-rewriting-stream@7.0.0: parse5 "^7.0.0" parse5-sax-parser "^7.0.0" -parse5-htmlparser2-tree-adapter@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz#4c05064254f0488676aca75fb39ca069ec96dee5" @@ -5936,7 +6462,7 @@ parse5-sax-parser@^7.0.0: dependencies: parse5 "^7.0.0" -parse5@^6.0.1: +parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== @@ -5958,6 +6484,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5973,13 +6504,13 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" - integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== +path-scurry@^1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== dependencies: - lru-cache "^9.0.0" - minipass "^5.0.0" + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-to-regexp@0.1.7: version "0.1.7" @@ -5996,7 +6527,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: +picomatch@2.3.1, picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -6006,10 +6537,10 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -piscina@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" - integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== +piscina@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.1.0.tgz#809578ee3ab2ecf4cf71c2a062100b4b95a85b96" + integrity sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -6017,21 +6548,28 @@ piscina@3.2.0: optionalDependencies: nice-napi "^1.0.2" -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== dependencies: - find-up "^4.0.0" + find-up "^6.3.0" -postcss-loader@7.2.4: - version "7.2.4" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.2.4.tgz#2884f4ca172de633b2cf1f93dc852968f0632ba9" - integrity sha512-F88rpxxNspo5hatIc+orYwZDtHFaVFOSIVAx+fBfJC1GmhWbVmPWtmg2gXKE1OxJbneOSGn8PWdIwsZFcruS+w== +portscanner@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" + integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== + dependencies: + async "^2.6.0" + is-number-like "^1.0.3" + +postcss-loader@7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.3.tgz#6da03e71a918ef49df1bb4be4c80401df8e249dd" + integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== dependencies: - cosmiconfig "^8.1.3" - cosmiconfig-typescript-loader "^4.3.0" - klona "^2.0.6" + cosmiconfig "^8.2.0" + jiti "^1.18.2" semver "^7.3.8" postcss-modules-extract-imports@^3.0.0: @@ -6039,10 +6577,10 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== dependencies: icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" @@ -6075,16 +6613,16 @@ 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.21, postcss@^8.4.19: - version "8.4.21" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" - integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== +postcss@8.4.29, postcss@^8.4.23, postcss@^8.4.27: + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== dependencies: - nanoid "^3.3.4" + nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.2.14, postcss@^8.3.7: +postcss@^8.2.14: version "8.4.19" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.19.tgz#61178e2add236b17351897c8bcc0b4c8ecab56fc" integrity sha512-h+pbPsyhlYj6N2ozBmHhHrs9DzGmbaarbLvWipMRO7RLS+v4onj26MPFXA5OBYFxyqYhUJK456SwDcY9H2/zsA== @@ -6143,11 +6681,21 @@ prr@~1.0.1: resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + qjobs@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" @@ -6160,6 +6708,11 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +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" @@ -6172,7 +6725,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1, range-parser@~1.2.0, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -6187,6 +6740,16 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +raw-body@^2.3.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + read-package-json-fast@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.1.tgz#de13ae1c591850534daf77e083e851f94af67733" @@ -6195,14 +6758,14 @@ read-package-json-fast@^3.0.0: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -read-package-json@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.0.tgz#6a741841ad72a40e77a82b9c3c8c10e865bbc519" - integrity sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w== +read-package-json@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-7.0.0.tgz#d605c9dcf6bc5856da24204aa4e9518ee9714be0" + integrity sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg== dependencies: - glob "^8.0.1" + glob "^10.2.2" json-parse-even-better-errors "^3.0.0" - normalize-package-data "^5.0.0" + normalize-package-data "^6.0.0" npm-normalize-package-bin "^3.0.0" readable-stream@^2.0.1: @@ -6251,15 +6814,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.10, regenerator-runtime@^0.13.11: +regenerator-runtime@^0.13.10: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -6340,12 +6908,12 @@ resolve-url-loader@5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve@1.22.2, resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +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== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -6358,6 +6926,14 @@ resolve@^1.14.2: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resp-modifier@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw== + dependencies: + debug "^2.2.0" + minimatch "^3.0.2" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -6393,10 +6969,10 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rollup@^3.18.0: - version "3.20.7" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.7.tgz#4f045dfb388abe08dd159f8cd286dcaca1e80b28" - integrity sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA== +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== optionalDependencies: fsevents "~2.3.2" @@ -6412,10 +6988,15 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@7.8.0: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== +rx@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug== + +rxjs@7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -6446,18 +7027,17 @@ safevalues@^0.3.4: resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@13.2.2: - version "13.2.2" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.2.tgz#f97e803993b24012c10d7ba9676548bf7a6b18b9" - integrity sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA== +sass-loader@13.3.2: + version "13.3.2" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" + integrity sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg== dependencies: - klona "^2.0.6" neo-async "^2.6.2" -sass@1.62.0: - version "1.62.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.62.0.tgz#3686b2195b93295d20765135e562366b33ece37d" - integrity sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg== +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== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -6468,7 +7048,14 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -schema-utils@^3.1.0, schema-utils@^3.1.1: +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: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -6477,6 +7064,15 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + schema-utils@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" @@ -6499,10 +7095,10 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -semver@7.4.0: - version "7.4.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" - integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== +semver@7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -6511,11 +7107,16 @@ semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -6523,6 +7124,25 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.3.5, semver@^7.3.8: dependencies: lru-cache "^6.0.0" +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -6556,7 +7176,7 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" -serve-index@^1.9.1: +serve-index@1.9.1, serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== @@ -6569,6 +7189,16 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -6579,6 +7209,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +server-destroy@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ== + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6632,13 +7267,20 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -sigstore@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.0.0.tgz#3c7a8bbacf99d0f978276bd29bd94911006b72c7" - integrity sha512-e+qfbn/zf1+rCza/BhIA//Awmf0v1pa5HQS8Xk8iXrn9bgytytVLqYD0P7NSqZ6IELTgq+tcDvLPkQjNHyWLNg== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" + integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== dependencies: - make-fetch-happen "^11.0.1" - tuf-js "^1.0.0" + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/sign" "^2.1.0" + "@sigstore/tuf" "^2.1.0" slash@^4.0.0: version "4.0.0" @@ -6655,6 +7297,16 @@ socket.io-adapter@~2.4.0: resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz#b50a4a9ecdd00c34d4c8c808224daa1a786152a6" integrity sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== +socket.io-client@^4.4.1: + version "4.7.2" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-4.7.2.tgz#f2f13f68058bd4e40f94f2a1541f275157ff2c08" + integrity sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.5.2" + socket.io-parser "~4.2.4" + socket.io-parser@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.1.tgz#01c96efa11ded938dcb21cbe590c26af5eff65e5" @@ -6663,6 +7315,14 @@ socket.io-parser@~4.2.0: "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + socket.io@^4.4.1: version "4.5.3" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.5.3.tgz#44dffea48d7f5aa41df4a66377c386b953bc521c" @@ -6693,7 +7353,16 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.6.2: +socks-proxy-agent@^8.0.1: + 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.2" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.6.2, socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -6723,7 +7392,7 @@ source-map-support@0.5.21, source-map-support@^0.5.5, source-map-support@~0.5.20 buffer-from "^1.0.0" source-map "^0.6.0" -source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -6811,6 +7480,24 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg== + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +stream-throttle@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ== + dependencies: + commander "^2.2.0" + limiter "^1.0.5" + streamroller@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-3.1.3.tgz#d95689a8c29b30d093525d0baffe6616fd62ca7e" @@ -6820,7 +7507,7 @@ streamroller@^3.1.3: debug "^4.3.4" fs-extra "^8.1.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6829,6 +7516,15 @@ streamroller@^3.1.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6843,13 +7539,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" @@ -6886,6 +7589,11 @@ 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== + tapable@^2.1.1, tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -6914,7 +7622,17 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@5.17.1, terser@^5.16.5: +terser@5.19.4: + version "5.19.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +terser@^5.16.5: version "5.17.1" resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.1.tgz#948f10830454761e2eeedc6debe45c532c83fd69" integrity sha512-hVl35zClmpisy6oaoKALOpS0rDYLxRFLHhRuDlEGTKey9qHjS1w9GMORjuwIMt70Wan4lwsLYyWDVnWgF+KUEw== @@ -6979,28 +7697,46 @@ 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" + +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" + tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== -tslib@2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@2.6.2, tslib@^2.0.3: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tslib@^2.1.0, tslib@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== -tuf-js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.0.0.tgz#c89daaf69b348081a86e9f766151dfd7ce0f5078" - integrity sha512-1dxsQwESDzACJjTdYHQ4wJ1f/of7jALWKfJEHSBWUQB/5UTJUx9SW6GHXp4mZ1KvdBRJCpGjssoPFGi4hvw8/A== +tuf-js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" + integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== dependencies: - make-fetch-happen "^11.0.1" - minimatch "^6.1.0" + "@tufjs/models" "2.0.0" + debug "^4.3.4" + make-fetch-happen "^13.0.0" type-fest@^0.21.3: version "0.21.3" @@ -7021,13 +7757,18 @@ typed-assert@^1.0.8: integrity sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg== "typescript@file:../../node_modules/typescript": - version "5.1.3" + version "5.2.2" ua-parser-js@^0.7.30: version "0.7.32" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.32.tgz#cd8c639cdca949e30fa68c44b7813ef13e36d211" integrity sha512-f9BESNVhzlhEFf2CHMSj40NWOjYPl1YKYbrvIr/hFTDEmLq7SRbWvm7FcdcpCYT95zrOhC7gZSxjdnnTpBcwVw== +ua-parser-js@^1.0.33: + 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== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -7084,6 +7825,11 @@ 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== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -7097,6 +7843,14 @@ update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: escalade "^3.1.1" picocolors "^1.0.0" +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -7104,6 +7858,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.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" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7139,15 +7901,14 @@ vary@^1, vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -vite@4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.2.2.tgz#014c30e5163844f6e96d7fe18fbb702236516dc6" - integrity sha512-PcNtT5HeDxb3QaSqFYkEum8f5sCVe0R3WK20qxgIvNBZPXU/Obxs/+ubBMeE7nLWeCo2LDzv+8hRYSlcaSehig== +vite@4.4.9: + version "4.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" + integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== dependencies: - esbuild "^0.17.5" - postcss "^8.4.21" - resolve "^1.22.1" - rollup "^3.18.0" + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" optionalDependencies: fsevents "~2.3.2" @@ -7156,6 +7917,20 @@ 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" + watchpack@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -7178,10 +7953,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webpack-dev-middleware@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-6.0.2.tgz#4aab69257378e01d6fe964a8b2d07e8a87623ebc" - integrity sha512-iOddiJzPcQC6lwOIu60vscbGWth8PCRcWRCwoQcTQf9RMoOWBHg5EyzpGdtSmGMrSPd5vHEfFXmVErQEmkRngQ== +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" + integrity sha512-y51HrHaFeeWir0YO4f0g+9GwZawuigzcAdRNon6jErXy/SqV/+O6eaVAzDqE6t3e3NpGeR5CS+cCDaTC+V3yEQ== dependencies: colorette "^2.0.10" memfs "^3.4.12" @@ -7200,10 +7985,10 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@4.13.2: - version "4.13.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.13.2.tgz#d97445481d78691efe6d9a3b230833d802fc31f9" - integrity sha512-5i6TrGBRxG4vnfDpB6qSQGfnB6skGBXNL5/542w2uRGLimX6qeE5BQMLrzIC3JYV/xlGOv+s+hTleI9AZKUQNw== +webpack-dev-server@4.15.1: + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -7211,7 +7996,7 @@ webpack-dev-server@4.13.2: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -7236,10 +8021,10 @@ webpack-dev-server@4.13.2: webpack-dev-middleware "^5.3.1" ws "^8.13.0" -webpack-merge@5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== +webpack-merge@5.9.0: + version "5.9.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.9.0.tgz#dc160a1c4cf512ceca515cc231669e9ddb133826" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" @@ -7256,21 +8041,21 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -webpack@5.79.0: - version "5.79.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.79.0.tgz#8552b5da5a26e4e25842c08a883e08fc7740547a" - integrity sha512-3mN4rR2Xq+INd6NnYuL9RC9GAmc1ROPKJoHhrZ4pAjdMFEkJJWrsPw8o2JjCIyQyTu7rTXYn4VG6OpyB3CobZg== +webpack@5.88.2: + version "5.88.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" + acorn-import-assertions "^1.9.0" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" + enhanced-resolve "^5.15.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -7280,7 +8065,7 @@ webpack@5.79.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" terser-webpack-plugin "^5.3.7" watchpack "^2.4.0" @@ -7300,6 +8085,27 @@ 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-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@^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@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -7314,12 +8120,12 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -which@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" - integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== dependencies: - isexe "^2.0.0" + isexe "^3.1.1" wide-align@^1.1.5: version "1.1.5" @@ -7333,7 +8139,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7342,21 +8148,64 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + 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.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + ws@~8.2.3: version "8.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba" integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== +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== + +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== + +xmlhttprequest-ssl@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz#91360c86b914e67f44dce769180027c0da618c67" + integrity sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -7382,10 +8231,23 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@17.7.1: - version "17.7.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967" - integrity sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw== +yargs@17.1.1: + version "17.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" + integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@17.7.2, yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" @@ -7421,6 +8283,11 @@ yargs@^17.2.1: y18n "^5.0.5" yargs-parser "^21.1.1" +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zone.js@~0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.13.0.tgz#4c735cb8ef49312b58c0ad13451996dc2b202a6d" diff --git a/package.json b/package.json index 3d19fda70125..ff180af9856f 100644 --- a/package.json +++ b/package.json @@ -55,14 +55,14 @@ "ci-notify-slack-failure": "ts-node --esm --project scripts/tsconfig.json scripts/circleci/notify-slack-job-failure.mts", "prepare": "husky install" }, - "version": "17.0.0-next.1", + "version": "17.0.0-next.4", "dependencies": { - "@angular/animations": "^16.1.1", - "@angular/common": "^16.1.1", - "@angular/compiler": "^16.1.1", - "@angular/core": "^16.1.1", - "@angular/forms": "^16.1.1", - "@angular/platform-browser": "^16.1.1", + "@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", "@types/google.maps": "^3.52.4", "@types/youtube": "^0.0.46", "rxjs": "^6.6.7", @@ -71,18 +71,18 @@ "zone.js": "~0.13.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.1.0", - "@angular-devkit/core": "^16.1.0", - "@angular-devkit/schematics": "^16.1.0", + "@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/bazel": "https://github.com/angular/bazel-builds.git#bac9c1abe1e6ac1801fbbccb53353a1ed7126469", "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#22a9a75114d5e80907054f01b9fa360972de1c05", - "@angular/cli": "^16.1.0", - "@angular/compiler-cli": "^16.1.1", - "@angular/localize": "^16.1.1", + "@angular/cli": "^17.0.0-next.4", + "@angular/compiler-cli": "^17.0.0-next.4", + "@angular/localize": "^17.0.0-next.4", "@angular/ng-dev": "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2c4d983ef0f1f000a8554b3b7fbf7f1061c877d3", - "@angular/platform-browser-dynamic": "^16.1.1", - "@angular/platform-server": "^16.1.1", - "@angular/router": "^16.1.1", + "@angular/platform-browser-dynamic": "^17.0.0-next.4", + "@angular/platform-server": "^17.0.0-next.4", + "@angular/router": "^17.0.0-next.4", "@babel/core": "^7.16.12", "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/helper-string-parser": "^7.22.5", @@ -98,57 +98,57 @@ "@bazel/terser": "5.8.1", "@bazel/worker": "5.8.1", "@firebase/app-types": "^0.7.0", - "@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", + "@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", "@octokit/rest": "18.3.5", "@rollup/plugin-commonjs": "^21.0.0", "@rollup/plugin-node-resolve": "^13.1.3", - "@schematics/angular": "^16.1.0", + "@schematics/angular": "^17.0.0-next.4", "@types/babel__core": "^7.1.18", "@types/browser-sync": "^2.26.3", "@types/fs-extra": "^9.0.13", @@ -218,17 +218,17 @@ "tsickle": "0.39.1", "tslint": "^6.1.3", "tsutils": "^3.21.0", - "typescript": "5.1.3", + "typescript": "5.2.2", "vrsource-tslint-rules": "6.0.0", "yaml": "^1.10.2", "yargs": "^17.3.1", "zx": "^6.2.4" }, "resolutions": { - "@angular/build-tooling/typescript": "5.1.3", - "@angular/ng-dev/typescript": "5.1.3", + "@angular/build-tooling/typescript": "5.2.2", + "@angular/ng-dev/typescript": "5.2.2", "browser-sync-client": "2.26.13", - "dgeni-packages/typescript": "5.1.3", + "dgeni-packages/typescript": "5.2.2", "**/https-proxy-agent": "5.0.0" } } diff --git a/packages.bzl b/packages.bzl index 9f30102695ae..3625a7da6a3c 100644 --- a/packages.bzl +++ b/packages.bzl @@ -1,7 +1,7 @@ # Each individual package uses a placeholder for the version of Angular to ensure they're # all in-sync. This map is passed to each ng_package rule to stamp out the appropriate # version for the placeholders. -MDC_PACKAGE_VERSION = "15.0.0-canary.bc9ae6c9c.0" +MDC_PACKAGE_VERSION = "15.0.0-canary.a246a4439.0" TSLIB_PACKAGE_VERSION = "^2.3.0" RXJS_PACKAGE_VERSION = "^6.5.3 || ^7.4.0" diff --git a/src/cdk/a11y/focus-trap/focus-trap.ts b/src/cdk/a11y/focus-trap/focus-trap.ts index 970c779ea2c0..9578898e9259 100644 --- a/src/cdk/a11y/focus-trap/focus-trap.ts +++ b/src/cdk/a11y/focus-trap/focus-trap.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {_getFocusedElementPierceShadowDom} from '@angular/cdk/platform'; import {DOCUMENT} from '@angular/common'; import { @@ -21,6 +20,7 @@ import { DoCheck, SimpleChanges, OnChanges, + booleanAttribute, } from '@angular/core'; import {take} from 'rxjs/operators'; import {InteractivityChecker} from '../interactivity-checker/interactivity-checker'; @@ -413,26 +413,19 @@ export class CdkTrapFocus implements OnDestroy, AfterContentInit, OnChanges, DoC private _previouslyFocusedElement: HTMLElement | null = null; /** Whether the focus trap is active. */ - @Input('cdkTrapFocus') + @Input({alias: 'cdkTrapFocus', transform: booleanAttribute}) get enabled(): boolean { return this.focusTrap.enabled; } - set enabled(value: BooleanInput) { - this.focusTrap.enabled = coerceBooleanProperty(value); + set enabled(value: boolean) { + this.focusTrap.enabled = value; } /** * Whether the directive should automatically move focus into the trapped region upon * initialization and return focus to the previous activeElement upon destruction. */ - @Input('cdkTrapFocusAutoCapture') - get autoCapture(): boolean { - return this._autoCapture; - } - set autoCapture(value: BooleanInput) { - this._autoCapture = coerceBooleanProperty(value); - } - private _autoCapture: boolean; + @Input({alias: 'cdkTrapFocusAutoCapture', transform: booleanAttribute}) autoCapture: boolean; constructor( private _elementRef: ElementRef, diff --git a/src/cdk/accordion/BUILD.bazel b/src/cdk/accordion/BUILD.bazel index d3b03e727564..919a0b06faab 100644 --- a/src/cdk/accordion/BUILD.bazel +++ b/src/cdk/accordion/BUILD.bazel @@ -15,7 +15,6 @@ ng_module( exclude = ["**/*.spec.ts"], ), deps = [ - "//src/cdk/coercion", "//src/cdk/collections", "@npm//@angular/core", "@npm//rxjs", diff --git a/src/cdk/accordion/accordion-item.ts b/src/cdk/accordion/accordion-item.ts index 2a2366ebd16a..1c9d5b772dbe 100644 --- a/src/cdk/accordion/accordion-item.ts +++ b/src/cdk/accordion/accordion-item.ts @@ -16,10 +16,10 @@ import { ChangeDetectorRef, SkipSelf, Inject, + booleanAttribute, } from '@angular/core'; import {UniqueSelectionDispatcher} from '@angular/cdk/collections'; import {CDK_ACCORDION, CdkAccordion} from './accordion'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {Subscription} from 'rxjs'; /** Used to generate unique ID for each accordion item. */ @@ -59,13 +59,11 @@ export class CdkAccordionItem implements OnDestroy { readonly id: string = `cdk-accordion-child-${nextId++}`; /** Whether the AccordionItem is expanded. */ - @Input() + @Input({transform: booleanAttribute}) get expanded(): boolean { return this._expanded; } - set expanded(expanded: BooleanInput) { - expanded = coerceBooleanProperty(expanded); - + set expanded(expanded: boolean) { // Only emit events and update the internal value if the value changes. if (this._expanded !== expanded) { this._expanded = expanded; @@ -91,14 +89,7 @@ export class CdkAccordionItem implements OnDestroy { private _expanded = false; /** Whether the AccordionItem is disabled. */ - @Input() - get disabled(): boolean { - return this._disabled; - } - set disabled(disabled: BooleanInput) { - this._disabled = coerceBooleanProperty(disabled); - } - private _disabled = false; + @Input({transform: booleanAttribute}) disabled: boolean = false; /** Unregister function for _expansionDispatcher. */ private _removeUniqueSelectionListener: () => void = () => {}; diff --git a/src/cdk/accordion/accordion.ts b/src/cdk/accordion/accordion.ts index 52f9d3744295..77fea84df0c3 100644 --- a/src/cdk/accordion/accordion.ts +++ b/src/cdk/accordion/accordion.ts @@ -6,8 +6,15 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; -import {Directive, InjectionToken, Input, OnChanges, OnDestroy, SimpleChanges} from '@angular/core'; +import { + Directive, + InjectionToken, + Input, + OnChanges, + OnDestroy, + SimpleChanges, + booleanAttribute, +} from '@angular/core'; import {Subject} from 'rxjs'; /** Used to generate unique ID for each accordion. */ @@ -39,18 +46,11 @@ export class CdkAccordion implements OnDestroy, OnChanges { readonly id: string = `cdk-accordion-${nextId++}`; /** Whether the accordion should allow multiple expanded accordion items simultaneously. */ - @Input() - get multi(): boolean { - return this._multi; - } - set multi(multi: BooleanInput) { - this._multi = coerceBooleanProperty(multi); - } - private _multi: boolean = false; + @Input({transform: booleanAttribute}) multi: boolean = false; /** Opens all enabled accordion items in an accordion where multi is enabled. */ openAll(): void { - if (this._multi) { + if (this.multi) { this._openCloseAllActions.next(true); } } diff --git a/src/cdk/drag-drop/directives/drag-handle.ts b/src/cdk/drag-drop/directives/drag-handle.ts index 3af26eeceda6..30bdf97eb6e5 100644 --- a/src/cdk/drag-drop/directives/drag-handle.ts +++ b/src/cdk/drag-drop/directives/drag-handle.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import { Directive, ElementRef, @@ -16,6 +15,7 @@ import { OnDestroy, Optional, SkipSelf, + booleanAttribute, } from '@angular/core'; import {Subject} from 'rxjs'; import {CDK_DRAG_PARENT} from '../drag-parent'; @@ -45,12 +45,12 @@ export class CdkDragHandle implements OnDestroy { readonly _stateChanges = new Subject(); /** Whether starting to drag through this handle is disabled. */ - @Input('cdkDragHandleDisabled') + @Input({alias: 'cdkDragHandleDisabled', transform: booleanAttribute}) get disabled(): boolean { return this._disabled; } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); + set disabled(value: boolean) { + this._disabled = value; this._stateChanges.next(this); } private _disabled = false; diff --git a/src/cdk/drag-drop/directives/drag-preview.ts b/src/cdk/drag-drop/directives/drag-preview.ts index 0aecd9440b04..779cfba9f0a4 100644 --- a/src/cdk/drag-drop/directives/drag-preview.ts +++ b/src/cdk/drag-drop/directives/drag-preview.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; -import {Directive, InjectionToken, Input, TemplateRef} from '@angular/core'; +import {Directive, InjectionToken, Input, TemplateRef, booleanAttribute} from '@angular/core'; /** * Injection token that can be used to reference instances of `CdkDragPreview`. It serves as @@ -30,14 +29,7 @@ export class CdkDragPreview { @Input() data: T; /** Whether the preview should preserve the same size as the item that is being dragged. */ - @Input() - get matchSize(): boolean { - return this._matchSize; - } - set matchSize(value: BooleanInput) { - this._matchSize = coerceBooleanProperty(value); - } - private _matchSize = false; + @Input({transform: booleanAttribute}) matchSize: boolean = false; constructor(public templateRef: TemplateRef) {} } diff --git a/src/cdk/drag-drop/directives/drag.ts b/src/cdk/drag-drop/directives/drag.ts index 2c0c4521cbe9..b85eb2c96613 100644 --- a/src/cdk/drag-drop/directives/drag.ts +++ b/src/cdk/drag-drop/directives/drag.ts @@ -29,13 +29,9 @@ import { ChangeDetectorRef, Self, InjectionToken, + booleanAttribute, } from '@angular/core'; -import { - coerceBooleanProperty, - coerceNumberProperty, - coerceElement, - BooleanInput, -} from '@angular/cdk/coercion'; +import {coerceElement, coerceNumberProperty} from '@angular/cdk/coercion'; import {Observable, Observer, Subject, merge} from 'rxjs'; import {startWith, take, map, takeUntil, switchMap, tap} from 'rxjs/operators'; import type { @@ -128,12 +124,12 @@ export class CdkDrag implements AfterViewInit, OnChanges, OnDestroy { @Input('cdkDragFreeDragPosition') freeDragPosition: Point; /** Whether starting to drag this element is disabled. */ - @Input('cdkDragDisabled') + @Input({alias: 'cdkDragDisabled', transform: booleanAttribute}) get disabled(): boolean { return this._disabled || (this.dropContainer && this.dropContainer.disabled); } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); + set disabled(value: boolean) { + this._disabled = value; this._dragRef.disabled = this._disabled; } private _disabled: boolean; diff --git a/src/cdk/drag-drop/directives/drop-list-group.ts b/src/cdk/drag-drop/directives/drop-list-group.ts index 148a5319993b..ffe30e0b5e2e 100644 --- a/src/cdk/drag-drop/directives/drop-list-group.ts +++ b/src/cdk/drag-drop/directives/drop-list-group.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive, OnDestroy, Input, InjectionToken} from '@angular/core'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; +import {Directive, OnDestroy, Input, InjectionToken, booleanAttribute} from '@angular/core'; /** * Injection token that can be used to reference instances of `CdkDropListGroup`. It serves as @@ -35,14 +34,8 @@ export class CdkDropListGroup implements OnDestroy { readonly _items = new Set(); /** Whether starting a dragging sequence from inside this group is disabled. */ - @Input('cdkDropListGroupDisabled') - get disabled(): boolean { - return this._disabled; - } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled = false; + @Input({alias: 'cdkDropListGroupDisabled', transform: booleanAttribute}) + disabled: boolean = false; ngOnDestroy() { this._items.clear(); diff --git a/src/cdk/drag-drop/directives/drop-list.ts b/src/cdk/drag-drop/directives/drop-list.ts index d947a574470e..41e0d16fb1c4 100644 --- a/src/cdk/drag-drop/directives/drop-list.ts +++ b/src/cdk/drag-drop/directives/drop-list.ts @@ -6,13 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import { - BooleanInput, - coerceArray, - coerceNumberProperty, - coerceBooleanProperty, - NumberInput, -} from '@angular/cdk/coercion'; +import {NumberInput, coerceArray, coerceNumberProperty} from '@angular/cdk/coercion'; import { ElementRef, EventEmitter, @@ -24,6 +18,7 @@ import { ChangeDetectorRef, SkipSelf, Inject, + booleanAttribute, } from '@angular/core'; import {Directionality} from '@angular/cdk/bidi'; import {ScrollDispatcher} from '@angular/cdk/scrolling'; @@ -96,22 +91,22 @@ export class CdkDropList implements OnDestroy { @Input('cdkDropListLockAxis') lockAxis: DragAxis; /** Whether starting a dragging sequence from this container is disabled. */ - @Input('cdkDropListDisabled') + @Input({alias: 'cdkDropListDisabled', transform: booleanAttribute}) get disabled(): boolean { return this._disabled || (!!this._group && this._group.disabled); } - set disabled(value: BooleanInput) { + set disabled(value: boolean) { // Usually we sync the directive and ref state right before dragging starts, in order to have // a single point of failure and to avoid having to use setters for everything. `disabled` is // a special case, because it can prevent the `beforeStarted` event from firing, which can lock // the user in a disabled state, so we also need to sync it as it's being set. - this._dropListRef.disabled = this._disabled = coerceBooleanProperty(value); + this._dropListRef.disabled = this._disabled = value; } private _disabled: boolean; /** Whether sorting within this drop list is disabled. */ - @Input('cdkDropListSortingDisabled') - sortingDisabled: BooleanInput; + @Input({alias: 'cdkDropListSortingDisabled', transform: booleanAttribute}) + sortingDisabled: boolean; /** * Function that is used to determine whether an item @@ -125,8 +120,8 @@ export class CdkDropList implements OnDestroy { sortPredicate: (index: number, drag: CdkDrag, drop: CdkDropList) => boolean = () => true; /** Whether to auto-scroll the view when the user moves their pointer close to the edges. */ - @Input('cdkDropListAutoScrollDisabled') - autoScrollDisabled: BooleanInput; + @Input({alias: 'cdkDropListAutoScrollDisabled', transform: booleanAttribute}) + autoScrollDisabled: boolean; /** Number of pixels to scroll for each frame when auto-scrolling an element. */ @Input('cdkDropListAutoScrollStep') @@ -302,8 +297,8 @@ export class CdkDropList implements OnDestroy { ref.disabled = this.disabled; ref.lockAxis = this.lockAxis; - ref.sortingDisabled = coerceBooleanProperty(this.sortingDisabled); - ref.autoScrollDisabled = coerceBooleanProperty(this.autoScrollDisabled); + ref.sortingDisabled = this.sortingDisabled; + ref.autoScrollDisabled = this.autoScrollDisabled; ref.autoScrollStep = coerceNumberProperty(this.autoScrollStep, 2); ref .connectedTo(siblings.filter(drop => drop && drop !== this).map(list => list._dropListRef)) diff --git a/src/cdk/drag-drop/drag-ref.ts b/src/cdk/drag-drop/drag-ref.ts index 242f1baeea18..89192775e5e6 100644 --- a/src/cdk/drag-drop/drag-ref.ts +++ b/src/cdk/drag-drop/drag-ref.ts @@ -14,7 +14,7 @@ import { _getEventTarget, _getShadowRoot, } from '@angular/cdk/platform'; -import {coerceBooleanProperty, coerceElement} from '@angular/cdk/coercion'; +import {coerceElement} from '@angular/cdk/coercion'; import {isFakeMousedownFromScreenReader, isFakeTouchstartFromScreenReader} from '@angular/cdk/a11y'; import {Subscription, Subject, Observable} from 'rxjs'; import type {DropListRef} from './drop-list-ref'; @@ -287,12 +287,10 @@ export class DragRef { return this._disabled || !!(this._dropContainer && this._dropContainer.disabled); } set disabled(value: boolean) { - const newValue = coerceBooleanProperty(value); - - if (newValue !== this._disabled) { - this._disabled = newValue; + if (value !== this._disabled) { + this._disabled = value; this._toggleNativeDragInteractions(); - this._handles.forEach(handle => toggleNativeDragInteractions(handle, newValue)); + this._handles.forEach(handle => toggleNativeDragInteractions(handle, value)); } } private _disabled = false; diff --git a/src/cdk/listbox/listbox.ts b/src/cdk/listbox/listbox.ts index 0a8fa40a0f98..a0de8ec65c6b 100644 --- a/src/cdk/listbox/listbox.ts +++ b/src/cdk/listbox/listbox.ts @@ -8,6 +8,7 @@ import { AfterContentInit, + booleanAttribute, ChangeDetectorRef, ContentChildren, Directive, @@ -33,7 +34,7 @@ import { SPACE, UP_ARROW, } from '@angular/cdk/keycodes'; -import {BooleanInput, coerceArray, coerceBooleanProperty} from '@angular/cdk/coercion'; +import {coerceArray} from '@angular/cdk/coercion'; import {SelectionModel} from '@angular/cdk/collections'; import {defer, fromEvent, merge, Observable, Subject} from 'rxjs'; import {filter, map, startWith, switchMap, takeUntil} from 'rxjs/operators'; @@ -115,12 +116,12 @@ export class CdkOption implements ListKeyManagerOption, Highlightab @Input('cdkOptionTypeaheadLabel') typeaheadLabel: string; /** Whether this option is disabled. */ - @Input('cdkOptionDisabled') + @Input({alias: 'cdkOptionDisabled', transform: booleanAttribute}) get disabled(): boolean { return this.listbox.disabled || this._disabled; } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); + set disabled(value: boolean) { + this._disabled = value; } private _disabled: boolean = false; @@ -281,12 +282,12 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con * Whether the listbox allows multiple options to be selected. If the value switches from `true` * to `false`, and more than one option is selected, all options are deselected. */ - @Input('cdkListboxMultiple') + @Input({alias: 'cdkListboxMultiple', transform: booleanAttribute}) get multiple(): boolean { return this.selectionModel.multiple; } - set multiple(value: BooleanInput) { - this.selectionModel.multiple = coerceBooleanProperty(value); + set multiple(value: boolean) { + this.selectionModel.multiple = value; if (this.options) { this._updateInternalValue(); @@ -294,24 +295,12 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con } /** Whether the listbox is disabled. */ - @Input('cdkListboxDisabled') - get disabled(): boolean { - return this._disabled; - } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled: boolean = false; + @Input({alias: 'cdkListboxDisabled', transform: booleanAttribute}) + disabled: boolean = false; /** Whether the listbox will use active descendant or will move focus onto the options. */ - @Input('cdkListboxUseActiveDescendant') - get useActiveDescendant(): boolean { - return this._useActiveDescendant; - } - set useActiveDescendant(shouldUseActiveDescendant: BooleanInput) { - this._useActiveDescendant = coerceBooleanProperty(shouldUseActiveDescendant); - } - private _useActiveDescendant: boolean = false; + @Input({alias: 'cdkListboxUseActiveDescendant', transform: booleanAttribute}) + useActiveDescendant: boolean = false; /** The orientation of the listbox. Only affects keyboard interaction, not visual layout. */ @Input('cdkListboxOrientation') @@ -341,23 +330,23 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con * Whether the keyboard navigation should wrap when the user presses arrow down on the last item * or arrow up on the first item. */ - @Input('cdkListboxNavigationWrapDisabled') + @Input({alias: 'cdkListboxNavigationWrapDisabled', transform: booleanAttribute}) get navigationWrapDisabled() { return this._navigationWrapDisabled; } - set navigationWrapDisabled(wrap: BooleanInput) { - this._navigationWrapDisabled = coerceBooleanProperty(wrap); + set navigationWrapDisabled(wrap: boolean) { + this._navigationWrapDisabled = wrap; this.listKeyManager?.withWrap(!this._navigationWrapDisabled); } private _navigationWrapDisabled = false; /** Whether keyboard navigation should skip over disabled items. */ - @Input('cdkListboxNavigatesDisabledOptions') + @Input({alias: 'cdkListboxNavigatesDisabledOptions', transform: booleanAttribute}) get navigateDisabledOptions() { return this._navigateDisabledOptions; } - set navigateDisabledOptions(skip: BooleanInput) { - this._navigateDisabledOptions = coerceBooleanProperty(skip); + set navigateDisabledOptions(skip: boolean) { + this._navigateDisabledOptions = skip; this.listKeyManager?.skipPredicate( this._navigateDisabledOptions ? this._skipNonePredicate : this._skipDisabledPredicate, ); @@ -683,7 +672,7 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con /** Called when the user presses keydown on the listbox. */ protected _handleKeydown(event: KeyboardEvent) { - if (this._disabled) { + if (this.disabled) { return; } @@ -809,7 +798,7 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con /** Get the id of the active option if active descendant is being used. */ protected _getAriaActiveDescendant(): string | null | undefined { - return this._useActiveDescendant ? this.listKeyManager?.activeItem?.id : null; + return this.useActiveDescendant ? this.listKeyManager?.activeItem?.id : null; } /** Get the tabindex for the listbox. */ diff --git a/src/cdk/menu/context-menu-trigger.ts b/src/cdk/menu/context-menu-trigger.ts index 7c3c53f4a16f..a3ec84a5d017 100644 --- a/src/cdk/menu/context-menu-trigger.ts +++ b/src/cdk/menu/context-menu-trigger.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive, inject, Injectable, Input, OnDestroy} from '@angular/core'; +import {booleanAttribute, Directive, inject, Injectable, Input, OnDestroy} from '@angular/core'; import {Directionality} from '@angular/cdk/bidi'; import { FlexibleConnectedPositionStrategy, @@ -14,7 +14,6 @@ import { OverlayConfig, STANDARD_DROPDOWN_BELOW_POSITIONS, } from '@angular/cdk/overlay'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {_getEventTarget} from '@angular/cdk/platform'; import {merge, partition} from 'rxjs'; import {skip, takeUntil} from 'rxjs/operators'; @@ -85,14 +84,7 @@ export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestr private readonly _contextMenuTracker = inject(ContextMenuTracker); /** Whether the context menu is disabled. */ - @Input('cdkContextMenuDisabled') - get disabled(): boolean { - return this._disabled; - } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled = false; + @Input({alias: 'cdkContextMenuDisabled', transform: booleanAttribute}) disabled: boolean = false; constructor() { super(); diff --git a/src/cdk/menu/menu-item-selectable.ts b/src/cdk/menu/menu-item-selectable.ts index 117c7b700612..1543bc0feabf 100644 --- a/src/cdk/menu/menu-item-selectable.ts +++ b/src/cdk/menu/menu-item-selectable.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; -import {Directive, Input} from '@angular/core'; +import {Directive, Input, booleanAttribute} from '@angular/core'; import {CdkMenuItem} from './menu-item'; /** Base class providing checked state for selectable MenuItems. */ @@ -19,14 +18,7 @@ import {CdkMenuItem} from './menu-item'; }) export abstract class CdkMenuItemSelectable extends CdkMenuItem { /** Whether the element is checked */ - @Input('cdkMenuItemChecked') - get checked(): boolean { - return this._checked; - } - set checked(value: BooleanInput) { - this._checked = coerceBooleanProperty(value); - } - private _checked = false; + @Input({alias: 'cdkMenuItemChecked', transform: booleanAttribute}) checked: boolean = false; /** Whether the item should close the menu if triggered by the spacebar. */ protected override closeOnSpacebarTrigger = false; diff --git a/src/cdk/menu/menu-item.spec.ts b/src/cdk/menu/menu-item.spec.ts index 8d0f0d3fb344..44d961804f5b 100644 --- a/src/cdk/menu/menu-item.spec.ts +++ b/src/cdk/menu/menu-item.spec.ts @@ -44,11 +44,6 @@ describe('MenuItem', () => { expect(nativeButton.getAttribute('type')).toBe('button'); }); - it('should coerce the disabled property', () => { - menuItem.disabled = ''; - expect(menuItem.disabled).toBeTrue(); - }); - it('should toggle the aria disabled attribute', () => { expect(nativeButton.hasAttribute('aria-disabled')).toBeFalse(); diff --git a/src/cdk/menu/menu-item.ts b/src/cdk/menu/menu-item.ts index a6720543ef23..193564fe419d 100644 --- a/src/cdk/menu/menu-item.ts +++ b/src/cdk/menu/menu-item.ts @@ -7,6 +7,7 @@ */ import { + booleanAttribute, Directive, ElementRef, EventEmitter, @@ -16,7 +17,6 @@ import { OnDestroy, Output, } from '@angular/core'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {FocusableOption, InputModalityDetector} from '@angular/cdk/a11y'; import {ENTER, hasModifierKey, LEFT_ARROW, RIGHT_ARROW, SPACE} from '@angular/cdk/keycodes'; import {Directionality} from '@angular/cdk/bidi'; @@ -68,14 +68,7 @@ export class CdkMenuItem implements FocusableOption, FocusableElement, Toggler, private readonly _menuTrigger = inject(CdkMenuTrigger, {optional: true, self: true}); /** Whether the CdkMenuItem is disabled - defaults to false */ - @Input('cdkMenuItemDisabled') - get disabled(): boolean { - return this._disabled; - } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); - } - private _disabled = false; + @Input({alias: 'cdkMenuItemDisabled', transform: booleanAttribute}) disabled: boolean = false; /** * The text used to locate this item during menu typeahead. If not specified, diff --git a/src/cdk/menu/menu-trigger.ts b/src/cdk/menu/menu-trigger.ts index c2e418b43204..2774491f4f9a 100644 --- a/src/cdk/menu/menu-trigger.ts +++ b/src/cdk/menu/menu-trigger.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive, ElementRef, inject, NgZone, OnDestroy} from '@angular/core'; +import {ChangeDetectorRef, Directive, ElementRef, inject, NgZone, OnDestroy} from '@angular/core'; import {InputModalityDetector} from '@angular/cdk/a11y'; import {Directionality} from '@angular/cdk/bidi'; import { @@ -70,6 +70,7 @@ export class CdkMenuTrigger extends CdkMenuTriggerBase implements OnDestroy { private readonly _elementRef: ElementRef = inject(ElementRef); private readonly _overlay = inject(Overlay); private readonly _ngZone = inject(NgZone); + private readonly _changeDetectorRef = inject(ChangeDetectorRef); private readonly _inputModalityDetector = inject(InputModalityDetector); private readonly _directionality = inject(Directionality, {optional: true}); @@ -101,6 +102,7 @@ export class CdkMenuTrigger extends CdkMenuTriggerBase implements OnDestroy { this.overlayRef = this.overlayRef || this._overlay.create(this._getOverlayConfig()); this.overlayRef.attach(this.getMenuContentPortal()); + this._changeDetectorRef.markForCheck(); this._subscribeToOutsideClicks(); } } @@ -111,6 +113,7 @@ export class CdkMenuTrigger extends CdkMenuTriggerBase implements OnDestroy { this.closed.next(); this.overlayRef!.detach(); + this._changeDetectorRef.markForCheck(); } this._closeSiblingTriggers(); } diff --git a/src/cdk/menu/menu.md b/src/cdk/menu/menu.md index c9d03251710e..1c43b0e6f1a2 100644 --- a/src/cdk/menu/menu.md +++ b/src/cdk/menu/menu.md @@ -210,7 +210,7 @@ If you would like to have unrelated groups of radio buttons within a single menu `@angular/cdk/menu` is capable of intelligently predicting when a user intends to navigate to an open submenu and preventing premature closeouts. This functionality prevents users from having to hunt through the open menus in a maze-like fashion to reach their destination. To enable this -feature for a menu and its sub-menus, add the `cdkMenuTargetAim` directive to the `cdkMenu` or +feature for a menu and its sub-menus, add the `cdkTargetMenuAim` directive to the `cdkMenu` or `cdkMenuBar` element. ![menu aim diagram][diagram] diff --git a/src/cdk/observers/observe-content.ts b/src/cdk/observers/observe-content.ts index e390c89b7884..68174f677105 100644 --- a/src/cdk/observers/observe-content.ts +++ b/src/cdk/observers/observe-content.ts @@ -6,13 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import { - coerceBooleanProperty, - coerceNumberProperty, - coerceElement, - BooleanInput, - NumberInput, -} from '@angular/cdk/coercion'; +import {coerceNumberProperty, coerceElement, NumberInput} from '@angular/cdk/coercion'; import { AfterContentInit, Directive, @@ -24,6 +18,7 @@ import { NgZone, OnDestroy, Output, + booleanAttribute, } from '@angular/core'; import {Observable, Subject, Subscription, Observer} from 'rxjs'; import {debounceTime} from 'rxjs/operators'; @@ -148,12 +143,12 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy { * Whether observing content is disabled. This option can be used * to disconnect the underlying MutationObserver until it is needed. */ - @Input('cdkObserveContentDisabled') + @Input({alias: 'cdkObserveContentDisabled', transform: booleanAttribute}) get disabled(): boolean { return this._disabled; } - set disabled(value: BooleanInput) { - this._disabled = coerceBooleanProperty(value); + set disabled(value: boolean) { + this._disabled = value; this._disabled ? this._unsubscribe() : this._subscribe(); } private _disabled = false; diff --git a/src/cdk/overlay/overlay-directives.ts b/src/cdk/overlay/overlay-directives.ts index 1e310def7d73..9bc9749597ac 100644 --- a/src/cdk/overlay/overlay-directives.ts +++ b/src/cdk/overlay/overlay-directives.ts @@ -7,7 +7,6 @@ */ import {Direction, Directionality} from '@angular/cdk/bidi'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {ESCAPE, hasModifierKey} from '@angular/cdk/keycodes'; import {TemplatePortal} from '@angular/cdk/portal'; import { @@ -100,11 +99,6 @@ export class CdkOverlayOrigin { export class CdkConnectedOverlay implements OnDestroy, OnChanges { private _overlayRef: OverlayRef; private _templatePortal: TemplatePortal; - private _hasBackdrop = false; - private _lockPosition = false; - private _growAfterOpen = false; - private _flexibleDimensions = false; - private _push = false; private _backdropSubscription = Subscription.EMPTY; private _attachSubscription = Subscription.EMPTY; private _detachSubscription = Subscription.EMPTY; @@ -188,49 +182,23 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges { @Input('cdkConnectedOverlayTransformOriginOn') transformOriginSelector: string; /** Whether or not the overlay should attach a backdrop. */ - @Input('cdkConnectedOverlayHasBackdrop') - get hasBackdrop(): boolean { - return this._hasBackdrop; - } - set hasBackdrop(value: BooleanInput) { - this._hasBackdrop = coerceBooleanProperty(value); - } + @Input({alias: 'cdkConnectedOverlayHasBackdrop', transform: booleanAttribute}) + hasBackdrop: boolean = false; /** Whether or not the overlay should be locked when scrolling. */ - @Input('cdkConnectedOverlayLockPosition') - get lockPosition(): boolean { - return this._lockPosition; - } - set lockPosition(value: BooleanInput) { - this._lockPosition = coerceBooleanProperty(value); - } + @Input({alias: 'cdkConnectedOverlayLockPosition', transform: booleanAttribute}) + lockPosition: boolean = false; /** Whether the overlay's width and height can be constrained to fit within the viewport. */ - @Input('cdkConnectedOverlayFlexibleDimensions') - get flexibleDimensions(): boolean { - return this._flexibleDimensions; - } - set flexibleDimensions(value: BooleanInput) { - this._flexibleDimensions = coerceBooleanProperty(value); - } + @Input({alias: 'cdkConnectedOverlayFlexibleDimensions', transform: booleanAttribute}) + flexibleDimensions: boolean = false; /** Whether the overlay can grow after the initial open when flexible positioning is turned on. */ - @Input('cdkConnectedOverlayGrowAfterOpen') - get growAfterOpen(): boolean { - return this._growAfterOpen; - } - set growAfterOpen(value: BooleanInput) { - this._growAfterOpen = coerceBooleanProperty(value); - } + @Input({alias: 'cdkConnectedOverlayGrowAfterOpen', transform: booleanAttribute}) + growAfterOpen: boolean = false; /** Whether the overlay can be pushed on-screen if none of the provided positions fit. */ - @Input('cdkConnectedOverlayPush') - get push(): boolean { - return this._push; - } - set push(value: BooleanInput) { - this._push = coerceBooleanProperty(value); - } + @Input({alias: 'cdkConnectedOverlayPush', transform: booleanAttribute}) push: boolean = false; /** Whether the overlay should be disposed of when the user goes backwards/forwards in history. */ @Input({alias: 'cdkConnectedOverlayDisposeOnNavigation', transform: booleanAttribute}) diff --git a/src/cdk/schematics/update-tool/component-resource-collector.ts b/src/cdk/schematics/update-tool/component-resource-collector.ts index 8568b17c64a3..cf353d51e050 100644 --- a/src/cdk/schematics/update-tool/component-resource-collector.ts +++ b/src/cdk/schematics/update-tool/component-resource-collector.ts @@ -45,7 +45,10 @@ export class ComponentResourceCollector { resolvedTemplates: ResolvedResource[] = []; resolvedStylesheets: ResolvedResource[] = []; - constructor(public typeChecker: ts.TypeChecker, private _fileSystem: FileSystem) {} + constructor( + public typeChecker: ts.TypeChecker, + private _fileSystem: FileSystem, + ) {} visitNode(node: ts.Node) { if (node.kind === ts.SyntaxKind.ClassDeclaration) { @@ -95,8 +98,12 @@ export class ComponentResourceCollector { const propertyName = getPropertyNameText(property.name); - if (propertyName === 'styles' && ts.isArrayLiteralExpression(property.initializer)) { - property.initializer.elements.forEach(el => { + if (propertyName === 'styles') { + const elements = ts.isArrayLiteralExpression(property.initializer) + ? property.initializer.elements + : [property.initializer]; + + elements.forEach(el => { if (ts.isStringLiteralLike(el)) { // Need to add an offset of one to the start because the template quotes are // not part of the template content. @@ -135,16 +142,15 @@ export class ComponentResourceCollector { if (propertyName === 'styleUrls' && ts.isArrayLiteralExpression(property.initializer)) { property.initializer.elements.forEach(el => { if (ts.isStringLiteralLike(el)) { - const stylesheetPath = this._fileSystem.resolve(sourceFileDirPath, el.text); - const stylesheet = this.resolveExternalStylesheet(stylesheetPath, node); - - if (stylesheet) { - this.resolvedStylesheets.push(stylesheet); - } + this._trackExternalStylesheet(sourceFileDirPath, el, node); } }); } + if (propertyName === 'styleUrl' && ts.isStringLiteralLike(property.initializer)) { + this._trackExternalStylesheet(sourceFileDirPath, property.initializer, node); + } + if (propertyName === 'templateUrl' && ts.isStringLiteralLike(property.initializer)) { const templateUrl = property.initializer.text; const templatePath = this._fileSystem.resolve(sourceFileDirPath, templateUrl); @@ -197,6 +203,19 @@ export class ComponentResourceCollector { getCharacterAndLineOfPosition: pos => getLineAndCharacterFromPosition(lineStartsMap, pos), }; } + + private _trackExternalStylesheet( + sourceFileDirPath: string, + node: ts.StringLiteralLike, + container: ts.ClassDeclaration, + ) { + const stylesheetPath = this._fileSystem.resolve(sourceFileDirPath, node.text); + const stylesheet = this.resolveExternalStylesheet(stylesheetPath, container); + + if (stylesheet) { + this.resolvedStylesheets.push(stylesheet); + } + } } /** Strips the BOM from a string. */ diff --git a/src/cdk/schematics/utils/project-main-file.ts b/src/cdk/schematics/utils/project-main-file.ts index 30c4c3a6f233..71f5c4e2cd40 100644 --- a/src/cdk/schematics/utils/project-main-file.ts +++ b/src/cdk/schematics/utils/project-main-file.ts @@ -13,13 +13,14 @@ import {getProjectTargetOptions} from './project-targets'; /** Looks for the main TypeScript file in the given project and returns its path. */ export function getProjectMainFile(project: workspaces.ProjectDefinition): Path { const buildOptions = getProjectTargetOptions(project, 'build'); + const mainPath = buildOptions.browser as Path | undefined; - if (!buildOptions.main) { + if (!mainPath) { throw new SchematicsException( `Could not find the project main file inside of the ` + `workspace config (${project.sourceRoot})`, ); } - return buildOptions.main as Path; + return mainPath; } diff --git a/src/cdk/schematics/utils/project-targets.ts b/src/cdk/schematics/utils/project-targets.ts index 51a0947df782..0c56f8c87be7 100644 --- a/src/cdk/schematics/utils/project-targets.ts +++ b/src/cdk/schematics/utils/project-targets.ts @@ -11,7 +11,7 @@ import {SchematicsException} from '@angular-devkit/schematics'; /** Object that maps a CLI target to its default builder name. */ export const defaultTargetBuilders = { - build: '@angular-devkit/build-angular:browser', + build: '@angular-devkit/build-angular:application', test: '@angular-devkit/build-angular:karma', }; diff --git a/src/cdk/scrolling/virtual-for-of.ts b/src/cdk/scrolling/virtual-for-of.ts index f6bc01b86447..2b1d0b89c137 100644 --- a/src/cdk/scrolling/virtual-for-of.ts +++ b/src/cdk/scrolling/virtual-for-of.ts @@ -34,7 +34,7 @@ import { TrackByFunction, ViewContainerRef, } from '@angular/core'; -import {coerceNumberProperty, NumberInput} from '@angular/cdk/coercion'; +import {NumberInput, coerceNumberProperty} from '@angular/cdk/coercion'; import {Observable, Subject, of as observableOf, isObservable} from 'rxjs'; import {pairwise, shareReplay, startWith, switchMap, takeUntil} from 'rxjs/operators'; import {CdkVirtualScrollRepeater} from './virtual-scroll-repeater'; diff --git a/src/cdk/scrolling/virtual-scroll-viewport.ts b/src/cdk/scrolling/virtual-scroll-viewport.ts index 65981ac03230..6547edd5b468 100644 --- a/src/cdk/scrolling/virtual-scroll-viewport.ts +++ b/src/cdk/scrolling/virtual-scroll-viewport.ts @@ -9,6 +9,7 @@ import {Directionality} from '@angular/cdk/bidi'; import {ListRange} from '@angular/cdk/collections'; import { + booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, @@ -39,7 +40,6 @@ import {CdkScrollable, ExtendedScrollToOptions} from './scrollable'; import {VIRTUAL_SCROLL_STRATEGY, VirtualScrollStrategy} from './virtual-scroll-strategy'; import {ViewportRuler} from './viewport-ruler'; import {CdkVirtualScrollRepeater} from './virtual-scroll-repeater'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import {CdkVirtualScrollable, VIRTUAL_SCROLLABLE} from './virtual-scrollable'; /** Checks if the given ranges are equal. */ @@ -106,14 +106,7 @@ export class CdkVirtualScrollViewport extends CdkVirtualScrollable implements On * Whether rendered items should persist in the DOM after scrolling out of view. By default, items * will be removed. */ - @Input() - get appendOnly(): boolean { - return this._appendOnly; - } - set appendOnly(value: BooleanInput) { - this._appendOnly = coerceBooleanProperty(value); - } - private _appendOnly = false; + @Input({transform: booleanAttribute}) appendOnly: boolean = false; // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll // strategy lazily (i.e. only if the user is actually listening to the events). We do this because @@ -236,6 +229,10 @@ export class CdkVirtualScrollViewport extends CdkVirtualScrollable implements On // there are multiple scroll events in the same frame we only need to recheck // our layout once. auditTime(0, SCROLL_SCHEDULER), + // Usually `elementScrolled` is completed when the scrollable is destroyed, but + // that may not be the case if a `CdkVirtualScrollableElement` is used so we have + // to unsubscribe here just in case. + takeUntil(this._destroyed), ) .subscribe(() => this._scrollStrategy.onContentScrolled()); diff --git a/src/cdk/stepper/stepper.ts b/src/cdk/stepper/stepper.ts index 4f1232786eb9..f38274a033d5 100644 --- a/src/cdk/stepper/stepper.ts +++ b/src/cdk/stepper/stepper.ts @@ -8,12 +8,6 @@ import {FocusableOption, FocusKeyManager} from '@angular/cdk/a11y'; import {Direction, Directionality} from '@angular/cdk/bidi'; -import { - BooleanInput, - coerceBooleanProperty, - coerceNumberProperty, - NumberInput, -} from '@angular/cdk/coercion'; import {ENTER, hasModifierKey, SPACE} from '@angular/cdk/keycodes'; import { AfterViewInit, @@ -38,6 +32,8 @@ import { ViewChild, ViewEncapsulation, AfterContentInit, + booleanAttribute, + numberAttribute, } from '@angular/core'; import {_getFocusedElementPierceShadowDom} from '@angular/cdk/platform'; import {Observable, of as observableOf, Subject} from 'rxjs'; @@ -149,32 +145,18 @@ export class CdkStep implements OnChanges { @Input() state: StepState; /** Whether the user can return to this step once it has been marked as completed. */ - @Input() - get editable(): boolean { - return this._editable; - } - set editable(value: BooleanInput) { - this._editable = coerceBooleanProperty(value); - } - private _editable = true; + @Input({transform: booleanAttribute}) editable: boolean = true; /** Whether the completion of step is optional. */ - @Input() - get optional(): boolean { - return this._optional; - } - set optional(value: BooleanInput) { - this._optional = coerceBooleanProperty(value); - } - private _optional = false; + @Input({transform: booleanAttribute}) optional: boolean = false; /** Whether step is marked as completed. */ - @Input() + @Input({transform: booleanAttribute}) get completed(): boolean { return this._completedOverride == null ? this._getDefaultCompleted() : this._completedOverride; } - set completed(value: BooleanInput) { - this._completedOverride = coerceBooleanProperty(value); + set completed(value: boolean) { + this._completedOverride = value; } _completedOverride: boolean | null = null; @@ -183,12 +165,12 @@ export class CdkStep implements OnChanges { } /** Whether step has an error. */ - @Input() + @Input({transform: booleanAttribute}) get hasError(): boolean { return this._customError == null ? this._getDefaultError() : this._customError; } - set hasError(value: BooleanInput) { - this._customError = coerceBooleanProperty(value); + set hasError(value: boolean) { + this._customError = value; } private _customError: boolean | null = null; @@ -271,40 +253,31 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { private _sortedHeaders = new QueryList(); /** Whether the validity of previous steps should be checked or not. */ - @Input() - get linear(): boolean { - return this._linear; - } - set linear(value: BooleanInput) { - this._linear = coerceBooleanProperty(value); - } - private _linear = false; + @Input({transform: booleanAttribute}) linear: boolean = false; /** The index of the selected step. */ - @Input() + @Input({transform: numberAttribute}) get selectedIndex(): number { return this._selectedIndex; } - set selectedIndex(index: NumberInput) { - const newIndex = coerceNumberProperty(index); - + set selectedIndex(index: number) { if (this.steps && this._steps) { // Ensure that the index can't be out of bounds. - if (!this._isValidIndex(newIndex) && (typeof ngDevMode === 'undefined' || ngDevMode)) { + if (!this._isValidIndex(index) && (typeof ngDevMode === 'undefined' || ngDevMode)) { throw Error('cdkStepper: Cannot assign out-of-bounds value to `selectedIndex`.'); } this.selected?._markAsInteracted(); if ( - this._selectedIndex !== newIndex && - !this._anyControlsInvalidOrPending(newIndex) && - (newIndex >= this._selectedIndex || this.steps.toArray()[newIndex].editable) + this._selectedIndex !== index && + !this._anyControlsInvalidOrPending(index) && + (index >= this._selectedIndex || this.steps.toArray()[index].editable) ) { - this._updateSelectedItemIndex(newIndex); + this._updateSelectedItemIndex(index); } } else { - this._selectedIndex = newIndex; + this._selectedIndex = index; } } private _selectedIndex = 0; @@ -551,7 +524,7 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { } private _anyControlsInvalidOrPending(index: number): boolean { - if (this._linear && index >= 0) { + if (this.linear && index >= 0) { return this.steps .toArray() .slice(0, index) diff --git a/src/cdk/table/cell.ts b/src/cdk/table/cell.ts index 4aabe6e48985..0a213c5846ea 100644 --- a/src/cdk/table/cell.ts +++ b/src/cdk/table/cell.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import { ContentChild, Directive, @@ -15,6 +14,7 @@ import { Input, Optional, TemplateRef, + booleanAttribute, } from '@angular/core'; import {CanStick, CanStickCtor, mixinHasStickyInput} from './can-stick'; import {CDK_TABLE} from './tokens'; @@ -82,14 +82,15 @@ export class CdkColumnDef extends _CdkColumnDefBase implements CanStick { * that it mimics the `CanStick` mixin such that `_hasStickyChanged` is set to true if the value * has been changed. */ - @Input('stickyEnd') + @Input({transform: booleanAttribute}) get stickyEnd(): boolean { return this._stickyEnd; } - set stickyEnd(v: BooleanInput) { - const prevValue = this._stickyEnd; - this._stickyEnd = coerceBooleanProperty(v); - this._hasStickyChanged = prevValue !== this._stickyEnd; + set stickyEnd(value: boolean) { + if (value !== this._stickyEnd) { + this._stickyEnd = value; + this._hasStickyChanged = true; + } } _stickyEnd: boolean = false; diff --git a/src/cdk/table/table.ts b/src/cdk/table/table.ts index 0fd73a714016..6d17b6f6cfbf 100644 --- a/src/cdk/table/table.ts +++ b/src/cdk/table/table.ts @@ -7,7 +7,6 @@ */ import {Direction, Directionality} from '@angular/cdk/bidi'; -import {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion'; import { CollectionViewer, DataSource, @@ -52,6 +51,7 @@ import { ViewChild, ViewContainerRef, ViewEncapsulation, + booleanAttribute, } from '@angular/core'; import { BehaviorSubject, @@ -432,12 +432,12 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes * dataobject will render the first row that evaluates its when predicate to true, in the order * defined in the table, or otherwise the default row which does not have a when predicate. */ - @Input() + @Input({transform: booleanAttribute}) get multiTemplateDataRows(): boolean { return this._multiTemplateDataRows; } - set multiTemplateDataRows(v: BooleanInput) { - this._multiTemplateDataRows = coerceBooleanProperty(v); + set multiTemplateDataRows(value: boolean) { + this._multiTemplateDataRows = value; // In Ivy if this value is set via a static attribute (e.g. ), // this setter will be invoked before the row outlet has been defined hence the null check. @@ -452,12 +452,12 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes * Whether to use a fixed table layout. Enabling this option will enforce consistent column widths * and optimize rendering sticky styles for native tables. No-op for flex tables. */ - @Input() + @Input({transform: booleanAttribute}) get fixedLayout(): boolean { return this._fixedLayout; } - set fixedLayout(v: BooleanInput) { - this._fixedLayout = coerceBooleanProperty(v); + set fixedLayout(value: boolean) { + this._fixedLayout = value; // Toggling `fixedLayout` may change column widths. Sticky column styles should be recalculated. this._forceRecalculateCellWidths = true; diff --git a/src/cdk/text-field/autosize.ts b/src/cdk/text-field/autosize.ts index f07bf93bbddd..d6d630645f5f 100644 --- a/src/cdk/text-field/autosize.ts +++ b/src/cdk/text-field/autosize.ts @@ -6,12 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import { - BooleanInput, - coerceBooleanProperty, - coerceNumberProperty, - NumberInput, -} from '@angular/cdk/coercion'; +import {NumberInput, coerceNumberProperty} from '@angular/cdk/coercion'; import { Directive, ElementRef, @@ -22,6 +17,7 @@ import { NgZone, Optional, Inject, + booleanAttribute, } from '@angular/core'; import {Platform} from '@angular/cdk/platform'; import {auditTime, takeUntil} from 'rxjs/operators'; @@ -80,13 +76,11 @@ export class CdkTextareaAutosize implements AfterViewInit, DoCheck, OnDestroy { } /** Whether autosizing is enabled or not */ - @Input('cdkTextareaAutosize') + @Input({alias: 'cdkTextareaAutosize', transform: booleanAttribute}) get enabled(): boolean { return this._enabled; } - set enabled(value: BooleanInput) { - value = coerceBooleanProperty(value); - + set enabled(value: boolean) { // Only act if the actual value changed. This specifically helps to not run // resizeToFitContent too early (i.e. before ngAfterViewInit) if (this._enabled !== value) { diff --git a/src/components-examples/material/tree/index.ts b/src/components-examples/material/tree/index.ts index 1b47ab706284..dd5eed1712d9 100644 --- a/src/components-examples/material/tree/index.ts +++ b/src/components-examples/material/tree/index.ts @@ -1,4 +1,3 @@ -export {TreeChecklistExample} from './tree-checklist/tree-checklist-example'; export {TreeDynamicExample} from './tree-dynamic/tree-dynamic-example'; export {TreeFlatOverviewExample} from './tree-flat-overview/tree-flat-overview-example'; export {TreeHarnessExample} from './tree-harness/tree-harness-example'; diff --git a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.css b/src/components-examples/material/tree/tree-checklist/tree-checklist-example.css deleted file mode 100644 index c5ab9948f1a2..000000000000 --- a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.css +++ /dev/null @@ -1,3 +0,0 @@ -.mat-mdc-form-field { - margin-right: 4px; -} diff --git a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.html b/src/components-examples/material/tree/tree-checklist/tree-checklist-example.html deleted file mode 100644 index cbe7f96d03f5..000000000000 --- a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - {{node.item}} - - - - - - New item... - - - - - - - - {{node.item}} - - - diff --git a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.ts b/src/components-examples/material/tree/tree-checklist/tree-checklist-example.ts deleted file mode 100644 index b3e9deecc893..000000000000 --- a/src/components-examples/material/tree/tree-checklist/tree-checklist-example.ts +++ /dev/null @@ -1,280 +0,0 @@ -import {SelectionModel} from '@angular/cdk/collections'; -import {FlatTreeControl} from '@angular/cdk/tree'; -import {Component, Injectable} from '@angular/core'; -import {MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule} from '@angular/material/tree'; -import {MatIconModule} from '@angular/material/icon'; -import {MatInputModule} from '@angular/material/input'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatButtonModule} from '@angular/material/button'; -import {BehaviorSubject} from 'rxjs'; - -/** - * Node for to-do item - */ -export class TodoItemNode { - children: TodoItemNode[]; - item: string; -} - -/** Flat to-do item node with expandable and level information */ -export class TodoItemFlatNode { - item: string; - level: number; - expandable: boolean; -} - -/** - * The Json object for to-do list data. - */ -const TREE_DATA = { - Groceries: { - 'Almond Meal flour': null, - 'Organic eggs': null, - 'Protein Powder': null, - Fruits: { - Apple: null, - Berries: ['Blueberry', 'Raspberry'], - Orange: null, - }, - }, - Reminders: ['Cook dinner', 'Read the Material Design spec', 'Upgrade Application to Angular'], -}; - -/** - * Checklist database, it can build a tree structured Json object. - * Each node in Json object represents a to-do item or a category. - * If a node is a category, it has children items and new items can be added under the category. - */ -@Injectable() -export class ChecklistDatabase { - dataChange = new BehaviorSubject([]); - - get data(): TodoItemNode[] { - return this.dataChange.value; - } - - constructor() { - this.initialize(); - } - - initialize() { - // Build the tree nodes from Json object. The result is a list of `TodoItemNode` with nested - // file node as children. - const data = this.buildFileTree(TREE_DATA, 0); - - // Notify the change. - this.dataChange.next(data); - } - - /** - * Build the file structure tree. The `value` is the Json object, or a sub-tree of a Json object. - * The return value is the list of `TodoItemNode`. - */ - buildFileTree(obj: {[key: string]: any}, level: number): TodoItemNode[] { - return Object.keys(obj).reduce((accumulator, key) => { - const value = obj[key]; - const node = new TodoItemNode(); - node.item = key; - - if (value != null) { - if (typeof value === 'object') { - node.children = this.buildFileTree(value, level + 1); - } else { - node.item = value; - } - } - - return accumulator.concat(node); - }, []); - } - - /** Add an item to to-do list */ - insertItem(parent: TodoItemNode, name: string) { - if (parent.children) { - parent.children.push({item: name} as TodoItemNode); - this.dataChange.next(this.data); - } - } - - updateItem(node: TodoItemNode, name: string) { - node.item = name; - this.dataChange.next(this.data); - } -} - -/** - * @title Tree with checkboxes - */ -@Component({ - selector: 'tree-checklist-example', - templateUrl: 'tree-checklist-example.html', - styleUrls: ['tree-checklist-example.css'], - providers: [ChecklistDatabase], - standalone: true, - imports: [ - MatTreeModule, - MatButtonModule, - MatCheckboxModule, - MatFormFieldModule, - MatInputModule, - MatIconModule, - ], -}) -export class TreeChecklistExample { - /** Map from flat node to nested node. This helps us finding the nested node to be modified */ - flatNodeMap = new Map(); - - /** Map from nested node to flattened node. This helps us to keep the same object for selection */ - nestedNodeMap = new Map(); - - /** A selected parent node to be inserted */ - selectedParent: TodoItemFlatNode | null = null; - - /** The new item's name */ - newItemName = ''; - - treeControl: FlatTreeControl; - - treeFlattener: MatTreeFlattener; - - dataSource: MatTreeFlatDataSource; - - /** The selection for checklist */ - checklistSelection = new SelectionModel(true /* multiple */); - - constructor(private _database: ChecklistDatabase) { - this.treeFlattener = new MatTreeFlattener( - this.transformer, - this.getLevel, - this.isExpandable, - this.getChildren, - ); - this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable); - this.dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener); - - _database.dataChange.subscribe(data => { - this.dataSource.data = data; - }); - } - - getLevel = (node: TodoItemFlatNode) => node.level; - - isExpandable = (node: TodoItemFlatNode) => node.expandable; - - getChildren = (node: TodoItemNode): TodoItemNode[] => node.children; - - hasChild = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.expandable; - - hasNoContent = (_: number, _nodeData: TodoItemFlatNode) => _nodeData.item === ''; - - /** - * Transformer to convert nested node to flat node. Record the nodes in maps for later use. - */ - transformer = (node: TodoItemNode, level: number) => { - const existingNode = this.nestedNodeMap.get(node); - const flatNode = - existingNode && existingNode.item === node.item ? existingNode : new TodoItemFlatNode(); - flatNode.item = node.item; - flatNode.level = level; - flatNode.expandable = !!node.children?.length; - this.flatNodeMap.set(flatNode, node); - this.nestedNodeMap.set(node, flatNode); - return flatNode; - }; - - /** Whether all the descendants of the node are selected. */ - descendantsAllSelected(node: TodoItemFlatNode): boolean { - const descendants = this.treeControl.getDescendants(node); - const descAllSelected = - descendants.length > 0 && - descendants.every(child => { - return this.checklistSelection.isSelected(child); - }); - return descAllSelected; - } - - /** Whether part of the descendants are selected */ - descendantsPartiallySelected(node: TodoItemFlatNode): boolean { - const descendants = this.treeControl.getDescendants(node); - const result = descendants.some(child => this.checklistSelection.isSelected(child)); - return result && !this.descendantsAllSelected(node); - } - - /** Toggle the to-do item selection. Select/deselect all the descendants node */ - todoItemSelectionToggle(node: TodoItemFlatNode): void { - this.checklistSelection.toggle(node); - const descendants = this.treeControl.getDescendants(node); - this.checklistSelection.isSelected(node) - ? this.checklistSelection.select(...descendants) - : this.checklistSelection.deselect(...descendants); - - // Force update for the parent - descendants.forEach(child => this.checklistSelection.isSelected(child)); - this.checkAllParentsSelection(node); - } - - /** Toggle a leaf to-do item selection. Check all the parents to see if they changed */ - todoLeafItemSelectionToggle(node: TodoItemFlatNode): void { - this.checklistSelection.toggle(node); - this.checkAllParentsSelection(node); - } - - /* Checks all the parents when a leaf node is selected/unselected */ - checkAllParentsSelection(node: TodoItemFlatNode): void { - let parent: TodoItemFlatNode | null = this.getParentNode(node); - while (parent) { - this.checkRootNodeSelection(parent); - parent = this.getParentNode(parent); - } - } - - /** Check root node checked state and change it accordingly */ - checkRootNodeSelection(node: TodoItemFlatNode): void { - const nodeSelected = this.checklistSelection.isSelected(node); - const descendants = this.treeControl.getDescendants(node); - const descAllSelected = - descendants.length > 0 && - descendants.every(child => { - return this.checklistSelection.isSelected(child); - }); - if (nodeSelected && !descAllSelected) { - this.checklistSelection.deselect(node); - } else if (!nodeSelected && descAllSelected) { - this.checklistSelection.select(node); - } - } - - /* Get the parent node of a node */ - getParentNode(node: TodoItemFlatNode): TodoItemFlatNode | null { - const currentLevel = this.getLevel(node); - - if (currentLevel < 1) { - return null; - } - - const startIndex = this.treeControl.dataNodes.indexOf(node) - 1; - - for (let i = startIndex; i >= 0; i--) { - const currentNode = this.treeControl.dataNodes[i]; - - if (this.getLevel(currentNode) < currentLevel) { - return currentNode; - } - } - return null; - } - - /** Select the category so we can insert the new item. */ - addNewItem(node: TodoItemFlatNode) { - const parentNode = this.flatNodeMap.get(node); - this._database.insertItem(parentNode!, ''); - this.treeControl.expand(node); - } - - /** Save the node to database */ - saveNode(node: TodoItemFlatNode, itemValue: string) { - const nestedNode = this.flatNodeMap.get(node); - this._database.updateItem(nestedNode!, itemValue); - } -} diff --git a/src/dev-app/theme-token-api.scss b/src/dev-app/theme-token-api.scss index 4bb5a196bc52..7265429eba3d 100644 --- a/src/dev-app/theme-token-api.scss +++ b/src/dev-app/theme-token-api.scss @@ -26,9 +26,6 @@ $m3-base-config: ( color: ( primary: matx.$m3-green-palette ), - typography: ( - brand-family: 'monospace' - ) ); // Our M3 light theme. @@ -41,6 +38,9 @@ $dark-theme: matx.define-theme(map.set($m3-base-config, color, theme-type, dark) html { @include mat.checkbox-theme($light-theme); @include mat.card-theme($light-theme); + @include mat.tooltip-theme($light-theme); + @include mat.toolbar-theme($light-theme); + @include mat.snack-bar-theme($light-theme); } // Emit dark theme styles. @@ -51,6 +51,9 @@ html { @include mat.checkbox-color($dark-theme); @include mat.card-color($dark-theme); + @include mat.tooltip-color($dark-theme); + @include mat.toolbar-color($dark-theme); + @include mat.snack-bar-color($dark-theme); } // Emit density styles for each scale. @@ -60,5 +63,8 @@ html { .demo-density-#{$scale} { @include mat.checkbox-density($scale-theme); @include mat.card-density($scale-theme); + @include mat.tooltip-density($scale-theme); + @include mat.toolbar-density($scale-theme); + @include mat.snack-bar-density($scale-theme); } } diff --git a/src/dev-app/theme.scss b/src/dev-app/theme.scss index 7b2b87fe30af..779c3ef69762 100644 --- a/src/dev-app/theme.scss +++ b/src/dev-app/theme.scss @@ -3,9 +3,8 @@ // Plus imports for other components in your app. -// Disable legacy API compatibility. -// TODO: uncomment once conversion to inspection API is complete. -//mat.$theme-legacy-inspection-api-compatibility: false; +// Disable legacy API compatibility, since dev-app is fully migrated to theme inspection API. +mat.$theme-legacy-inspection-api-compatibility: false; // Define the default (light) theme. $candy-app-primary: mat.define-palette(mat.$indigo-palette); diff --git a/src/dev-app/tree/tree-demo.html b/src/dev-app/tree/tree-demo.html index 97160db7c1cb..8b2d4e1fedd6 100644 --- a/src/dev-app/tree/tree-demo.html +++ b/src/dev-app/tree/tree-demo.html @@ -15,10 +15,6 @@ CDK Nested tree - - Todo list tree - - Dynamic flat tree diff --git a/src/dev-app/tree/tree-demo.ts b/src/dev-app/tree/tree-demo.ts index af0ae1ed9d98..ebcf0e40e575 100644 --- a/src/dev-app/tree/tree-demo.ts +++ b/src/dev-app/tree/tree-demo.ts @@ -10,7 +10,6 @@ import {CdkTreeModule} from '@angular/cdk/tree'; import {CommonModule} from '@angular/common'; import {CdkTreeFlatExample, CdkTreeNestedExample} from '@angular/components-examples/cdk/tree'; import { - TreeChecklistExample, TreeDynamicExample, TreeFlatOverviewExample, TreeHarnessExample, @@ -38,7 +37,6 @@ import {MatTreeModule} from '@angular/material/tree'; CdkTreeNestedExample, CommonModule, FormsModule, - TreeChecklistExample, TreeDynamicExample, TreeFlatOverviewExample, TreeHarnessExample, diff --git a/src/e2e-app/theme.scss b/src/e2e-app/theme.scss index 910e09d01e19..8671b8fce364 100644 --- a/src/e2e-app/theme.scss +++ b/src/e2e-app/theme.scss @@ -2,6 +2,9 @@ // Plus imports for other components in your app. +// Disable legacy API compatibility, since e2e-app is fully migrated to theme inspection API. +mat.$theme-legacy-inspection-api-compatibility: false; + // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // **Be sure that you only ever include this mixin once!** diff --git a/src/material-experimental/menubar/menubar-item.spec.ts b/src/material-experimental/menubar/menubar-item.spec.ts index b668e11f04d3..14bf1c516601 100644 --- a/src/material-experimental/menubar/menubar-item.spec.ts +++ b/src/material-experimental/menubar/menubar-item.spec.ts @@ -6,7 +6,6 @@ import {MatMenuBarModule} from './menubar-module'; describe('MatMenuBarItem', () => { let fixture: ComponentFixture; - let menubarItem: MatMenuBarItem; let nativeMenubarItem: HTMLElement; beforeEach(waitForAsync(() => { @@ -20,7 +19,6 @@ describe('MatMenuBarItem', () => { fixture = TestBed.createComponent(SimpleMenuBarItem); fixture.detectChanges(); - menubarItem = fixture.componentInstance.menubarItem; nativeMenubarItem = fixture.componentInstance.nativeMenubarItem.nativeElement; }); @@ -36,13 +34,6 @@ describe('MatMenuBarItem', () => { expect(nativeMenubarItem.hasAttribute('aria.disabled')).toBeFalse(); }); - it('should coerce and set aria-disabled attribute', () => { - (menubarItem.disabled as any) = ''; - fixture.detectChanges(); - - expect(nativeMenubarItem.getAttribute('aria-disabled')).toBe('true'); - }); - it('should have cdk and material classes set', () => { expect(nativeMenubarItem.classList.contains('cdk-menu-item')).toBeTrue(); expect(nativeMenubarItem.classList.contains('mat-menubar-item')).toBeTrue(); diff --git a/src/material-experimental/selection/_selection.scss b/src/material-experimental/selection/_selection.scss index 2df0365bb442..05457c06bcd2 100644 --- a/src/material-experimental/selection/_selection.scss +++ b/src/material-experimental/selection/_selection.scss @@ -1,8 +1,7 @@ @use '@angular/material' as mat; -@mixin theme($theme-or-color-config) { - $theme: mat.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include mat.private-check-duplicate-theme-styles($theme, 'mat-selection'); } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} diff --git a/src/material-experimental/theming/_custom-tokens.scss b/src/material-experimental/theming/_custom-tokens.scss index ea8058ef463a..f5703e3d2478 100644 --- a/src/material-experimental/theming/_custom-tokens.scss +++ b/src/material-experimental/theming/_custom-tokens.scss @@ -11,7 +11,7 @@ $result: (); @each $prop in (font, line-height, size, tracking, weight) { $result: map.set($result, #{$base-name}-#{$prop}, - map.get($systems, md-sys-typescale, #{$typography-level}-#{$prop})); + map.get($systems, md-sys-typescale, #{$typography-level}-#{$prop})); } @return $result; } @@ -25,7 +25,31 @@ _generate-typography-tokens($systems, title-text, title-large), _generate-typography-tokens($systems, subtitle-text, title-medium), ( - subtitle-text-color: map.get($systems, md-ref-color, on-surface) + subtitle-text-color: map.get($systems, md-sys-color, on-surface) ) ); } + +/// Generates custom tokens for the mat-toolbar. +/// @param {Map} $systems The MDC system tokens +/// @param {Boolean} $exclude-hardcoded Whether to exclude hardcoded token values +/// @return {Map} A set of custom tokens for the mat-toolbar +@function toolbar($systems, $exclude-hardcoded) { + @return mat.private-merge-all( + _generate-typography-tokens($systems, title-text, title-large), + ( + container-background-color: map.get($systems, md-sys-color, surface), + container-text-color: map.get($systems, md-sys-color, on-surface), + ) + ); +} + +/// Generates custom tokens for the mat-snack-bar. +/// @param {Map} $systems The MDC system tokens +/// @param {Boolean} $exclude-hardcoded Whether to exclude hardcoded token values +/// @return {Map} A set of custom tokens for the mat-snack-bar +@function snack-bar($systems, $exclude-hardcoded) { + @return ( + button-color: map.get($systems, md-sys-color, inverse-primary), + ); +} diff --git a/src/material-experimental/theming/_m3-density.scss b/src/material-experimental/theming/_m3-density.scss index f9ea732c87bd..b142eec001a8 100644 --- a/src/material-experimental/theming/_m3-density.scss +++ b/src/material-experimental/theming/_m3-density.scss @@ -21,6 +21,11 @@ $_density-tokens: ( (mdc, elevated-card): (), (mdc, outlined-card): (), (mat, card): (), + (mdc, plain-tooltip): (), + (mat, toolbar): ( + standard-height: (64px, 60px, 56px, 52px), + mobile-height: (56px, 52px, 48px, 44px), + ) ); /// Gets the value for the given density scale from the given set of density values. diff --git a/src/material-experimental/theming/_m3-tokens.scss b/src/material-experimental/theming/_m3-tokens.scss index 374e21bffb65..9bee6d194a40 100644 --- a/src/material-experimental/theming/_m3-tokens.scss +++ b/src/material-experimental/theming/_m3-tokens.scss @@ -188,6 +188,16 @@ mdc-tokens.md-comp-outlined-card-values($systems, $exclude-hardcoded), $token-slots ), + _namespace-tokens( + (mdc, snackbar), + mdc-tokens.md-comp-snackbar-values($systems, $exclude-hardcoded), + $token-slots, + ), + _namespace-tokens( + (mdc, plain-tooltip), + mdc-tokens.md-comp-plain-tooltip-values($systems, $exclude-hardcoded), + $token-slots + ), // Choose values for our made up tokens based on MDC system tokens or sensible hardcoded // values. _namespace-tokens( @@ -195,6 +205,16 @@ custom-tokens.card($systems, $exclude-hardcoded), $token-slots ), + _namespace-tokens( + (mat, toolbar), + custom-tokens.toolbar($systems, $exclude-hardcoded), + $token-slots, + ), + _namespace-tokens( + (mat, snack-bar), + custom-tokens.snack-bar($systems, $exclude-hardcoded), + $token-slots + ), ); // Strip out tokens that are systemized by our made up density system. diff --git a/src/material/_index.scss b/src/material/_index.scss index e35f98f435a2..67f5981b2bd7 100644 --- a/src/material/_index.scss +++ b/src/material/_index.scss @@ -11,8 +11,7 @@ $gray-palette, $blue-grey-palette, $blue-gray-palette, $light-theme-background-palette, $dark-theme-background-palette, $light-theme-foreground-palette, $dark-theme-foreground-palette; @forward './core/typography/typography' show define-typography-level, define-rem-typography-config, - define-typography-config, typography-hierarchy, define-legacy-typography-config, - legacy-typography-hierarchy; + define-typography-config, typography-hierarchy, define-legacy-typography-config; @forward './core/typography/typography-utils' show typography-level, font-size, line-height, font-weight, letter-spacing, font-family, font-shorthand; @forward './core/tokens/m2' show m2-tokens-from-theme; @@ -113,7 +112,7 @@ list-density, list-base; progress-spinner-theme, progress-spinner-color, progress-spinner-typography, progress-spinner-density, progress-spinner-base; @forward './radio/radio-theme' as radio-* show radio-theme, radio-color, radio-typography, - radio-density; + radio-density, radio-base; @forward './select/select-theme' as select-* show select-theme, select-color, select-typography, select-density; @forward './sidenav/sidenav-theme' as sidenav-* show sidenav-theme, sidenav-color, diff --git a/src/material/autocomplete/_autocomplete-theme.scss b/src/material/autocomplete/_autocomplete-theme.scss index a10049668498..f537a04ccdd9 100644 --- a/src/material/autocomplete/_autocomplete-theme.scss +++ b/src/material/autocomplete/_autocomplete-theme.scss @@ -1,37 +1,31 @@ @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/style/sass-utils'; @use '../core/tokens/token-utils'; @use '../core/tokens/m2/mat/autocomplete' as tokens-mat-autocomplete; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-autocomplete.$prefix, - tokens-mat-autocomplete.get-color-tokens($config)); + tokens-mat-autocomplete.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-autocomplete') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/autocomplete/autocomplete-trigger.ts b/src/material/autocomplete/autocomplete-trigger.ts index 44c041a22280..5e881a9f9ae6 100644 --- a/src/material/autocomplete/autocomplete-trigger.ts +++ b/src/material/autocomplete/autocomplete-trigger.ts @@ -132,8 +132,8 @@ export class MatAutocompleteTrigger /** Old value of the native input. Used to work around issues with the `input` event on IE. */ private _previousValue: string | number | null; - /** Value of the input element when the panel was opened. */ - private _valueOnOpen: string | number | null; + /** Value of the input element when the panel was attached (even if there are no options). */ + private _valueOnAttach: string | number | null; /** Strategy that is used to position the panel. */ private _positionStrategy: FlexibleConnectedPositionStrategy; @@ -589,6 +589,7 @@ export class MatAutocompleteTrigger // of the available options, // - if a valid string is entered after an invalid one. if (this.panelOpen) { + this._captureValueOnAttach(); this._emitOpened(); } else { this.autocomplete.closed.emit(); @@ -611,10 +612,14 @@ export class MatAutocompleteTrigger * the state of the trigger right before the opening sequence was finished. */ private _emitOpened() { - this._valueOnOpen = this._element.nativeElement.value; this.autocomplete.opened.emit(); } + /** Intended to be called when the panel is attached. Captures the current value of the input. */ + private _captureValueOnAttach() { + this._valueOnAttach = this._element.nativeElement.value; + } + /** Destroys the autocomplete suggestion panel. */ private _destroyPanel(): void { if (this._overlayRef) { @@ -665,7 +670,10 @@ export class MatAutocompleteTrigger this._onChange(toSelect.value); panel._emitSelectEvent(toSelect); this._element.nativeElement.focus(); - } else if (panel.requireSelection && this._element.nativeElement.value !== this._valueOnOpen) { + } else if ( + panel.requireSelection && + this._element.nativeElement.value !== this._valueOnAttach + ) { this._clearPreviousSelectedOption(null); this._assignOptionValue(null); // Wait for the animation to finish before clearing the form control value, otherwise @@ -727,8 +735,8 @@ export class MatAutocompleteTrigger this.autocomplete._isOpen = this._overlayAttached = true; this.autocomplete._setColor(this._formField?.color); this._updatePanelState(); - this._applyModalPanelOwnership(); + this._captureValueOnAttach(); // We need to do an extra `panelOpen` check in here, because the // autocomplete won't be shown if there are no options. diff --git a/src/material/autocomplete/autocomplete.spec.ts b/src/material/autocomplete/autocomplete.spec.ts index 27365fa5b76f..41e51dd5a3d7 100644 --- a/src/material/autocomplete/autocomplete.spec.ts +++ b/src/material/autocomplete/autocomplete.spec.ts @@ -2663,6 +2663,37 @@ describe('MDC-based MatAutocomplete', () => { expect(spy).not.toHaveBeenCalled(); subscription.unsubscribe(); })); + + it('should preserve the value if a selection is required, and there are no options', fakeAsync(() => { + const input = fixture.nativeElement.querySelector('input'); + const {stateCtrl, trigger, states} = fixture.componentInstance; + fixture.componentInstance.requireSelection = true; + stateCtrl.setValue(states[1]); + fixture.detectChanges(); + tick(); + + expect(input.value).toBe('California'); + expect(stateCtrl.value).toEqual({code: 'CA', name: 'California'}); + + fixture.componentInstance.states = fixture.componentInstance.filteredStates = []; + fixture.detectChanges(); + + trigger.openPanel(); + fixture.detectChanges(); + zone.simulateZoneExit(); + + const spy = jasmine.createSpy('optionSelected spy'); + const subscription = trigger.optionSelections.subscribe(spy); + + dispatchFakeEvent(document, 'click'); + fixture.detectChanges(); + tick(); + + expect(input.value).toBe('California'); + expect(stateCtrl.value).toEqual({code: 'CA', name: 'California'}); + expect(spy).not.toHaveBeenCalled(); + subscription.unsubscribe(); + })); }); describe('panel closing', () => { diff --git a/src/material/autocomplete/testing/BUILD.bazel b/src/material/autocomplete/testing/BUILD.bazel index 1bb0936d98ab..de2a2bc59400 100644 --- a/src/material/autocomplete/testing/BUILD.bazel +++ b/src/material/autocomplete/testing/BUILD.bazel @@ -15,21 +15,6 @@ ts_library( ], ) -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/overlay", - "//src/cdk/testing", - "//src/cdk/testing/private", - "//src/cdk/testing/testbed", - "//src/material/autocomplete", - "@npm//@angular/forms", - "@npm//@angular/platform-browser", - ], -) - filegroup( name = "source-files", srcs = glob(["**/*.ts"]), @@ -37,14 +22,14 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/autocomplete", - "//src/material/autocomplete/testing:harness_tests_lib", + "@npm//@angular/forms", + "@npm//@angular/platform-browser", ], ) diff --git a/src/material/autocomplete/testing/autocomplete-harness.spec.ts b/src/material/autocomplete/testing/autocomplete-harness.spec.ts index 3182e490a55a..0c4350e3f371 100644 --- a/src/material/autocomplete/testing/autocomplete-harness.spec.ts +++ b/src/material/autocomplete/testing/autocomplete-harness.spec.ts @@ -1,7 +1,223 @@ +import {Component} from '@angular/core'; import {MatAutocompleteModule} from '@angular/material/autocomplete'; -import {runHarnessTests} from '@angular/material/autocomplete/testing/shared.spec'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatAutocompleteHarness} from './autocomplete-harness'; -describe('MDC-based MatAutocompleteHarness', () => { - runHarnessTests(MatAutocompleteModule, MatAutocompleteHarness); +describe('MatAutocompleteHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatAutocompleteModule], + declarations: [AutocompleteHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(AutocompleteHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all autocomplete harnesses', async () => { + const inputs = await loader.getAllHarnesses(MatAutocompleteHarness); + expect(inputs.length).toBe(5); + }); + + it('should load harness for autocomplete with value', async () => { + const ac = await loader.getHarness(MatAutocompleteHarness.with({value: /Prefilled/})); + const id = await (await ac.host()).getAttribute('id'); + expect(id).toBe('prefilled'); + }); + + it('should be able to get value of the input', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#prefilled'})); + expect(await input.getValue()).toBe('Prefilled value'); + }); + + it('should get disabled state', async () => { + const enabled = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + const disabled = await loader.getHarness(MatAutocompleteHarness.with({selector: '#disabled'})); + + expect(await enabled.isDisabled()).toBe(false); + expect(await disabled.isDisabled()).toBe(true); + }); + + it('should filter by whether an autocomplete is disabled', async () => { + const enabledInputs = await loader.getAllHarnesses( + MatAutocompleteHarness.with({disabled: false}), + ); + const disabledInputs = await loader.getAllHarnesses( + MatAutocompleteHarness.with({disabled: true}), + ); + expect(enabledInputs.length).toBe(4); + expect(disabledInputs.length).toBe(1); + }); + + it('should focus and blur an input', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + expect(await input.isFocused()).toBe(false); + await input.focus(); + expect(await input.isFocused()).toBe(true); + await input.blur(); + expect(await input.isFocused()).toBe(false); + }); + + it('should be able to type in an input', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.enterText('Hello there'); + expect(await input.getValue()).toBe('Hello there'); + }); + + it('should be able to clear the input', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.enterText('Hello there'); + expect(await input.getValue()).toBe('Hello there'); + await input.clear(); + expect(await input.getValue()).toBe(''); + }); + + it('should be able to get the autocomplete panel options', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.focus(); + const options = await input.getOptions(); + + expect(options.length).toBe(11); + expect(await options[5].getText()).toBe('New York'); + }); + + it('should be able to get filtered options', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.focus(); + const options = await input.getOptions({text: /New/}); + + expect(options.length).toBe(1); + expect(await options[0].getText()).toBe('New York'); + }); + + it('should be able to get the autocomplete panel groups', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#grouped'})); + await input.focus(); + const groups = await input.getOptionGroups(); + const options = await input.getOptions(); + + expect(groups.length).toBe(3); + expect(options.length).toBe(14); + }); + + it('should be able to get the autocomplete panel groups', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.focus(); + + const input2 = await loader.getHarness(MatAutocompleteHarness.with({selector: '#grouped'})); + await input2.focus(); + + const options = await input.getOptions(); + const options2 = await input2.getOptions(); + + expect(options.length).toBe(11); + expect(options2.length).toBe(14); + }); + + it('should be able to get filtered panel groups', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#grouped'})); + await input.focus(); + const groups = await input.getOptionGroups({labelText: 'Two'}); + + expect(groups.length).toBe(1); + expect(await groups[0].getLabelText()).toBe('Two'); + }); + + it('should be able to get whether the autocomplete is open', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + + expect(await input.isOpen()).toBe(false); + await input.focus(); + expect(await input.isOpen()).toBe(true); + }); + + it('should be able to select option', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.selectOption({text: 'New York'}); + expect(await input.getValue()).toBe('NY'); + }); + + it('should throw when selecting an option that is not available', async () => { + const input = await loader.getHarness(MatAutocompleteHarness.with({selector: '#plain'})); + await input.enterText('New'); + await expectAsync(input.selectOption({text: 'Texas'})).toBeRejectedWithError( + /Could not find a mat-option matching {"text":"Texas"}/, + ); + }); }); + +@Component({ + template: ` + + {{ state.name }} + + + + + {{ state.name }} + + + + + + + + + `, +}) +class AutocompleteHarnessTest { + states = [ + {code: 'AL', name: 'Alabama'}, + {code: 'CA', name: 'California'}, + {code: 'FL', name: 'Florida'}, + {code: 'KS', name: 'Kansas'}, + {code: 'MA', name: 'Massachusetts'}, + {code: 'NY', name: 'New York'}, + {code: 'OR', name: 'Oregon'}, + {code: 'PA', name: 'Pennsylvania'}, + {code: 'TN', name: 'Tennessee'}, + {code: 'VA', name: 'Virginia'}, + {code: 'WY', name: 'Wyoming'}, + ]; + + stateGroups = [ + { + name: 'One', + states: [ + {code: 'IA', name: 'Iowa'}, + {code: 'KS', name: 'Kansas'}, + {code: 'KY', name: 'Kentucky'}, + {code: 'LA', name: 'Louisiana'}, + {code: 'ME', name: 'Maine'}, + ], + }, + { + name: 'Two', + states: [ + {code: 'RI', name: 'Rhode Island'}, + {code: 'SC', name: 'South Carolina'}, + {code: 'SD', name: 'South Dakota'}, + {code: 'TN', name: 'Tennessee'}, + {code: 'TX', name: 'Texas'}, + ], + }, + { + name: 'Three', + states: [ + {code: 'UT', name: 'Utah'}, + {code: 'WA', name: 'Washington'}, + {code: 'WV', name: 'West Virginia'}, + {code: 'WI', name: 'Wisconsin'}, + ], + }, + ]; +} diff --git a/src/material/autocomplete/testing/shared.spec.ts b/src/material/autocomplete/testing/shared.spec.ts deleted file mode 100644 index e103abab9432..000000000000 --- a/src/material/autocomplete/testing/shared.spec.ts +++ /dev/null @@ -1,226 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatAutocompleteModule} from '@angular/material/autocomplete'; -import {MatAutocompleteHarness} from '@angular/material/autocomplete/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; - -/** - * Function that can be used to run the shared autocomplete harness tests for either the non-MDC or - * MDC based autocomplete harness. - */ -export function runHarnessTests( - autocompleteModule: typeof MatAutocompleteModule, - autocompleteHarness: typeof MatAutocompleteHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, autocompleteModule], - declarations: [AutocompleteHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(AutocompleteHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all autocomplete harnesses', async () => { - const inputs = await loader.getAllHarnesses(autocompleteHarness); - expect(inputs.length).toBe(5); - }); - - it('should load harness for autocomplete with value', async () => { - const ac = await loader.getHarness(autocompleteHarness.with({value: /Prefilled/})); - const id = await (await ac.host()).getAttribute('id'); - expect(id).toBe('prefilled'); - }); - - it('should be able to get value of the input', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#prefilled'})); - expect(await input.getValue()).toBe('Prefilled value'); - }); - - it('should get disabled state', async () => { - const enabled = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - const disabled = await loader.getHarness(autocompleteHarness.with({selector: '#disabled'})); - - expect(await enabled.isDisabled()).toBe(false); - expect(await disabled.isDisabled()).toBe(true); - }); - - it('should filter by whether an autocomplete is disabled', async () => { - const enabledInputs = await loader.getAllHarnesses(autocompleteHarness.with({disabled: false})); - const disabledInputs = await loader.getAllHarnesses(autocompleteHarness.with({disabled: true})); - expect(enabledInputs.length).toBe(4); - expect(disabledInputs.length).toBe(1); - }); - - it('should focus and blur an input', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - expect(await input.isFocused()).toBe(false); - await input.focus(); - expect(await input.isFocused()).toBe(true); - await input.blur(); - expect(await input.isFocused()).toBe(false); - }); - - it('should be able to type in an input', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.enterText('Hello there'); - expect(await input.getValue()).toBe('Hello there'); - }); - - it('should be able to clear the input', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.enterText('Hello there'); - expect(await input.getValue()).toBe('Hello there'); - await input.clear(); - expect(await input.getValue()).toBe(''); - }); - - it('should be able to get the autocomplete panel options', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.focus(); - const options = await input.getOptions(); - - expect(options.length).toBe(11); - expect(await options[5].getText()).toBe('New York'); - }); - - it('should be able to get filtered options', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.focus(); - const options = await input.getOptions({text: /New/}); - - expect(options.length).toBe(1); - expect(await options[0].getText()).toBe('New York'); - }); - - it('should be able to get the autocomplete panel groups', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#grouped'})); - await input.focus(); - const groups = await input.getOptionGroups(); - const options = await input.getOptions(); - - expect(groups.length).toBe(3); - expect(options.length).toBe(14); - }); - - it('should be able to get the autocomplete panel groups', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.focus(); - - const input2 = await loader.getHarness(autocompleteHarness.with({selector: '#grouped'})); - await input2.focus(); - - const options = await input.getOptions(); - const options2 = await input2.getOptions(); - - expect(options.length).toBe(11); - expect(options2.length).toBe(14); - }); - - it('should be able to get filtered panel groups', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#grouped'})); - await input.focus(); - const groups = await input.getOptionGroups({labelText: 'Two'}); - - expect(groups.length).toBe(1); - expect(await groups[0].getLabelText()).toBe('Two'); - }); - - it('should be able to get whether the autocomplete is open', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - - expect(await input.isOpen()).toBe(false); - await input.focus(); - expect(await input.isOpen()).toBe(true); - }); - - it('should be able to select option', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.selectOption({text: 'New York'}); - expect(await input.getValue()).toBe('NY'); - }); - - it('should throw when selecting an option that is not available', async () => { - const input = await loader.getHarness(autocompleteHarness.with({selector: '#plain'})); - await input.enterText('New'); - await expectAsync(input.selectOption({text: 'Texas'})).toBeRejectedWithError( - /Could not find a mat-option matching {"text":"Texas"}/, - ); - }); -} - -@Component({ - template: ` - - {{ state.name }} - - - - - {{ state.name }} - - - - - - - - - `, -}) -class AutocompleteHarnessTest { - states = [ - {code: 'AL', name: 'Alabama'}, - {code: 'CA', name: 'California'}, - {code: 'FL', name: 'Florida'}, - {code: 'KS', name: 'Kansas'}, - {code: 'MA', name: 'Massachusetts'}, - {code: 'NY', name: 'New York'}, - {code: 'OR', name: 'Oregon'}, - {code: 'PA', name: 'Pennsylvania'}, - {code: 'TN', name: 'Tennessee'}, - {code: 'VA', name: 'Virginia'}, - {code: 'WY', name: 'Wyoming'}, - ]; - - stateGroups = [ - { - name: 'One', - states: [ - {code: 'IA', name: 'Iowa'}, - {code: 'KS', name: 'Kansas'}, - {code: 'KY', name: 'Kentucky'}, - {code: 'LA', name: 'Louisiana'}, - {code: 'ME', name: 'Maine'}, - ], - }, - { - name: 'Two', - states: [ - {code: 'RI', name: 'Rhode Island'}, - {code: 'SC', name: 'South Carolina'}, - {code: 'SD', name: 'South Dakota'}, - {code: 'TN', name: 'Tennessee'}, - {code: 'TX', name: 'Texas'}, - ], - }, - { - name: 'Three', - states: [ - {code: 'UT', name: 'Utah'}, - {code: 'WA', name: 'Washington'}, - {code: 'WV', name: 'West Virginia'}, - {code: 'WI', name: 'Wisconsin'}, - ], - }, - ]; -} diff --git a/src/material/badge/_badge-theme.scss b/src/material/badge/_badge-theme.scss index c55c73169968..f18a28edd983 100644 --- a/src/material/badge/_badge-theme.scss +++ b/src/material/badge/_badge-theme.scss @@ -1,9 +1,9 @@ @use 'sass:color'; -@use 'sass:map'; @use 'sass:math'; @use '@angular/cdk'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/m2/mat/badge' as tokens-mat-badge; @use '../core/tokens/token-utils'; @@ -164,46 +164,34 @@ $_emit-fallback-vars: true; } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - $accent: map.get($config, accent); - $warn: map.get($config, warn); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-badge.$prefix, - tokens-mat-badge.get-color-tokens($config)); + tokens-mat-badge.get-color-tokens($theme)); } .mat-badge-accent { @include token-utils.create-token-values(tokens-mat-badge.$prefix, - tokens-mat-badge.private-get-color-palette-color-tokens($accent)); + tokens-mat-badge.private-get-color-palette-color-tokens($theme, accent)); } .mat-badge-warn { @include token-utils.create-token-values(tokens-mat-badge.$prefix, - tokens-mat-badge.private-get-color-palette-color-tokens($warn)); + tokens-mat-badge.private-get-color-palette-color-tokens($theme, warn)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-badge.$prefix, - tokens-mat-badge.get-typography-tokens($config)); + tokens-mat-badge.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-badge') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - // Try to reduce the number of times that the structural styles are emitted. @if not $_badge-structure-emitted { @include _badge-structure; @@ -216,14 +204,14 @@ $_emit-fallback-vars: true; } } - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/badge/testing/BUILD.bazel b/src/material/badge/testing/BUILD.bazel index 01ba836d5770..c04825a62a99 100644 --- a/src/material/badge/testing/BUILD.bazel +++ b/src/material/badge/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -31,19 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/badge", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/badge/testing/badge-harness.spec.ts b/src/material/badge/testing/badge-harness.spec.ts index 6b6028d79494..f396406baf68 100644 --- a/src/material/badge/testing/badge-harness.spec.ts +++ b/src/material/badge/testing/badge-harness.spec.ts @@ -1,7 +1,138 @@ -import {MatBadgeModule} from '@angular/material/badge'; -import {runHarnessTests} from '@angular/material/badge/testing/shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatBadgeModule, MatBadgePosition, MatBadgeSize} from '@angular/material/badge'; import {MatBadgeHarness} from './badge-harness'; -describe('Non-MDC-based MatBadgeHarness', () => { - runHarnessTests(MatBadgeModule, MatBadgeHarness); +describe('MatBadgeHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatBadgeModule], + declarations: [BadgeHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(BadgeHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all badge harnesses', async () => { + const badges = await loader.getAllHarnesses(MatBadgeHarness); + expect(badges.length).toBe(6); + }); + + it('should be able to get the text of a badge', async () => { + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#simple'})); + + expect(await badge.getText()).toBe('Simple badge'); + fixture.componentInstance.simpleContent = 'Changed simple badge'; + expect(await badge.getText()).toBe('Changed simple badge'); + }); + + it('should load badge with exact text', async () => { + const badges = await loader.getAllHarnesses(MatBadgeHarness.with({text: 'Simple badge'})); + expect(badges.length).toBe(1); + expect(await badges[0].getText()).toBe('Simple badge'); + }); + + it('should load badge with regex label match', async () => { + const badges = await loader.getAllHarnesses(MatBadgeHarness.with({text: /sized|disabled/i})); + expect(badges.length).toBe(2); + expect(await badges[0].getText()).toBe('Sized badge'); + expect(await badges[1].getText()).toBe('Disabled badge'); + }); + + it('should get whether a badge is overlapping', async () => { + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#overlapping'})); + + expect(await badge.isOverlapping()).toBe(true); + fixture.componentInstance.overlap = false; + expect(await badge.isOverlapping()).toBe(false); + }); + + it('should get whether a badge is disabled', async () => { + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#disabled'})); + + expect(await badge.isDisabled()).toBe(true); + fixture.componentInstance.disabled = false; + expect(await badge.isDisabled()).toBe(false); + }); + + it('should get whether a badge is hidden', async () => { + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#hidden'})); + + expect(await badge.isHidden()).toBe(true); + fixture.componentInstance.hidden = false; + expect(await badge.isHidden()).toBe(false); + }); + + it('should get the position of a badge', async () => { + const instance = fixture.componentInstance; + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#positioned'})); + + expect(await badge.getPosition()).toBe('above after'); + + instance.position = 'below'; + expect(await badge.getPosition()).toBe('below after'); + + instance.position = 'below before'; + expect(await badge.getPosition()).toBe('below before'); + + instance.position = 'above'; + expect(await badge.getPosition()).toBe('above after'); + + instance.position = 'above before'; + expect(await badge.getPosition()).toBe('above before'); + }); + + it('should get the size of a badge', async () => { + const instance = fixture.componentInstance; + const badge = await loader.getHarness(MatBadgeHarness.with({selector: '#sized'})); + + expect(await badge.getSize()).toBe('medium'); + + instance.size = 'small'; + expect(await badge.getSize()).toBe('small'); + + instance.size = 'large'; + expect(await badge.getSize()).toBe('large'); + }); }); + +@Component({ + template: ` + + + + + + + `, +}) +class BadgeHarnessTest { + simpleContent = 'Simple badge'; + position: MatBadgePosition = 'above after'; + size: MatBadgeSize = 'medium'; + overlap = true; + hidden = true; + disabled = true; +} diff --git a/src/material/badge/testing/shared.spec.ts b/src/material/badge/testing/shared.spec.ts deleted file mode 100644 index 028280e3af06..000000000000 --- a/src/material/badge/testing/shared.spec.ts +++ /dev/null @@ -1,142 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatBadgeModule, MatBadgePosition, MatBadgeSize} from '@angular/material/badge'; -import {MatBadgeHarness} from '@angular/material/badge/testing/badge-harness'; - -/** Shared tests to run on both the original and MDC-based badges. */ -export function runHarnessTests( - badgeModule: typeof MatBadgeModule, - badgeHarness: typeof MatBadgeHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [badgeModule], - declarations: [BadgeHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(BadgeHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all badge harnesses', async () => { - const badges = await loader.getAllHarnesses(badgeHarness); - expect(badges.length).toBe(6); - }); - - it('should be able to get the text of a badge', async () => { - const badge = await loader.getHarness(badgeHarness.with({selector: '#simple'})); - - expect(await badge.getText()).toBe('Simple badge'); - fixture.componentInstance.simpleContent = 'Changed simple badge'; - expect(await badge.getText()).toBe('Changed simple badge'); - }); - - it('should load badge with exact text', async () => { - const badges = await loader.getAllHarnesses(badgeHarness.with({text: 'Simple badge'})); - expect(badges.length).toBe(1); - expect(await badges[0].getText()).toBe('Simple badge'); - }); - - it('should load badge with regex label match', async () => { - const badges = await loader.getAllHarnesses(badgeHarness.with({text: /sized|disabled/i})); - expect(badges.length).toBe(2); - expect(await badges[0].getText()).toBe('Sized badge'); - expect(await badges[1].getText()).toBe('Disabled badge'); - }); - - it('should get whether a badge is overlapping', async () => { - const badge = await loader.getHarness(badgeHarness.with({selector: '#overlapping'})); - - expect(await badge.isOverlapping()).toBe(true); - fixture.componentInstance.overlap = false; - expect(await badge.isOverlapping()).toBe(false); - }); - - it('should get whether a badge is disabled', async () => { - const badge = await loader.getHarness(badgeHarness.with({selector: '#disabled'})); - - expect(await badge.isDisabled()).toBe(true); - fixture.componentInstance.disabled = false; - expect(await badge.isDisabled()).toBe(false); - }); - - it('should get whether a badge is hidden', async () => { - const badge = await loader.getHarness(badgeHarness.with({selector: '#hidden'})); - - expect(await badge.isHidden()).toBe(true); - fixture.componentInstance.hidden = false; - expect(await badge.isHidden()).toBe(false); - }); - - it('should get the position of a badge', async () => { - const instance = fixture.componentInstance; - const badge = await loader.getHarness(badgeHarness.with({selector: '#positioned'})); - - expect(await badge.getPosition()).toBe('above after'); - - instance.position = 'below'; - expect(await badge.getPosition()).toBe('below after'); - - instance.position = 'below before'; - expect(await badge.getPosition()).toBe('below before'); - - instance.position = 'above'; - expect(await badge.getPosition()).toBe('above after'); - - instance.position = 'above before'; - expect(await badge.getPosition()).toBe('above before'); - }); - - it('should get the size of a badge', async () => { - const instance = fixture.componentInstance; - const badge = await loader.getHarness(badgeHarness.with({selector: '#sized'})); - - expect(await badge.getSize()).toBe('medium'); - - instance.size = 'small'; - expect(await badge.getSize()).toBe('small'); - - instance.size = 'large'; - expect(await badge.getSize()).toBe('large'); - }); -} - -@Component({ - template: ` - - - - - - - `, -}) -class BadgeHarnessTest { - simpleContent = 'Simple badge'; - position: MatBadgePosition = 'above after'; - size: MatBadgeSize = 'medium'; - overlap = true; - hidden = true; - disabled = true; -} diff --git a/src/material/bottom-sheet/_bottom-sheet-theme.scss b/src/material/bottom-sheet/_bottom-sheet-theme.scss index 122e93d99a02..bfb5a8cde56e 100644 --- a/src/material/bottom-sheet/_bottom-sheet-theme.scss +++ b/src/material/bottom-sheet/_bottom-sheet-theme.scss @@ -1,45 +1,36 @@ @use '../core/typography/typography'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/style/sass-utils'; @use '../core/tokens/token-utils'; @use '../core/tokens/m2/mat/bottom-sheet' as tokens-mat-bottom-sheet; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-bottom-sheet.$prefix, - tokens-mat-bottom-sheet.get-color-tokens($config)); + tokens-mat-bottom-sheet.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-bottom-sheet.$prefix, - tokens-mat-bottom-sheet.get-typography-tokens($config)); + tokens-mat-bottom-sheet.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-bottom-sheet') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/bottom-sheet/testing/BUILD.bazel b/src/material/bottom-sheet/testing/BUILD.bazel index b5979e619f85..d733cf41d9f6 100644 --- a/src/material/bottom-sheet/testing/BUILD.bazel +++ b/src/material/bottom-sheet/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/overlay", @@ -32,19 +32,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/bottom-sheet", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/bottom-sheet/testing/bottom-sheet-harness.spec.ts b/src/material/bottom-sheet/testing/bottom-sheet-harness.spec.ts index 299fd1f7e4c7..0b4273cbdf3d 100644 --- a/src/material/bottom-sheet/testing/bottom-sheet-harness.spec.ts +++ b/src/material/bottom-sheet/testing/bottom-sheet-harness.spec.ts @@ -1,7 +1,67 @@ -import {MatBottomSheetModule} from '@angular/material/bottom-sheet'; -import {runHarnessTests} from '@angular/material/bottom-sheet/testing/shared.spec'; +import {Component, TemplateRef, ViewChild} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import { + MatBottomSheet, + MatBottomSheetConfig, + MatBottomSheetModule, +} from '@angular/material/bottom-sheet'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatBottomSheetHarness} from './bottom-sheet-harness'; -describe('Non-MDC-based MatBottomSheetHarness', () => { - runHarnessTests(MatBottomSheetModule, MatBottomSheetHarness); +describe('MatBottomSheetHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatBottomSheetModule, NoopAnimationsModule], + declarations: [BottomSheetHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(BottomSheetHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.documentRootLoader(fixture); + }); + + it('should load harness for a bottom sheet', async () => { + fixture.componentInstance.open(); + const bottomSheets = await loader.getAllHarnesses(MatBottomSheetHarness); + expect(bottomSheets.length).toBe(1); + }); + + it('should be able to get aria-label of the bottom sheet', async () => { + fixture.componentInstance.open({ariaLabel: 'Confirm purchase.'}); + const bottomSheet = await loader.getHarness(MatBottomSheetHarness); + expect(await bottomSheet.getAriaLabel()).toBe('Confirm purchase.'); + }); + + it('should be able to dismiss the bottom sheet', async () => { + fixture.componentInstance.open(); + let bottomSheets = await loader.getAllHarnesses(MatBottomSheetHarness); + + expect(bottomSheets.length).toBe(1); + await bottomSheets[0].dismiss(); + + bottomSheets = await loader.getAllHarnesses(MatBottomSheetHarness); + expect(bottomSheets.length).toBe(0); + }); }); + +@Component({ + template: ` + + Hello from the bottom sheet! + + `, +}) +class BottomSheetHarnessTest { + @ViewChild(TemplateRef) template: TemplateRef; + + constructor(readonly bottomSheet: MatBottomSheet) {} + + open(config?: MatBottomSheetConfig) { + return this.bottomSheet.open(this.template, config); + } +} diff --git a/src/material/bottom-sheet/testing/shared.spec.ts b/src/material/bottom-sheet/testing/shared.spec.ts deleted file mode 100644 index 23d51aa358bc..000000000000 --- a/src/material/bottom-sheet/testing/shared.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, TemplateRef, ViewChild} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import { - MatBottomSheet, - MatBottomSheetConfig, - MatBottomSheetModule, -} from '@angular/material/bottom-sheet'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatBottomSheetHarness} from './bottom-sheet-harness'; - -/** Shared tests to run on both the original and MDC-based bottom sheets. */ -export function runHarnessTests( - bottomSheetModule: typeof MatBottomSheetModule, - harness: typeof MatBottomSheetHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [bottomSheetModule, NoopAnimationsModule], - declarations: [BottomSheetHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(BottomSheetHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.documentRootLoader(fixture); - }); - - it('should load harness for a bottom sheet', async () => { - fixture.componentInstance.open(); - const bottomSheets = await loader.getAllHarnesses(harness); - expect(bottomSheets.length).toBe(1); - }); - - it('should be able to get aria-label of the bottom sheet', async () => { - fixture.componentInstance.open({ariaLabel: 'Confirm purchase.'}); - const bottomSheet = await loader.getHarness(harness); - expect(await bottomSheet.getAriaLabel()).toBe('Confirm purchase.'); - }); - - it('should be able to dismiss the bottom sheet', async () => { - fixture.componentInstance.open(); - let bottomSheets = await loader.getAllHarnesses(harness); - - expect(bottomSheets.length).toBe(1); - await bottomSheets[0].dismiss(); - - bottomSheets = await loader.getAllHarnesses(harness); - expect(bottomSheets.length).toBe(0); - }); -} - -@Component({ - template: ` - - Hello from the bottom sheet! - - `, -}) -class BottomSheetHarnessTest { - @ViewChild(TemplateRef) template: TemplateRef; - - constructor(readonly bottomSheet: MatBottomSheet) {} - - open(config?: MatBottomSheetConfig) { - return this.bottomSheet.open(this.template, config); - } -} diff --git a/src/material/button-toggle/_button-toggle-theme.scss b/src/material/button-toggle/_button-toggle-theme.scss index 5a113c16f4f3..d0db197e966d 100644 --- a/src/material/button-toggle/_button-toggle-theme.scss +++ b/src/material/button-toggle/_button-toggle-theme.scss @@ -1,59 +1,48 @@ @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/m2/mat/legacy-button-toggle' as tokens-mat-legacy-button-toggle; @use '../core/tokens/m2/mat/standard-button-toggle' as tokens-mat-standard-button-toggle; @use '../core/tokens/token-utils'; @use '../core/style/sass-utils'; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-legacy-button-toggle.$prefix, - tokens-mat-legacy-button-toggle.get-color-tokens($config)); + tokens-mat-legacy-button-toggle.get-color-tokens($theme)); @include token-utils.create-token-values(tokens-mat-standard-button-toggle.$prefix, - tokens-mat-standard-button-toggle.get-color-tokens($config)); + tokens-mat-standard-button-toggle.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-legacy-button-toggle.$prefix, - tokens-mat-legacy-button-toggle.get-typography-tokens($config)); + tokens-mat-legacy-button-toggle.get-typography-tokens($theme)); @include token-utils.create-token-values(tokens-mat-standard-button-toggle.$prefix, - tokens-mat-standard-button-toggle.get-typography-tokens($config)); + tokens-mat-standard-button-toggle.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - +@mixin density($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-legacy-button-toggle.$prefix, - tokens-mat-legacy-button-toggle.get-density-tokens($density-scale)); + tokens-mat-legacy-button-toggle.get-density-tokens($theme)); @include token-utils.create-token-values(tokens-mat-standard-button-toggle.$prefix, - tokens-mat-standard-button-toggle.get-density-tokens($density-scale)); + tokens-mat-standard-button-toggle.get-density-tokens($theme)); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-button-toggle') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/button-toggle/testing/BUILD.bazel b/src/material/button-toggle/testing/BUILD.bazel index d140040318e5..1417959d0433 100644 --- a/src/material/button-toggle/testing/BUILD.bazel +++ b/src/material/button-toggle/testing/BUILD.bazel @@ -21,11 +21,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = [ - "button-toggle-group-shared.spec.ts", - "button-toggle-shared.spec.ts", - ], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -34,22 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "button-toggle-shared.spec.ts", - "button-toggle-group-shared.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/button-toggle", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/button-toggle/testing/button-toggle-group-shared.spec.ts b/src/material/button-toggle/testing/button-toggle-group-shared.spec.ts deleted file mode 100644 index ac423d83e902..000000000000 --- a/src/material/button-toggle/testing/button-toggle-group-shared.spec.ts +++ /dev/null @@ -1,90 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatButtonToggleModule, MatButtonToggleAppearance} from '@angular/material/button-toggle'; -import {MatButtonToggleGroupHarness} from './button-toggle-group-harness'; - -/** Shared tests to run on both the original and MDC-based button toggle group. */ -export function runHarnessTests( - buttonToggleModule: typeof MatButtonToggleModule, - buttonToggleGroupHarness: typeof MatButtonToggleGroupHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [buttonToggleModule], - declarations: [ButtonToggleGroupHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ButtonToggleGroupHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all button toggle group harnesses', async () => { - const groups = await loader.getAllHarnesses(buttonToggleGroupHarness); - expect(groups.length).toBe(1); - }); - - it('should load the toggles inside the group', async () => { - const group = await loader.getHarness(buttonToggleGroupHarness); - const toggles = await group.getToggles(); - expect(toggles.length).toBe(2); - }); - - it('should get whether the group is disabled', async () => { - const group = await loader.getHarness(buttonToggleGroupHarness); - expect(await group.isDisabled()).toBe(false); - fixture.componentInstance.disabled = true; - expect(await group.isDisabled()).toBe(true); - }); - - it('should filter by whether the group is disabled', async () => { - let enabledGroups = await loader.getAllHarnesses( - buttonToggleGroupHarness.with({disabled: false}), - ); - let disabledGroups = await loader.getAllHarnesses( - buttonToggleGroupHarness.with({disabled: true}), - ); - expect(enabledGroups.length).toBe(1); - expect(disabledGroups.length).toBe(0); - - fixture.componentInstance.disabled = true; - - enabledGroups = await loader.getAllHarnesses(buttonToggleGroupHarness.with({disabled: false})); - disabledGroups = await loader.getAllHarnesses(buttonToggleGroupHarness.with({disabled: true})); - expect(enabledGroups.length).toBe(0); - expect(disabledGroups.length).toBe(1); - }); - - it('should get whether the group is vertical', async () => { - const group = await loader.getHarness(buttonToggleGroupHarness); - expect(await group.isVertical()).toBe(false); - fixture.componentInstance.vertical = true; - expect(await group.isVertical()).toBe(true); - }); - - it('should get whether the group appearance', async () => { - const group = await loader.getHarness(buttonToggleGroupHarness); - expect(await group.getAppearance()).toBe('standard'); - fixture.componentInstance.appearance = 'legacy'; - expect(await group.getAppearance()).toBe('legacy'); - }); -} - -@Component({ - template: ` - - One - Two - - `, -}) -class ButtonToggleGroupHarnessTest { - disabled = false; - vertical = false; - appearance: MatButtonToggleAppearance = 'standard'; -} diff --git a/src/material/button-toggle/testing/button-toggle-group.spec.ts b/src/material/button-toggle/testing/button-toggle-group.spec.ts index 5046d8acb1ff..be5787724606 100644 --- a/src/material/button-toggle/testing/button-toggle-group.spec.ts +++ b/src/material/button-toggle/testing/button-toggle-group.spec.ts @@ -1,7 +1,90 @@ -import {MatButtonToggleModule} from '@angular/material/button-toggle'; -import {runHarnessTests} from './button-toggle-group-shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatButtonToggleModule, MatButtonToggleAppearance} from '@angular/material/button-toggle'; import {MatButtonToggleGroupHarness} from './button-toggle-group-harness'; -describe('Non-MDC-based MatButtonToggleGroupHarness', () => { - runHarnessTests(MatButtonToggleModule, MatButtonToggleGroupHarness); +describe('MatButtonToggleGroupHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatButtonToggleModule], + declarations: [ButtonToggleGroupHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ButtonToggleGroupHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all button toggle group harnesses', async () => { + const groups = await loader.getAllHarnesses(MatButtonToggleGroupHarness); + expect(groups.length).toBe(1); + }); + + it('should load the toggles inside the group', async () => { + const group = await loader.getHarness(MatButtonToggleGroupHarness); + const toggles = await group.getToggles(); + expect(toggles.length).toBe(2); + }); + + it('should get whether the group is disabled', async () => { + const group = await loader.getHarness(MatButtonToggleGroupHarness); + expect(await group.isDisabled()).toBe(false); + fixture.componentInstance.disabled = true; + expect(await group.isDisabled()).toBe(true); + }); + + it('should filter by whether the group is disabled', async () => { + let enabledGroups = await loader.getAllHarnesses( + MatButtonToggleGroupHarness.with({disabled: false}), + ); + let disabledGroups = await loader.getAllHarnesses( + MatButtonToggleGroupHarness.with({disabled: true}), + ); + expect(enabledGroups.length).toBe(1); + expect(disabledGroups.length).toBe(0); + + fixture.componentInstance.disabled = true; + + enabledGroups = await loader.getAllHarnesses( + MatButtonToggleGroupHarness.with({disabled: false}), + ); + disabledGroups = await loader.getAllHarnesses( + MatButtonToggleGroupHarness.with({disabled: true}), + ); + expect(enabledGroups.length).toBe(0); + expect(disabledGroups.length).toBe(1); + }); + + it('should get whether the group is vertical', async () => { + const group = await loader.getHarness(MatButtonToggleGroupHarness); + expect(await group.isVertical()).toBe(false); + fixture.componentInstance.vertical = true; + expect(await group.isVertical()).toBe(true); + }); + + it('should get whether the group appearance', async () => { + const group = await loader.getHarness(MatButtonToggleGroupHarness); + expect(await group.getAppearance()).toBe('standard'); + fixture.componentInstance.appearance = 'legacy'; + expect(await group.getAppearance()).toBe('legacy'); + }); }); + +@Component({ + template: ` + + One + Two + + `, +}) +class ButtonToggleGroupHarnessTest { + disabled = false; + vertical = false; + appearance: MatButtonToggleAppearance = 'standard'; +} diff --git a/src/material/button-toggle/testing/button-toggle-harness.spec.ts b/src/material/button-toggle/testing/button-toggle-harness.spec.ts index b7894e93c86c..5041804f9a4f 100644 --- a/src/material/button-toggle/testing/button-toggle-harness.spec.ts +++ b/src/material/button-toggle/testing/button-toggle-harness.spec.ts @@ -1,7 +1,149 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatButtonToggleModule} from '@angular/material/button-toggle'; -import {runHarnessTests} from './button-toggle-shared.spec'; import {MatButtonToggleHarness} from './button-toggle-harness'; -describe('Non-MDC-based MatButtonToggleHarness', () => { - runHarnessTests(MatButtonToggleModule, MatButtonToggleHarness); +describe('MatButtonToggleHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatButtonToggleModule], + declarations: [ButtonToggleHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ButtonToggleHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all button toggle harnesses', async () => { + const toggles = await loader.getAllHarnesses(MatButtonToggleHarness); + expect(toggles.length).toBe(2); + }); + + it('should load a button toggle with exact label', async () => { + const toggles = await loader.getAllHarnesses(MatButtonToggleHarness.with({text: 'First'})); + expect(toggles.length).toBe(1); + expect(await toggles[0].getText()).toBe('First'); + }); + + it('should load a button toggle with regex label match', async () => { + const toggles = await loader.getAllHarnesses(MatButtonToggleHarness.with({text: /^s/i})); + expect(toggles.length).toBe(1); + expect(await toggles[0].getText()).toBe('Second'); + }); + + it('should get the toggle checked state', async () => { + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + expect(await checkedToggle.isChecked()).toBe(true); + expect(await uncheckedToggle.isChecked()).toBe(false); + }); + + it('should filter by whether the group is disabled', async () => { + const enabledToggles = await loader.getAllHarnesses( + MatButtonToggleHarness.with({disabled: false}), + ); + const disabledToggles = await loader.getAllHarnesses( + MatButtonToggleHarness.with({disabled: true}), + ); + expect(enabledToggles.length).toBe(1); + expect(disabledToggles.length).toBe(1); + }); + + it('should get the toggle disabled state', async () => { + const [enabledToggle, disabledToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + expect(await enabledToggle.isDisabled()).toBe(false); + expect(await disabledToggle.isDisabled()).toBe(true); + }); + + it('should get the toggle name', async () => { + const toggle = await loader.getHarness(MatButtonToggleHarness.with({text: 'First'})); + expect(await toggle.getName()).toBe('first-name'); + }); + + it('should get the toggle aria-label', async () => { + const toggle = await loader.getHarness(MatButtonToggleHarness.with({text: 'First'})); + expect(await toggle.getAriaLabel()).toBe('First toggle'); + }); + + it('should get the toggle aria-labelledby', async () => { + const toggle = await loader.getHarness(MatButtonToggleHarness.with({text: 'Second'})); + expect(await toggle.getAriaLabelledby()).toBe('second-label'); + }); + + it('should get the toggle label text', async () => { + const [firstToggle, secondToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + expect(await firstToggle.getText()).toBe('First'); + expect(await secondToggle.getText()).toBe('Second'); + }); + + it('should get the toggle appearance', async () => { + const [firstToggle, secondToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + expect(await firstToggle.getAppearance()).toBe('standard'); + expect(await secondToggle.getAppearance()).toBe('legacy'); + }); + + it('should focus the button toggle', async () => { + const toggle = await loader.getHarness(MatButtonToggleHarness.with({text: 'First'})); + expect(await toggle.isFocused()).toBe(false); + await toggle.focus(); + expect(await toggle.isFocused()).toBe(true); + }); + + it('should blur the button toggle', async () => { + const toggle = await loader.getHarness(MatButtonToggleHarness.with({text: 'First'})); + await toggle.focus(); + expect(await toggle.isFocused()).toBe(true); + await toggle.blur(); + expect(await toggle.isFocused()).toBe(false); + }); + + it('should toggle the button value', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + await checkedToggle.toggle(); + await uncheckedToggle.toggle(); + expect(await checkedToggle.isChecked()).toBe(false); + expect(await uncheckedToggle.isChecked()).toBe(true); + }); + + it('should check the button toggle', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + await checkedToggle.check(); + await uncheckedToggle.check(); + expect(await checkedToggle.isChecked()).toBe(true); + expect(await uncheckedToggle.isChecked()).toBe(true); + }); + + it('should uncheck the button toggle', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatButtonToggleHarness); + await checkedToggle.uncheck(); + await uncheckedToggle.uncheck(); + expect(await checkedToggle.isChecked()).toBe(false); + expect(await uncheckedToggle.isChecked()).toBe(false); + }); }); + +@Component({ + template: ` + First + Second + Second toggle + `, +}) +class ButtonToggleHarnessTest { + disabled = true; +} diff --git a/src/material/button-toggle/testing/button-toggle-shared.spec.ts b/src/material/button-toggle/testing/button-toggle-shared.spec.ts deleted file mode 100644 index acbddbaaa93c..000000000000 --- a/src/material/button-toggle/testing/button-toggle-shared.spec.ts +++ /dev/null @@ -1,153 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatButtonToggleModule} from '@angular/material/button-toggle'; -import {MatButtonToggleHarness} from './button-toggle-harness'; - -/** Shared tests to run on both the original and MDC-based button toggles. */ -export function runHarnessTests( - buttonToggleModule: typeof MatButtonToggleModule, - buttonToggleHarness: typeof MatButtonToggleHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [buttonToggleModule], - declarations: [ButtonToggleHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ButtonToggleHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all button toggle harnesses', async () => { - const toggles = await loader.getAllHarnesses(buttonToggleHarness); - expect(toggles.length).toBe(2); - }); - - it('should load a button toggle with exact label', async () => { - const toggles = await loader.getAllHarnesses(buttonToggleHarness.with({text: 'First'})); - expect(toggles.length).toBe(1); - expect(await toggles[0].getText()).toBe('First'); - }); - - it('should load a button toggle with regex label match', async () => { - const toggles = await loader.getAllHarnesses(buttonToggleHarness.with({text: /^s/i})); - expect(toggles.length).toBe(1); - expect(await toggles[0].getText()).toBe('Second'); - }); - - it('should get the toggle checked state', async () => { - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(buttonToggleHarness); - expect(await checkedToggle.isChecked()).toBe(true); - expect(await uncheckedToggle.isChecked()).toBe(false); - }); - - it('should filter by whether the group is disabled', async () => { - const enabledToggles = await loader.getAllHarnesses( - buttonToggleHarness.with({disabled: false}), - ); - const disabledToggles = await loader.getAllHarnesses( - buttonToggleHarness.with({disabled: true}), - ); - expect(enabledToggles.length).toBe(1); - expect(disabledToggles.length).toBe(1); - }); - - it('should get the toggle disabled state', async () => { - const [enabledToggle, disabledToggle] = await loader.getAllHarnesses(buttonToggleHarness); - expect(await enabledToggle.isDisabled()).toBe(false); - expect(await disabledToggle.isDisabled()).toBe(true); - }); - - it('should get the toggle name', async () => { - const toggle = await loader.getHarness(buttonToggleHarness.with({text: 'First'})); - expect(await toggle.getName()).toBe('first-name'); - }); - - it('should get the toggle aria-label', async () => { - const toggle = await loader.getHarness(buttonToggleHarness.with({text: 'First'})); - expect(await toggle.getAriaLabel()).toBe('First toggle'); - }); - - it('should get the toggle aria-labelledby', async () => { - const toggle = await loader.getHarness(buttonToggleHarness.with({text: 'Second'})); - expect(await toggle.getAriaLabelledby()).toBe('second-label'); - }); - - it('should get the toggle label text', async () => { - const [firstToggle, secondToggle] = await loader.getAllHarnesses(buttonToggleHarness); - expect(await firstToggle.getText()).toBe('First'); - expect(await secondToggle.getText()).toBe('Second'); - }); - - it('should get the toggle appearance', async () => { - const [firstToggle, secondToggle] = await loader.getAllHarnesses(buttonToggleHarness); - expect(await firstToggle.getAppearance()).toBe('standard'); - expect(await secondToggle.getAppearance()).toBe('legacy'); - }); - - it('should focus the button toggle', async () => { - const toggle = await loader.getHarness(buttonToggleHarness.with({text: 'First'})); - expect(await toggle.isFocused()).toBe(false); - await toggle.focus(); - expect(await toggle.isFocused()).toBe(true); - }); - - it('should blur the button toggle', async () => { - const toggle = await loader.getHarness(buttonToggleHarness.with({text: 'First'})); - await toggle.focus(); - expect(await toggle.isFocused()).toBe(true); - await toggle.blur(); - expect(await toggle.isFocused()).toBe(false); - }); - - it('should toggle the button value', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(buttonToggleHarness); - await checkedToggle.toggle(); - await uncheckedToggle.toggle(); - expect(await checkedToggle.isChecked()).toBe(false); - expect(await uncheckedToggle.isChecked()).toBe(true); - }); - - it('should check the button toggle', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(buttonToggleHarness); - await checkedToggle.check(); - await uncheckedToggle.check(); - expect(await checkedToggle.isChecked()).toBe(true); - expect(await uncheckedToggle.isChecked()).toBe(true); - }); - - it('should uncheck the button toggle', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(buttonToggleHarness); - await checkedToggle.uncheck(); - await uncheckedToggle.uncheck(); - expect(await checkedToggle.isChecked()).toBe(false); - expect(await uncheckedToggle.isChecked()).toBe(false); - }); -} - -@Component({ - template: ` - First - Second - Second toggle - `, -}) -class ButtonToggleHarnessTest { - disabled = true; -} diff --git a/src/material/button/_button-theme.scss b/src/material/button/_button-theme.scss index f3385a051e92..663fb39e7dc1 100644 --- a/src/material/button/_button-theme.scss +++ b/src/material/button/_button-theme.scss @@ -11,6 +11,12 @@ @use '../core/theming/theming'; @use '../core/theming/inspection'; @use '../core/typography/typography'; +@use '../core/tokens/m2/mdc/button-filled' as tokens-mdc-button-filled; + +@function on-color($theme, $palette) { + $is-dark: inspection.get-theme-type($theme) == dark; + @return if(mdc-helpers.variable-safe-contrast-tone($palette, $is-dark) == 'dark', #000, #fff); +} @mixin _button-variant($color) { @include mdc-button-text-theme.theme(( @@ -18,13 +24,6 @@ )); } -@mixin _unelevated-button-variant($foreground, $background) { - @include mdc-button-filled-theme.theme(( - container-color: $background, - label-text-color: $foreground, - )); -} - @mixin _raised-button-variant($foreground, $background) { @include mdc-button-protected-theme.theme(( container-color: $background, @@ -79,35 +78,6 @@ } } - .mat-mdc-unelevated-button { - &.mat-unthemed { - @include _unelevated-button-variant($on-surface, $surface); - } - - &.mat-primary { - @include _unelevated-button-variant($on-primary, $primary); - } - - &.mat-accent { - @include _unelevated-button-variant($on-secondary, $secondary); - } - - &.mat-warn { - @include _unelevated-button-variant($on-error, $error); - } - - @include button-theme-private.apply-disabled-style() { - @include mdc-button-filled-theme.theme(( - // We need to pass both the disabled and enabled values, because the enabled - // ones apply to anchors while the disabled ones are for buttons. - disabled-container-color: $disabled-container-color, - disabled-label-text-color: $disabled-ink-color, - container-color: $disabled-container-color, - label-text-color: $disabled-ink-color, - )); - } - } - .mat-mdc-raised-button { &.mat-unthemed { @include _raised-button-variant($on-surface, $surface); @@ -180,6 +150,52 @@ @include button-theme-private.ripple-theme-styles($theme, true); } } + + .mat-mdc-unelevated-button { + $surface: inspection.get-theme-color($theme, background, card); + $primary: inspection.get-theme-color($theme, primary); + $accent: inspection.get-theme-color($theme, accent); + $error: inspection.get-theme-color($theme, warn); + + $on-surface: on-color($theme, $surface); + $on-primary: on-color($theme, $primary); + $on-accent: on-color($theme, $accent); + $on-error: on-color($theme, $error); + + $default-color-tokens: tokens-mdc-button-filled.get-color-tokens($theme, $surface, $on-surface); + $primary-color-tokens: tokens-mdc-button-filled.get-color-tokens($theme, $primary, $on-primary); + $accent-color-tokens: tokens-mdc-button-filled.get-color-tokens($theme, $accent, $on-accent); + $warn-color-tokens: tokens-mdc-button-filled.get-color-tokens($theme, $error, $on-error); + + &.mat-unthemed { + @include mdc-button-filled-theme.theme($default-color-tokens); + } + + &.mat-primary { + @include mdc-button-filled-theme.theme($primary-color-tokens); + } + + &.mat-accent { + @include mdc-button-filled-theme.theme($accent-color-tokens); + } + + &.mat-warn { + @include mdc-button-filled-theme.theme($warn-color-tokens); + } + + @include button-theme-private.apply-disabled-style() { + $is-dark: inspection.get-theme-type($theme) == dark; + $disabled-ink-color: rgba($on-surface, if($is-dark, 0.5, 0.38)); + $disabled-container-color: rgba($on-surface, 0.12); + + @include mdc-button-filled-theme.theme(( + disabled-container-color: $disabled-container-color, + disabled-label-text-color: $disabled-ink-color, + container-color: $disabled-container-color, + label-text-color: $disabled-ink-color, + )); + } + } } @mixin typography($theme) { diff --git a/src/material/button/button.scss b/src/material/button/button.scss index b8e6dd6609b4..78ae4355f19a 100644 --- a/src/material/button/button.scss +++ b/src/material/button/button.scss @@ -6,11 +6,13 @@ @use '@material/button/button-filled-theme' as mdc-button-filled-theme; @use '@material/button/button-protected-theme' as mdc-button-protected-theme; @use '@material/button/button-outlined-theme' as mdc-button-outlined-theme; +@use '@material/theme/custom-properties' as mdc-custom-properties; @use './button-base'; @use '../core/mdc-helpers/mdc-helpers'; @use '../core/style/private' as style-private; @use '../core/focus-indicators/private' as focus-indicators-private; +@use '../core/tokens/m2/mdc/button-filled' as tokens-mdc-button-filled; @include mdc-helpers.disable-mdc-fallback-declarations { @include mdc-button.static-styles-without-ripple($query: mdc-helpers.$mdc-base-styles-query); @@ -33,13 +35,6 @@ map.merge(mdc-button-text-theme.$light-theme, $override-keys)); } - .mat-mdc-unelevated-button { - @include mdc-button-filled-theme.theme-styles( - map.merge(map.merge(mdc-button-filled-theme.$light-theme, $override-keys), ( - container-color: transparent, - ))); - } - .mat-mdc-raised-button { @include mdc-button-protected-theme.theme-styles( map.merge(map.merge(mdc-button-protected-theme.$light-theme, $override-keys), ( @@ -53,6 +48,20 @@ } } +@include mdc-custom-properties.configure($emit-fallback-values: false, $emit-fallback-vars: false) { + // Note that we don't include a feature query, because this mixins declare + // all the "slots" for CSS variables that will be defined in the theme. + .mat-mdc-unelevated-button { + $mdc-button-filled-slots: tokens-mdc-button-filled.get-token-slots(); + + // Add the slots for MDC text button. + @include mdc-button-filled-theme.theme-styles($mdc-button-filled-slots); + + // Add default values for MDC text button tokens that aren't outputted by the theming API. + @include mdc-button-filled-theme.theme(tokens-mdc-button-filled.get-unthemable-tokens()); + } +} + .mat-mdc-button, .mat-mdc-unelevated-button, .mat-mdc-raised-button, diff --git a/src/material/button/testing/BUILD.bazel b/src/material/button/testing/BUILD.bazel index 471727a90a9f..6fc418595b11 100644 --- a/src/material/button/testing/BUILD.bazel +++ b/src/material/button/testing/BUILD.bazel @@ -21,20 +21,7 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/button", - ], -) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/platform", diff --git a/src/material/button/testing/button-harness.spec.ts b/src/material/button/testing/button-harness.spec.ts index d9151564792b..2e7b3b31ccca 100644 --- a/src/material/button/testing/button-harness.spec.ts +++ b/src/material/button/testing/button-harness.spec.ts @@ -1,7 +1,182 @@ -import {runHarnessTests} from '@angular/material/button/testing/shared.spec'; -import {MatButtonModule} from '../index'; +import {Component} from '@angular/core'; +import {ComponentFixture, inject, TestBed} from '@angular/core/testing'; +import {Platform, PlatformModule} from '@angular/cdk/platform'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatButtonModule} from '@angular/material/button'; +import {MatIconModule} from '@angular/material/icon'; +import {MatIconHarness} from '@angular/material/icon/testing'; import {MatButtonHarness} from './button-harness'; -describe('MDC-based MatButtonHarness', () => { - runHarnessTests(MatButtonModule, MatButtonHarness); +describe('MatButtonHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + let platform: Platform; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatButtonModule, MatIconModule, PlatformModule], + declarations: [ButtonHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ButtonHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + beforeEach(inject([Platform], (p: Platform) => { + platform = p; + })); + + it('should load all button harnesses', async () => { + const buttons = await loader.getAllHarnesses(MatButtonHarness); + expect(buttons.length).toBe(15); + }); + + it('should load button with exact text', async () => { + const buttons = await loader.getAllHarnesses(MatButtonHarness.with({text: 'Basic button'})); + expect(buttons.length).toBe(1); + expect(await buttons[0].getText()).toBe('Basic button'); + }); + + it('should load button with regex label match', async () => { + const buttons = await loader.getAllHarnesses(MatButtonHarness.with({text: /basic/i})); + expect(buttons.length).toBe(2); + expect(await buttons[0].getText()).toBe('Basic button'); + expect(await buttons[1].getText()).toBe('Basic anchor'); + }); + + it('should filter by whether a button is disabled', async () => { + const enabledButtons = await loader.getAllHarnesses(MatButtonHarness.with({disabled: false})); + const disabledButtons = await loader.getAllHarnesses(MatButtonHarness.with({disabled: true})); + expect(enabledButtons.length).toBe(13); + expect(disabledButtons.length).toBe(2); + }); + + it('should get disabled state', async () => { + // Grab each combination of [enabled, disabled] ⨯ [button, anchor] + const [disabledFlatButton, enabledFlatAnchor] = await loader.getAllHarnesses( + MatButtonHarness.with({text: /flat/i}), + ); + const [enabledRaisedButton, disabledRaisedAnchor] = await loader.getAllHarnesses( + MatButtonHarness.with({text: /raised/i}), + ); + + expect(await enabledFlatAnchor.isDisabled()).toBe(false); + expect(await disabledFlatButton.isDisabled()).toBe(true); + expect(await enabledRaisedButton.isDisabled()).toBe(false); + expect(await disabledRaisedAnchor.isDisabled()).toBe(true); + }); + + it('should get button text', async () => { + const [firstButton, secondButton] = await loader.getAllHarnesses(MatButtonHarness); + expect(await firstButton.getText()).toBe('Basic button'); + expect(await secondButton.getText()).toBe('Flat button'); + }); + + it('should focus and blur a button', async () => { + const button = await loader.getHarness(MatButtonHarness.with({text: 'Basic button'})); + expect(await button.isFocused()).toBe(false); + await button.focus(); + expect(await button.isFocused()).toBe(true); + await button.blur(); + expect(await button.isFocused()).toBe(false); + }); + + it('should click a button', async () => { + const button = await loader.getHarness(MatButtonHarness.with({text: 'Basic button'})); + await button.click(); + + expect(fixture.componentInstance.clicked).toBe(true); + }); + + it('should not click a disabled button', async () => { + // Older versions of Edge have a bug where `disabled` buttons are still clickable if + // they contain child elements. Also new versions of Firefox (starting v65) do not + // cancel dispatched click events on disabled buttons. We skip this check on Edge and Firefox. + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1582570 and: + // https://stackoverflow.com/questions/32377026/disabled-button-is-clickable-on-edge-browser + if (platform.FIREFOX) { + return; + } + + const button = await loader.getHarness(MatButtonHarness.with({text: 'Flat button'})); + await button.click(); + + expect(fixture.componentInstance.clicked).toBe(false); + }); + + it('should be able to handle nested harnesses', async () => { + const homeBtn = await loader.getHarness(MatButtonHarness.with({selector: '#home-icon'})); + const favBtn = await loader.getHarness(MatButtonHarness.with({selector: '#favorite-icon'})); + + const homeIcon = await homeBtn.getHarness(MatIconHarness); + const favIcon = await favBtn.getHarness(MatIconHarness); + + expect(await homeIcon.getName()).toBe('home'); + expect(await favIcon.getName()).toBe('favorite'); + }); + + it('should load all button harnesses', async () => { + const buttons = await loader.getAllHarnesses(MatButtonHarness); + const variants = await parallel(() => buttons.map(button => button.getVariant())); + + expect(variants).toEqual([ + 'basic', + 'flat', + 'raised', + 'stroked', + 'icon', + 'icon', + 'fab', + 'mini-fab', + 'basic', + 'flat', + 'raised', + 'stroked', + 'icon', + 'fab', + 'mini-fab', + ]); + }); + + it('should be able to filter buttons based on their variant', async () => { + const button = await loader.getHarness(MatButtonHarness.with({variant: 'flat'})); + expect(await button.getText()).toBe('Flat button'); + }); }); + +@Component({ + // Include one of each type of button selector to ensure that they're all captured by + // the harness's selector. + template: ` + + + + + + + + + + Basic anchor + Flat anchor + Raised anchor + Stroked anchor + Icon anchor + Fab anchor + Mini Fab anchor + `, +}) +class ButtonHarnessTest { + disabled = true; + clicked = false; +} diff --git a/src/material/button/testing/shared.spec.ts b/src/material/button/testing/shared.spec.ts deleted file mode 100644 index 3bdc0370ac50..000000000000 --- a/src/material/button/testing/shared.spec.ts +++ /dev/null @@ -1,186 +0,0 @@ -import {Platform, PlatformModule} from '@angular/cdk/platform'; -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, inject, TestBed} from '@angular/core/testing'; -import {MatButtonModule} from '@angular/material/button'; -import {MatButtonHarness} from '@angular/material/button/testing/button-harness'; -import {MatIconModule} from '@angular/material/icon'; -import {MatIconHarness} from '@angular/material/icon/testing/icon-harness'; - -/** Shared tests to run on both the original and MDC-based buttons. */ -export function runHarnessTests( - buttonModule: typeof MatButtonModule, - buttonHarness: typeof MatButtonHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - let platform: Platform; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [buttonModule, MatIconModule, PlatformModule], - declarations: [ButtonHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ButtonHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - beforeEach(inject([Platform], (p: Platform) => { - platform = p; - })); - - it('should load all button harnesses', async () => { - const buttons = await loader.getAllHarnesses(buttonHarness); - expect(buttons.length).toBe(15); - }); - - it('should load button with exact text', async () => { - const buttons = await loader.getAllHarnesses(buttonHarness.with({text: 'Basic button'})); - expect(buttons.length).toBe(1); - expect(await buttons[0].getText()).toBe('Basic button'); - }); - - it('should load button with regex label match', async () => { - const buttons = await loader.getAllHarnesses(buttonHarness.with({text: /basic/i})); - expect(buttons.length).toBe(2); - expect(await buttons[0].getText()).toBe('Basic button'); - expect(await buttons[1].getText()).toBe('Basic anchor'); - }); - - it('should filter by whether a button is disabled', async () => { - const enabledButtons = await loader.getAllHarnesses(buttonHarness.with({disabled: false})); - const disabledButtons = await loader.getAllHarnesses(buttonHarness.with({disabled: true})); - expect(enabledButtons.length).toBe(13); - expect(disabledButtons.length).toBe(2); - }); - - it('should get disabled state', async () => { - // Grab each combination of [enabled, disabled] ⨯ [button, anchor] - const [disabledFlatButton, enabledFlatAnchor] = await loader.getAllHarnesses( - buttonHarness.with({text: /flat/i}), - ); - const [enabledRaisedButton, disabledRaisedAnchor] = await loader.getAllHarnesses( - buttonHarness.with({text: /raised/i}), - ); - - expect(await enabledFlatAnchor.isDisabled()).toBe(false); - expect(await disabledFlatButton.isDisabled()).toBe(true); - expect(await enabledRaisedButton.isDisabled()).toBe(false); - expect(await disabledRaisedAnchor.isDisabled()).toBe(true); - }); - - it('should get button text', async () => { - const [firstButton, secondButton] = await loader.getAllHarnesses(buttonHarness); - expect(await firstButton.getText()).toBe('Basic button'); - expect(await secondButton.getText()).toBe('Flat button'); - }); - - it('should focus and blur a button', async () => { - const button = await loader.getHarness(buttonHarness.with({text: 'Basic button'})); - expect(await button.isFocused()).toBe(false); - await button.focus(); - expect(await button.isFocused()).toBe(true); - await button.blur(); - expect(await button.isFocused()).toBe(false); - }); - - it('should click a button', async () => { - const button = await loader.getHarness(buttonHarness.with({text: 'Basic button'})); - await button.click(); - - expect(fixture.componentInstance.clicked).toBe(true); - }); - - it('should not click a disabled button', async () => { - // Older versions of Edge have a bug where `disabled` buttons are still clickable if - // they contain child elements. Also new versions of Firefox (starting v65) do not - // cancel dispatched click events on disabled buttons. We skip this check on Edge and Firefox. - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1582570 and: - // https://stackoverflow.com/questions/32377026/disabled-button-is-clickable-on-edge-browser - if (platform.FIREFOX) { - return; - } - - const button = await loader.getHarness(buttonHarness.with({text: 'Flat button'})); - await button.click(); - - expect(fixture.componentInstance.clicked).toBe(false); - }); - - it('should be able to handle nested harnesses', async () => { - const homeBtn = await loader.getHarness(buttonHarness.with({selector: '#home-icon'})); - const favBtn = await loader.getHarness(buttonHarness.with({selector: '#favorite-icon'})); - - const homeIcon = await homeBtn.getHarness(MatIconHarness); - const favIcon = await favBtn.getHarness(MatIconHarness); - - expect(await homeIcon.getName()).toBe('home'); - expect(await favIcon.getName()).toBe('favorite'); - }); - - it('should load all button harnesses', async () => { - const buttons = await loader.getAllHarnesses(buttonHarness); - const variants = await parallel(() => buttons.map(button => button.getVariant())); - - expect(variants).toEqual([ - 'basic', - 'flat', - 'raised', - 'stroked', - 'icon', - 'icon', - 'fab', - 'mini-fab', - 'basic', - 'flat', - 'raised', - 'stroked', - 'icon', - 'fab', - 'mini-fab', - ]); - }); - - it('should be able to filter buttons based on their variant', async () => { - const button = await loader.getHarness(buttonHarness.with({variant: 'flat'})); - expect(await button.getText()).toBe('Flat button'); - }); -} - -@Component({ - // Include one of each type of button selector to ensure that they're all captured by - // the harness's selector. - template: ` - - - - - - - - - - Basic anchor - Flat anchor - Raised anchor - Stroked anchor - Icon anchor - Fab anchor - Mini Fab anchor - `, -}) -class ButtonHarnessTest { - disabled = true; - clicked = false; -} diff --git a/src/material/card/_card-theme.scss b/src/material/card/_card-theme.scss index a7f357bebc01..43f1470f966f 100644 --- a/src/material/card/_card-theme.scss +++ b/src/material/card/_card-theme.scss @@ -87,9 +87,7 @@ } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); - +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-card') { @if inspection.get-theme-version($theme) == 1 { @include _theme-from-tokens(inspection.get-theme-tokens($theme)); diff --git a/src/material/card/testing/BUILD.bazel b/src/material/card/testing/BUILD.bazel index 55bccbc9257b..3b402109b2f0 100644 --- a/src/material/card/testing/BUILD.bazel +++ b/src/material/card/testing/BUILD.bazel @@ -20,16 +20,13 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "shared.spec.ts", - ], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/card", + "@npm//@angular/platform-browser", ], ) @@ -37,15 +34,3 @@ ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], ) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/card", - "@npm//@angular/platform-browser", - ], -) diff --git a/src/material/card/testing/card-harness.spec.ts b/src/material/card/testing/card-harness.spec.ts index 9d488cf41ea3..fb935a8518f5 100644 --- a/src/material/card/testing/card-harness.spec.ts +++ b/src/material/card/testing/card-harness.spec.ts @@ -1,12 +1,132 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatCardModule} from '@angular/material/card'; -import {runHarnessTests} from './shared.spec'; import {MatCardHarness, MatCardSection} from './card-harness'; -describe('MDC-based MatCardHarness', () => { - runHarnessTests(MatCardModule, MatCardHarness as any, { - header: MatCardSection.HEADER, - content: MatCardSection.CONTENT, - actions: MatCardSection.ACTIONS, - footer: MatCardSection.FOOTER, +describe('MatCardHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatCardModule], + declarations: [CardHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(CardHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should find all cards', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness); + expect(cards.length).toBe(2); + }); + + it('should find card with text', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness.with({text: /spitz breed/})); + expect(cards.length).toBe(1); + expect(await cards[0].getTitleText()).toBe('Shiba Inu'); + }); + + it('should find card with title', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness.with({title: 'Shiba Inu'})); + expect(cards.length).toBe(1); + expect(await cards[0].getTitleText()).toBe('Shiba Inu'); + }); + + it('should find card with subtitle', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness.with({subtitle: 'Dog Breed'})); + expect(cards.length).toBe(1); + expect(await cards[0].getTitleText()).toBe('Shiba Inu'); + }); + + it('should get card text', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness); + expect(await parallel(() => cards.map(c => c.getText()))).toEqual([ + '', + 'Shiba InuDog Breed The Shiba Inu is the smallest of the six original and distinct spitz' + + ' breeds of dog from Japan. A small, agile dog that copes very well with mountainous' + + ' terrain, the Shiba Inu was originally bred for hunting. LIKESHAREWoof woof!', + ]); + }); + + it('should get title text', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness); + expect(await parallel(() => cards.map(c => c.getTitleText()))).toEqual(['', 'Shiba Inu']); + }); + + it('should get subtitle text', async () => { + const cards = await loader.getAllHarnesses(MatCardHarness); + expect(await parallel(() => cards.map(c => c.getSubtitleText()))).toEqual(['', 'Dog Breed']); + }); + + it('should get a harness loader for the card header', async () => { + const card = await loader.getHarness(MatCardHarness.with({title: 'Shiba Inu'})); + const headerLoader = await card.getChildLoader(MatCardSection.HEADER); + const headerSubcomponents = (await headerLoader?.getAllHarnesses(DummyHarness)) ?? []; + expect(headerSubcomponents.length).toBe(2); + }); + + it('should get a harness loader for the card content', async () => { + const card = await loader.getHarness(MatCardHarness.with({title: 'Shiba Inu'})); + const contentLoader = await card.getChildLoader(MatCardSection.CONTENT); + const contentSubcomponents = (await contentLoader?.getAllHarnesses(DummyHarness)) ?? []; + expect(contentSubcomponents.length).toBe(1); + }); + + it('should get a harness loader for the card actions', async () => { + const card = await loader.getHarness(MatCardHarness.with({title: 'Shiba Inu'})); + const actionLoader = await card.getChildLoader(MatCardSection.ACTIONS); + const actionSubcomponents = (await actionLoader?.getAllHarnesses(DummyHarness)) ?? []; + expect(actionSubcomponents.length).toBe(2); + }); + + it('should get a harness loader for the card footer', async () => { + const card = await loader.getHarness(MatCardHarness.with({title: 'Shiba Inu'})); + const footerLoader = await card.getChildLoader(MatCardSection.FOOTER); + const footerSubcomponents = (await footerLoader?.getAllHarnesses(DummyHarness)) ?? []; + expect(footerSubcomponents.length).toBe(1); + }); + + it('should act as a harness loader for user content', async () => { + const card = await loader.getHarness(MatCardHarness.with({title: 'Shiba Inu'})); + const footerSubcomponents = (await card.getAllHarnesses(DummyHarness)) ?? []; + expect(footerSubcomponents.length).toBe(7); }); }); + +@Component({ + template: ` + + + +
+ Shiba Inu + Dog Breed +
+
+ +

+ The Shiba Inu is the smallest of the six original and distinct spitz breeds of dog from + Japan. A small, agile dog that copes very well with mountainous terrain, the Shiba Inu + was originally bred for hunting. +

+
+ + + + + +
Woof woof!
+
+
+ `, +}) +class CardHarnessTest {} + +class DummyHarness extends ComponentHarness { + static hostSelector = 'div, p, button'; +} diff --git a/src/material/card/testing/shared.spec.ts b/src/material/card/testing/shared.spec.ts deleted file mode 100644 index e9cb2eeb9854..000000000000 --- a/src/material/card/testing/shared.spec.ts +++ /dev/null @@ -1,137 +0,0 @@ -import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatCardModule} from '@angular/material/card'; -import {MatCardHarness, MatCardSection} from '@angular/material/card/testing'; - -/** Shared tests to run on both the original and MDC-based cards. */ -export function runHarnessTests( - cardModule: typeof MatCardModule, - cardHarness: typeof MatCardHarness, - contentSelectors: {header: string; content: string; actions: string; footer: string}, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [cardModule], - declarations: [CardHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(CardHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should find all cards', async () => { - const cards = await loader.getAllHarnesses(cardHarness); - expect(cards.length).toBe(2); - }); - - it('should find card with text', async () => { - const cards = await loader.getAllHarnesses(cardHarness.with({text: /spitz breed/})); - expect(cards.length).toBe(1); - expect(await cards[0].getTitleText()).toBe('Shiba Inu'); - }); - - it('should find card with title', async () => { - const cards = await loader.getAllHarnesses(cardHarness.with({title: 'Shiba Inu'})); - expect(cards.length).toBe(1); - expect(await cards[0].getTitleText()).toBe('Shiba Inu'); - }); - - it('should find card with subtitle', async () => { - const cards = await loader.getAllHarnesses(cardHarness.with({subtitle: 'Dog Breed'})); - expect(cards.length).toBe(1); - expect(await cards[0].getTitleText()).toBe('Shiba Inu'); - }); - - it('should get card text', async () => { - const cards = await loader.getAllHarnesses(cardHarness); - expect(await parallel(() => cards.map(c => c.getText()))).toEqual([ - '', - 'Shiba InuDog Breed The Shiba Inu is the smallest of the six original and distinct spitz' + - ' breeds of dog from Japan. A small, agile dog that copes very well with mountainous' + - ' terrain, the Shiba Inu was originally bred for hunting. LIKESHAREWoof woof!', - ]); - }); - - it('should get title text', async () => { - const cards = await loader.getAllHarnesses(cardHarness); - expect(await parallel(() => cards.map(c => c.getTitleText()))).toEqual(['', 'Shiba Inu']); - }); - - it('should get subtitle text', async () => { - const cards = await loader.getAllHarnesses(cardHarness); - expect(await parallel(() => cards.map(c => c.getSubtitleText()))).toEqual(['', 'Dog Breed']); - }); - - it('should get a harness loader for the card header', async () => { - const card = await loader.getHarness(cardHarness.with({title: 'Shiba Inu'})); - const headerLoader = await card.getChildLoader(contentSelectors.header as MatCardSection); - const headerSubcomponents = (await headerLoader?.getAllHarnesses(DummyHarness)) ?? []; - expect(headerSubcomponents.length).toBe(2); - }); - - it('should get a harness loader for the card content', async () => { - const card = await loader.getHarness(cardHarness.with({title: 'Shiba Inu'})); - const contentLoader = await card.getChildLoader(contentSelectors.content as MatCardSection); - const contentSubcomponents = (await contentLoader?.getAllHarnesses(DummyHarness)) ?? []; - expect(contentSubcomponents.length).toBe(1); - }); - - it('should get a harness loader for the card actions', async () => { - const card = await loader.getHarness(cardHarness.with({title: 'Shiba Inu'})); - const actionLoader = await card.getChildLoader(contentSelectors.actions as MatCardSection); - const actionSubcomponents = (await actionLoader?.getAllHarnesses(DummyHarness)) ?? []; - expect(actionSubcomponents.length).toBe(2); - }); - - it('should get a harness loader for the card footer', async () => { - const card = await loader.getHarness(cardHarness.with({title: 'Shiba Inu'})); - const footerLoader = await card.getChildLoader(contentSelectors.footer as MatCardSection); - const footerSubcomponents = (await footerLoader?.getAllHarnesses(DummyHarness)) ?? []; - expect(footerSubcomponents.length).toBe(1); - }); - - it('should act as a harness loader for user content', async () => { - const card = await loader.getHarness(cardHarness.with({title: 'Shiba Inu'})); - const footerSubcomponents = (await card.getAllHarnesses(DummyHarness)) ?? []; - expect(footerSubcomponents.length).toBe(7); - }); -} - -@Component({ - template: ` - - - -
- Shiba Inu - Dog Breed -
-
- -

- The Shiba Inu is the smallest of the six original and distinct spitz breeds of dog from - Japan. A small, agile dog that copes very well with mountainous terrain, the Shiba Inu - was originally bred for hunting. -

-
- - - - - -
Woof woof!
-
-
- `, -}) -class CardHarnessTest {} - -export class DummyHarness extends ComponentHarness { - static hostSelector = 'div, p, button'; -} diff --git a/src/material/checkbox/testing/BUILD.bazel b/src/material/checkbox/testing/BUILD.bazel index bda74020e430..c0319d997f4e 100644 --- a/src/material/checkbox/testing/BUILD.bazel +++ b/src/material/checkbox/testing/BUILD.bazel @@ -14,19 +14,6 @@ ts_library( ], ) -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/checkbox", - "@npm//@angular/forms", - "@npm//@angular/platform-browser", - ], -) - filegroup( name = "source-files", srcs = glob(["**/*.ts"]), @@ -34,14 +21,14 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/checkbox", + "@npm//@angular/forms", + "@npm//@angular/platform-browser", ], ) diff --git a/src/material/checkbox/testing/checkbox-harness.spec.ts b/src/material/checkbox/testing/checkbox-harness.spec.ts index 3720a239d0d5..b0f1dc4edf72 100644 --- a/src/material/checkbox/testing/checkbox-harness.spec.ts +++ b/src/material/checkbox/testing/checkbox-harness.spec.ts @@ -1,7 +1,193 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormControl, ReactiveFormsModule} from '@angular/forms'; import {MatCheckboxModule} from '@angular/material/checkbox'; import {MatCheckboxHarness} from './checkbox-harness'; -import {runHarnessTests} from './shared.spec'; -describe('MDC-based MatCheckboxHarness', () => { - runHarnessTests(MatCheckboxModule, MatCheckboxHarness as any); +describe('MatCheckboxHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatCheckboxModule, ReactiveFormsModule], + declarations: [CheckboxHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(CheckboxHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all checkbox harnesses', async () => { + const checkboxes = await loader.getAllHarnesses(MatCheckboxHarness); + expect(checkboxes.length).toBe(2); + }); + + it('should load checkbox with exact label', async () => { + const checkboxes = await loader.getAllHarnesses(MatCheckboxHarness.with({label: 'First'})); + expect(checkboxes.length).toBe(1); + expect(await checkboxes[0].getLabelText()).toBe('First'); + }); + + it('should load checkbox with name', async () => { + const checkboxes = await loader.getAllHarnesses(MatCheckboxHarness.with({name: 'first-name'})); + expect(checkboxes.length).toBe(1); + expect(await checkboxes[0].getLabelText()).toBe('First'); + }); + + it('should load checkbox with regex label match', async () => { + const checkboxes = await loader.getAllHarnesses(MatCheckboxHarness.with({label: /^s/i})); + expect(checkboxes.length).toBe(1); + expect(await checkboxes[0].getLabelText()).toBe('Second'); + }); + + it('should load checkbox with disabled state', async () => { + let enabledCheckboxes = await loader.getAllHarnesses( + MatCheckboxHarness.with({disabled: false}), + ); + let disabledCheckboxes = await loader.getAllHarnesses( + MatCheckboxHarness.with({disabled: true}), + ); + expect(enabledCheckboxes.length).toBe(1); + expect(disabledCheckboxes.length).toBe(1); + + fixture.componentInstance.disabled = false; + enabledCheckboxes = await loader.getAllHarnesses(MatCheckboxHarness.with({disabled: false})); + disabledCheckboxes = await loader.getAllHarnesses(MatCheckboxHarness.with({disabled: true})); + expect(enabledCheckboxes.length).toBe(2); + expect(disabledCheckboxes.length).toBe(0); + }); + + it('should get checked state', async () => { + const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + expect(await checkedCheckbox.isChecked()).toBe(true); + expect(await uncheckedCheckbox.isChecked()).toBe(false); + }); + + it('should get indeterminate state', async () => { + const [checkedCheckbox, indeterminateCheckbox] = await loader.getAllHarnesses( + MatCheckboxHarness, + ); + expect(await checkedCheckbox.isIndeterminate()).toBe(false); + expect(await indeterminateCheckbox.isIndeterminate()).toBe(true); + }); + + it('should get disabled state', async () => { + const [enabledCheckbox, disabledCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + expect(await enabledCheckbox.isDisabled()).toBe(false); + expect(await disabledCheckbox.isDisabled()).toBe(true); + }); + + it('should get required state', async () => { + const [requiredCheckbox, optionalCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + expect(await requiredCheckbox.isRequired()).toBe(true); + expect(await optionalCheckbox.isRequired()).toBe(false); + }); + + it('should get valid state', async () => { + const [requiredCheckbox, optionalCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + expect(await optionalCheckbox.isValid()).toBe(true); + expect(await requiredCheckbox.isValid()).toBe(true); + await requiredCheckbox.uncheck(); + expect(await requiredCheckbox.isValid()).toBe(false); + }); + + it('should get name', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'First'})); + expect(await checkbox.getName()).toBe('first-name'); + }); + + it('should get value', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'First'})); + expect(await checkbox.getValue()).toBe('first-value'); + }); + + it('should get aria-label', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'First'})); + expect(await checkbox.getAriaLabel()).toBe('First checkbox'); + }); + + it('should get aria-labelledby', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'Second'})); + expect(await checkbox.getAriaLabelledby()).toBe('second-label'); + }); + + it('should get label text', async () => { + const [firstCheckbox, secondCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + expect(await firstCheckbox.getLabelText()).toBe('First'); + expect(await secondCheckbox.getLabelText()).toBe('Second'); + }); + + it('should focus checkbox', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'First'})); + expect(await checkbox.isFocused()).toBe(false); + await checkbox.focus(); + expect(await checkbox.isFocused()).toBe(true); + }); + + it('should blur checkbox', async () => { + const checkbox = await loader.getHarness(MatCheckboxHarness.with({label: 'First'})); + await checkbox.focus(); + expect(await checkbox.isFocused()).toBe(true); + await checkbox.blur(); + expect(await checkbox.isFocused()).toBe(false); + }); + + it('should toggle checkbox', async () => { + fixture.componentInstance.disabled = false; + const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + await checkedCheckbox.toggle(); + await uncheckedCheckbox.toggle(); + expect(await checkedCheckbox.isChecked()).toBe(false); + expect(await uncheckedCheckbox.isChecked()).toBe(true); + }); + + it('should check checkbox', async () => { + fixture.componentInstance.disabled = false; + const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + await checkedCheckbox.check(); + await uncheckedCheckbox.check(); + expect(await checkedCheckbox.isChecked()).toBe(true); + expect(await uncheckedCheckbox.isChecked()).toBe(true); + }); + + it('should uncheck checkbox', async () => { + fixture.componentInstance.disabled = false; + const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(MatCheckboxHarness); + await checkedCheckbox.uncheck(); + await uncheckedCheckbox.uncheck(); + expect(await checkedCheckbox.isChecked()).toBe(false); + expect(await uncheckedCheckbox.isChecked()).toBe(false); + }); + + it('should not toggle disabled checkbox', async () => { + const disabledCheckbox = await loader.getHarness(MatCheckboxHarness.with({label: 'Second'})); + expect(await disabledCheckbox.isChecked()).toBe(false); + await disabledCheckbox.toggle(); + expect(await disabledCheckbox.isChecked()).toBe(false); + }); }); + +@Component({ + template: ` + + First + + + Second + + Second checkbox + `, +}) +class CheckboxHarnessTest { + ctrl = new FormControl(true); + disabled = true; +} diff --git a/src/material/checkbox/testing/shared.spec.ts b/src/material/checkbox/testing/shared.spec.ts deleted file mode 100644 index 0df2251f4bc2..000000000000 --- a/src/material/checkbox/testing/shared.spec.ts +++ /dev/null @@ -1,194 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormControl, ReactiveFormsModule} from '@angular/forms'; -import {MatCheckboxModule} from '@angular/material/checkbox'; -import {MatCheckboxHarness} from '@angular/material/checkbox/testing/checkbox-harness'; - -/** - * Function that can be used to run the shared checkbox harness tests for either the non-MDC or - * MDC based checkbox harness. - */ -export function runHarnessTests( - checkboxModule: typeof MatCheckboxModule, - checkboxHarness: typeof MatCheckboxHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [checkboxModule, ReactiveFormsModule], - declarations: [CheckboxHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(CheckboxHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all checkbox harnesses', async () => { - const checkboxes = await loader.getAllHarnesses(checkboxHarness); - expect(checkboxes.length).toBe(2); - }); - - it('should load checkbox with exact label', async () => { - const checkboxes = await loader.getAllHarnesses(checkboxHarness.with({label: 'First'})); - expect(checkboxes.length).toBe(1); - expect(await checkboxes[0].getLabelText()).toBe('First'); - }); - - it('should load checkbox with name', async () => { - const checkboxes = await loader.getAllHarnesses(checkboxHarness.with({name: 'first-name'})); - expect(checkboxes.length).toBe(1); - expect(await checkboxes[0].getLabelText()).toBe('First'); - }); - - it('should load checkbox with regex label match', async () => { - const checkboxes = await loader.getAllHarnesses(checkboxHarness.with({label: /^s/i})); - expect(checkboxes.length).toBe(1); - expect(await checkboxes[0].getLabelText()).toBe('Second'); - }); - - it('should load checkbox with disabled state', async () => { - let enabledCheckboxes = await loader.getAllHarnesses(checkboxHarness.with({disabled: false})); - let disabledCheckboxes = await loader.getAllHarnesses(checkboxHarness.with({disabled: true})); - expect(enabledCheckboxes.length).toBe(1); - expect(disabledCheckboxes.length).toBe(1); - - fixture.componentInstance.disabled = false; - enabledCheckboxes = await loader.getAllHarnesses(checkboxHarness.with({disabled: false})); - disabledCheckboxes = await loader.getAllHarnesses(checkboxHarness.with({disabled: true})); - expect(enabledCheckboxes.length).toBe(2); - expect(disabledCheckboxes.length).toBe(0); - }); - - it('should get checked state', async () => { - const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await checkedCheckbox.isChecked()).toBe(true); - expect(await uncheckedCheckbox.isChecked()).toBe(false); - }); - - it('should get indeterminate state', async () => { - const [checkedCheckbox, indeterminateCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await checkedCheckbox.isIndeterminate()).toBe(false); - expect(await indeterminateCheckbox.isIndeterminate()).toBe(true); - }); - - it('should get disabled state', async () => { - const [enabledCheckbox, disabledCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await enabledCheckbox.isDisabled()).toBe(false); - expect(await disabledCheckbox.isDisabled()).toBe(true); - }); - - it('should get required state', async () => { - const [requiredCheckbox, optionalCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await requiredCheckbox.isRequired()).toBe(true); - expect(await optionalCheckbox.isRequired()).toBe(false); - }); - - it('should get valid state', async () => { - const [requiredCheckbox, optionalCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await optionalCheckbox.isValid()).toBe(true); - expect(await requiredCheckbox.isValid()).toBe(true); - await requiredCheckbox.uncheck(); - expect(await requiredCheckbox.isValid()).toBe(false); - }); - - it('should get name', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'First'})); - expect(await checkbox.getName()).toBe('first-name'); - }); - - it('should get value', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'First'})); - expect(await checkbox.getValue()).toBe('first-value'); - }); - - it('should get aria-label', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'First'})); - expect(await checkbox.getAriaLabel()).toBe('First checkbox'); - }); - - it('should get aria-labelledby', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'Second'})); - expect(await checkbox.getAriaLabelledby()).toBe('second-label'); - }); - - it('should get label text', async () => { - const [firstCheckbox, secondCheckbox] = await loader.getAllHarnesses(checkboxHarness); - expect(await firstCheckbox.getLabelText()).toBe('First'); - expect(await secondCheckbox.getLabelText()).toBe('Second'); - }); - - it('should focus checkbox', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'First'})); - expect(await checkbox.isFocused()).toBe(false); - await checkbox.focus(); - expect(await checkbox.isFocused()).toBe(true); - }); - - it('should blur checkbox', async () => { - const checkbox = await loader.getHarness(checkboxHarness.with({label: 'First'})); - await checkbox.focus(); - expect(await checkbox.isFocused()).toBe(true); - await checkbox.blur(); - expect(await checkbox.isFocused()).toBe(false); - }); - - it('should toggle checkbox', async () => { - fixture.componentInstance.disabled = false; - const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(checkboxHarness); - await checkedCheckbox.toggle(); - await uncheckedCheckbox.toggle(); - expect(await checkedCheckbox.isChecked()).toBe(false); - expect(await uncheckedCheckbox.isChecked()).toBe(true); - }); - - it('should check checkbox', async () => { - fixture.componentInstance.disabled = false; - const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(checkboxHarness); - await checkedCheckbox.check(); - await uncheckedCheckbox.check(); - expect(await checkedCheckbox.isChecked()).toBe(true); - expect(await uncheckedCheckbox.isChecked()).toBe(true); - }); - - it('should uncheck checkbox', async () => { - fixture.componentInstance.disabled = false; - const [checkedCheckbox, uncheckedCheckbox] = await loader.getAllHarnesses(checkboxHarness); - await checkedCheckbox.uncheck(); - await uncheckedCheckbox.uncheck(); - expect(await checkedCheckbox.isChecked()).toBe(false); - expect(await uncheckedCheckbox.isChecked()).toBe(false); - }); - - it('should not toggle disabled checkbox', async () => { - const disabledCheckbox = await loader.getHarness(checkboxHarness.with({label: 'Second'})); - expect(await disabledCheckbox.isChecked()).toBe(false); - await disabledCheckbox.toggle(); - expect(await disabledCheckbox.isChecked()).toBe(false); - }); -} - -@Component({ - template: ` - - First - - - Second - - Second checkbox - `, -}) -class CheckboxHarnessTest { - ctrl = new FormControl(true); - disabled = true; -} diff --git a/src/material/chips/_chips-theme.scss b/src/material/chips/_chips-theme.scss index 40cababb87a7..b45b80d7b9d9 100644 --- a/src/material/chips/_chips-theme.scss +++ b/src/material/chips/_chips-theme.scss @@ -1,99 +1,61 @@ @use 'sass:color'; -@use 'sass:map'; -@use 'sass:meta'; @use '@material/chips/chip-theme' as mdc-chip-theme; @use '../core/tokens/m2/mdc/chip' as tokens-mdc-chip; -@use '../core/theming/palette'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; -@use '../core/mdc-helpers/mdc-helpers'; - -@function _get-default-palette($config) { - $is-dark: map.get($config, is-dark); - $grey-50: map.get(palette.$grey-palette, 50); - $grey-900: map.get(palette.$grey-palette, 900); - $default-foreground: if($is-dark, $grey-50, $grey-900); - - $surface: map.get(map.get($config, background), card); - $on-surface: if( - mdc-helpers.variable-safe-contrast-tone($surface, $is-dark) == 'dark', - #000, - #fff - ); - $default-background: if( - meta.type-of($on-surface) == color and meta.type-of($surface) == color, - color.mix($on-surface, $surface, 12%), - $on-surface - ); - - @return (default: $default-background, default-contrast: $default-foreground); -} - -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); +@mixin color($theme) { .mat-mdc-standard-chip { - $default-palette: _get-default-palette($config); - $default-config: map.merge($config, (primary: $default-palette)); - $default-color-tokens: tokens-mdc-chip.get-color-tokens($default-config); + $default-color-tokens: tokens-mdc-chip.get-color-tokens($theme); @include mdc-chip-theme.theme($default-color-tokens); &.mat-mdc-chip-selected, &.mat-mdc-chip-highlighted { &.mat-primary { - $primary-color-tokens: tokens-mdc-chip.get-color-tokens($config); + $primary-color-tokens: tokens-mdc-chip.get-color-tokens($theme, primary); @include mdc-chip-theme.theme($primary-color-tokens); } &.mat-accent { - $accent-config: map.merge($config, (primary: map.get($config, accent))); - $accent-color-tokens: tokens-mdc-chip.get-color-tokens($accent-config); + $accent-color-tokens: tokens-mdc-chip.get-color-tokens($theme, accent); @include mdc-chip-theme.theme($accent-color-tokens); } &.mat-warn { - $warn-config: map.merge($config, (primary: map.get($config, warn))); - $warn-color-tokens: tokens-mdc-chip.get-color-tokens($warn-config); + $warn-color-tokens: tokens-mdc-chip.get-color-tokens($theme, warn); @include mdc-chip-theme.theme($warn-color-tokens); } } } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme) - ); - $typography-tokens: tokens-mdc-chip.get-typography-tokens($config); +@mixin typography($theme) { + $typography-tokens: tokens-mdc-chip.get-typography-tokens($theme); .mat-mdc-standard-chip { @include mdc-chip-theme.theme($typography-tokens); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - $density-tokens: tokens-mdc-chip.get-density-tokens($density-scale); +@mixin density($theme) { + $density-tokens: tokens-mdc-chip.get-density-tokens($theme); + .mat-mdc-chip.mat-mdc-standard-chip { @include mdc-chip-theme.theme($density-tokens); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-chips') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/core/focus-indicators/_focus-indicators-theme.scss b/src/material/core/focus-indicators/_focus-indicators-theme.scss index 34321058999c..2a4834a31a18 100644 --- a/src/material/core/focus-indicators/_focus-indicators-theme.scss +++ b/src/material/core/focus-indicators/_focus-indicators-theme.scss @@ -1,13 +1,11 @@ @use './private'; -// stylelint-disable-next-line material/theme-mixin-api -@mixin color($config-or-theme-or-color) { - @include private.strong-focus-indicators-color($config-or-theme-or-color); - @include private.mdc-strong-focus-indicators-color($config-or-theme-or-color); +@mixin color($theme) { + @include private.strong-focus-indicators-color($theme); + @include private.mdc-strong-focus-indicators-color($theme); } -// stylelint-disable-next-line material/theme-mixin-api -@mixin theme($theme-or-color-config-or-color) { - @include private.strong-focus-indicators-theme($theme-or-color-config-or-color); - @include private.mdc-strong-focus-indicators-theme($theme-or-color-config-or-color); +@mixin theme($theme) { + @include private.strong-focus-indicators-theme($theme); + @include private.mdc-strong-focus-indicators-theme($theme); } diff --git a/src/material/core/style/_form-common.scss b/src/material/core/style/_form-common.scss index dc9e06d4cc07..fcb697d667c0 100644 --- a/src/material/core/style/_form-common.scss +++ b/src/material/core/style/_form-common.scss @@ -1,5 +1,5 @@ -@use 'sass:map'; -@use '../theming/theming'; +@use '../theming/inspection'; +@use './sass-utils'; // Renders a gradient for showing the dashed line when the input is disabled. // Unlike using a border, a gradient allows us to adjust the spacing of the dotted line @@ -13,9 +13,9 @@ // Figures out the color of the placeholder for a form control. // Used primarily to prevent the various form controls from // becoming out of sync since these colors aren't in a palette. -@function private-control-placeholder-color($config) { - $foreground: map.get($config, foreground); - $is-dark-theme: map.get($config, is-dark); - @return theming.get-color-from-palette($foreground, secondary-text, - if($is-dark-theme, 0.5, 0.42)); +@function private-control-placeholder-color($theme) { + $is-dark-theme: inspection.get-theme-type($theme) == dark; + @return sass-utils.safe-color-change( + inspection.get-theme-color($theme, foreground, secondary-text), + $alpha: if($is-dark-theme, 0.5, 0.42)); } diff --git a/src/material/core/style/_private.scss b/src/material/core/style/_private.scss index 509885122769..026717998738 100644 --- a/src/material/core/style/_private.scss +++ b/src/material/core/style/_private.scss @@ -1,4 +1,3 @@ -@use 'sass:map'; @use './elevation'; @use '../theming/inspection'; @@ -9,9 +8,8 @@ @include elevation.elevation($zValue, $elevation-color-or-default); } -@mixin private-theme-overridable-elevation($zValue, $config) { - $foreground: map.get($config, foreground); - $elevation-color: map.get($foreground, elevation); +@mixin private-theme-overridable-elevation($zValue, $theme) { + $elevation-color: inspection.get-theme-color($theme, foreground, elevation); $elevation-color-or-default: if($elevation-color == null, elevation.$color, $elevation-color); @include elevation.overridable-elevation($zValue, $elevation-color-or-default); diff --git a/src/material/core/testing/BUILD.bazel b/src/material/core/testing/BUILD.bazel index ce917864fb4f..a4fadc6aa3a8 100644 --- a/src/material/core/testing/BUILD.bazel +++ b/src/material/core/testing/BUILD.bazel @@ -19,11 +19,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = [ - "optgroup-shared.spec.ts", - "option-shared.spec.ts", - ], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -32,22 +29,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "option-shared.spec.ts", - "optgroup-shared.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/core", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/core/testing/optgroup-harness.spec.ts b/src/material/core/testing/optgroup-harness.spec.ts index 6e85da1921c8..acfd72aeff05 100644 --- a/src/material/core/testing/optgroup-harness.spec.ts +++ b/src/material/core/testing/optgroup-harness.spec.ts @@ -1,7 +1,77 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatOptionModule} from '@angular/material/core'; -import {runHarnessTests} from './optgroup-shared.spec'; import {MatOptgroupHarness} from './optgroup-harness'; -describe('MDC-based MatOptgroupHarness', () => { - runHarnessTests(MatOptionModule, MatOptgroupHarness); +describe('MatOptgroupHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatOptionModule], + declarations: [OptgroupHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(OptgroupHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all option group harnesses', async () => { + const groups = await loader.getAllHarnesses(MatOptgroupHarness); + expect(groups.length).toBe(2); + }); + + it('should filter groups based on their text', async () => { + const groups = await loader.getAllHarnesses( + MatOptgroupHarness.with({ + labelText: 'Disabled group', + }), + ); + + expect(groups.length).toBe(1); + }); + + it('should filter group label text by a pattern', async () => { + const groups = await loader.getAllHarnesses(MatOptgroupHarness.with({labelText: /group/})); + expect(groups.length).toBe(2); + }); + + it('should get the group label text', async () => { + const groups = await loader.getAllHarnesses(MatOptgroupHarness); + const texts = await parallel(() => groups.map(group => group.getLabelText())); + expect(texts).toEqual(['Plain group', 'Disabled group']); + }); + + it('should get the group disabled state', async () => { + const groups = await loader.getAllHarnesses(MatOptgroupHarness); + const disabledStates = await parallel(() => groups.map(group => group.isDisabled())); + expect(disabledStates).toEqual([false, true]); + }); + + it('should get the options inside the groups', async () => { + const group = await loader.getHarness(MatOptgroupHarness); + const optionTexts = await group.getOptions().then(async options => { + return await parallel(() => options.map(option => option.getText())); + }); + + expect(optionTexts).toEqual(['Option 1', 'Option 2']); + }); }); + +@Component({ + template: ` + + Option 1 + Option 2 + + + + Disabled option 1 + + `, +}) +class OptgroupHarnessTest {} diff --git a/src/material/core/testing/optgroup-shared.spec.ts b/src/material/core/testing/optgroup-shared.spec.ts deleted file mode 100644 index fc57425168d1..000000000000 --- a/src/material/core/testing/optgroup-shared.spec.ts +++ /dev/null @@ -1,81 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatOptionModule} from '@angular/material/core'; -import {MatOptgroupHarness} from './optgroup-harness'; - -/** Shared tests to run on both the original and MDC-based option groups. */ -export function runHarnessTests( - optionModule: typeof MatOptionModule, - optionGroupHarness: typeof MatOptgroupHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [optionModule], - declarations: [OptgroupHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(OptgroupHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all option group harnesses', async () => { - const groups = await loader.getAllHarnesses(optionGroupHarness); - expect(groups.length).toBe(2); - }); - - it('should filter groups based on their text', async () => { - const groups = await loader.getAllHarnesses( - optionGroupHarness.with({ - labelText: 'Disabled group', - }), - ); - - expect(groups.length).toBe(1); - }); - - it('should filter group label text by a pattern', async () => { - const groups = await loader.getAllHarnesses(optionGroupHarness.with({labelText: /group/})); - expect(groups.length).toBe(2); - }); - - it('should get the group label text', async () => { - const groups = await loader.getAllHarnesses(optionGroupHarness); - const texts = await parallel(() => groups.map(group => group.getLabelText())); - expect(texts).toEqual(['Plain group', 'Disabled group']); - }); - - it('should get the group disabled state', async () => { - const groups = await loader.getAllHarnesses(optionGroupHarness); - const disabledStates = await parallel(() => groups.map(group => group.isDisabled())); - expect(disabledStates).toEqual([false, true]); - }); - - it('should get the options inside the groups', async () => { - const group = await loader.getHarness(optionGroupHarness); - const optionTexts = await group.getOptions().then(async options => { - return await parallel(() => options.map(option => option.getText())); - }); - - expect(optionTexts).toEqual(['Option 1', 'Option 2']); - }); -} - -@Component({ - template: ` - - Option 1 - Option 2 - - - - Disabled option 1 - - `, -}) -class OptgroupHarnessTest {} diff --git a/src/material/core/testing/option-harness.spec.ts b/src/material/core/testing/option-harness.spec.ts index dcb6563b065d..ea1c2e1df783 100644 --- a/src/material/core/testing/option-harness.spec.ts +++ b/src/material/core/testing/option-harness.spec.ts @@ -1,7 +1,120 @@ -import {MatOptionModule, MatOption} from '@angular/material/core'; -import {runHarnessTests} from './option-shared.spec'; +import {Component, ViewChildren, QueryList} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import { + MatOption, + MatOptionModule, + MAT_OPTION_PARENT_COMPONENT, + MatOptionParentComponent, +} from '@angular/material/core'; import {MatOptionHarness} from './option-harness'; -describe('MDC-based MatOptionHarness', () => { - runHarnessTests(MatOptionModule, MatOptionHarness, MatOption); +describe('MatOptionHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatOptionModule], + declarations: [OptionHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(OptionHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all option harnesses', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness); + expect(options.length).toBe(2); + }); + + it('should filter options by text', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness.with({text: 'Disabled option'})); + expect(options.length).toBe(1); + }); + + it('should filter options text by a pattern', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness.with({text: /option/})); + expect(options.length).toBe(2); + }); + + it('should filter options text by its selected state', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness); + let selectedOptions = await loader.getAllHarnesses(MatOptionHarness.with({isSelected: true})); + + expect(options.length).toBe(2); + expect(selectedOptions.length).toBe(0); + + await options[0].click(); + + selectedOptions = await loader.getAllHarnesses(MatOptionHarness.with({isSelected: true})); + + expect(selectedOptions.length).toBe(1); + }); + + it('should get the text of options', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness); + const texts = await parallel(() => options.map(option => option.getText())); + expect(texts).toEqual(['Plain option', 'Disabled option']); + }); + + it('should get whether an option is disabled', async () => { + const options = await loader.getAllHarnesses(MatOptionHarness); + const disabledStates = await parallel(() => options.map(option => option.isDisabled())); + expect(disabledStates).toEqual([false, true]); + }); + + it('should get whether an option is selected', async () => { + const option = await loader.getHarness(MatOptionHarness); + + expect(await option.isSelected()).toBe(false); + + await option.click(); + + expect(await option.isSelected()).toBe(true); + }); + + it('should get whether an option is active', async () => { + const option = await loader.getHarness(MatOptionHarness); + + expect(await option.isActive()).toBe(false); + + // Set the option as active programmatically since + // it's usually the parent component that does it. + fixture.componentInstance.options.first.setActiveStyles(); + fixture.detectChanges(); + + expect(await option.isActive()).toBe(true); + }); + + it('should get whether an option is in multi-selection mode', async () => { + const option = await loader.getHarness(MatOptionHarness); + + expect(await option.isMultiple()).toBe(false); + + // Options take their `multiple` state from the parent component. + fixture.componentInstance.multiple = true; + fixture.detectChanges(); + + expect(await option.isMultiple()).toBe(true); + }); }); + +@Component({ + providers: [ + { + provide: MAT_OPTION_PARENT_COMPONENT, + useExisting: OptionHarnessTest, + }, + ], + template: ` + Plain option + Disabled option + `, +}) +class OptionHarnessTest implements MatOptionParentComponent { + @ViewChildren(MatOption) options: QueryList<{setActiveStyles(): void}>; + multiple = false; +} diff --git a/src/material/core/testing/option-harness.ts b/src/material/core/testing/option-harness.ts index a68b96117d63..925bfc35f57d 100644 --- a/src/material/core/testing/option-harness.ts +++ b/src/material/core/testing/option-harness.ts @@ -7,14 +7,14 @@ */ import { - ComponentHarness, ComponentHarnessConstructor, + ContentContainerComponentHarness, HarnessPredicate, } from '@angular/cdk/testing'; import {OptionHarnessFilters} from './option-harness-filters'; /** Harness for interacting with an MDC-based `mat-option` in tests. */ -export class MatOptionHarness extends ComponentHarness { +export class MatOptionHarness extends ContentContainerComponentHarness { /** Selector used to locate option instances. */ static hostSelector = '.mat-mdc-option'; diff --git a/src/material/core/testing/option-shared.spec.ts b/src/material/core/testing/option-shared.spec.ts deleted file mode 100644 index fecdb800d6ca..000000000000 --- a/src/material/core/testing/option-shared.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, ViewChildren, QueryList} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import { - MatOption, - MatOptionModule, - MAT_OPTION_PARENT_COMPONENT, - MatOptionParentComponent, -} from '@angular/material/core'; -import {MatOptionHarness} from './option-harness'; - -/** Shared tests to run on both the original and MDC-based options. */ -export function runHarnessTests( - optionModule: typeof MatOptionModule, - optionHarness: typeof MatOptionHarness, - optionComponent: typeof MatOption, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [optionModule], - declarations: [OptionHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(OptionHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all option harnesses', async () => { - const options = await loader.getAllHarnesses(optionHarness); - expect(options.length).toBe(2); - }); - - it('should filter options by text', async () => { - const options = await loader.getAllHarnesses(optionHarness.with({text: 'Disabled option'})); - expect(options.length).toBe(1); - }); - - it('should filter options text by a pattern', async () => { - const options = await loader.getAllHarnesses(optionHarness.with({text: /option/})); - expect(options.length).toBe(2); - }); - - it('should filter options text by its selected state', async () => { - const options = await loader.getAllHarnesses(optionHarness); - let selectedOptions = await loader.getAllHarnesses(optionHarness.with({isSelected: true})); - - expect(options.length).toBe(2); - expect(selectedOptions.length).toBe(0); - - await options[0].click(); - - selectedOptions = await loader.getAllHarnesses(optionHarness.with({isSelected: true})); - - expect(selectedOptions.length).toBe(1); - }); - - it('should get the text of options', async () => { - const options = await loader.getAllHarnesses(optionHarness); - const texts = await parallel(() => options.map(option => option.getText())); - expect(texts).toEqual(['Plain option', 'Disabled option']); - }); - - it('should get whether an option is disabled', async () => { - const options = await loader.getAllHarnesses(optionHarness); - const disabledStates = await parallel(() => options.map(option => option.isDisabled())); - expect(disabledStates).toEqual([false, true]); - }); - - it('should get whether an option is selected', async () => { - const option = await loader.getHarness(optionHarness); - - expect(await option.isSelected()).toBe(false); - - await option.click(); - - expect(await option.isSelected()).toBe(true); - }); - - it('should get whether an option is active', async () => { - const option = await loader.getHarness(optionHarness); - - expect(await option.isActive()).toBe(false); - - // Set the option as active programmatically since - // it's usually the parent component that does it. - fixture.componentInstance.options.first.setActiveStyles(); - fixture.detectChanges(); - - expect(await option.isActive()).toBe(true); - }); - - it('should get whether an option is in multi-selection mode', async () => { - const option = await loader.getHarness(optionHarness); - - expect(await option.isMultiple()).toBe(false); - - // Options take their `multiple` state from the parent component. - fixture.componentInstance.multiple = true; - fixture.detectChanges(); - - expect(await option.isMultiple()).toBe(true); - }); - - @Component({ - providers: [ - { - provide: MAT_OPTION_PARENT_COMPONENT, - useExisting: OptionHarnessTest, - }, - ], - template: ` - Plain option - Disabled option - `, - }) - class OptionHarnessTest implements MatOptionParentComponent { - @ViewChildren(optionComponent) options: QueryList<{setActiveStyles(): void}>; - multiple = false; - } -} diff --git a/src/material/core/theming/_inspection.scss b/src/material/core/theming/_inspection.scss index 989280cc095d..2b966d7206e9 100644 --- a/src/material/core/theming/_inspection.scss +++ b/src/material/core/theming/_inspection.scss @@ -289,3 +289,15 @@ $_typography-properties: (font, font-family, line-height, font-size, letter-spac } @return $result; } + +/// Gets a version of the theme with a modified typography config that preserves old behavior in +/// some components that previously used `private-typography-to-2014-config`. +/// Do not introduce new usages of this, it should be cleaned up and removed. +/// @deprecated +@function private-get-typography-back-compat-theme($theme) { + @return if( + get-theme-version($theme) == 0, + m2-inspection.private-get-typography-back-compat-theme($theme), + $theme + ); +} diff --git a/src/material/core/theming/_m2-inspection.scss b/src/material/core/theming/_m2-inspection.scss index bbdad5ff01ed..005e274ec65b 100644 --- a/src/material/core/theming/_m2-inspection.scss +++ b/src/material/core/theming/_m2-inspection.scss @@ -233,3 +233,36 @@ $_typography-properties: (font, font-family, line-height, font-size, letter-spac } @return $theme; } + +/// Gets a version of the theme with a modified typography config that preserves old behavior in +/// some components that previously used `private-typography-to-2014-config`. +/// Do not introduce new usages of this, it should be cleaned up and removed. +/// @deprecated +@function private-get-typography-back-compat-theme($theme) { + // It is possible for a user to pass a "density theme" that is just a number. + @if meta.type-of($theme) != 'map' { + @return $theme; + } + $internal: map.get($theme, $_internals, m2-config); + $theme: map.remove($theme, $_internals); + @if theme-has($theme, typography) { + $typography-config: theming.get-typography-config($theme); + // gmat configs have both 2018 and 2014 keys. + @if (not typography-versioning.private-typography-is-2014-config($typography-config)) or + (not typography-versioning.private-typography-is-2018-config($typography-config)) { + @return $theme; + } + $new-typography-config: typography-versioning.private-typography-to-2018-config( + $typography-config, true); + // subtitle-2 is mapped differently by `private-typography-to-2014-config`. + $new-typography-config: map.set( + $new-typography-config, subtitle-2, map.get($new-typography-config, body-1)); + $theme: if($theme == $typography-config, $new-typography-config, + map.set($theme, typography, $new-typography-config)); + } + @if $internal { + $internal: private-get-typography-back-compat-theme($internal); + $theme: map.set($theme, $_internals, m2-config, $internal); + } + @return $theme; +} diff --git a/src/material/core/theming/_theming.scss b/src/material/core/theming/_theming.scss index c7b4bc3e57dd..52b9282d39e0 100644 --- a/src/material/core/theming/_theming.scss +++ b/src/material/core/theming/_theming.scss @@ -24,11 +24,6 @@ $_legacy-theme-warning: 'Angular Material themes should be created from a map co 'palette values for "primary", "accent", and "warn". ' + 'See https://material.angular.io/guide/theming for more information.'; -// Flag whether theme config getter functions should warn if a key is expected to exist but not -// present in the config. This can be transformed internally in Google to ensure all clients have -// comprehensive theme configurations. -$_enable-strict-theme-config: false; - // Flag whether to disable theme definitions copying color values to the top-level theme config. // This copy is to preserve backwards compatibility. $_disable-color-backwards-compatibility: false; @@ -270,9 +265,6 @@ $_emitted-base: () !default; @if map.has-key($theme, color) { @return map.get($theme, color); } - @else if ($_enable-strict-theme-config) { - @error 'Angular Material theme configuration is missing a "color" value'; - } @return $default; } @@ -292,9 +284,6 @@ $_emitted-base: () !default; @if map.has-key($theme-or-config, density) { @return map.get($theme-or-config, density); } - @else if ($_enable-strict-theme-config) { - @error 'Angular Material theme configuration is missing a "density" value'; - } @return $default; } @@ -315,9 +304,6 @@ $_emitted-base: () !default; @if (map.has-key($theme-or-config, typography)) { @return map.get($theme-or-config, typography); } - @else if ($_enable-strict-theme-config) { - @error 'Angular Material theme configuration is missing a "typography" value'; - } @return $default; } diff --git a/src/material/core/theming/tests/theming-definition-api.spec.ts b/src/material/core/theming/tests/theming-definition-api.spec.ts index f0b116375482..e2e56a235f0f 100644 --- a/src/material/core/theming/tests/theming-definition-api.spec.ts +++ b/src/material/core/theming/tests/theming-definition-api.spec.ts @@ -16,7 +16,9 @@ const localPackageSassImporter = createLocalAngularPackageImporter(packagesDir); const mdcSassImporter = { findFileUrl: (url: string) => { if (url.toString().startsWith('@material')) { - return pathToFileURL(path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url)); + return pathToFileURL( + path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url), + ) as URL; } return null; }, diff --git a/src/material/core/theming/tests/theming-inspection-api.spec.ts b/src/material/core/theming/tests/theming-inspection-api.spec.ts index 793ec098580b..744005583c47 100644 --- a/src/material/core/theming/tests/theming-inspection-api.spec.ts +++ b/src/material/core/theming/tests/theming-inspection-api.spec.ts @@ -15,7 +15,9 @@ const localPackageSassImporter = createLocalAngularPackageImporter(packagesDir); const mdcSassImporter = { findFileUrl: (url: string) => { if (url.toString().startsWith('@material')) { - return pathToFileURL(path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url)); + return pathToFileURL( + path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url), + ) as URL; } return null; }, diff --git a/src/material/core/theming/tests/theming-mixin-api.spec.ts b/src/material/core/theming/tests/theming-mixin-api.spec.ts index 6456cdae0911..c7e93c2e95bd 100644 --- a/src/material/core/theming/tests/theming-mixin-api.spec.ts +++ b/src/material/core/theming/tests/theming-mixin-api.spec.ts @@ -17,7 +17,9 @@ const localPackageSassImporter = createLocalAngularPackageImporter(packagesDir); const mdcSassImporter = { findFileUrl: (url: string) => { if (url.toString().startsWith('@material')) { - return pathToFileURL(path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url)); + return pathToFileURL( + path.join(runfiles.resolveWorkspaceRelative('./node_modules'), url), + ) as URL; } return null; }, diff --git a/src/material/core/tokens/m2/_index.scss b/src/material/core/tokens/m2/_index.scss index da279eb223b3..5a9e929681cf 100644 --- a/src/material/core/tokens/m2/_index.scss +++ b/src/material/core/tokens/m2/_index.scss @@ -3,6 +3,7 @@ @use '../../style/sass-utils'; @use './mat/card' as tokens-mat-card; +@use './mat/toolbar' as tokens-mat-toolbar; @use './mat/radio' as tokens-mat-radio; @use './mat/snack-bar' as tokens-mat-snack-bar; @use './mat/tab-header' as tokens-mat-tab-header; @@ -19,6 +20,7 @@ @use './mdc/snack-bar' as tokens-mdc-snack-bar; @use './mdc/tab' as tokens-mdc-tab; @use './mdc/tab-indicator' as tokens-mdc-tab-indicator; +@use './mdc/plain-tooltip' as tokens-mdc-plain-tooltip; /// Gets the tokens for the given theme, m2 tokens module, and theming system. /// @param {Map} $theme The Angular Material theme object to generate token values from. @@ -68,6 +70,7 @@ _get-tokens-for-module($theme, tokens-mat-snack-bar), _get-tokens-for-module($theme, tokens-mat-tab-header), _get-tokens-for-module($theme, tokens-mat-tab-header-with-background), + _get-tokens-for-module($theme, tokens-mat-toolbar), _get-tokens-for-module($theme, tokens-mdc-checkbox), _get-tokens-for-module($theme, tokens-mdc-circular-progress), _get-tokens-for-module($theme, tokens-mdc-dialog), @@ -80,5 +83,6 @@ _get-tokens-for-module($theme, tokens-mdc-snack-bar), _get-tokens-for-module($theme, tokens-mdc-tab), _get-tokens-for-module($theme, tokens-mdc-tab-indicator), + _get-tokens-for-module($theme, tokens-mdc-plain-tooltip), ); } diff --git a/src/material/core/tokens/m2/mat/_autocomplete.scss b/src/material/core/tokens/m2/mat/_autocomplete.scss index 13747f52a87f..ca319eb93b26 100644 --- a/src/material/core/tokens/m2/mat/_autocomplete.scss +++ b/src/material/core/tokens/m2/mat/_autocomplete.scss @@ -1,6 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -13,21 +12,19 @@ $prefix: (mat, autocomplete); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return ( - background-color: theming.get-color-from-palette($background, card) + background-color: inspection.get-theme-color($theme, background, card) ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_badge.scss b/src/material/core/tokens/m2/mat/_badge.scss index 60fdd6d95043..72725ad7d3b9 100644 --- a/src/material/core/tokens/m2/mat/_badge.scss +++ b/src/material/core/tokens/m2/mat/_badge.scss @@ -2,8 +2,7 @@ @use 'sass:map'; @use 'sass:color'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -16,12 +15,10 @@ $prefix: (mat, badge); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - $primary-color-tokens: private-get-color-palette-color-tokens(map.get($config, primary)); - $app-background: theming.get-color-from-palette($background, 'background'); - $disabled-background: theming.get-color-from-palette($foreground, disabled-button); +@function get-color-tokens($theme) { + $primary-color-tokens: private-get-color-palette-color-tokens($theme, primary); + $app-background: inspection.get-theme-color($theme, background, background); + $disabled-background: inspection.get-theme-color($theme, foreground, disabled-button); // The disabled color usually has some kind of opacity, but because the badge is overlayed // on top of something else, it won't look good if it's opaque. If it is a color *type*, @@ -36,24 +33,24 @@ $prefix: (mat, badge); @return map.merge($primary-color-tokens, ( disabled-state-background-color: $disabled-background, - disabled-state-text-color: theming.get-color-from-palette($foreground, disabled-text), + disabled-state-text-color: inspection.get-theme-color($theme, foreground, disabled-text), )); } // Generates the tokens used to theme the badge based on a palette. -@function private-get-color-palette-color-tokens($palette) { +@function private-get-color-palette-color-tokens($theme, $palette-name: primary) { @return ( - background-color: theming.get-color-from-palette($palette), - text-color: theming.get-color-from-palette($palette, default-contrast), + background-color: inspection.get-theme-color($theme, $palette-name), + text-color: inspection.get-theme-color($theme, $palette-name, default-contrast), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { $base-size: 12px; @return ( - text-font: typography-utils.font-family($config), + text-font: inspection.get-theme-typography($theme, body-2, font-family), text-size: $base-size, text-weight: 600, small-size-text-size: $base-size * 0.75, @@ -62,7 +59,7 @@ $prefix: (mat, badge); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_bottom-sheet.scss b/src/material/core/tokens/m2/mat/_bottom-sheet.scss index e8a45d035461..923eb58e3a0e 100644 --- a/src/material/core/tokens/m2/mat/_bottom-sheet.scss +++ b/src/material/core/tokens/m2/mat/_bottom-sheet.scss @@ -1,7 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -17,30 +15,26 @@ $prefix: (mat, bottom-sheet); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return ( - container-text-color: theming.get-color-from-palette($foreground, text), - container-background-color: theming.get-color-from-palette($background, dialog), + container-text-color: inspection.get-theme-color($theme, foreground, text), + container-background-color: inspection.get-theme-color($theme, background, dialog), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( - container-text-font: typography-utils.font-family($config, body-1) or - typography-utils.font-family($config), - container-text-line-height: typography-utils.line-height($config, body-1), - container-text-size: typography-utils.font-size($config, body-1), - container-text-tracking: typography-utils.letter-spacing($config, body-1), - container-text-weight: typography-utils.font-weight($config, body-1), + container-text-font: inspection.get-theme-typography($theme, body-2, font-family), + container-text-line-height: inspection.get-theme-typography($theme, body-2, line-height), + container-text-size: inspection.get-theme-typography($theme, body-2, font-size), + container-text-tracking: inspection.get-theme-typography($theme, body-2, letter-spacing), + container-text-weight: inspection.get-theme-typography($theme, body-2, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_divider.scss b/src/material/core/tokens/m2/mat/_divider.scss index ee30de54a6e3..cc2149f6663a 100644 --- a/src/material/core/tokens/m2/mat/_divider.scss +++ b/src/material/core/tokens/m2/mat/_divider.scss @@ -1,6 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -15,21 +14,19 @@ $prefix: (mat, divider); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - +@function get-color-tokens($theme) { @return ( - color: theming.get-color-from-palette($foreground, divider) + color: inspection.get-theme-color($theme, foreground, divider) ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_expansion.scss b/src/material/core/tokens/m2/mat/_expansion.scss index 2d850df9ba53..0d0f473f5b37 100644 --- a/src/material/core/tokens/m2/mat/_expansion.scss +++ b/src/material/core/tokens/m2/mat/_expansion.scss @@ -1,8 +1,8 @@ @use 'sass:map'; @use '../../token-utils'; @use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; -@use '../../../typography/typography-utils'; // The prefix used to generate the fully qualified name for tokens in this file. $prefix: (mat, expansion); @@ -16,49 +16,45 @@ $prefix: (mat, expansion); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return ( - container-background-color: theming.get-color-from-palette($background, card), - container-text-color: theming.get-color-from-palette($foreground, text), - actions-divider-color: theming.get-color-from-palette($foreground, divider), - header-hover-state-layer-color: theming.get-color-from-palette($background, hover), - header-focus-state-layer-color: theming.get-color-from-palette($background, hover), - header-disabled-state-text-color: theming.get-color-from-palette($foreground, disabled-button), - header-text-color: theming.get-color-from-palette($foreground, text), - header-description-color: theming.get-color-from-palette($foreground, secondary-text), - header-indicator-color: theming.get-color-from-palette($foreground, secondary-text), + container-background-color: inspection.get-theme-color($theme, background, card), + container-text-color: inspection.get-theme-color($theme, foreground, text), + actions-divider-color: inspection.get-theme-color($theme, foreground, divider), + header-hover-state-layer-color: inspection.get-theme-color($theme, background, hover), + header-focus-state-layer-color: inspection.get-theme-color($theme, background, hover), + header-disabled-state-text-color: inspection.get-theme-color( + $theme, foreground, disabled-button), + header-text-color: inspection.get-theme-color($theme, foreground, text), + header-description-color: inspection.get-theme-color($theme, foreground, secondary-text), + header-indicator-color: inspection.get-theme-color($theme, foreground, secondary-text), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - $fallback-font-family: typography-utils.font-family($config); - +@function get-typography-tokens($theme) { @return ( - header-text-font: typography-utils.font-family($config, subheading-1) or $fallback-font-family, - header-text-size: typography-utils.font-size($config, subheading-1), - header-text-weight: typography-utils.font-weight($config, subheading-1), + header-text-font: inspection.get-theme-typography($theme, subtitle-2, font-family), + header-text-size: inspection.get-theme-typography($theme, subtitle-2, font-size), + header-text-weight: inspection.get-theme-typography($theme, subtitle-2, font-weight), // TODO(crisbeto): these two properties weren't set at all before the introduction of tokens, // but it's inconsistent not to provide them since the container sets all of them. Eventually - // we should change the values to use come from `subheading-1`. + // we should change the values to use come from `subtitle-2`. header-text-line-height: inherit, header-text-tracking: inherit, - container-text-font: typography-utils.font-family($config, body-1) or $fallback-font-family, - container-text-line-height: typography-utils.line-height($config, body-1), - container-text-size: typography-utils.font-size($config, body-1), - container-text-tracking: typography-utils.letter-spacing($config, body-1), - container-text-weight: typography-utils.font-weight($config, body-1), + container-text-font: inspection.get-theme-typography($theme, body-2, font-family), + container-text-line-height: inspection.get-theme-typography($theme, body-2, line-height), + container-text-size: inspection.get-theme-typography($theme, body-2, font-size), + container-text-tracking: inspection.get-theme-typography($theme, body-2, letter-spacing), + container-text-weight: inspection.get-theme-typography($theme, body-2, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $scale: theming.clamp-density($config, -3); +@function get-density-tokens($theme) { + $scale: theming.clamp-density(inspection.get-theme-density($theme), -3); $collapsed-scale: ( 0: 48px, -1: 44px, diff --git a/src/material/core/tokens/m2/mat/_grid-list.scss b/src/material/core/tokens/m2/mat/_grid-list.scss index 3374d1f2bdc7..bcec9ecf228b 100644 --- a/src/material/core/tokens/m2/mat/_grid-list.scss +++ b/src/material/core/tokens/m2/mat/_grid-list.scss @@ -1,5 +1,5 @@ @use '../../token-utils'; -@use '../../../typography/typography-utils'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -12,25 +12,25 @@ $prefix: (mat, grid-list); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { +@function get-color-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( // TODO(crisbeto): other components have tokens for all typography dimensions. // Here we only set the font size to maintain the same appearance as the pre-tokens // theming API. Consider adding more tokens for letter spacing, font weight etc. - tile-header-primary-text-size: typography-utils.font-size($config, body-1), - tile-header-secondary-text-size: typography-utils.font-size($config, caption), - tile-footer-primary-text-size: typography-utils.font-size($config, body-1), - tile-footer-secondary-text-size: typography-utils.font-size($config, caption), + tile-header-primary-text-size: inspection.get-theme-typography($theme, body-2, font-size), + tile-header-secondary-text-size: inspection.get-theme-typography($theme, caption, font-size), + tile-footer-primary-text-size: inspection.get-theme-typography($theme, body-2, font-size), + tile-footer-secondary-text-size: inspection.get-theme-typography($theme, caption, font-size), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_icon.scss b/src/material/core/tokens/m2/mat/_icon.scss index e7d4e1489e39..ec4de5a28967 100644 --- a/src/material/core/tokens/m2/mat/_icon.scss +++ b/src/material/core/tokens/m2/mat/_icon.scss @@ -11,18 +11,18 @@ $prefix: (mat, icon); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { +@function get-color-tokens($theme) { // Default the icon to `inherit` so it matches the text around it. @return private-get-icon-color-tokens(inherit); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_legacy-button-toggle.scss b/src/material/core/tokens/m2/mat/_legacy-button-toggle.scss index 90991f15613a..6eeacb3127cf 100644 --- a/src/material/core/tokens/m2/mat/_legacy-button-toggle.scss +++ b/src/material/core/tokens/m2/mat/_legacy-button-toggle.scss @@ -1,7 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -18,36 +16,34 @@ $prefix: (mat, legacy-button-toggle); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return ( - text-color: theming.get-color-from-palette($foreground, hint-text), - state-layer-color: theming.get-color-from-palette($background, focused-button), - selected-state-text-color: theming.get-color-from-palette($foreground, secondary-text), - selected-state-background-color: theming.get-color-from-palette($background, selected-button), - disabled-state-text-color: theming.get-color-from-palette($foreground, disabled-button), - disabled-state-background-color: - theming.get-color-from-palette($background, disabled-button-toggle), - disabled-selected-state-background-color: - theming.get-color-from-palette($background, selected-disabled-button) + text-color: inspection.get-theme-color($theme, foreground, hint-text), + state-layer-color: inspection.get-theme-color($theme, background, focused-button), + selected-state-text-color: inspection.get-theme-color($theme, foreground, secondary-text), + selected-state-background-color: inspection.get-theme-color( + $theme, background, selected-button), + disabled-state-text-color: inspection.get-theme-color($theme, foreground, disabled-button), + disabled-state-background-color: inspection.get-theme-color( + $theme, background, disabled-button-toggle), + disabled-selected-state-background-color: inspection.get-theme-color( + $theme, background, selected-disabled-button) ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( // TODO(crisbeto): other components have tokens for all typography dimensions (font weight, // letter spacing etc). The button toggle only has the font to match what it had in the // old theming API and to reduce internal breakages. We should introduce more typography // tokens at some point. - text-font: typography-utils.font-family($config), + text-font: inspection.get-theme-typography($theme, body-1, font-family), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_menu.scss b/src/material/core/tokens/m2/mat/_menu.scss index f06c35575030..14e0ed220b0c 100644 --- a/src/material/core/tokens/m2/mat/_menu.scss +++ b/src/material/core/tokens/m2/mat/_menu.scss @@ -1,8 +1,6 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; -@use '../../../typography/typography-utils'; // The prefix used to generate the fully qualified name for tokens in this file. $prefix: (mat, menu); @@ -16,37 +14,34 @@ $prefix: (mat, menu); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, is-dark); - $foreground: map.get($config, foreground); - $background: map.get($config, background); +@function get-color-tokens($theme) { + $is-dark: inspection.get-theme-type($theme) == dark; $on-surface: if($is-dark, #fff, #000); $active-state-layer-color: rgba($on-surface, if($is-dark, 0.08, 0.04)); - $text-color: theming.get-color-from-palette($foreground, text); + $text-color: inspection.get-theme-color($theme, foreground, text); @return ( item-label-text-color: $text-color, item-icon-color: $text-color, item-hover-state-layer-color: $active-state-layer-color, item-focus-state-layer-color: $active-state-layer-color, - container-color: theming.get-color-from-palette($background, card), + container-color: inspection.get-theme-color($theme, background, card), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( - item-label-text-font: - typography-utils.font-family($config, body-1) or typography-utils.font-family($config), - item-label-text-size: typography-utils.font-size($config, body-1), - item-label-text-tracking: typography-utils.letter-spacing($config, body-1), - item-label-text-line-height: typography-utils.line-height($config, body-1), - item-label-text-weight: typography-utils.font-weight($config, body-1), + item-label-text-font: inspection.get-theme-typography($theme, body-1, font-family), + item-label-text-size: inspection.get-theme-typography($theme, body-1, font-size), + item-label-text-tracking: inspection.get-theme-typography($theme, body-1, letter-spacing), + item-label-text-line-height: inspection.get-theme-typography($theme, body-1, line-height), + item-label-text-weight: inspection.get-theme-typography($theme, body-1, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_select.scss b/src/material/core/tokens/m2/mat/_select.scss index 7093411c5afa..bf0eee0b8d29 100644 --- a/src/material/core/tokens/m2/mat/_select.scss +++ b/src/material/core/tokens/m2/mat/_select.scss @@ -1,8 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; -@use '../../../mdc-helpers/mdc-helpers'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -15,48 +12,37 @@ $prefix: (mat, select); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, is-dark); - $foreground: map.get($config, foreground); - $background: map.get($config, background); - $primary: map.get($config, primary); - $warn: map.get($config, warn); +@function get-color-tokens($theme, $palette-name: primary) { + $is-dark: inspection.get-theme-type($theme) == dark; $on-surface: if($is-dark, #fff, #000); @return ( - panel-background-color: theming.get-color-from-palette($background, card), + panel-background-color: inspection.get-theme-color($theme, background, card), enabled-trigger-text-color: rgba($on-surface, 0.87), disabled-trigger-text-color: rgba($on-surface, 0.38), placeholder-text-color: rgba($on-surface, 0.6), enabled-arrow-color: rgba($on-surface, 0.54), disabled-arrow-color: rgba($on-surface, 0.38), - focused-arrow-color: theming.get-color-from-palette($primary, default, 0.87), - invalid-arrow-color: theming.get-color-from-palette($warn, default, 0.87), + focused-arrow-color: sass-utils.safe-color-change( + inspection.get-theme-color($theme, $palette-name, default), $alpha: 0.87), + invalid-arrow-color: sass-utils.safe-color-change( + inspection.get-theme-color($theme, warn, default), $alpha: 0.87), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - // TODO(crisbeto): The earlier implementation of the select used MDC's APIs to create the - // typography tokens. As a result, we unintentionally allowed `null` typography configs to be - // passed in. Since there a lot of apps that now depend on this pattern, we need this temporary - // fallback. - @if ($config == null) { - $config: mdc-helpers.private-fallback-typography-from-mdc(); - } - +@function get-typography-tokens($theme) { @return ( - trigger-text-font: typography-utils.font-family($config, body-1) or - typography-utils.font-family($config), - trigger-text-line-height: typography-utils.line-height($config, body-1), - trigger-text-size: typography-utils.font-size($config, body-1), - trigger-text-tracking: typography-utils.letter-spacing($config, body-1), - trigger-text-weight: typography-utils.font-weight($config, body-1) + trigger-text-font: inspection.get-theme-typography($theme, body-1, font-family), + trigger-text-line-height: inspection.get-theme-typography($theme, body-1, line-height), + trigger-text-size: inspection.get-theme-typography($theme, body-1, font-size), + trigger-text-tracking: inspection.get-theme-typography($theme, body-1, letter-spacing), + trigger-text-weight: inspection.get-theme-typography($theme, body-1, font-weight) ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_sidenav.scss b/src/material/core/tokens/m2/mat/_sidenav.scss index a17dfa6c7873..47407dde338d 100644 --- a/src/material/core/tokens/m2/mat/_sidenav.scss +++ b/src/material/core/tokens/m2/mat/_sidenav.scss @@ -1,8 +1,7 @@ @use 'sass:color'; -@use 'sass:map'; @use 'sass:meta'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -19,20 +18,19 @@ $prefix: (mat, sidenav); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, is-dark); - $foreground: map.get($config, foreground); - $background: map.get($config, background); +@function get-color-tokens($theme) { + $is-dark: inspection.get-theme-type($theme) == dark; $scrim-opacity: 0.6; - $scrim-color: theming.get-color-from-palette($background, card, $scrim-opacity); + $scrim-color: sass-utils.safe-color-change( + inspection.get-theme-color($theme, background, card), $alpha: $scrim-opacity); $fallback-scrim-color: if($is-dark, rgba(#fff, $scrim-opacity), rgba(#000, $scrim-opacity)); @return ( - container-divider-color: theming.get-color-from-palette($foreground, divider), - container-background-color: theming.get-color-from-palette($background, dialog), - container-text-color: theming.get-color-from-palette($foreground, text), - content-background-color: theming.get-color-from-palette($background, background), - content-text-color: theming.get-color-from-palette($foreground, text), + container-divider-color: inspection.get-theme-color($theme, foreground, divider), + container-background-color: inspection.get-theme-color($theme, background, dialog), + container-text-color: inspection.get-theme-color($theme, foreground, text), + content-background-color: inspection.get-theme-color($theme, background, background), + content-text-color: inspection.get-theme-color($theme, foreground, text), // We use invert() here to have the darken the background color expected to be used. // If the background is light, we use a dark backdrop. If the background is dark, we @@ -44,12 +42,12 @@ $prefix: (mat, sidenav); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_snack-bar.scss b/src/material/core/tokens/m2/mat/_snack-bar.scss index 70f704467494..33ade33af756 100644 --- a/src/material/core/tokens/m2/mat/_snack-bar.scss +++ b/src/material/core/tokens/m2/mat/_snack-bar.scss @@ -1,6 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -13,22 +12,22 @@ $prefix: (mat, snack-bar); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, is-dark); - $accent: map.get($config, accent); +@function get-color-tokens($theme) { + $is-dark: inspection.get-theme-type($theme) == dark; @return ( - button-color: if($is-dark, rgba(0, 0, 0, 0.87), theming.get-color-from-palette($accent, text)) + button-color: if( + $is-dark, rgba(0, 0, 0, 0.87), inspection.get-theme-color($theme, accent, text)) ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_standard-button-toggle.scss b/src/material/core/tokens/m2/mat/_standard-button-toggle.scss index 76c66844373f..af2d0923b4b8 100644 --- a/src/material/core/tokens/m2/mat/_standard-button-toggle.scss +++ b/src/material/core/tokens/m2/mat/_standard-button-toggle.scss @@ -1,8 +1,8 @@ @use 'sass:map'; @use 'sass:meta'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; @use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -19,49 +19,50 @@ $prefix: (mat, standard-button-toggle); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - $theme-divider-color: theming.get-color-from-palette($foreground, divider); +@function get-color-tokens($theme) { + $theme-divider-color: inspection.get-theme-color($theme, foreground, divider); // By default the theme usually has an rgba color for the dividers, which can // stack up with the background of a button toggle. This can cause the border // of a selected toggle to look different from an deselected one. We use a solid // color to ensure that the border always stays the same. - $divider-color: if(meta.type-of($theme-divider-color) == color, - theming.private-rgba-to-hex($theme-divider-color, map.get($background, card)), - $theme-divider-color - ); + $divider-color: if( + meta.type-of($theme-divider-color) == color, + theming.private-rgba-to-hex( + $theme-divider-color, inspection.get-theme-color($theme, background, card)), + $theme-divider-color); @return ( - text-color: theming.get-color-from-palette($foreground, text), - background-color: theming.get-color-from-palette($background, card), - state-layer-color: theming.get-color-from-palette($background, focused-button, 1), - selected-state-background-color: theming.get-color-from-palette($background, selected-button), - selected-state-text-color: theming.get-color-from-palette($foreground, text), - disabled-state-text-color: theming.get-color-from-palette($foreground, disabled-button), - disabled-state-background-color: theming.get-color-from-palette($background, card), - disabled-selected-state-text-color: theming.get-color-from-palette($foreground, text), + text-color: inspection.get-theme-color($theme, foreground, text), + background-color: inspection.get-theme-color($theme, background, card), + state-layer-color: sass-utils.safe-color-change( + inspection.get-theme-color($theme, background, focused-button), $alpha: 1), + selected-state-background-color: inspection.get-theme-color( + $theme, background, selected-button), + selected-state-text-color: inspection.get-theme-color($theme, foreground, text), + disabled-state-text-color: inspection.get-theme-color($theme, foreground, disabled-button), + disabled-state-background-color: inspection.get-theme-color($theme, background, card), + disabled-selected-state-text-color: inspection.get-theme-color($theme, foreground, text), disabled-selected-state-background-color: - theming.get-color-from-palette($background, selected-disabled-button), + inspection.get-theme-color($theme, background, selected-disabled-button), divider-color: $divider-color, ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( // TODO(crisbeto): other components have tokens for all typography dimensions (font weight, // letter spacing etc). The button toggle only has the font to match what it had in the // old theming API and to reduce internal breakages. We should introduce more typography // tokens at some point. - text-font: typography-utils.font-family($config), + text-font: inspection.get-theme-typography($theme, body-1, font-family), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $density-scale: theming.clamp-density($config, -4); +@function get-density-tokens($theme) { + $density-scale: theming.clamp-density(inspection.get-theme-density($theme), -4); $size-scale: ( 0: 48px, -1: 44px, diff --git a/src/material/core/tokens/m2/mat/_tab-header-with-background.scss b/src/material/core/tokens/m2/mat/_tab-header-with-background.scss index d332fa7ce7c5..bf15c0fefeb3 100644 --- a/src/material/core/tokens/m2/mat/_tab-header-with-background.scss +++ b/src/material/core/tokens/m2/mat/_tab-header-with-background.scss @@ -1,6 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -13,22 +12,21 @@ $prefix: (mat, tab-header-with-background); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $primary: map.get($config, primary); +@function get-color-tokens($theme, $palette-name: primary) { @return ( - background-color: theming.get-color-from-palette($primary, default), - foreground-color: theming.get-color-from-palette($primary, default-contrast), + background-color: inspection.get-theme-color($theme, $palette-name, default), + foreground-color: inspection.get-theme-color($theme, $palette-name, default-contrast), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_tab-header.scss b/src/material/core/tokens/m2/mat/_tab-header.scss index edcd1fd437f6..541fbd7d17af 100644 --- a/src/material/core/tokens/m2/mat/_tab-header.scss +++ b/src/material/core/tokens/m2/mat/_tab-header.scss @@ -1,7 +1,5 @@ -@use 'sass:map'; @use '../../token-utils'; -@use '../../../theming/theming'; -@use '../../../typography/typography-utils'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -14,16 +12,14 @@ $prefix: (mat, tab-header); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, is-dark); - $foreground: map.get($config, foreground); - $primary: map.get($config, primary); +@function get-color-tokens($theme, $palette-name: primary) { + $is-dark: inspection.get-theme-type($theme) == dark; $inactive-label-text-color: rgba(if($is-dark, #fff, #000), 0.6); - $active-label-text-color: theming.get-color-from-palette($primary, default); - $ripple-color: theming.get-color-from-palette($primary, default); + $active-label-text-color: inspection.get-theme-color($theme, $palette-name, default); + $ripple-color: inspection.get-theme-color($theme, $palette-name, default); @return ( - disabled-ripple-color: theming.get-color-from-palette($foreground, disabled), + disabled-ripple-color: inspection.get-theme-color($theme, foreground, disabled), pagination-icon-color: if($is-dark, #fff, #000), // Note: MDC has equivalents of these tokens, but they lead to much higher selector specificity. @@ -43,20 +39,19 @@ $prefix: (mat, tab-header); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( // Note: MDC has equivalents of these tokens, but they lead to much higher selector specificity. - label-text-font: - typography-utils.font-family($config, button) or typography-utils.font-family($config), - label-text-size: typography-utils.font-size($config, button), - label-text-tracking: typography-utils.letter-spacing($config, button), - label-text-line-height: typography-utils.line-height($config, button), - label-text-weight: typography-utils.font-weight($config, button), + label-text-font: inspection.get-theme-typography($theme, button, font-family), + label-text-size: inspection.get-theme-typography($theme, button, font-size), + label-text-tracking: inspection.get-theme-typography($theme, button, letter-spacing), + label-text-line-height: inspection.get-theme-typography($theme, button, line-height), + label-text-weight: inspection.get-theme-typography($theme, button, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mat/_table.scss b/src/material/core/tokens/m2/mat/_table.scss index cd9f442e338d..1905555d909b 100644 --- a/src/material/core/tokens/m2/mat/_table.scss +++ b/src/material/core/tokens/m2/mat/_table.scss @@ -1,6 +1,6 @@ @use 'sass:map'; @use '../../../theming/theming'; -@use '../../../typography/typography-utils'; +@use '../../../theming/inspection'; @use '../../token-utils'; @use '../../../style/sass-utils'; @@ -16,34 +16,30 @@ $prefix: (mat, table); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return ( - background-color: theming.get-color-from-palette($background, 'card'), + background-color: inspection.get-theme-color($theme, background, 'card'), - header-headline-color: theming.get-color-from-palette($foreground, text), - row-item-label-text-color: theming.get-color-from-palette($foreground, text), - row-item-outline-color: theming.get-color-from-palette($foreground, divider), + header-headline-color: inspection.get-theme-color($theme, foreground, text), + row-item-label-text-color: inspection.get-theme-color($theme, foreground, text), + row-item-outline-color: inspection.get-theme-color($theme, foreground, divider), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - $fallback-font: typography-utils.font-family($config); - $cell-font-family: typography-utils.font-family($config, body-2) or $fallback-font; - $cell-line-height: typography-utils.line-height($config, body-2); - $cell-font-size: typography-utils.font-size($config, body-2); - $cell-font-weight: typography-utils.font-weight($config, body-2); - $cell-letter-spacing: typography-utils.letter-spacing($config, body-2); +@function get-typography-tokens($theme) { + $cell-font-family: inspection.get-theme-typography($theme, body-2, font-family); + $cell-line-height: inspection.get-theme-typography($theme, body-2, line-height); + $cell-font-size: inspection.get-theme-typography($theme, body-2, font-size); + $cell-font-weight: inspection.get-theme-typography($theme, body-2, font-weight); + $cell-letter-spacing: inspection.get-theme-typography($theme, body-2, letter-spacing); @return ( - header-headline-font: typography-utils.font-family($config, subtitle-2) or $fallback-font, - header-headline-line-height: typography-utils.line-height($config, subtitle-2), - header-headline-size: typography-utils.font-size($config, subtitle-2), - header-headline-weight: typography-utils.font-weight($config, subtitle-2), - header-headline-tracking: typography-utils.letter-spacing($config, subtitle-2), + header-headline-font: inspection.get-theme-typography($theme, subtitle-2, font-family), + header-headline-line-height: inspection.get-theme-typography($theme, subtitle-2, line-height), + header-headline-size: inspection.get-theme-typography($theme, subtitle-2, font-size), + header-headline-weight: inspection.get-theme-typography($theme, subtitle-2, font-weight), + header-headline-tracking: inspection.get-theme-typography($theme, subtitle-2, letter-spacing), // Plain cells and footer cells have the same typography. row-item-label-text-font: $cell-font-family, @@ -61,8 +57,8 @@ $prefix: (mat, table); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $scale: theming.clamp-density($config, -4); +@function get-density-tokens($theme) { + $scale: theming.clamp-density(inspection.get-theme-density($theme), -4); $header-scale: ( 0: 56px, -1: 52px, diff --git a/src/material/core/tokens/m2/mat/_toolbar.scss b/src/material/core/tokens/m2/mat/_toolbar.scss index 3b472dcd20c2..611cd90e6ae9 100644 --- a/src/material/core/tokens/m2/mat/_toolbar.scss +++ b/src/material/core/tokens/m2/mat/_toolbar.scss @@ -1,7 +1,7 @@ @use 'sass:map'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; @use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -14,31 +14,27 @@ $prefix: (mat, toolbar); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $foreground: map.get($config, foreground); - $background: map.get($config, background); - +@function get-color-tokens($theme) { @return private-get-color-palette-color-tokens( - $background-color: theming.get-color-from-palette($background, app-bar), - $text-color: theming.get-color-from-palette($foreground, text), + $background-color: inspection.get-theme-color($theme, background, app-bar), + $text-color: inspection.get-theme-color($theme, foreground, text), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return ( - title-text-font: typography-utils.font-family($config, title) or - typography-utils.font-family($config), - title-text-line-height: typography-utils.line-height($config, title), - title-text-size: typography-utils.font-size($config, title), - title-text-tracking: typography-utils.letter-spacing($config, title), - title-text-weight: typography-utils.font-weight($config, title), + title-text-font: inspection.get-theme-typography($theme, headline-6, font-family), + title-text-line-height: inspection.get-theme-typography($theme, headline-6, line-height), + title-text-size: inspection.get-theme-typography($theme, headline-6, font-size), + title-text-tracking: inspection.get-theme-typography($theme, headline-6, letter-spacing), + title-text-weight: inspection.get-theme-typography($theme, headline-6, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $density-scale: theming.clamp-density($config, -3); +@function get-density-tokens($theme) { + $density-scale: theming.clamp-density(inspection.get-theme-density($theme), -3); $standard-scale: ( 0: 64px, -1: 60px, diff --git a/src/material/core/tokens/m2/mdc/_button-filled.scss b/src/material/core/tokens/m2/mdc/_button-filled.scss new file mode 100644 index 000000000000..3a9994384bda --- /dev/null +++ b/src/material/core/tokens/m2/mdc/_button-filled.scss @@ -0,0 +1,92 @@ +@use '../../token-utils'; +@use '../../../mdc-helpers/mdc-helpers'; +@use '../../../style/sass-utils'; +@use '../../../theming/inspection'; + +// The prefix used to generate the fully qualified name for tokens in this file. +$prefix: (mdc, button-filled); + +// Tokens that can't be configured through Angular Material's current theming API, +// but may be in a future version of the theming API. +// +// Tokens that are available in MDC, but not used in Angular Material should be mapped to `null`. +// `null` indicates that we are intentionally choosing not to emit a slot or value for the token in +// our CSS. +@function get-unthemable-tokens() { + @return ( + container-elevation: 0, + container-height: 36px, + container-shape: 4px, + disabled-container-elevation: 0, + focus-container-elevation: 0, + hover-container-elevation: 0, + keep-touch-target: false, + pressed-container-elevation: 0, + + focus-state-layer-opacity: null, + hover-state-layer-opacity: null, + pressed-state-layer-opacity: null, + container-shadow-color: null, + focus-label-text-color: null, + hover-label-text-color: null, + label-text-font: null, + label-text-size: null, + label-text-tracking: null, + label-text-transform: null, + label-text-weight: null, + pressed-label-text-color: null, + with-icon-disabled-icon-color: null, + with-icon-focus-icon-color: null, + with-icon-hover-icon-color: null, + with-icon-icon-color: null, + with-icon-icon-size: null, + with-icon-pressed-icon-color: null + ); +} + +@function on-color($theme, $palette) { + @if ($palette) { + $is-dark: inspection.get-theme-type($theme) == dark; + @return if(mdc-helpers.variable-safe-contrast-tone($palette, $is-dark) == 'dark', #000, #fff); + } +} + +// Tokens that can be configured through Angular Material's color theming API. +@function get-color-tokens($theme, $color: null, $on-color: null) { + $is-dark: inspection.get-theme-type($theme) == dark; + $primary: inspection.get-theme-color($theme, primary); + $surface: inspection.get-theme-color($theme, background, card); + $on-primary: on-color($theme, $primary); + $on-surface: on-color($theme, $surface); + + @return ( + container-color: if($color, $color, transparent), + disabled-container-color: rgba($on-surface, 0.12), + disabled-label-text-color: rgba($on-surface, if($is-dark, 0.5, 0.38)), + focus-state-layer-color: $on-primary, + hover-state-layer-color: $on-primary, + label-text-color: if($on-color, $on-color, inherit), + pressed-state-layer-color: $on-primary + ); +} + +// Tokens that can be configured through Angular Material's typography theming API. +@function get-typography-tokens($theme) { + @return (); +} + +// Tokens that can be configured through Angular Material's density theming API. +@function get-density-tokens($theme) { + @return (); +} + +// Combines the tokens generated by the above functions into a single map with placeholder values. +// This is used to create token slots. +@function get-token-slots() { + @return sass-utils.deep-merge-all( + get-unthemable-tokens(), + get-color-tokens(token-utils.$placeholder-color-config), + get-typography-tokens(token-utils.$placeholder-typography-config), + get-density-tokens(token-utils.$placeholder-density-config) + ); +} diff --git a/src/material/core/tokens/m2/mdc/_chip.scss b/src/material/core/tokens/m2/mdc/_chip.scss index b1d562df7203..73f3d631f550 100644 --- a/src/material/core/tokens/m2/mdc/_chip.scss +++ b/src/material/core/tokens/m2/mdc/_chip.scss @@ -1,9 +1,12 @@ +@use 'sass:color'; @use 'sass:map'; +@use 'sass:meta'; @use '../../token-utils'; @use '../../../mdc-helpers/mdc-helpers'; @use '../../../style/sass-utils'; @use '../../../theming/theming'; -@use '../../../typography/typography-utils'; +@use '../../../theming/inspection'; +@use '../../../theming/palette'; // The prefix used to generate the fully qualified name for tokens in this file. $prefix: (mdc, chip); @@ -228,14 +231,34 @@ $prefix: (mdc, chip); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $palette: map.get($config, primary); +@function get-color-tokens($theme, $palette-name: null) { + $foreground: null; + $background: null; + $state-layer-color: inspection.get-theme-color($theme, foreground, base); + $state-layer-opacity: 0.12; // 0.12 is a common value in Material Design for opacity. - $background: theming.get-color-from-palette($palette); - $foreground: theming.get-color-from-palette($palette, default-contrast); + @if $palette-name == null { + $is-dark: inspection.get-theme-type($theme) == dark; + $grey-50: map.get(palette.$grey-palette, 50); + $grey-900: map.get(palette.$grey-palette, 900); + $foreground: if($is-dark, $grey-50, $grey-900); - $state-layer-color: theming.get-color-from-palette(map.get($config, foreground), base); - $state-layer-opacity: 0.12; // 0.12 is a common value in Material Design for opacity. + $surface: inspection.get-theme-color($theme, background, card); + $on-surface: if( + mdc-helpers.variable-safe-contrast-tone($surface, $is-dark) == 'dark', + #000, + #fff + ); + $background: if( + meta.type-of($on-surface) == color and meta.type-of($surface) == color, + color.mix($on-surface, $surface, 12%), + $on-surface + ); + } + @else { + $background: inspection.get-theme-color($theme, $palette-name); + $foreground: inspection.get-theme-color($theme, $palette-name, default-contrast); + } @return ( // The text color of a disabled chip. @@ -264,33 +287,24 @@ $prefix: (mdc, chip); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - // TODO(wagnermaciel): The earlier implementation of the chip used MDC's APIs to create the - // typography tokens. As a result, we unintentionally allowed `null` typography configs to be - // passed in. Since there a lot of apps that now depend on this pattern, we need this temporary - // fallback. - @if ($config == null) { - $config: mdc-helpers.private-fallback-typography-from-mdc(); - } - +@function get-typography-tokens($theme) { @return ( // The font family of the chip text. - label-text-font: typography-utils.font-family($config, body-2) or - typography-utils.font-family($config), + label-text-font: inspection.get-theme-typography($theme, body-2, font-family), // The line height of the chip text. - label-text-line-height: typography-utils.line-height($config, body-2), + label-text-line-height: inspection.get-theme-typography($theme, body-2, line-height), // The font size of the chip text. - label-text-size: typography-utils.font-size($config, body-2), + label-text-size: inspection.get-theme-typography($theme, body-2, font-size), // The letter spacing of the chip label. - label-text-tracking: typography-utils.letter-spacing($config, body-2), + label-text-tracking: inspection.get-theme-typography($theme, body-2, letter-spacing), // The font weight of the chip text. - label-text-weight: typography-utils.font-weight($config, body-2) + label-text-weight: inspection.get-theme-typography($theme, body-2, font-weight) ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $scale: theming.clamp-density($config, -2); +@function get-density-tokens($theme) { + $scale: theming.clamp-density(inspection.get-theme-density($theme), -2); @return ( // The height of the chip. container-height: diff --git a/src/material/core/tokens/m2/mdc/_circular-progress.scss b/src/material/core/tokens/m2/mdc/_circular-progress.scss index d8e436ddd1ec..c1a1d69ba279 100644 --- a/src/material/core/tokens/m2/mdc/_circular-progress.scss +++ b/src/material/core/tokens/m2/mdc/_circular-progress.scss @@ -1,5 +1,4 @@ -@use 'sass:map'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; @use '../../token-utils'; @@ -33,20 +32,20 @@ $prefix: (mdc, circular-progress); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { +@function get-color-tokens($theme) { @return ( // The color of the progress spinner's active indicator. - active-indicator-color: theming.get-color-from-palette(map.get($config, primary)) + active-indicator-color: inspection.get-theme-color($theme, primary) ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_dialog.scss b/src/material/core/tokens/m2/mdc/_dialog.scss index b717c7885cf8..83fc63519880 100644 --- a/src/material/core/tokens/m2/mdc/_dialog.scss +++ b/src/material/core/tokens/m2/mdc/_dialog.scss @@ -1,7 +1,4 @@ -@use 'sass:map'; -@use '../../../theming/theming'; -@use '../../../typography/typography-utils'; -@use '../../../mdc-helpers/mdc-helpers'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; @use '../../token-utils'; @@ -56,14 +53,13 @@ $prefix: (mdc, dialog); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $is-dark: map.get($config, 'is-dark'); - $background: map.get($config, background); +@function get-color-tokens($theme) { + $is-dark: inspection.get-theme-type($theme) == dark; $on-surface: if($is-dark, #fff, #000); @return ( // Background color of the container. - container-color: theming.get-color-from-palette($background, dialog), + container-color: inspection.get-theme-color($theme, background, dialog), // Color of the dialog header. subhead-color: rgba($on-surface, 0.87), // Color of the dialog body text. @@ -72,35 +68,25 @@ $prefix: (mdc, dialog); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - // TODO(crisbeto): The earlier implementation of the dialog used MDC's APIs to create the - // typography tokens. As a result, we unintentionally allowed `null` typography configs to be - // passed in. Since there a lot of apps that now depend on this pattern, we need this temporary - // fallback. - @if ($config == null) { - $config: mdc-helpers.private-fallback-typography-from-mdc(); - } - +@function get-typography-tokens($theme) { @return ( // Typography of the dialog header. - subhead-font: typography-utils.font-family($config, headline-6) - or typography-utils.font-family($config), - subhead-line-height: typography-utils.line-height($config, headline-6), - subhead-size: typography-utils.font-size($config, headline-6), - subhead-weight: typography-utils.font-weight($config, headline-6), - subhead-tracking: typography-utils.letter-spacing($config, headline-6), + subhead-font: inspection.get-theme-typography($theme, headline-6, font-family), + subhead-line-height: inspection.get-theme-typography($theme, headline-6, line-height), + subhead-size: inspection.get-theme-typography($theme, headline-6, font-size), + subhead-weight: inspection.get-theme-typography($theme, headline-6, font-weight), + subhead-tracking: inspection.get-theme-typography($theme, headline-6, letter-spacing), // Typography of the dialog body text. - supporting-text-font: typography-utils.font-family($config, body-1) - or typography-utils.font-family($config), - supporting-text-line-height: typography-utils.line-height($config, body-1), - supporting-text-size: typography-utils.font-size($config, body-1), - supporting-text-weight: typography-utils.font-weight($config, body-1), - supporting-text-tracking: typography-utils.letter-spacing($config, body-1), + supporting-text-font: inspection.get-theme-typography($theme, body-1, font-family), + supporting-text-line-height: inspection.get-theme-typography($theme, body-1, line-height), + supporting-text-size: inspection.get-theme-typography($theme, body-1, font-size), + supporting-text-weight: inspection.get-theme-typography($theme, body-1, font-weight), + supporting-text-tracking: inspection.get-theme-typography($theme, body-1, letter-spacing), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_icon-button.scss b/src/material/core/tokens/m2/mdc/_icon-button.scss index ee89b90cc731..62ff58fb382b 100644 --- a/src/material/core/tokens/m2/mdc/_icon-button.scss +++ b/src/material/core/tokens/m2/mdc/_icon-button.scss @@ -39,6 +39,8 @@ $prefix: (mdc, icon-button); pressed-icon-color: null, pressed-state-layer-color: null, pressed-state-layer-opacity: null, + focus-ring-color: null, + focus-ring-offset: null, ); } @@ -50,12 +52,12 @@ $prefix: (mdc, icon-button); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_plain-tooltip.scss b/src/material/core/tokens/m2/mdc/_plain-tooltip.scss index 83e3ce579ccf..1380dcb16843 100644 --- a/src/material/core/tokens/m2/mdc/_plain-tooltip.scss +++ b/src/material/core/tokens/m2/mdc/_plain-tooltip.scss @@ -1,7 +1,4 @@ -@use 'sass:map'; -@use '../../../theming/theming'; -@use '../../../typography/typography-utils'; -@use '../../../mdc-helpers/mdc-helpers'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; @use '../../token-utils'; @@ -26,42 +23,32 @@ $prefix: (mdc, plain-tooltip); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $background: map.get($config, background); +@function get-color-tokens($theme) { @return ( // Color of the tooltip container. - container-color: theming.get-color-from-palette($background, tooltip), + container-color: inspection.get-theme-color($theme, background, tooltip), // Color of the tooltip text. supporting-text-color: #fff, ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - // TODO(amysorto): The earlier implementation of the tooltip used MDC's APIs to create the - // typography tokens. As a result, we unintentionally allowed `null` typography configs to be - // passed in. Since there a lot of apps that now depend on this pattern, we need this temporary - // fallback. - @if ($config == null) { - $config: mdc-helpers.private-fallback-typography-from-mdc(); - } - +@function get-typography-tokens($theme) { @return ( // Font for the tooltip text. - supporting-text-font: typography-utils.font-family($config, caption) - or typography-utils.font-family($config), + supporting-text-font: inspection.get-theme-typography($theme, caption, font-family), // Font size for the tooltip text. - supporting-text-size: typography-utils.font-size($config, caption), + supporting-text-size: inspection.get-theme-typography($theme, caption, font-size), // Font weight of the tooltip text. - supporting-text-weight: typography-utils.font-weight($config, caption), + supporting-text-weight: inspection.get-theme-typography($theme, caption, font-weight), // Tracking (space between letters) of the tooltip text. - supporting-text-tracking: typography-utils.letter-spacing($config, caption), + supporting-text-tracking: inspection.get-theme-typography($theme, caption, letter-spacing), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_snack-bar.scss b/src/material/core/tokens/m2/mdc/_snack-bar.scss index cd191a22fa2e..dc09959aebb1 100644 --- a/src/material/core/tokens/m2/mdc/_snack-bar.scss +++ b/src/material/core/tokens/m2/mdc/_snack-bar.scss @@ -1,10 +1,7 @@ -@use 'sass:map'; @use 'sass:meta'; @use 'sass:color'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../token-utils'; -@use '../../../typography/typography-utils'; -@use '../../../mdc-helpers/mdc-helpers'; @use '../../../style/sass-utils'; // The prefix used to generate the fully qualified name for tokens in this file. @@ -58,10 +55,9 @@ $prefix: (mdc, snackbar); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $background-palette: map.get($config, background); - $is-dark: map.get($config, is-dark); - $surface: theming.get-color-from-palette($background-palette, card); +@function get-color-tokens($theme) { + $is-dark: inspection.get-theme-type($theme) == dark; + $surface: inspection.get-theme-color($theme, background, card); @return ( container-color: if(meta.type-of($surface) == color, @@ -71,26 +67,17 @@ $prefix: (mdc, snackbar); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { - // TODO(crisbeto): The earlier implementation of the snack bar used MDC's APIs to create the - // typography tokens. As a result, we unintentionally allowed `null` typography configs to be - // passed in. Since there a lot of apps that now depend on this pattern, we need this temporary - // fallback. - @if ($config == null) { - $config: mdc-helpers.private-fallback-typography-from-mdc(); - } - +@function get-typography-tokens($theme) { @return ( - supporting-text-font: typography-utils.font-family($config, body-2) - or typography-utils.font-family($config), - supporting-text-line-height: typography-utils.line-height($config, body-2), - supporting-text-size: typography-utils.font-size($config, body-2), - supporting-text-weight: typography-utils.font-weight($config, body-2), + supporting-text-font: inspection.get-theme-typography($theme, body-2, font-family), + supporting-text-line-height: inspection.get-theme-typography($theme, body-2, line-height), + supporting-text-size: inspection.get-theme-typography($theme, body-2, font-size), + supporting-text-weight: inspection.get-theme-typography($theme, body-2, font-weight), ); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_tab-indicator.scss b/src/material/core/tokens/m2/mdc/_tab-indicator.scss index 1b8d0776497e..4b8da2742b40 100644 --- a/src/material/core/tokens/m2/mdc/_tab-indicator.scss +++ b/src/material/core/tokens/m2/mdc/_tab-indicator.scss @@ -1,5 +1,4 @@ -@use 'sass:map'; -@use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; @use '../../token-utils'; @@ -21,21 +20,19 @@ $prefix: (mdc, tab-indicator); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { - $primary: map.get($config, primary); - +@function get-color-tokens($theme, $palette-name: primary) { @return ( - active-indicator-color: theming.get-color-from-palette($primary, default), + active-indicator-color: inspection.get-theme-color($theme, $palette-name, default), ); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { +@function get-density-tokens($theme) { @return (); } diff --git a/src/material/core/tokens/m2/mdc/_tab.scss b/src/material/core/tokens/m2/mdc/_tab.scss index 3869ef97da2a..e95c7e670280 100644 --- a/src/material/core/tokens/m2/mdc/_tab.scss +++ b/src/material/core/tokens/m2/mdc/_tab.scss @@ -1,5 +1,6 @@ @use 'sass:map'; @use '../../../theming/theming'; +@use '../../../theming/inspection'; @use '../../../style/sass-utils'; @use '../../token-utils'; @@ -50,18 +51,18 @@ $prefix: (mdc, tab); } // Tokens that can be configured through Angular Material's color theming API. -@function get-color-tokens($config) { +@function get-color-tokens($theme, $palette-name: primary) { @return (); } // Tokens that can be configured through Angular Material's typography theming API. -@function get-typography-tokens($config) { +@function get-typography-tokens($theme) { @return (); } // Tokens that can be configured through Angular Material's density theming API. -@function get-density-tokens($config) { - $scale: theming.clamp-density($config, -4); +@function get-density-tokens($theme) { + $scale: theming.clamp-density(inspection.get-theme-density($theme), -4); @return ( container-height: map.get(( diff --git a/src/material/core/tokens/tests/test-validate-tokens.scss b/src/material/core/tokens/tests/test-validate-tokens.scss index 32e85bbaaa4d..15213bbd8426 100644 --- a/src/material/core/tokens/tests/test-validate-tokens.scss +++ b/src/material/core/tokens/tests/test-validate-tokens.scss @@ -104,7 +104,7 @@ @include validate-slots( $component: 'm2.mdc.switch', $slots: tokens-mdc-switch.get-token-slots(), - $reference: mdc-switch-theme.$light-theme, + $reference: mdc-switch-theme.$light-theme ); @include validate-slots( $component: 'm2.mdc.tab-indicator', @@ -156,3 +156,8 @@ $slots: tokens-mdc-outlined-text-field.get-token-slots(), $reference: mdc-outlined-text-field-theme.$light-theme ); +@include validate-slots( + $component: 'm2.mdc.button-filled', + $slots: tokens-mdc-extended-fab.get-token-slots(), + $reference: mdc-extended-fab-theme.$extended-light-theme +); diff --git a/src/material/core/typography/_typography-deprecated.scss b/src/material/core/typography/_typography-deprecated.scss deleted file mode 100644 index cee0ba282892..000000000000 --- a/src/material/core/typography/_typography-deprecated.scss +++ /dev/null @@ -1,39 +0,0 @@ -@use 'typography'; - -// @deprecated Use `define-typography-level`. -@function level( - $font-size, - $line-height: $font-size, - $font-weight: 400, - $font-family: null, - $letter-spacing: normal) { - @return typography.define-typography-level($font-size, $line-height, $font-weight, $font-family, - $letter-spacing); -} - -// @deprecated Use `typography-hierarchy`. -@mixin base-typography($config-or-theme, $selector: '.mat-typography') { - @include typography.legacy-typography-hierarchy($config-or-theme, $selector); -} - -// @deprecated Use `define-typography-config`. -@function config( - $font-family: 'Roboto, "Helvetica Neue", sans-serif', - $display-4: typography.define-typography-level(112px, 112px, 300, $letter-spacing: -0.05em), - $display-3: typography.define-typography-level(56px, 56px, 400, $letter-spacing: -0.02em), - $display-2: typography.define-typography-level(45px, 48px, 400, $letter-spacing: -0.005em), - $display-1: typography.define-typography-level(34px, 40px, 400), - $headline: typography.define-typography-level(24px, 32px, 400), - $title: typography.define-typography-level(20px, 32px, 500), - $subheading-2: typography.define-typography-level(16px, 28px, 400), - $subheading-1: typography.define-typography-level(15px, 24px, 400), - $body-2: typography.define-typography-level(14px, 24px, 500), - $body-1: typography.define-typography-level(14px, 20px, 400), - $caption: typography.define-typography-level(12px, 20px, 400), - $button: typography.define-typography-level(14px, 14px, 500), - $input: typography.define-typography-level(inherit, 1.125, 400) -) { - @return typography.define-legacy-typography-config($font-family, $display-4, $display-3, - $display-2, $display-1, $headline, $title, $subheading-2, $subheading-1, $body-2, - $body-1, $caption, $button, $input); -} diff --git a/src/material/core/typography/_typography.scss b/src/material/core/typography/_typography.scss index a70bab381d03..93ba526a72cd 100644 --- a/src/material/core/typography/_typography.scss +++ b/src/material/core/typography/_typography.scss @@ -1,5 +1,4 @@ @use 'typography-utils'; -@use '../theming/theming'; @use '../theming/inspection'; @use './versioning'; @@ -145,145 +144,3 @@ margin: 0 0 64px; } } - -/// Emits baseline typographic styles based on a given config. -/// @param {Map} $config-or-theme A typography config for an entire theme. -/// @param {String} $selector Ancestor selector under which native elements, such as h1, will -/// be styled. -/// @deprecated Use `mat.typography-hierarchy` instead. See https://material.angular.io/guide/mdc-migration for information about migrating. -/// @breaking-change 17.0.0 -@mixin legacy-typography-hierarchy($config-or-theme, $selector: '.mat-typography') { - $config: versioning.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); - - // Note that it seems redundant to prefix the class rules with the `$selector`, however it's - // necessary if we want to allow people to overwrite the tag selectors. This is due to - // selectors like `#{$selector} h1` being more specific than ones like `.mat-title`. - .mat-h1, - .mat-headline, - #{$selector} .mat-h1, - #{$selector} .mat-headline, - #{$selector} h1 { - font: inspection.get-theme-typography($theme, headline, font); - letter-spacing: inspection.get-theme-typography($theme, headline, letter-spacing); - margin: 0 0 16px; - } - - .mat-h2, - .mat-title, - #{$selector} .mat-h2, - #{$selector} .mat-title, - #{$selector} h2 { - font: inspection.get-theme-typography($theme, title, font); - letter-spacing: inspection.get-theme-typography($theme, title, letter-spacing); - margin: 0 0 16px; - } - - .mat-h3, - .mat-subheading-2, - #{$selector} .mat-h3, - #{$selector} .mat-subheading-2, - #{$selector} h3 { - font: inspection.get-theme-typography($theme, subheading-2, font); - letter-spacing: inspection.get-theme-typography($theme, subheading-2, letter-spacing); - margin: 0 0 16px; - } - - .mat-h4, - .mat-subheading-1, - #{$selector} .mat-h4, - #{$selector} .mat-subheading-1, - #{$selector} h4 { - font: inspection.get-theme-typography($theme, subheading-1, font); - letter-spacing: inspection.get-theme-typography($theme, subheading-1, letter-spacing); - margin: 0 0 16px; - } - - // Note: the spec doesn't have anything that would correspond to h5 and h6, but we add these for - // consistency. The font sizes come from the Chrome user agent styles which have h5 at 0.83em - // and h6 at 0.67em. - .mat-h5, - #{$selector} .mat-h5, - #{$selector} h5 { - @include typography-utils.font-shorthand( - // calc is used here to support css variables - calc(#{inspection.get-theme-typography($theme, body-1, font-size)} * 0.83), - inspection.get-theme-typography($theme, body-1, font-weight), - inspection.get-theme-typography($theme, body-1, line-height), - inspection.get-theme-typography($theme, body-1, font-family) - ); - - margin: 0 0 12px; - } - - .mat-h6, - #{$selector} .mat-h6, - #{$selector} h6 { - @include typography-utils.font-shorthand( - // calc is used here to support css variables - calc(#{inspection.get-theme-typography($theme, body-1, font-size)} * 0.67), - inspection.get-theme-typography($theme, body-1, font-weight), - inspection.get-theme-typography($theme, body-1, line-height), - inspection.get-theme-typography($theme, body-1, font-family) - ); - - margin: 0 0 12px; - } - - .mat-body-strong, - .mat-body-2, - #{$selector} .mat-body-strong, - #{$selector} .mat-body-2 { - font: inspection.get-theme-typography($theme, body-2, font); - letter-spacing: inspection.get-theme-typography($theme, body-2, letter-spacing); - } - - .mat-body, - .mat-body-1, - #{$selector} .mat-body, - #{$selector} .mat-body-1, - #{$selector} { - font: inspection.get-theme-typography($theme, body-1, font); - letter-spacing: inspection.get-theme-typography($theme, body-1, letter-spacing); - - p { - margin: 0 0 12px; - } - } - - .mat-small, - .mat-caption, - #{$selector} .mat-small, - #{$selector} .mat-caption { - font: inspection.get-theme-typography($theme, caption, font); - letter-spacing: inspection.get-theme-typography($theme, caption, letter-spacing); - } - - .mat-display-4, - #{$selector} .mat-display-4 { - font: inspection.get-theme-typography($theme, display-4, font); - letter-spacing: inspection.get-theme-typography($theme, display-4, letter-spacing); - margin: 0 0 56px; - } - - .mat-display-3, - #{$selector} .mat-display-3 { - font: inspection.get-theme-typography($theme, display-3, font); - letter-spacing: inspection.get-theme-typography($theme, display-3, letter-spacing); - margin: 0 0 64px; - } - - .mat-display-2, - #{$selector} .mat-display-2 { - font: inspection.get-theme-typography($theme, display-2, font); - letter-spacing: inspection.get-theme-typography($theme, display-2, letter-spacing); - margin: 0 0 64px; - } - - .mat-display-1, - #{$selector} .mat-display-1 { - font: inspection.get-theme-typography($theme, display-1, font); - letter-spacing: inspection.get-theme-typography($theme, display-1, letter-spacing); - margin: 0 0 64px; - } -} diff --git a/src/material/core/typography/_versioning.scss b/src/material/core/typography/_versioning.scss index 2b629fa6f998..b71750ae9e74 100644 --- a/src/material/core/typography/_versioning.scss +++ b/src/material/core/typography/_versioning.scss @@ -53,11 +53,16 @@ // produces a normalized typography config for the 2018 Material Design typography system. // 2014 - https://material.io/archive/guidelines/style/typography.html#typography-styles // 2018 - https://material.io/design/typography/the-type-system.html#type-scale -@function private-typography-to-2018-config($config) { +// +// The $force option is used to allow components to specify that they want to re-map the keys, even +// if the 2018 keys are already present. This allows those components to preserve the (incorrect) +// behavior they had previously, when they called `private-typography-to-2014-config`. Eventually we +// should clean this up, remove the $force option, and reconcile any screen diffs. +@function private-typography-to-2018-config($config, $force: false) { @if $config == null { @return null; } - @if not private-typography-is-2018-config($config) { + @if $force or not private-typography-is-2018-config($config) { @return ( headline-1: map.get($config, display-4), headline-2: map.get($config, display-3), diff --git a/src/material/datepicker/testing/BUILD.bazel b/src/material/datepicker/testing/BUILD.bazel index 36f6fd151ab5..9b3b5fd0f903 100644 --- a/src/material/datepicker/testing/BUILD.bazel +++ b/src/material/datepicker/testing/BUILD.bazel @@ -21,13 +21,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = [ - "calendar-harness-shared.spec.ts", - "date-range-input-harness-shared.spec.ts", - "datepicker-input-harness-shared.spec.ts", - "datepicker-toggle-harness-shared.spec.ts", - ], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -39,24 +34,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "date-range-input-harness-shared.spec.ts", - "datepicker-input-harness-shared.spec.ts", - "datepicker-toggle-harness-shared.spec.ts", - "calendar-harness-shared.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/datepicker", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/datepicker/testing/calendar-harness-shared.spec.ts b/src/material/datepicker/testing/calendar-harness-shared.spec.ts deleted file mode 100644 index 8e9b264f7ab1..000000000000 --- a/src/material/datepicker/testing/calendar-harness-shared.spec.ts +++ /dev/null @@ -1,355 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import { - MatDatepickerModule, - DateRange, - MAT_DATE_RANGE_SELECTION_STRATEGY, - DefaultMatCalendarRangeStrategy, -} from '@angular/material/datepicker'; -import {MatNativeDateModule} from '@angular/material/core'; -import {MatCalendarHarness, CalendarView} from './calendar-harness'; - -/** Date at which the calendars are set. */ -const calendarDate = new Date(2020, 7, 1); - -/** Shared tests to run on both the original and MDC-based calendars. */ -export function runCalendarHarnessTests( - datepickerModule: typeof MatDatepickerModule, - calendarHarness: typeof MatCalendarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [MatNativeDateModule, datepickerModule], - declarations: [CalendarHarnessTest], - providers: [ - { - // Usually it's the date range picker that provides the default range selection strategy, - // but since we're testing the calendar on its own, we have to provide it manually. - provide: MAT_DATE_RANGE_SELECTION_STRATEGY, - useClass: DefaultMatCalendarRangeStrategy, - }, - ], - }).compileComponents(); - - fixture = TestBed.createComponent(CalendarHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all calendar harnesses', async () => { - const calendars = await loader.getAllHarnesses(calendarHarness); - expect(calendars.length).toBe(2); - }); - - it('should go to a different view', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - expect(await calendar.getCurrentView()).toBe(CalendarView.MONTH); - - await calendar.changeView(); - expect(await calendar.getCurrentView()).toBe(CalendarView.MULTI_YEAR); - }); - - it('should get the current view label', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); - - await calendar.changeView(); - expect(await calendar.getCurrentViewLabel()).toBe('2016 – 2039'); - }); - - it('should go to the next page in the view', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); - - await calendar.next(); - expect(await calendar.getCurrentViewLabel()).toBe('SEP 2020'); - }); - - it('should go to the previous page in the view', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); - - await calendar.previous(); - expect(await calendar.getCurrentViewLabel()).toBe('JUL 2020'); - }); - - it('should get all of the date cells inside the calendar', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - expect((await calendar.getCells()).length).toBe(31); - }); - - it('should get the text of a calendar cell', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells(); - - expect(await cells[0].getText()).toBe('1'); - expect(await cells[15].getText()).toBe('16'); - expect(await cells[30].getText()).toBe('31'); - }); - - it('should be able to select a specific cell through the calendar', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const targetCell = (await calendar.getCells({text: '16'}))[0]; - expect(await targetCell.isSelected()).toBe(false); - - await calendar.selectCell({text: '16'}); - expect(await targetCell.isSelected()).toBe(true); - }); - - it('should get the aria-label of a cell', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells(); - - expect(await cells[0].getAriaLabel()).toBe('August 1, 2020'); - expect(await cells[15].getAriaLabel()).toBe('August 16, 2020'); - expect(await cells[30].getAriaLabel()).toBe('August 31, 2020'); - }); - - it('should get the disabled state of a cell', async () => { - fixture.componentInstance.minDate = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 20, - ); - - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells(); - - expect(await cells[0].isDisabled()).toBe(true); - expect(await cells[15].isDisabled()).toBe(true); - expect(await cells[30].isDisabled()).toBe(false); - }); - - it('should select a cell', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cell = (await calendar.getCells())[10]; - expect(await cell.isSelected()).toBe(false); - - await cell.select(); - expect(await cell.isSelected()).toBe(true); - }); - - it('should get whether a cell is active', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells(); - - expect(await cells[0].isActive()).toBe(true); - expect(await cells[15].isActive()).toBe(false); - }); - - it('should get the state of the cell within the main range', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#range'})); - const allCells = await calendar.getCells(); - const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ - parallel(() => allCells.map(cell => cell.isRangeStart())), - parallel(() => allCells.map(cell => cell.isInRange())), - parallel(() => allCells.map(cell => cell.isRangeEnd())), - ]); - - expect(initialStartStates.every(state => state === false)).toBe(true); - expect(initialInRangeStates.every(state => state === false)).toBe(true); - expect(initialEndStates.every(state => state === false)).toBe(true); - - await (await calendar.getCells({text: '5'}))[0].select(); - await (await calendar.getCells({text: '8'}))[0].select(); - - expect(await allCells[4].isRangeStart()).toBe(true); - expect(await allCells[4].isInRange()).toBe(true); - expect(await allCells[4].isRangeEnd()).toBe(false); - - expect(await allCells[5].isRangeStart()).toBe(false); - expect(await allCells[5].isInRange()).toBe(true); - expect(await allCells[5].isRangeEnd()).toBe(false); - - expect(await allCells[6].isRangeStart()).toBe(false); - expect(await allCells[6].isInRange()).toBe(true); - expect(await allCells[6].isRangeEnd()).toBe(false); - - expect(await allCells[7].isRangeStart()).toBe(false); - expect(await allCells[7].isInRange()).toBe(true); - expect(await allCells[7].isRangeEnd()).toBe(true); - }); - - it('should get the state of the cell within the comparison range', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#range'})); - const allCells = await calendar.getCells(); - const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ - parallel(() => allCells.map(cell => cell.isComparisonRangeStart())), - parallel(() => allCells.map(cell => cell.isInComparisonRange())), - parallel(() => allCells.map(cell => cell.isComparisonRangeEnd())), - ]); - - expect(initialStartStates.every(state => state === false)).toBe(true); - expect(initialInRangeStates.every(state => state === false)).toBe(true); - expect(initialEndStates.every(state => state === false)).toBe(true); - - fixture.componentInstance.comparisonStart = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 5, - ); - fixture.componentInstance.comparisonEnd = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 8, - ); - - expect(await allCells[4].isComparisonRangeStart()).toBe(true); - expect(await allCells[4].isInComparisonRange()).toBe(true); - expect(await allCells[4].isComparisonRangeEnd()).toBe(false); - - expect(await allCells[5].isComparisonRangeStart()).toBe(false); - expect(await allCells[5].isInComparisonRange()).toBe(true); - expect(await allCells[5].isComparisonRangeEnd()).toBe(false); - - expect(await allCells[6].isComparisonRangeStart()).toBe(false); - expect(await allCells[6].isInComparisonRange()).toBe(true); - expect(await allCells[6].isComparisonRangeEnd()).toBe(false); - - expect(await allCells[7].isComparisonRangeStart()).toBe(false); - expect(await allCells[7].isInComparisonRange()).toBe(true); - expect(await allCells[7].isComparisonRangeEnd()).toBe(true); - }); - - it('should get the state of the cell within the preview range', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#range'})); - const allCells = await calendar.getCells(); - const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ - parallel(() => allCells.map(cell => cell.isPreviewRangeStart())), - parallel(() => allCells.map(cell => cell.isInPreviewRange())), - parallel(() => allCells.map(cell => cell.isPreviewRangeEnd())), - ]); - - expect(initialStartStates.every(state => state === false)).toBe(true); - expect(initialInRangeStates.every(state => state === false)).toBe(true); - expect(initialEndStates.every(state => state === false)).toBe(true); - - await (await calendar.getCells({text: '5'}))[0].select(); - await (await calendar.getCells({text: '8'}))[0].hover(); - - expect(await allCells[4].isPreviewRangeStart()).toBe(true); - expect(await allCells[4].isInPreviewRange()).toBe(true); - expect(await allCells[4].isPreviewRangeEnd()).toBe(false); - - expect(await allCells[5].isPreviewRangeStart()).toBe(false); - expect(await allCells[5].isInPreviewRange()).toBe(true); - expect(await allCells[5].isPreviewRangeEnd()).toBe(false); - - expect(await allCells[6].isPreviewRangeStart()).toBe(false); - expect(await allCells[6].isInPreviewRange()).toBe(true); - expect(await allCells[6].isPreviewRangeEnd()).toBe(false); - - expect(await allCells[7].isPreviewRangeStart()).toBe(false); - expect(await allCells[7].isInPreviewRange()).toBe(true); - expect(await allCells[7].isPreviewRangeEnd()).toBe(true); - }); - - it('should filter cells by their text', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells({text: /^3/}); - expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['3', '30', '31']); - }); - - it('should filter cells by their selected state', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const allCells = await calendar.getCells(); - - await allCells[0].select(); - - const selectedCells = await calendar.getCells({selected: true}); - expect(await parallel(() => selectedCells.map(cell => cell.getText()))).toEqual(['1']); - }); - - it('should filter cells by their active state', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells({active: true}); - expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['1']); - }); - - it('should filter cells by their disabled state', async () => { - fixture.componentInstance.minDate = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 3, - ); - - const calendar = await loader.getHarness(calendarHarness.with({selector: '#single'})); - const cells = await calendar.getCells({disabled: true}); - expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['1', '2']); - }); - - it('should filter cells based on whether they are inside the comparison range', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#range'})); - - fixture.componentInstance.comparisonStart = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 5, - ); - fixture.componentInstance.comparisonEnd = new Date( - calendarDate.getFullYear(), - calendarDate.getMonth(), - 8, - ); - - const cells = await calendar.getCells({inComparisonRange: true}); - expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['5', '6', '7', '8']); - }); - - it('should filter cells based on whether they are inside the preview range', async () => { - const calendar = await loader.getHarness(calendarHarness.with({selector: '#range'})); - - await (await calendar.getCells({text: '5'}))[0].select(); - await (await calendar.getCells({text: '8'}))[0].hover(); - - const cells = await calendar.getCells({inPreviewRange: true}); - expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['5', '6', '7', '8']); - }); -} - -@Component({ - template: ` - - - - `, -}) -class CalendarHarnessTest { - // Start the datepickers off at a specific date so tests - // run consistently no matter what the current date is. - readonly startAt = new Date(calendarDate); - minDate: Date | null; - singleValue: Date | null = null; - rangeValue = new DateRange(null, null); - comparisonStart: Date | null = null; - comparisonEnd: Date | null = null; - - rangeChanged(selectedDate: Date) { - let {start, end} = this.rangeValue; - - if (start == null || end != null) { - start = selectedDate; - } else if (end == null) { - end = selectedDate; - } - - this.rangeValue = new DateRange(start, end); - } -} diff --git a/src/material/datepicker/testing/calendar-harness.spec.ts b/src/material/datepicker/testing/calendar-harness.spec.ts index 84190b48db32..6609c9d89524 100644 --- a/src/material/datepicker/testing/calendar-harness.spec.ts +++ b/src/material/datepicker/testing/calendar-harness.spec.ts @@ -1,7 +1,351 @@ -import {MatDatepickerModule} from '@angular/material/datepicker'; -import {runCalendarHarnessTests} from './calendar-harness-shared.spec'; -import {MatCalendarHarness} from './calendar-harness'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import { + MatDatepickerModule, + DateRange, + MAT_DATE_RANGE_SELECTION_STRATEGY, + DefaultMatCalendarRangeStrategy, +} from '@angular/material/datepicker'; +import {MatNativeDateModule} from '@angular/material/core'; +import {MatCalendarHarness, CalendarView} from './calendar-harness'; -describe('Non-MDC-based calendar harness', () => { - runCalendarHarnessTests(MatDatepickerModule, MatCalendarHarness); +/** Date at which the calendars are set. */ +const calendarDate = new Date(2020, 7, 1); + +describe('MatCalendarHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatNativeDateModule, MatDatepickerModule], + declarations: [CalendarHarnessTest], + providers: [ + { + // Usually it's the date range picker that provides the default range selection strategy, + // but since we're testing the calendar on its own, we have to provide it manually. + provide: MAT_DATE_RANGE_SELECTION_STRATEGY, + useClass: DefaultMatCalendarRangeStrategy, + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(CalendarHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all calendar harnesses', async () => { + const calendars = await loader.getAllHarnesses(MatCalendarHarness); + expect(calendars.length).toBe(2); + }); + + it('should go to a different view', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + expect(await calendar.getCurrentView()).toBe(CalendarView.MONTH); + + await calendar.changeView(); + expect(await calendar.getCurrentView()).toBe(CalendarView.MULTI_YEAR); + }); + + it('should get the current view label', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); + + await calendar.changeView(); + expect(await calendar.getCurrentViewLabel()).toBe('2016 – 2039'); + }); + + it('should go to the next page in the view', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); + + await calendar.next(); + expect(await calendar.getCurrentViewLabel()).toBe('SEP 2020'); + }); + + it('should go to the previous page in the view', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + expect(await calendar.getCurrentViewLabel()).toBe('AUG 2020'); + + await calendar.previous(); + expect(await calendar.getCurrentViewLabel()).toBe('JUL 2020'); + }); + + it('should get all of the date cells inside the calendar', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + expect((await calendar.getCells()).length).toBe(31); + }); + + it('should get the text of a calendar cell', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells(); + + expect(await cells[0].getText()).toBe('1'); + expect(await cells[15].getText()).toBe('16'); + expect(await cells[30].getText()).toBe('31'); + }); + + it('should be able to select a specific cell through the calendar', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const targetCell = (await calendar.getCells({text: '16'}))[0]; + expect(await targetCell.isSelected()).toBe(false); + + await calendar.selectCell({text: '16'}); + expect(await targetCell.isSelected()).toBe(true); + }); + + it('should get the aria-label of a cell', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells(); + + expect(await cells[0].getAriaLabel()).toBe('August 1, 2020'); + expect(await cells[15].getAriaLabel()).toBe('August 16, 2020'); + expect(await cells[30].getAriaLabel()).toBe('August 31, 2020'); + }); + + it('should get the disabled state of a cell', async () => { + fixture.componentInstance.minDate = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 20, + ); + + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells(); + + expect(await cells[0].isDisabled()).toBe(true); + expect(await cells[15].isDisabled()).toBe(true); + expect(await cells[30].isDisabled()).toBe(false); + }); + + it('should select a cell', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cell = (await calendar.getCells())[10]; + expect(await cell.isSelected()).toBe(false); + + await cell.select(); + expect(await cell.isSelected()).toBe(true); + }); + + it('should get whether a cell is active', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells(); + + expect(await cells[0].isActive()).toBe(true); + expect(await cells[15].isActive()).toBe(false); + }); + + it('should get the state of the cell within the main range', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#range'})); + const allCells = await calendar.getCells(); + const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ + parallel(() => allCells.map(cell => cell.isRangeStart())), + parallel(() => allCells.map(cell => cell.isInRange())), + parallel(() => allCells.map(cell => cell.isRangeEnd())), + ]); + + expect(initialStartStates.every(state => state === false)).toBe(true); + expect(initialInRangeStates.every(state => state === false)).toBe(true); + expect(initialEndStates.every(state => state === false)).toBe(true); + + await (await calendar.getCells({text: '5'}))[0].select(); + await (await calendar.getCells({text: '8'}))[0].select(); + + expect(await allCells[4].isRangeStart()).toBe(true); + expect(await allCells[4].isInRange()).toBe(true); + expect(await allCells[4].isRangeEnd()).toBe(false); + + expect(await allCells[5].isRangeStart()).toBe(false); + expect(await allCells[5].isInRange()).toBe(true); + expect(await allCells[5].isRangeEnd()).toBe(false); + + expect(await allCells[6].isRangeStart()).toBe(false); + expect(await allCells[6].isInRange()).toBe(true); + expect(await allCells[6].isRangeEnd()).toBe(false); + + expect(await allCells[7].isRangeStart()).toBe(false); + expect(await allCells[7].isInRange()).toBe(true); + expect(await allCells[7].isRangeEnd()).toBe(true); + }); + + it('should get the state of the cell within the comparison range', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#range'})); + const allCells = await calendar.getCells(); + const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ + parallel(() => allCells.map(cell => cell.isComparisonRangeStart())), + parallel(() => allCells.map(cell => cell.isInComparisonRange())), + parallel(() => allCells.map(cell => cell.isComparisonRangeEnd())), + ]); + + expect(initialStartStates.every(state => state === false)).toBe(true); + expect(initialInRangeStates.every(state => state === false)).toBe(true); + expect(initialEndStates.every(state => state === false)).toBe(true); + + fixture.componentInstance.comparisonStart = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 5, + ); + fixture.componentInstance.comparisonEnd = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 8, + ); + + expect(await allCells[4].isComparisonRangeStart()).toBe(true); + expect(await allCells[4].isInComparisonRange()).toBe(true); + expect(await allCells[4].isComparisonRangeEnd()).toBe(false); + + expect(await allCells[5].isComparisonRangeStart()).toBe(false); + expect(await allCells[5].isInComparisonRange()).toBe(true); + expect(await allCells[5].isComparisonRangeEnd()).toBe(false); + + expect(await allCells[6].isComparisonRangeStart()).toBe(false); + expect(await allCells[6].isInComparisonRange()).toBe(true); + expect(await allCells[6].isComparisonRangeEnd()).toBe(false); + + expect(await allCells[7].isComparisonRangeStart()).toBe(false); + expect(await allCells[7].isInComparisonRange()).toBe(true); + expect(await allCells[7].isComparisonRangeEnd()).toBe(true); + }); + + it('should get the state of the cell within the preview range', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#range'})); + const allCells = await calendar.getCells(); + const [initialStartStates, initialInRangeStates, initialEndStates] = await parallel(() => [ + parallel(() => allCells.map(cell => cell.isPreviewRangeStart())), + parallel(() => allCells.map(cell => cell.isInPreviewRange())), + parallel(() => allCells.map(cell => cell.isPreviewRangeEnd())), + ]); + + expect(initialStartStates.every(state => state === false)).toBe(true); + expect(initialInRangeStates.every(state => state === false)).toBe(true); + expect(initialEndStates.every(state => state === false)).toBe(true); + + await (await calendar.getCells({text: '5'}))[0].select(); + await (await calendar.getCells({text: '8'}))[0].hover(); + + expect(await allCells[4].isPreviewRangeStart()).toBe(true); + expect(await allCells[4].isInPreviewRange()).toBe(true); + expect(await allCells[4].isPreviewRangeEnd()).toBe(false); + + expect(await allCells[5].isPreviewRangeStart()).toBe(false); + expect(await allCells[5].isInPreviewRange()).toBe(true); + expect(await allCells[5].isPreviewRangeEnd()).toBe(false); + + expect(await allCells[6].isPreviewRangeStart()).toBe(false); + expect(await allCells[6].isInPreviewRange()).toBe(true); + expect(await allCells[6].isPreviewRangeEnd()).toBe(false); + + expect(await allCells[7].isPreviewRangeStart()).toBe(false); + expect(await allCells[7].isInPreviewRange()).toBe(true); + expect(await allCells[7].isPreviewRangeEnd()).toBe(true); + }); + + it('should filter cells by their text', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells({text: /^3/}); + expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['3', '30', '31']); + }); + + it('should filter cells by their selected state', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const allCells = await calendar.getCells(); + + await allCells[0].select(); + + const selectedCells = await calendar.getCells({selected: true}); + expect(await parallel(() => selectedCells.map(cell => cell.getText()))).toEqual(['1']); + }); + + it('should filter cells by their active state', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells({active: true}); + expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['1']); + }); + + it('should filter cells by their disabled state', async () => { + fixture.componentInstance.minDate = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 3, + ); + + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#single'})); + const cells = await calendar.getCells({disabled: true}); + expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['1', '2']); + }); + + it('should filter cells based on whether they are inside the comparison range', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#range'})); + + fixture.componentInstance.comparisonStart = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 5, + ); + fixture.componentInstance.comparisonEnd = new Date( + calendarDate.getFullYear(), + calendarDate.getMonth(), + 8, + ); + + const cells = await calendar.getCells({inComparisonRange: true}); + expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['5', '6', '7', '8']); + }); + + it('should filter cells based on whether they are inside the preview range', async () => { + const calendar = await loader.getHarness(MatCalendarHarness.with({selector: '#range'})); + + await (await calendar.getCells({text: '5'}))[0].select(); + await (await calendar.getCells({text: '8'}))[0].hover(); + + const cells = await calendar.getCells({inPreviewRange: true}); + expect(await parallel(() => cells.map(cell => cell.getText()))).toEqual(['5', '6', '7', '8']); + }); }); + +@Component({ + template: ` + + + + `, +}) +class CalendarHarnessTest { + // Start the datepickers off at a specific date so tests + // run consistently no matter what the current date is. + readonly startAt = new Date(calendarDate); + minDate: Date | null; + singleValue: Date | null = null; + rangeValue = new DateRange(null, null); + comparisonStart: Date | null = null; + comparisonEnd: Date | null = null; + + rangeChanged(selectedDate: Date) { + let {start, end} = this.rangeValue; + + if (start == null || end != null) { + start = selectedDate; + } else if (end == null) { + end = selectedDate; + } + + this.rangeValue = new DateRange(start, end); + } +} diff --git a/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts b/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts deleted file mode 100644 index 68f97a012ffc..000000000000 --- a/src/material/datepicker/testing/date-range-input-harness-shared.spec.ts +++ /dev/null @@ -1,272 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {MatNativeDateModule} from '@angular/material/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormsModule} from '@angular/forms'; -import {MatDatepickerModule} from '@angular/material/datepicker'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatCalendarHarness} from './calendar-harness'; -import { - MatDateRangeInputHarness, - MatStartDateHarness, - MatEndDateHarness, -} from './date-range-input-harness'; - -/** Shared tests to run on both the original and MDC-based date range inputs. */ -export function runDateRangeInputHarnessTests( - datepickerModule: typeof MatDatepickerModule, - dateRangeInputHarness: typeof MatDateRangeInputHarness, - startInputHarness: typeof MatStartDateHarness, - endInputHarness: typeof MatEndDateHarness, - calendarHarness: typeof MatCalendarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, MatNativeDateModule, datepickerModule, FormsModule], - declarations: [DateRangeInputHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(DateRangeInputHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all date range input harnesses', async () => { - const inputs = await loader.getAllHarnesses(dateRangeInputHarness); - expect(inputs.length).toBe(2); - }); - - it('should get whether the input is disabled', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - expect(await input.isDisabled()).toBe(false); - - fixture.componentInstance.disabled = true; - expect(await input.isDisabled()).toBe(true); - }); - - it('should get whether the input is required', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - expect(await input.isRequired()).toBe(false); - - fixture.componentInstance.required = true; - expect(await input.isRequired()).toBe(true); - }); - - it('should get the input separator', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - expect(await input.getSeparator()).toBe('–'); - }); - - it('should get the combined input value including the separator', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - - fixture.componentInstance.startDate = new Date(2020, 0, 1, 12, 0, 0); - fixture.componentInstance.endDate = new Date(2020, 1, 2, 12, 0, 0); - - expect(await input.getValue()).toBe('1/1/2020 – 2/2/2020'); - }); - - it('should get harnesses for the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - expect(start).toBeInstanceOf(startInputHarness); - expect(end).toBeInstanceOf(endInputHarness); - }); - - it('should be able to open and close a calendar in popup mode', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - expect(await input.isCalendarOpen()).toBe(false); - - await input.openCalendar(); - expect(await input.isCalendarOpen()).toBe(true); - - await input.closeCalendar(); - expect(await input.isCalendarOpen()).toBe(false); - }); - - it('should be able to open and close a calendar in touch mode', async () => { - fixture.componentInstance.touchUi = true; - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - expect(await input.isCalendarOpen()).toBe(false); - - await input.openCalendar(); - expect(await input.isCalendarOpen()).toBe(true); - - await input.closeCalendar(); - expect(await input.isCalendarOpen()).toBe(false); - }); - - it('should be able to get the harness for the associated calendar', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - await input.openCalendar(); - expect(await input.getCalendar()).toBeInstanceOf(calendarHarness); - }); - - it('should get whether the inner inputs are disabled', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.isDisabled(), end.isDisabled()])).toEqual([false, false]); - - fixture.componentInstance.subInputsDisabled = true; - expect(await parallel(() => [start.isDisabled(), end.isDisabled()])).toEqual([true, true]); - }); - - it('should get whether the inner inputs are required', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.isRequired(), end.isRequired()])).toEqual([false, false]); - - fixture.componentInstance.subInputsRequired = true; - expect(await parallel(() => [start.isRequired(), end.isRequired()])).toEqual([true, true]); - }); - - it('should get the values of the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - fixture.componentInstance.startDate = new Date(2020, 0, 1, 12, 0, 0); - fixture.componentInstance.endDate = new Date(2020, 1, 2, 12, 0, 0); - - expect( - await parallel(() => { - return [start.getValue(), end.getValue()]; - }), - ).toEqual(['1/1/2020', '2/2/2020']); - }); - - it('should set the values of the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.getValue(), end.getValue()])).toEqual(['', '']); - - await parallel(() => [start.setValue('1/1/2020'), end.setValue('2/2/2020')]); - - expect( - await parallel(() => { - return [start.getValue(), end.getValue()]; - }), - ).toEqual(['1/1/2020', '2/2/2020']); - }); - - it('should get the placeholders of the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.getPlaceholder(), end.getPlaceholder()])).toEqual([ - 'Start date', - 'End date', - ]); - }); - - it('should be able to change the inner input focused state', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await start.isFocused()).toBe(false); - await start.focus(); - expect(await start.isFocused()).toBe(true); - await start.blur(); - expect(await start.isFocused()).toBe(false); - - expect(await end.isFocused()).toBe(false); - await end.focus(); - expect(await end.isFocused()).toBe(true); - await end.blur(); - expect(await end.isFocused()).toBe(false); - }); - - it('should get the minimum date of the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.getMin(), end.getMin()])).toEqual([null, null]); - - fixture.componentInstance.minDate = new Date(2020, 0, 1, 12, 0, 0); - expect( - await parallel(() => { - return [start.getMin(), end.getMin()]; - }), - ).toEqual(['2020-01-01', '2020-01-01']); - }); - - it('should get the maximum date of the inner inputs', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(await parallel(() => [start.getMax(), end.getMax()])).toEqual([null, null]); - - fixture.componentInstance.maxDate = new Date(2020, 0, 1, 12, 0, 0); - - expect( - await parallel(() => { - return [start.getMax(), end.getMax()]; - }), - ).toEqual(['2020-01-01', '2020-01-01']); - }); - - it('should dispatch the dateChange event when the inner input values have changed', async () => { - const input = await loader.getHarness(dateRangeInputHarness.with({selector: '[basic]'})); - const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); - - expect(fixture.componentInstance.startDateChangeCount).toBe(0); - expect(fixture.componentInstance.endDateChangeCount).toBe(0); - - await parallel(() => [start.setValue('1/1/2020'), end.setValue('2/2/2020')]); - - expect(fixture.componentInstance.startDateChangeCount).toBe(1); - expect(fixture.componentInstance.endDateChangeCount).toBe(1); - }); -} - -@Component({ - template: ` - - - - - - - - - - - `, -}) -class DateRangeInputHarnessTest { - startDate: Date | null = null; - endDate: Date | null = null; - minDate: Date | null = null; - maxDate: Date | null = null; - touchUi = false; - disabled = false; - required = false; - subInputsDisabled = false; - subInputsRequired = false; - startDateChangeCount = 0; - endDateChangeCount = 0; -} diff --git a/src/material/datepicker/testing/date-range-input-harness.spec.ts b/src/material/datepicker/testing/date-range-input-harness.spec.ts index a78d3994e6fa..544a73980232 100644 --- a/src/material/datepicker/testing/date-range-input-harness.spec.ts +++ b/src/material/datepicker/testing/date-range-input-harness.spec.ts @@ -1,18 +1,265 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatNativeDateModule} from '@angular/material/core'; +import {FormsModule} from '@angular/forms'; import {MatDatepickerModule} from '@angular/material/datepicker'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {MatCalendarHarness} from './calendar-harness'; import { MatDateRangeInputHarness, MatStartDateHarness, MatEndDateHarness, } from './date-range-input-harness'; -import {runDateRangeInputHarnessTests} from './date-range-input-harness-shared.spec'; -import {MatCalendarHarness} from './calendar-harness'; -describe('Non-MDC-based date range input harness', () => { - runDateRangeInputHarnessTests( - MatDatepickerModule, - MatDateRangeInputHarness, - MatStartDateHarness, - MatEndDateHarness, - MatCalendarHarness, - ); +describe('matDateRangeInputHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatNativeDateModule, MatDatepickerModule, FormsModule], + declarations: [DateRangeInputHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DateRangeInputHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all date range input harnesses', async () => { + const inputs = await loader.getAllHarnesses(MatDateRangeInputHarness); + expect(inputs.length).toBe(2); + }); + + it('should get whether the input is disabled', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + expect(await input.isDisabled()).toBe(false); + + fixture.componentInstance.disabled = true; + expect(await input.isDisabled()).toBe(true); + }); + + it('should get whether the input is required', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + expect(await input.isRequired()).toBe(false); + + fixture.componentInstance.required = true; + expect(await input.isRequired()).toBe(true); + }); + + it('should get the input separator', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + expect(await input.getSeparator()).toBe('–'); + }); + + it('should get the combined input value including the separator', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + + fixture.componentInstance.startDate = new Date(2020, 0, 1, 12, 0, 0); + fixture.componentInstance.endDate = new Date(2020, 1, 2, 12, 0, 0); + + expect(await input.getValue()).toBe('1/1/2020 – 2/2/2020'); + }); + + it('should get harnesses for the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + expect(start).toBeInstanceOf(MatStartDateHarness); + expect(end).toBeInstanceOf(MatEndDateHarness); + }); + + it('should be able to open and close a calendar in popup mode', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + expect(await input.isCalendarOpen()).toBe(false); + + await input.openCalendar(); + expect(await input.isCalendarOpen()).toBe(true); + + await input.closeCalendar(); + expect(await input.isCalendarOpen()).toBe(false); + }); + + it('should be able to open and close a calendar in touch mode', async () => { + fixture.componentInstance.touchUi = true; + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + expect(await input.isCalendarOpen()).toBe(false); + + await input.openCalendar(); + expect(await input.isCalendarOpen()).toBe(true); + + await input.closeCalendar(); + expect(await input.isCalendarOpen()).toBe(false); + }); + + it('should be able to get the harness for the associated calendar', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + await input.openCalendar(); + expect(await input.getCalendar()).toBeInstanceOf(MatCalendarHarness); + }); + + it('should get whether the inner inputs are disabled', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.isDisabled(), end.isDisabled()])).toEqual([false, false]); + + fixture.componentInstance.subInputsDisabled = true; + expect(await parallel(() => [start.isDisabled(), end.isDisabled()])).toEqual([true, true]); + }); + + it('should get whether the inner inputs are required', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.isRequired(), end.isRequired()])).toEqual([false, false]); + + fixture.componentInstance.subInputsRequired = true; + expect(await parallel(() => [start.isRequired(), end.isRequired()])).toEqual([true, true]); + }); + + it('should get the values of the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + fixture.componentInstance.startDate = new Date(2020, 0, 1, 12, 0, 0); + fixture.componentInstance.endDate = new Date(2020, 1, 2, 12, 0, 0); + + expect( + await parallel(() => { + return [start.getValue(), end.getValue()]; + }), + ).toEqual(['1/1/2020', '2/2/2020']); + }); + + it('should set the values of the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.getValue(), end.getValue()])).toEqual(['', '']); + + await parallel(() => [start.setValue('1/1/2020'), end.setValue('2/2/2020')]); + + expect( + await parallel(() => { + return [start.getValue(), end.getValue()]; + }), + ).toEqual(['1/1/2020', '2/2/2020']); + }); + + it('should get the placeholders of the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.getPlaceholder(), end.getPlaceholder()])).toEqual([ + 'Start date', + 'End date', + ]); + }); + + it('should be able to change the inner input focused state', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await start.isFocused()).toBe(false); + await start.focus(); + expect(await start.isFocused()).toBe(true); + await start.blur(); + expect(await start.isFocused()).toBe(false); + + expect(await end.isFocused()).toBe(false); + await end.focus(); + expect(await end.isFocused()).toBe(true); + await end.blur(); + expect(await end.isFocused()).toBe(false); + }); + + it('should get the minimum date of the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.getMin(), end.getMin()])).toEqual([null, null]); + + fixture.componentInstance.minDate = new Date(2020, 0, 1, 12, 0, 0); + expect( + await parallel(() => { + return [start.getMin(), end.getMin()]; + }), + ).toEqual(['2020-01-01', '2020-01-01']); + }); + + it('should get the maximum date of the inner inputs', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(await parallel(() => [start.getMax(), end.getMax()])).toEqual([null, null]); + + fixture.componentInstance.maxDate = new Date(2020, 0, 1, 12, 0, 0); + + expect( + await parallel(() => { + return [start.getMax(), end.getMax()]; + }), + ).toEqual(['2020-01-01', '2020-01-01']); + }); + + it('should dispatch the dateChange event when the inner input values have changed', async () => { + const input = await loader.getHarness(MatDateRangeInputHarness.with({selector: '[basic]'})); + const [start, end] = await parallel(() => [input.getStartInput(), input.getEndInput()]); + + expect(fixture.componentInstance.startDateChangeCount).toBe(0); + expect(fixture.componentInstance.endDateChangeCount).toBe(0); + + await parallel(() => [start.setValue('1/1/2020'), end.setValue('2/2/2020')]); + + expect(fixture.componentInstance.startDateChangeCount).toBe(1); + expect(fixture.componentInstance.endDateChangeCount).toBe(1); + }); }); + +@Component({ + template: ` + + + + + + + + + + + `, +}) +class DateRangeInputHarnessTest { + startDate: Date | null = null; + endDate: Date | null = null; + minDate: Date | null = null; + maxDate: Date | null = null; + touchUi = false; + disabled = false; + required = false; + subInputsDisabled = false; + subInputsRequired = false; + startDateChangeCount = 0; + endDateChangeCount = 0; +} diff --git a/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts b/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts deleted file mode 100644 index 0513cb32cb34..000000000000 --- a/src/material/datepicker/testing/datepicker-input-harness-shared.spec.ts +++ /dev/null @@ -1,211 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {DateAdapter, MatNativeDateModule} from '@angular/material/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormsModule} from '@angular/forms'; -import {MatDatepickerModule} from '@angular/material/datepicker'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatDatepickerInputHarness} from './datepicker-input-harness'; -import {MatCalendarHarness} from './calendar-harness'; - -/** Shared tests to run on both the original and MDC-based datepicker inputs. */ -export function runDatepickerInputHarnessTests( - datepickerModule: typeof MatDatepickerModule, - datepickerInputHarness: typeof MatDatepickerInputHarness, - calendarHarness: typeof MatCalendarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, MatNativeDateModule, datepickerModule, FormsModule], - declarations: [DatepickerInputHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(DatepickerInputHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all datepicker input harnesses', async () => { - const inputs = await loader.getAllHarnesses(datepickerInputHarness); - expect(inputs.length).toBe(2); - }); - - it('should filter inputs based on their value', async () => { - fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0); - const inputs = await loader.getAllHarnesses(datepickerInputHarness.with({value: /2020/})); - expect(inputs.length).toBe(1); - }); - - it('should filter inputs based on their placeholder', async () => { - const inputs = await loader.getAllHarnesses( - datepickerInputHarness.with({ - placeholder: /^Type/, - }), - ); - - expect(inputs.length).toBe(1); - }); - - it('should get whether the input has an associated calendar', async () => { - const inputs = await loader.getAllHarnesses(datepickerInputHarness); - expect(await parallel(() => inputs.map(input => input.hasCalendar()))).toEqual([true, false]); - }); - - it('should get whether the input is disabled', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.isDisabled()).toBe(false); - - fixture.componentInstance.disabled = true; - expect(await input.isDisabled()).toBe(true); - }); - - it('should get whether the input is required', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.isRequired()).toBe(false); - - fixture.componentInstance.required = true; - expect(await input.isRequired()).toBe(true); - }); - - it('should get the input value', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0); - - expect(await input.getValue()).toBe('1/1/2020'); - }); - - it('should set the input value', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.getValue()).toBeFalsy(); - - await input.setValue('1/1/2020'); - expect(await input.getValue()).toBe('1/1/2020'); - }); - - it('should set the input value based on date adapter validation and formatting', async () => { - const adapter = fixture.debugElement.injector.get(DateAdapter); - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - const validValues: any[] = [new Date(0), '', 0, false]; - const invalidValues: any[] = [null, undefined]; - spyOn(adapter, 'format').and.returnValue('FORMATTED_VALUE'); - spyOn(adapter, 'isValid').and.callFake(value => validValues.includes(value)); - spyOn(adapter, 'deserialize').and.callFake(value => - validValues.includes(value) ? value : null, - ); - spyOn(adapter, 'getValidDateOrNull').and.callFake(value => - adapter.isValid(value) ? value : null, - ); - - for (let value of validValues) { - fixture.componentInstance.date = value; - expect(await input.getValue()).toBe('FORMATTED_VALUE'); - } - - for (let value of invalidValues) { - fixture.componentInstance.date = value; - expect(await input.getValue()).toBe(''); - } - }); - - it('should get the input placeholder', async () => { - const inputs = await loader.getAllHarnesses(datepickerInputHarness); - expect( - await parallel(() => - inputs.map(input => { - return input.getPlaceholder(); - }), - ), - ).toEqual(['Type a date', '']); - }); - - it('should be able to change the input focused state', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.isFocused()).toBe(false); - - await input.focus(); - expect(await input.isFocused()).toBe(true); - - await input.blur(); - expect(await input.isFocused()).toBe(false); - }); - - it('should get the minimum date of the input', async () => { - const inputs = await loader.getAllHarnesses(datepickerInputHarness); - fixture.componentInstance.minDate = new Date(2020, 0, 1, 12, 0, 0); - expect(await parallel(() => inputs.map(input => input.getMin()))).toEqual(['2020-01-01', null]); - }); - - it('should get the maximum date of the input', async () => { - const inputs = await loader.getAllHarnesses(datepickerInputHarness); - fixture.componentInstance.maxDate = new Date(2020, 0, 1, 12, 0, 0); - expect(await parallel(() => inputs.map(input => input.getMax()))).toEqual(['2020-01-01', null]); - }); - - it('should be able to open and close a calendar in popup mode', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.isCalendarOpen()).toBe(false); - - await input.openCalendar(); - expect(await input.isCalendarOpen()).toBe(true); - - await input.closeCalendar(); - expect(await input.isCalendarOpen()).toBe(false); - }); - - it('should be able to open and close a calendar in touch mode', async () => { - fixture.componentInstance.touchUi = true; - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(await input.isCalendarOpen()).toBe(false); - - await input.openCalendar(); - expect(await input.isCalendarOpen()).toBe(true); - - await input.closeCalendar(); - expect(await input.isCalendarOpen()).toBe(false); - }); - - it('should be able to get the harness for the associated calendar', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - await input.openCalendar(); - expect(await input.getCalendar()).toBeInstanceOf(calendarHarness); - }); - - it('should emit the `dateChange` event when the value is changed', async () => { - const input = await loader.getHarness(datepickerInputHarness.with({selector: '#basic'})); - expect(fixture.componentInstance.dateChangeCount).toBe(0); - - await input.setValue('1/1/2020'); - expect(fixture.componentInstance.dateChangeCount).toBe(1); - }); -} - -@Component({ - template: ` - - - - `, -}) -class DatepickerInputHarnessTest { - date: Date | null = null; - minDate: Date | null = null; - maxDate: Date | null = null; - touchUi = false; - disabled = false; - required = false; - dateChangeCount = 0; -} diff --git a/src/material/datepicker/testing/datepicker-input-harness.spec.ts b/src/material/datepicker/testing/datepicker-input-harness.spec.ts index e5ed1bc86d9f..9f766a5bf3c5 100644 --- a/src/material/datepicker/testing/datepicker-input-harness.spec.ts +++ b/src/material/datepicker/testing/datepicker-input-harness.spec.ts @@ -1,12 +1,206 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {DateAdapter, MatNativeDateModule} from '@angular/material/core'; +import {FormsModule} from '@angular/forms'; import {MatDatepickerModule} from '@angular/material/datepicker'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatDatepickerInputHarness} from './datepicker-input-harness'; -import {runDatepickerInputHarnessTests} from './datepicker-input-harness-shared.spec'; import {MatCalendarHarness} from './calendar-harness'; -describe('Non-MDC-based datepicker input harness', () => { - runDatepickerInputHarnessTests( - MatDatepickerModule, - MatDatepickerInputHarness, - MatCalendarHarness, - ); +describe('MatDatepickerInputHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatNativeDateModule, MatDatepickerModule, FormsModule], + declarations: [DatepickerInputHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DatepickerInputHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all datepicker input harnesses', async () => { + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness); + expect(inputs.length).toBe(2); + }); + + it('should filter inputs based on their value', async () => { + fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0); + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness.with({value: /2020/})); + expect(inputs.length).toBe(1); + }); + + it('should filter inputs based on their placeholder', async () => { + const inputs = await loader.getAllHarnesses( + MatDatepickerInputHarness.with({ + placeholder: /^Type/, + }), + ); + + expect(inputs.length).toBe(1); + }); + + it('should get whether the input has an associated calendar', async () => { + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness); + expect(await parallel(() => inputs.map(input => input.hasCalendar()))).toEqual([true, false]); + }); + + it('should get whether the input is disabled', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.isDisabled()).toBe(false); + + fixture.componentInstance.disabled = true; + expect(await input.isDisabled()).toBe(true); + }); + + it('should get whether the input is required', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.isRequired()).toBe(false); + + fixture.componentInstance.required = true; + expect(await input.isRequired()).toBe(true); + }); + + it('should get the input value', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + fixture.componentInstance.date = new Date(2020, 0, 1, 12, 0, 0); + + expect(await input.getValue()).toBe('1/1/2020'); + }); + + it('should set the input value', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.getValue()).toBeFalsy(); + + await input.setValue('1/1/2020'); + expect(await input.getValue()).toBe('1/1/2020'); + }); + + it('should set the input value based on date adapter validation and formatting', async () => { + const adapter = fixture.debugElement.injector.get(DateAdapter); + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + const validValues: any[] = [new Date(0), '', 0, false]; + const invalidValues: any[] = [null, undefined]; + spyOn(adapter, 'format').and.returnValue('FORMATTED_VALUE'); + spyOn(adapter, 'isValid').and.callFake(value => validValues.includes(value)); + spyOn(adapter, 'deserialize').and.callFake(value => + validValues.includes(value) ? value : null, + ); + spyOn(adapter, 'getValidDateOrNull').and.callFake(value => + adapter.isValid(value) ? value : null, + ); + + for (let value of validValues) { + fixture.componentInstance.date = value; + expect(await input.getValue()).toBe('FORMATTED_VALUE'); + } + + for (let value of invalidValues) { + fixture.componentInstance.date = value; + expect(await input.getValue()).toBe(''); + } + }); + + it('should get the input placeholder', async () => { + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness); + expect( + await parallel(() => + inputs.map(input => { + return input.getPlaceholder(); + }), + ), + ).toEqual(['Type a date', '']); + }); + + it('should be able to change the input focused state', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.isFocused()).toBe(false); + + await input.focus(); + expect(await input.isFocused()).toBe(true); + + await input.blur(); + expect(await input.isFocused()).toBe(false); + }); + + it('should get the minimum date of the input', async () => { + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness); + fixture.componentInstance.minDate = new Date(2020, 0, 1, 12, 0, 0); + expect(await parallel(() => inputs.map(input => input.getMin()))).toEqual(['2020-01-01', null]); + }); + + it('should get the maximum date of the input', async () => { + const inputs = await loader.getAllHarnesses(MatDatepickerInputHarness); + fixture.componentInstance.maxDate = new Date(2020, 0, 1, 12, 0, 0); + expect(await parallel(() => inputs.map(input => input.getMax()))).toEqual(['2020-01-01', null]); + }); + + it('should be able to open and close a calendar in popup mode', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.isCalendarOpen()).toBe(false); + + await input.openCalendar(); + expect(await input.isCalendarOpen()).toBe(true); + + await input.closeCalendar(); + expect(await input.isCalendarOpen()).toBe(false); + }); + + it('should be able to open and close a calendar in touch mode', async () => { + fixture.componentInstance.touchUi = true; + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(await input.isCalendarOpen()).toBe(false); + + await input.openCalendar(); + expect(await input.isCalendarOpen()).toBe(true); + + await input.closeCalendar(); + expect(await input.isCalendarOpen()).toBe(false); + }); + + it('should be able to get the harness for the associated calendar', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + await input.openCalendar(); + expect(await input.getCalendar()).toBeInstanceOf(MatCalendarHarness); + }); + + it('should emit the `dateChange` event when the value is changed', async () => { + const input = await loader.getHarness(MatDatepickerInputHarness.with({selector: '#basic'})); + expect(fixture.componentInstance.dateChangeCount).toBe(0); + + await input.setValue('1/1/2020'); + expect(fixture.componentInstance.dateChangeCount).toBe(1); + }); }); + +@Component({ + template: ` + + + + `, +}) +class DatepickerInputHarnessTest { + date: Date | null = null; + minDate: Date | null = null; + maxDate: Date | null = null; + touchUi = false; + disabled = false; + required = false; + dateChangeCount = 0; +} diff --git a/src/material/datepicker/testing/datepicker-toggle-harness-shared.spec.ts b/src/material/datepicker/testing/datepicker-toggle-harness-shared.spec.ts deleted file mode 100644 index a5bc632df7a7..000000000000 --- a/src/material/datepicker/testing/datepicker-toggle-harness-shared.spec.ts +++ /dev/null @@ -1,95 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {MatNativeDateModule} from '@angular/material/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDatepickerModule} from '@angular/material/datepicker'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatDatepickerToggleHarness} from './datepicker-toggle-harness'; -import {MatCalendarHarness} from './calendar-harness'; - -/** Shared tests to run on both the original and MDC-based datepicker toggles. */ -export function runDatepickerToggleHarnessTests( - datepickerModule: typeof MatDatepickerModule, - datepickerToggleHarness: typeof MatDatepickerToggleHarness, - calendarHarness: typeof MatCalendarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, MatNativeDateModule, datepickerModule], - declarations: [DatepickerToggleHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(DatepickerToggleHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all toggle harnesses', async () => { - const toggles = await loader.getAllHarnesses(datepickerToggleHarness); - expect(toggles.length).toBe(2); - }); - - it('should get whether the toggle is disabled', async () => { - const toggle = await loader.getHarness(datepickerToggleHarness.with({selector: '#basic'})); - expect(await toggle.isDisabled()).toBe(false); - - fixture.componentInstance.disabled = true; - expect(await toggle.isDisabled()).toBe(true); - }); - - it('should get whether the toggle has a calendar associated with it', async () => { - const toggles = await loader.getAllHarnesses(datepickerToggleHarness); - expect( - await parallel(() => { - return toggles.map(toggle => toggle.hasCalendar()); - }), - ).toEqual([true, false]); - }); - - it('should be able to open and close a calendar in popup mode', async () => { - const toggle = await loader.getHarness(datepickerToggleHarness.with({selector: '#basic'})); - expect(await toggle.isCalendarOpen()).toBe(false); - - await toggle.openCalendar(); - expect(await toggle.isCalendarOpen()).toBe(true); - - await toggle.closeCalendar(); - expect(await toggle.isCalendarOpen()).toBe(false); - }); - - it('should be able to open and close a calendar in touch mode', async () => { - fixture.componentInstance.touchUi = true; - const toggle = await loader.getHarness(datepickerToggleHarness.with({selector: '#basic'})); - expect(await toggle.isCalendarOpen()).toBe(false); - - await toggle.openCalendar(); - expect(await toggle.isCalendarOpen()).toBe(true); - - await toggle.closeCalendar(); - expect(await toggle.isCalendarOpen()).toBe(false); - }); - - it('should be able to get the harness for the associated calendar', async () => { - const toggle = await loader.getHarness(datepickerToggleHarness.with({selector: '#basic'})); - await toggle.openCalendar(); - expect(await toggle.getCalendar()).toBeInstanceOf(calendarHarness); - }); -} - -@Component({ - template: ` - - - - - - `, -}) -class DatepickerToggleHarnessTest { - touchUi = false; - disabled = false; -} diff --git a/src/material/datepicker/testing/datepicker-toggle-harness.spec.ts b/src/material/datepicker/testing/datepicker-toggle-harness.spec.ts index 3125bd317b06..b580fb55b66d 100644 --- a/src/material/datepicker/testing/datepicker-toggle-harness.spec.ts +++ b/src/material/datepicker/testing/datepicker-toggle-harness.spec.ts @@ -1,12 +1,90 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatNativeDateModule} from '@angular/material/core'; import {MatDatepickerModule} from '@angular/material/datepicker'; -import {runDatepickerToggleHarnessTests} from './datepicker-toggle-harness-shared.spec'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatDatepickerToggleHarness} from './datepicker-toggle-harness'; import {MatCalendarHarness} from './calendar-harness'; -describe('Non-MDC-based datepicker toggle harness', () => { - runDatepickerToggleHarnessTests( - MatDatepickerModule, - MatDatepickerToggleHarness, - MatCalendarHarness, - ); +describe('MatDatepickerToggleHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatNativeDateModule, MatDatepickerModule], + declarations: [DatepickerToggleHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DatepickerToggleHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all toggle harnesses', async () => { + const toggles = await loader.getAllHarnesses(MatDatepickerToggleHarness); + expect(toggles.length).toBe(2); + }); + + it('should get whether the toggle is disabled', async () => { + const toggle = await loader.getHarness(MatDatepickerToggleHarness.with({selector: '#basic'})); + expect(await toggle.isDisabled()).toBe(false); + + fixture.componentInstance.disabled = true; + expect(await toggle.isDisabled()).toBe(true); + }); + + it('should get whether the toggle has a calendar associated with it', async () => { + const toggles = await loader.getAllHarnesses(MatDatepickerToggleHarness); + expect( + await parallel(() => { + return toggles.map(toggle => toggle.hasCalendar()); + }), + ).toEqual([true, false]); + }); + + it('should be able to open and close a calendar in popup mode', async () => { + const toggle = await loader.getHarness(MatDatepickerToggleHarness.with({selector: '#basic'})); + expect(await toggle.isCalendarOpen()).toBe(false); + + await toggle.openCalendar(); + expect(await toggle.isCalendarOpen()).toBe(true); + + await toggle.closeCalendar(); + expect(await toggle.isCalendarOpen()).toBe(false); + }); + + it('should be able to open and close a calendar in touch mode', async () => { + fixture.componentInstance.touchUi = true; + const toggle = await loader.getHarness(MatDatepickerToggleHarness.with({selector: '#basic'})); + expect(await toggle.isCalendarOpen()).toBe(false); + + await toggle.openCalendar(); + expect(await toggle.isCalendarOpen()).toBe(true); + + await toggle.closeCalendar(); + expect(await toggle.isCalendarOpen()).toBe(false); + }); + + it('should be able to get the harness for the associated calendar', async () => { + const toggle = await loader.getHarness(MatDatepickerToggleHarness.with({selector: '#basic'})); + await toggle.openCalendar(); + expect(await toggle.getCalendar()).toBeInstanceOf(MatCalendarHarness); + }); }); + +@Component({ + template: ` + + + + + + `, +}) +class DatepickerToggleHarnessTest { + touchUi = false; + disabled = false; +} diff --git a/src/material/dialog/_dialog-theme.scss b/src/material/dialog/_dialog-theme.scss index 586097721f22..3cd2a4e2f7bc 100644 --- a/src/material/dialog/_dialog-theme.scss +++ b/src/material/dialog/_dialog-theme.scss @@ -2,53 +2,42 @@ @use '../core/style/sass-utils'; @use '../core/tokens/m2/mdc/dialog' as tokens-mdc-dialog; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; -@mixin base($config-or-theme) { +@mixin base($theme) { // Add default values for tokens not related to color, typography, or density. @include sass-utils.current-selector-or-root() { @include mdc-dialog-theme.theme(tokens-mdc-dialog.get-unthemable-tokens()); } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { .mat-mdc-dialog-container { - @include mdc-dialog-theme.theme(tokens-mdc-dialog.get-color-tokens($config)); + @include mdc-dialog-theme.theme(tokens-mdc-dialog.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { .mat-mdc-dialog-container { - @include mdc-dialog-theme.theme(tokens-mdc-dialog.get-typography-tokens($config)); + @include mdc-dialog-theme.theme(tokens-mdc-dialog.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); -} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-dialog') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - @include base($theme); - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/dialog/_mdc-dialog-structure-overrides.scss b/src/material/dialog/_mdc-dialog-structure-overrides.scss index a2056fadfd9b..037fd7c8887c 100644 --- a/src/material/dialog/_mdc-dialog-structure-overrides.scss +++ b/src/material/dialog/_mdc-dialog-structure-overrides.scss @@ -38,19 +38,21 @@ max-width: inherit; } - // MDC by default sets the `surface` to `display: flex`. MDC does this in order to - // be able to make the content scrollable while locking the title and actions. This - // does not work in our dialog anyway because due to the content projection, arbitrary - // components can be immediate children of the surface and make this a noop. If only - // templates or DOM elements are projected, the flex display could cause unexpected - // alignment issues as explained in our coding standards (see `CODING_STANDARDS.md`). - // Additionally, the surface by default should expand based on the parent overlay - // boundaries (so that boundaries for the overlay config are respected). The surface - // by default would only expand based on its content. .mdc-dialog__surface { - display: block; width: 100%; height: 100%; } } + + // When a component is passed into the dialog, the host element interrupts + // the `display:flex` from affecting the dialog title, content, and + // actions. To fix this, we make the component host `display: contents` by + // marking its host with the `mat-mdc-dialog-component-host` class. + // + // Note that this problem does not exist when a template ref is used since + // the title, contents, and actions are then nested directly under the + // dialog surface. + .mat-mdc-dialog-component-host { + display: contents; + } } diff --git a/src/material/dialog/dialog-container.ts b/src/material/dialog/dialog-container.ts index 3338af7948c0..538c2bfb0139 100644 --- a/src/material/dialog/dialog-container.ts +++ b/src/material/dialog/dialog-container.ts @@ -12,6 +12,7 @@ import {DOCUMENT} from '@angular/common'; import { ChangeDetectionStrategy, Component, + ComponentRef, ElementRef, EventEmitter, Inject, @@ -24,6 +25,7 @@ import {MatDialogConfig} from './dialog-config'; import {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations'; import {CdkDialogContainer} from '@angular/cdk/dialog'; import {coerceNumberProperty} from '@angular/cdk/coercion'; +import {ComponentPortal} from '@angular/cdk/portal'; /** Event that captures the state of dialog container animations. */ interface LegacyDialogAnimationEvent { @@ -259,6 +261,20 @@ export class MatDialogContainer extends CdkDialogContainer impl clearTimeout(this._animationTimer); } } + + override attachComponentPortal(portal: ComponentPortal): ComponentRef { + // When a component is passed into the dialog, the host element interrupts + // the `display:flex` from affecting the dialog title, content, and + // actions. To fix this, we make the component host `display: contents` by + // marking its host with the `mat-mdc-dialog-component-host` class. + // + // Note that this problem does not exist when a template ref is used since + // the title, contents, and actions are then nested directly under the + // dialog surface. + const ref = super.attachComponentPortal(portal); + ref.location.nativeElement.classList.add('mat-mdc-dialog-component-host'); + return ref; + } } const TRANSITION_DURATION_PROPERTY = '--mat-dialog-transition-duration'; diff --git a/src/material/dialog/testing/BUILD.bazel b/src/material/dialog/testing/BUILD.bazel index 051b4dfad86c..b732761d2b1b 100644 --- a/src/material/dialog/testing/BUILD.bazel +++ b/src/material/dialog/testing/BUILD.bazel @@ -25,13 +25,12 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/overlay", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/dialog", "@npm//@angular/platform-browser", ], @@ -43,16 +42,3 @@ ng_web_test_suite( ":unit_tests_lib", ], ) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/overlay", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/dialog", - "@npm//@angular/platform-browser", - ], -) diff --git a/src/material/dialog/testing/dialog-harness.spec.ts b/src/material/dialog/testing/dialog-harness.spec.ts index f8e1f3e760f1..237691f52c91 100644 --- a/src/material/dialog/testing/dialog-harness.spec.ts +++ b/src/material/dialog/testing/dialog-harness.spec.ts @@ -1,7 +1,129 @@ -import {MatDialog, MatDialogModule} from '@angular/material/dialog'; -import {runHarnessTests} from './shared.spec'; +import {Component, TemplateRef, ViewChild} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatDialog, MatDialogModule, MatDialogConfig} from '@angular/material/dialog'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatDialogHarness} from './dialog-harness'; -describe('MDC-based MatDialog', () => { - runHarnessTests(MatDialogModule, MatDialogHarness, MatDialog); +describe('MatDialogHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatDialogModule, NoopAnimationsModule], + declarations: [DialogHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DialogHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.documentRootLoader(fixture); + }); + + it('should load harness for dialog', async () => { + fixture.componentInstance.open(); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(dialogs.length).toBe(1); + }); + + it('should load harness for dialog with specific id', async () => { + fixture.componentInstance.open({id: 'my-dialog'}); + fixture.componentInstance.open({id: 'other'}); + let dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(dialogs.length).toBe(2); + + dialogs = await loader.getAllHarnesses(MatDialogHarness.with({selector: '#my-dialog'})); + expect(dialogs.length).toBe(1); + }); + + it('should be able to get id of dialog', async () => { + fixture.componentInstance.open({id: 'my-dialog'}); + fixture.componentInstance.open({id: 'other'}); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(await dialogs[0].getId()).toBe('my-dialog'); + expect(await dialogs[1].getId()).toBe('other'); + }); + + it('should be able to get role of dialog', async () => { + fixture.componentInstance.open({role: 'alertdialog'}); + fixture.componentInstance.open({role: 'dialog'}); + fixture.componentInstance.open({role: undefined}); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(await dialogs[0].getRole()).toBe('alertdialog'); + expect(await dialogs[1].getRole()).toBe('dialog'); + expect(await dialogs[2].getRole()).toBe(null); + }); + + it('should be able to get aria-label of dialog', async () => { + fixture.componentInstance.open(); + fixture.componentInstance.open({ariaLabel: 'Confirm purchase.'}); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(await dialogs[0].getAriaLabel()).toBe(null); + expect(await dialogs[1].getAriaLabel()).toBe('Confirm purchase.'); + }); + + it('should be able to get aria-labelledby of dialog', async () => { + fixture.componentInstance.open(); + fixture.componentInstance.open({ariaLabelledBy: 'dialog-label'}); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(await dialogs[0].getAriaLabelledby()).toMatch(/-dialog-title-\d+/); + expect(await dialogs[1].getAriaLabelledby()).toBe('dialog-label'); + }); + + it('should be able to get aria-describedby of dialog', async () => { + fixture.componentInstance.open(); + fixture.componentInstance.open({ariaDescribedBy: 'dialog-description'}); + const dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(await dialogs[0].getAriaDescribedby()).toBe(null); + expect(await dialogs[1].getAriaDescribedby()).toBe('dialog-description'); + }); + + it('should be able to close dialog', async () => { + fixture.componentInstance.open({disableClose: true}); + fixture.componentInstance.open(); + let dialogs = await loader.getAllHarnesses(MatDialogHarness); + + expect(dialogs.length).toBe(2); + await dialogs[0].close(); + + dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(dialogs.length).toBe(1); + + // should be a noop since "disableClose" is set to "true". + await dialogs[0].close(); + dialogs = await loader.getAllHarnesses(MatDialogHarness); + expect(dialogs.length).toBe(1); + }); + + it('should get the text content of each section', async () => { + fixture.componentInstance.open(); + const dialog = await loader.getHarness(MatDialogHarness); + expect(await dialog.getText()).toBe(`I'm the dialog titleI'm the dialog contentCancelOk`); + expect(await dialog.getTitleText()).toBe(`I'm the dialog title`); + expect(await dialog.getContentText()).toBe(`I'm the dialog content`); + expect(await dialog.getActionsText()).toBe(`CancelOk`); + }); }); + +@Component({ + template: ` + +
I'm the dialog title
+
I'm the dialog content
+
+ + +
+
+ `, +}) +class DialogHarnessTest { + @ViewChild(TemplateRef) dialogTmpl: TemplateRef; + + constructor(readonly dialog: MatDialog) {} + + open(config?: MatDialogConfig) { + return this.dialog.open(this.dialogTmpl, config); + } +} diff --git a/src/material/dialog/testing/shared.spec.ts b/src/material/dialog/testing/shared.spec.ts deleted file mode 100644 index 89f29ffc73da..000000000000 --- a/src/material/dialog/testing/shared.spec.ts +++ /dev/null @@ -1,141 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, TemplateRef, ViewChild} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDialog, MatDialogModule, MatDialogConfig} from '@angular/material/dialog'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatDialogHarness} from './dialog-harness'; - -/** Shared tests to run on both the original and MDC-based dialog's. */ -export function runHarnessTests( - dialogModule: typeof MatDialogModule, - dialogHarness: typeof MatDialogHarness, - dialogService: typeof MatDialog, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - // If the specified dialog service does not match the default `MatDialog` service - // that is used in the test components below, we provide the `MatDialog` service with - // the existing instance of the specified dialog service. This allows us to run these - // tests for the MDC-based version of the dialog too. - const providers = - dialogService !== MatDialog ? [{provide: MatDialog, useExisting: dialogService}] : undefined; - await TestBed.configureTestingModule({ - imports: [dialogModule, NoopAnimationsModule], - declarations: [DialogHarnessTest], - providers, - }).compileComponents(); - - fixture = TestBed.createComponent(DialogHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.documentRootLoader(fixture); - }); - - it('should load harness for dialog', async () => { - fixture.componentInstance.open(); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(dialogs.length).toBe(1); - }); - - it('should load harness for dialog with specific id', async () => { - fixture.componentInstance.open({id: 'my-dialog'}); - fixture.componentInstance.open({id: 'other'}); - let dialogs = await loader.getAllHarnesses(dialogHarness); - expect(dialogs.length).toBe(2); - - dialogs = await loader.getAllHarnesses(dialogHarness.with({selector: '#my-dialog'})); - expect(dialogs.length).toBe(1); - }); - - it('should be able to get id of dialog', async () => { - fixture.componentInstance.open({id: 'my-dialog'}); - fixture.componentInstance.open({id: 'other'}); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(await dialogs[0].getId()).toBe('my-dialog'); - expect(await dialogs[1].getId()).toBe('other'); - }); - - it('should be able to get role of dialog', async () => { - fixture.componentInstance.open({role: 'alertdialog'}); - fixture.componentInstance.open({role: 'dialog'}); - fixture.componentInstance.open({role: undefined}); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(await dialogs[0].getRole()).toBe('alertdialog'); - expect(await dialogs[1].getRole()).toBe('dialog'); - expect(await dialogs[2].getRole()).toBe(null); - }); - - it('should be able to get aria-label of dialog', async () => { - fixture.componentInstance.open(); - fixture.componentInstance.open({ariaLabel: 'Confirm purchase.'}); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(await dialogs[0].getAriaLabel()).toBe(null); - expect(await dialogs[1].getAriaLabel()).toBe('Confirm purchase.'); - }); - - it('should be able to get aria-labelledby of dialog', async () => { - fixture.componentInstance.open(); - fixture.componentInstance.open({ariaLabelledBy: 'dialog-label'}); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(await dialogs[0].getAriaLabelledby()).toMatch(/-dialog-title-\d+/); - expect(await dialogs[1].getAriaLabelledby()).toBe('dialog-label'); - }); - - it('should be able to get aria-describedby of dialog', async () => { - fixture.componentInstance.open(); - fixture.componentInstance.open({ariaDescribedBy: 'dialog-description'}); - const dialogs = await loader.getAllHarnesses(dialogHarness); - expect(await dialogs[0].getAriaDescribedby()).toBe(null); - expect(await dialogs[1].getAriaDescribedby()).toBe('dialog-description'); - }); - - it('should be able to close dialog', async () => { - fixture.componentInstance.open({disableClose: true}); - fixture.componentInstance.open(); - let dialogs = await loader.getAllHarnesses(dialogHarness); - - expect(dialogs.length).toBe(2); - await dialogs[0].close(); - - dialogs = await loader.getAllHarnesses(dialogHarness); - expect(dialogs.length).toBe(1); - - // should be a noop since "disableClose" is set to "true". - await dialogs[0].close(); - dialogs = await loader.getAllHarnesses(dialogHarness); - expect(dialogs.length).toBe(1); - }); - - it('should get the text content of each section', async () => { - fixture.componentInstance.open(); - const dialog = await loader.getHarness(dialogHarness); - expect(await dialog.getText()).toBe(`I'm the dialog titleI'm the dialog contentCancelOk`); - expect(await dialog.getTitleText()).toBe(`I'm the dialog title`); - expect(await dialog.getContentText()).toBe(`I'm the dialog content`); - expect(await dialog.getActionsText()).toBe(`CancelOk`); - }); - - @Component({ - template: ` - -
I'm the dialog title
-
I'm the dialog content
-
- - -
-
- `, - }) - class DialogHarnessTest { - @ViewChild(TemplateRef) dialogTmpl: TemplateRef; - - constructor(readonly dialog: MatDialog) {} - - open(config?: MatDialogConfig) { - return this.dialog.open(this.dialogTmpl, config); - } - } -} diff --git a/src/material/divider/_divider-theme.scss b/src/material/divider/_divider-theme.scss index 3ee3d0680ff5..b179d84e559a 100644 --- a/src/material/divider/_divider-theme.scss +++ b/src/material/divider/_divider-theme.scss @@ -1,36 +1,30 @@ @use '../core/style/sass-utils'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/tokens/token-utils'; @use '../core/tokens/m2/mat/divider' as tokens-mat-divider; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-divider.$prefix, - tokens-mat-divider.get-color-tokens($config)); + tokens-mat-divider.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-divider') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/divider/testing/BUILD.bazel b/src/material/divider/testing/BUILD.bazel index 6d078a39e5a2..0cd22f88d4d8 100644 --- a/src/material/divider/testing/BUILD.bazel +++ b/src/material/divider/testing/BUILD.bazel @@ -19,8 +19,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -30,19 +30,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/divider", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/divider/testing/divider-harness.spec.ts b/src/material/divider/testing/divider-harness.spec.ts index 28b7018ef4f5..784f1fc891d2 100644 --- a/src/material/divider/testing/divider-harness.spec.ts +++ b/src/material/divider/testing/divider-harness.spec.ts @@ -1,7 +1,47 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatDividerModule} from '@angular/material/divider'; import {MatDividerHarness} from './divider-harness'; -import {runHarnessTests} from './shared.spec'; -describe('Non-MDC-based MatLegacyButtonHarness', () => { - runHarnessTests(MatDividerModule, MatDividerHarness); +describe('MatLegacyButtonHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatDividerModule], + declarations: [DividerHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DividerHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all divider harnesses', async () => { + const dividers = await loader.getAllHarnesses(MatDividerHarness); + expect(dividers.length).toBe(2); + }); + + it('should check if divider is inset', async () => { + const dividers = await loader.getAllHarnesses(MatDividerHarness); + expect(await dividers[0].isInset()).toBe(false); + expect(await dividers[1].isInset()).toBe(true); + }); + + it('should get divider orientation', async () => { + const dividers = await loader.getAllHarnesses(MatDividerHarness); + expect(await dividers[0].getOrientation()).toBe('horizontal'); + expect(await dividers[1].getOrientation()).toBe('vertical'); + }); }); + +@Component({ + template: ` + + + `, +}) +class DividerHarnessTest {} diff --git a/src/material/divider/testing/shared.spec.ts b/src/material/divider/testing/shared.spec.ts deleted file mode 100644 index dfd67509089a..000000000000 --- a/src/material/divider/testing/shared.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatDividerModule} from '@angular/material/divider'; -import {MatDividerHarness} from './divider-harness'; - -/** Shared tests to run on both the original and MDC-based dividers. */ -export function runHarnessTests( - dividerModule: typeof MatDividerModule, - dividerHarness: typeof MatDividerHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [dividerModule], - declarations: [DividerHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(DividerHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all divider harnesses', async () => { - const dividers = await loader.getAllHarnesses(dividerHarness); - expect(dividers.length).toBe(2); - }); - - it('should check if divider is inset', async () => { - const dividers = await loader.getAllHarnesses(dividerHarness); - expect(await dividers[0].isInset()).toBe(false); - expect(await dividers[1].isInset()).toBe(true); - }); - - it('should get divider orientation', async () => { - const dividers = await loader.getAllHarnesses(dividerHarness); - expect(await dividers[0].getOrientation()).toBe('horizontal'); - expect(await dividers[1].getOrientation()).toBe('vertical'); - }); -} - -@Component({ - template: ` - - - `, -}) -class DividerHarnessTest {} diff --git a/src/material/expansion/_expansion-theme.scss b/src/material/expansion/_expansion-theme.scss index 4d14da51c9da..a257410cf229 100644 --- a/src/material/expansion/_expansion-theme.scss +++ b/src/material/expansion/_expansion-theme.scss @@ -1,52 +1,44 @@ @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/style/sass-utils'; @use '../core/tokens/token-utils'; @use '../core/tokens/m2/mat/expansion' as tokens-mat-expansion; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-expansion.$prefix, - tokens-mat-expansion.get-color-tokens($config)); + tokens-mat-expansion.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); +@mixin typography($theme) { + // TODO(mmalerba): Stop calling this and resolve resulting screen diffs. + $theme: inspection.private-get-typography-back-compat-theme($theme); @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-expansion.$prefix, - tokens-mat-expansion.get-typography-tokens($config)); + tokens-mat-expansion.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - +@mixin density($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-expansion.$prefix, - tokens-mat-expansion.get-density-tokens($density-scale)); + tokens-mat-expansion.get-density-tokens($theme)); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-expansion') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/expansion/testing/BUILD.bazel b/src/material/expansion/testing/BUILD.bazel index b40b21c48f5d..c5542e861fc5 100644 --- a/src/material/expansion/testing/BUILD.bazel +++ b/src/material/expansion/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -31,19 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/expansion", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/expansion/testing/expansion-harness.spec.ts b/src/material/expansion/testing/expansion-harness.spec.ts index fbc8a1244733..1d027ad7b56b 100644 --- a/src/material/expansion/testing/expansion-harness.spec.ts +++ b/src/material/expansion/testing/expansion-harness.spec.ts @@ -1,9 +1,342 @@ -import {MatExpansionModule} from '@angular/material/expansion'; - +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatAccordionTogglePosition, MatExpansionModule} from '@angular/material/expansion'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatAccordionHarness} from './accordion-harness'; import {MatExpansionPanelHarness} from './expansion-harness'; -import {runHarnessTests} from './shared.spec'; -describe('Non-MDC-based expansion harnesses', () => { - runHarnessTests(MatExpansionModule, MatAccordionHarness, MatExpansionPanelHarness); +describe('MatExpansionHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatExpansionModule, NoopAnimationsModule], + declarations: [ExpansionHarnessTestComponent], + }).compileComponents(); + + fixture = TestBed.createComponent(ExpansionHarnessTestComponent); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should be able to load accordion', async () => { + const accordions = await loader.getAllHarnesses(MatAccordionHarness); + expect(accordions.length).toBe(2); + }); + + it('should be able to load an accordion by selector', async () => { + const accordions = await loader.getAllHarnesses( + MatAccordionHarness.with({selector: '#accordion2'}), + ); + expect(accordions.length).toBe(1); + }); + + it('should be able to load expansion panels', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness); + expect(panels.length).toBe(5); + }); + + it('should be able to load expansion panel by title matching regex', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({title: /Panel#2/})); + expect(panels.length).toBe(1); + expect(await panels[0].getTitle()).toBe('Title of Panel#2'); + }); + + it('should be able to load expansion panel by title matching exact text', async () => { + const panels = await loader.getAllHarnesses( + MatExpansionPanelHarness.with({title: 'Standalone Panel Title'}), + ); + expect(panels.length).toBe(1); + expect(await panels[0].getTitle()).toBe('Standalone Panel Title'); + }); + + it('should be able to load expansion panel without title', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({title: null})); + expect(panels.length).toBe(1); + }); + + it('should be able to load expansion panel by description matching regex', async () => { + const panels = await loader.getAllHarnesses( + MatExpansionPanelHarness.with({description: /Panel#2/}), + ); + expect(panels.length).toBe(1); + expect(await panels[0].getDescription()).toBe('Description of Panel#2'); + }); + + it('should be able to load expansion panel by description matching exact text', async () => { + const panels = await loader.getAllHarnesses( + MatExpansionPanelHarness.with({description: 'Description of Panel#1'}), + ); + expect(panels.length).toBe(1); + expect(await panels[0].getDescription()).toBe('Description of Panel#1'); + }); + + it('should be able to load expansion panel without description', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({description: null})); + expect(panels.length).toBe(3); + }); + + it('should be able to load expanded panels', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({expanded: true})); + expect(panels.length).toBe(2); + expect(await panels[0].getTitle()).toBe('Title of Panel#2'); + expect(await panels[1].getTitle()).toBe('Standalone Panel Title'); + }); + + it('should be able to load collapsed panels', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({expanded: false})); + expect(panels.length).toBe(3); + expect(await panels[0].getTitle()).toBe('Title of Panel#1'); + expect(await panels[1].getTextContent()).toBe('Accordion #2 - Content'); + expect(await panels[2].getTitle()).toBe('Disabled Panel Title'); + }); + + it('should be able to load expansion panel by content matching regex', async () => { + const panels = await loader.getAllHarnesses( + MatExpansionPanelHarness.with({content: /Accordion #2/}), + ); + expect(panels.length).toBe(1); + expect(await panels[0].getTextContent()).toBe('Accordion #2 - Content'); + }); + + it('should be able to load expansion panel by content matching exact string', async () => { + const panels = await loader.getAllHarnesses( + MatExpansionPanelHarness.with({content: 'Content of Panel#2'}), + ); + expect(panels.length).toBe(1); + expect(await panels[0].getTextContent()).toBe('Content of Panel#2'); + }); + + it('should be able to load expansion panels based on disabled state', async () => { + const panels = await loader.getAllHarnesses(MatExpansionPanelHarness.with({disabled: true})); + expect(panels.length).toBe(1); + expect(await panels[0].getTitle()).toBe('Disabled Panel Title'); + }); + + it('should be able to get expansion state of panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness.with({title: /Panel#1/})); + expect(await panel.isExpanded()).toBe(false); + fixture.componentInstance.panel1Expanded = true; + expect(await panel.isExpanded()).toBe(true); + }); + + it('should be able to get title of panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness.with({content: /Panel#1/})); + expect(await panel.getTitle()).toBe('Title of Panel#1'); + fixture.componentInstance.panel1Title = 'new title'; + expect(await panel.getTitle()).toBe('new title'); + }); + + it('should be able to get description of panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness.with({content: /Panel#1/})); + expect(await panel.getDescription()).toBe('Description of Panel#1'); + fixture.componentInstance.panel1Description = 'new description'; + expect(await panel.getDescription()).toBe('new description'); + }); + + it('should be able to get disabled state of panel', async () => { + const panel = await loader.getHarness( + MatExpansionPanelHarness.with({selector: '#disabledPanel'}), + ); + expect(await panel.isDisabled()).toBe(true); + fixture.componentInstance.isDisabled = false; + expect(await panel.isDisabled()).toBe(false); + }); + + it('should be able to toggle expansion state of panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + expect(await panel.isExpanded()).toBe(false); + await panel.toggle(); + expect(await panel.isExpanded()).toBe(true); + }); + + it('should be able to expand a panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + expect(await panel.isExpanded()).toBe(false); + await panel.expand(); + expect(await panel.isExpanded()).toBe(true); + // checking a second time to ensure it does not modify + // the state if already expanded. + await panel.expand(); + expect(await panel.isExpanded()).toBe(true); + }); + + it('should be able to collapse a panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + expect(await panel.isExpanded()).toBe(false); + await panel.expand(); + expect(await panel.isExpanded()).toBe(true); + await panel.collapse(); + expect(await panel.isExpanded()).toBe(false); + // checking a second time to ensure it does not modify + // the state if already collapsed. + await panel.collapse(); + expect(await panel.isExpanded()).toBe(false); + }); + + it('should be able to get text content of expansion panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + expect(await panel.getTextContent()).toBe('Content of Panel#1'); + fixture.componentInstance.panel1Content = 'new content'; + expect(await panel.getTextContent()).toBe('new content'); + }); + + it('should be able to get harness loader for content of panel', async () => { + const panel = await loader.getHarness( + MatExpansionPanelHarness.with({selector: '#standalonePanel'}), + ); + const matchedHarnesses = await panel.getAllHarnesses(TestContentHarness); + expect(matchedHarnesses.length).toBe(1); + expect(await matchedHarnesses[0].getText()).toBe('Part of expansion panel'); + }); + + it('should be able to focus expansion panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + expect(getActiveElementTag()).not.toBe('mat-expansion-panel-header'); + await panel.focus(); + expect(getActiveElementTag()).toBe('mat-expansion-panel-header'); + }); + + it('should be able to blur expansion panel', async () => { + const panel = await loader.getHarness(MatExpansionPanelHarness); + await panel.focus(); + expect(getActiveElementTag()).toBe('mat-expansion-panel-header'); + await panel.blur(); + expect(getActiveElementTag()).not.toBe('mat-expansion-panel-header'); + }); + + it('should be able to check if expansion panel has toggle indicator', async () => { + const accordion = await loader.getHarness(MatAccordionHarness); + const standalonePanel = await loader.getHarness( + MatExpansionPanelHarness.with({selector: '#standalonePanel'}), + ); + const expansionPanels = [standalonePanel, ...(await accordion.getExpansionPanels())]; + let toggleIndicatorChecks = await parallel(() => { + return expansionPanels.map(p => p.hasToggleIndicator()); + }); + expect(toggleIndicatorChecks.every(s => s)).toBe(true); + fixture.componentInstance.hideToggleIndicators = true; + toggleIndicatorChecks = await parallel(() => expansionPanels.map(p => p.hasToggleIndicator())); + expect(toggleIndicatorChecks.every(s => !s)).toBe(true); + }); + + it('should be able to get toggle indicator position of panels', async () => { + const accordion = await loader.getHarness(MatAccordionHarness); + const standalonePanel = await loader.getHarness( + MatExpansionPanelHarness.with({selector: '#standalonePanel'}), + ); + const expansionPanels = [standalonePanel, ...(await accordion.getExpansionPanels())]; + let togglePositions = await parallel(() => + expansionPanels.map(p => p.getToggleIndicatorPosition()), + ); + expect(togglePositions.every(p => p === 'after')).toBe(true); + fixture.componentInstance.toggleIndicatorsPosition = 'before'; + togglePositions = await parallel(() => { + return expansionPanels.map(p => p.getToggleIndicatorPosition()); + }); + expect(togglePositions.every(p => p === 'before')).toBe(true); + }); + + it('should be able to get expansion panels of accordion', async () => { + const accordion = await loader.getHarness(MatAccordionHarness); + const panels = await accordion.getExpansionPanels(); + expect(panels.length).toBe(2); + expect(await panels[0].getTitle()).toBe('Title of Panel#1'); + expect(await panels[1].getTitle()).toBe('Title of Panel#2'); + }); + + it('should be able to get expansion panels of accordion with filter', async () => { + const accordion = await loader.getHarness(MatAccordionHarness); + const panels = await accordion.getExpansionPanels({title: /Panel#1/}); + expect(panels.length).toBe(1); + expect(await panels[0].getTitle()).toBe('Title of Panel#1'); + }); + + it('should be able to check if accordion has multi panel support enabled', async () => { + const accordion = await loader.getHarness(MatAccordionHarness); + expect(await accordion.isMulti()).toBe(false); + fixture.componentInstance.multiMode = true; + expect(await accordion.isMulti()).toBe(true); + }); }); + +function getActiveElementTag() { + return document.activeElement ? document.activeElement.tagName.toLowerCase() : ''; +} + +@Component({ + template: ` + + + + {{panel1Title}} + {{panel1Description}} + + {{panel1Content}} + + + + + Title of Panel#2 + + + Description of Panel#2 + + + Content of Panel#2 + + + + + + + Accordion #2 - Header + +

Accordion #2 - Content

+
+
+ + + + Standalone Panel Title + +
+ Standalone Panel Body +
Part of expansion panel
+
+
+ + + + Disabled Panel Title + + + +
Outside of expansion panel
+ `, +}) +class ExpansionHarnessTestComponent { + panel1Expanded = false; + panel1Title = 'Title of Panel#1'; + panel1Description = 'Description of Panel#1'; + panel1Content = 'Content of Panel#1'; + hideToggleIndicators = false; + toggleIndicatorsPosition: MatAccordionTogglePosition; + isDisabled = true; + multiMode = false; +} + +class TestContentHarness extends ComponentHarness { + static hostSelector = '.test-content-harness'; + + async getText() { + return (await this.host()).text(); + } +} diff --git a/src/material/expansion/testing/shared.spec.ts b/src/material/expansion/testing/shared.spec.ts deleted file mode 100644 index 18c23ddb7b6c..000000000000 --- a/src/material/expansion/testing/shared.spec.ts +++ /dev/null @@ -1,348 +0,0 @@ -import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatAccordionTogglePosition, MatExpansionModule} from '@angular/material/expansion'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatAccordionHarness} from './accordion-harness'; -import {MatExpansionPanelHarness} from './expansion-harness'; - -/** - * Function that can be used to run the shared expansion harness tests for either - * the non-MDC or MDC based expansion harness. - */ -export function runHarnessTests( - expansionModule: typeof MatExpansionModule, - accordionHarness: typeof MatAccordionHarness, - expansionPanelHarness: typeof MatExpansionPanelHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [expansionModule, NoopAnimationsModule], - declarations: [ExpansionHarnessTestComponent], - }).compileComponents(); - - fixture = TestBed.createComponent(ExpansionHarnessTestComponent); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should be able to load accordion', async () => { - const accordions = await loader.getAllHarnesses(accordionHarness); - expect(accordions.length).toBe(2); - }); - - it('should be able to load an accordion by selector', async () => { - const accordions = await loader.getAllHarnesses( - accordionHarness.with({selector: '#accordion2'}), - ); - expect(accordions.length).toBe(1); - }); - - it('should be able to load expansion panels', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness); - expect(panels.length).toBe(5); - }); - - it('should be able to load expansion panel by title matching regex', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({title: /Panel#2/})); - expect(panels.length).toBe(1); - expect(await panels[0].getTitle()).toBe('Title of Panel#2'); - }); - - it('should be able to load expansion panel by title matching exact text', async () => { - const panels = await loader.getAllHarnesses( - expansionPanelHarness.with({title: 'Standalone Panel Title'}), - ); - expect(panels.length).toBe(1); - expect(await panels[0].getTitle()).toBe('Standalone Panel Title'); - }); - - it('should be able to load expansion panel without title', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({title: null})); - expect(panels.length).toBe(1); - }); - - it('should be able to load expansion panel by description matching regex', async () => { - const panels = await loader.getAllHarnesses( - expansionPanelHarness.with({description: /Panel#2/}), - ); - expect(panels.length).toBe(1); - expect(await panels[0].getDescription()).toBe('Description of Panel#2'); - }); - - it('should be able to load expansion panel by description matching exact text', async () => { - const panels = await loader.getAllHarnesses( - expansionPanelHarness.with({description: 'Description of Panel#1'}), - ); - expect(panels.length).toBe(1); - expect(await panels[0].getDescription()).toBe('Description of Panel#1'); - }); - - it('should be able to load expansion panel without description', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({description: null})); - expect(panels.length).toBe(3); - }); - - it('should be able to load expanded panels', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({expanded: true})); - expect(panels.length).toBe(2); - expect(await panels[0].getTitle()).toBe('Title of Panel#2'); - expect(await panels[1].getTitle()).toBe('Standalone Panel Title'); - }); - - it('should be able to load collapsed panels', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({expanded: false})); - expect(panels.length).toBe(3); - expect(await panels[0].getTitle()).toBe('Title of Panel#1'); - expect(await panels[1].getTextContent()).toBe('Accordion #2 - Content'); - expect(await panels[2].getTitle()).toBe('Disabled Panel Title'); - }); - - it('should be able to load expansion panel by content matching regex', async () => { - const panels = await loader.getAllHarnesses( - expansionPanelHarness.with({content: /Accordion #2/}), - ); - expect(panels.length).toBe(1); - expect(await panels[0].getTextContent()).toBe('Accordion #2 - Content'); - }); - - it('should be able to load expansion panel by content matching exact string', async () => { - const panels = await loader.getAllHarnesses( - expansionPanelHarness.with({content: 'Content of Panel#2'}), - ); - expect(panels.length).toBe(1); - expect(await panels[0].getTextContent()).toBe('Content of Panel#2'); - }); - - it('should be able to load expansion panels based on disabled state', async () => { - const panels = await loader.getAllHarnesses(expansionPanelHarness.with({disabled: true})); - expect(panels.length).toBe(1); - expect(await panels[0].getTitle()).toBe('Disabled Panel Title'); - }); - - it('should be able to get expansion state of panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness.with({title: /Panel#1/})); - expect(await panel.isExpanded()).toBe(false); - fixture.componentInstance.panel1Expanded = true; - expect(await panel.isExpanded()).toBe(true); - }); - - it('should be able to get title of panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness.with({content: /Panel#1/})); - expect(await panel.getTitle()).toBe('Title of Panel#1'); - fixture.componentInstance.panel1Title = 'new title'; - expect(await panel.getTitle()).toBe('new title'); - }); - - it('should be able to get description of panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness.with({content: /Panel#1/})); - expect(await panel.getDescription()).toBe('Description of Panel#1'); - fixture.componentInstance.panel1Description = 'new description'; - expect(await panel.getDescription()).toBe('new description'); - }); - - it('should be able to get disabled state of panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness.with({selector: '#disabledPanel'})); - expect(await panel.isDisabled()).toBe(true); - fixture.componentInstance.isDisabled = false; - expect(await panel.isDisabled()).toBe(false); - }); - - it('should be able to toggle expansion state of panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - expect(await panel.isExpanded()).toBe(false); - await panel.toggle(); - expect(await panel.isExpanded()).toBe(true); - }); - - it('should be able to expand a panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - expect(await panel.isExpanded()).toBe(false); - await panel.expand(); - expect(await panel.isExpanded()).toBe(true); - // checking a second time to ensure it does not modify - // the state if already expanded. - await panel.expand(); - expect(await panel.isExpanded()).toBe(true); - }); - - it('should be able to collapse a panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - expect(await panel.isExpanded()).toBe(false); - await panel.expand(); - expect(await panel.isExpanded()).toBe(true); - await panel.collapse(); - expect(await panel.isExpanded()).toBe(false); - // checking a second time to ensure it does not modify - // the state if already collapsed. - await panel.collapse(); - expect(await panel.isExpanded()).toBe(false); - }); - - it('should be able to get text content of expansion panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - expect(await panel.getTextContent()).toBe('Content of Panel#1'); - fixture.componentInstance.panel1Content = 'new content'; - expect(await panel.getTextContent()).toBe('new content'); - }); - - it('should be able to get harness loader for content of panel', async () => { - const panel = await loader.getHarness( - expansionPanelHarness.with({selector: '#standalonePanel'}), - ); - const matchedHarnesses = await panel.getAllHarnesses(TestContentHarness); - expect(matchedHarnesses.length).toBe(1); - expect(await matchedHarnesses[0].getText()).toBe('Part of expansion panel'); - }); - - it('should be able to focus expansion panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - expect(getActiveElementTag()).not.toBe('mat-expansion-panel-header'); - await panel.focus(); - expect(getActiveElementTag()).toBe('mat-expansion-panel-header'); - }); - - it('should be able to blur expansion panel', async () => { - const panel = await loader.getHarness(expansionPanelHarness); - await panel.focus(); - expect(getActiveElementTag()).toBe('mat-expansion-panel-header'); - await panel.blur(); - expect(getActiveElementTag()).not.toBe('mat-expansion-panel-header'); - }); - - it('should be able to check if expansion panel has toggle indicator', async () => { - const accordion = await loader.getHarness(accordionHarness); - const standalonePanel = await loader.getHarness( - expansionPanelHarness.with({selector: '#standalonePanel'}), - ); - const expansionPanels = [standalonePanel, ...(await accordion.getExpansionPanels())]; - let toggleIndicatorChecks = await parallel(() => { - return expansionPanels.map(p => p.hasToggleIndicator()); - }); - expect(toggleIndicatorChecks.every(s => s)).toBe(true); - fixture.componentInstance.hideToggleIndicators = true; - toggleIndicatorChecks = await parallel(() => expansionPanels.map(p => p.hasToggleIndicator())); - expect(toggleIndicatorChecks.every(s => !s)).toBe(true); - }); - - it('should be able to get toggle indicator position of panels', async () => { - const accordion = await loader.getHarness(accordionHarness); - const standalonePanel = await loader.getHarness( - expansionPanelHarness.with({selector: '#standalonePanel'}), - ); - const expansionPanels = [standalonePanel, ...(await accordion.getExpansionPanels())]; - let togglePositions = await parallel(() => - expansionPanels.map(p => p.getToggleIndicatorPosition()), - ); - expect(togglePositions.every(p => p === 'after')).toBe(true); - fixture.componentInstance.toggleIndicatorsPosition = 'before'; - togglePositions = await parallel(() => { - return expansionPanels.map(p => p.getToggleIndicatorPosition()); - }); - expect(togglePositions.every(p => p === 'before')).toBe(true); - }); - - it('should be able to get expansion panels of accordion', async () => { - const accordion = await loader.getHarness(accordionHarness); - const panels = await accordion.getExpansionPanels(); - expect(panels.length).toBe(2); - expect(await panels[0].getTitle()).toBe('Title of Panel#1'); - expect(await panels[1].getTitle()).toBe('Title of Panel#2'); - }); - - it('should be able to get expansion panels of accordion with filter', async () => { - const accordion = await loader.getHarness(accordionHarness); - const panels = await accordion.getExpansionPanels({title: /Panel#1/}); - expect(panels.length).toBe(1); - expect(await panels[0].getTitle()).toBe('Title of Panel#1'); - }); - - it('should be able to check if accordion has multi panel support enabled', async () => { - const accordion = await loader.getHarness(accordionHarness); - expect(await accordion.isMulti()).toBe(false); - fixture.componentInstance.multiMode = true; - expect(await accordion.isMulti()).toBe(true); - }); -} - -function getActiveElementTag() { - return document.activeElement ? document.activeElement.tagName.toLowerCase() : ''; -} - -@Component({ - template: ` - - - - {{panel1Title}} - {{panel1Description}} - - {{panel1Content}} - - - - - Title of Panel#2 - - - Description of Panel#2 - - - Content of Panel#2 - - - - - - - Accordion #2 - Header - -

Accordion #2 - Content

-
-
- - - - Standalone Panel Title - -
- Standalone Panel Body -
Part of expansion panel
-
-
- - - - Disabled Panel Title - - - -
Outside of expansion panel
- `, -}) -class ExpansionHarnessTestComponent { - panel1Expanded = false; - panel1Title = 'Title of Panel#1'; - panel1Description = 'Description of Panel#1'; - panel1Content = 'Content of Panel#1'; - hideToggleIndicators = false; - toggleIndicatorsPosition: MatAccordionTogglePosition; - isDisabled = true; - multiMode = false; -} - -class TestContentHarness extends ComponentHarness { - static hostSelector = '.test-content-harness'; - - async getText() { - return (await this.host()).text(); - } -} diff --git a/src/material/form-field/_form-field-sizing.scss b/src/material/form-field/_form-field-sizing.scss index 3b3fbcd1174b..70b78c8d17a5 100644 --- a/src/material/form-field/_form-field-sizing.scss +++ b/src/material/form-field/_form-field-sizing.scss @@ -3,7 +3,7 @@ $mat-form-field-outline-top-spacing: 12px; // Infix stretches to fit the container, but naturally wants to be this wide. We set -// this in order to have a a consistent natural size for the various types of controls +// this in order to have a consistent natural size for the various types of controls // that can go in a form field. $mat-form-field-default-infix-width: 180px !default; diff --git a/src/material/form-field/_mdc-text-field-structure-overrides.scss b/src/material/form-field/_mdc-text-field-structure-overrides.scss index 382c6c6f79d9..fcd1ad5f4f7a 100644 --- a/src/material/form-field/_mdc-text-field-structure-overrides.scss +++ b/src/material/form-field/_mdc-text-field-structure-overrides.scss @@ -38,6 +38,11 @@ pointer-events: all; } + .mat-mdc-form-field:not(.mat-form-field-disabled) .mat-mdc-floating-label.mdc-floating-label { + // Style the cursor the same way as the rest of the input + cursor: inherit; + } + // Reset the height that MDC sets on native input elements. We cannot rely on their // fixed height as we handle vertical spacing differently. MDC sets a fixed height for // inputs and modifies the baseline so that the textfield matches the spec. This does diff --git a/src/material/form-field/testing/BUILD.bazel b/src/material/form-field/testing/BUILD.bazel index 280cfa34255e..1fcca75e9bcb 100644 --- a/src/material/form-field/testing/BUILD.bazel +++ b/src/material/form-field/testing/BUILD.bazel @@ -23,27 +23,13 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", "//src/cdk/testing/private", "//src/cdk/testing/testbed", - "@npm//@angular/forms", - "@npm//@angular/platform-browser", - ], -) - -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", "//src/material/autocomplete", "//src/material/core", "//src/material/datepicker", @@ -53,6 +39,8 @@ ng_test_library( "//src/material/input/testing", "//src/material/select", "//src/material/select/testing", + "@npm//@angular/forms", + "@npm//@angular/platform-browser", ], ) diff --git a/src/material/form-field/testing/form-field-harness.spec.ts b/src/material/form-field/testing/form-field-harness.spec.ts index 8fff4d40dbd8..57df5e881359 100644 --- a/src/material/form-field/testing/form-field-harness.spec.ts +++ b/src/material/form-field/testing/form-field-harness.spec.ts @@ -1,37 +1,365 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentHarness, HarnessLoader, HarnessPredicate, parallel} from '@angular/cdk/testing'; +import {createFakeEvent, dispatchFakeEvent} from '@angular/cdk/testing/private'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatErrorHarness} from './error-harness'; -import {MatInputModule} from '@angular/material/input'; import {MatAutocompleteModule} from '@angular/material/autocomplete'; -import {MatInputHarness} from '@angular/material/input/testing'; +import {MatInputModule} from '@angular/material/input'; import {MatSelectModule} from '@angular/material/select'; -import {MatSelectHarness} from '@angular/material/select/testing'; -import {runHarnessTests} from './shared.spec'; -import {MatDatepickerModule} from '@angular/material/datepicker'; import {MatNativeDateModule} from '@angular/material/core'; +import {MatDatepickerModule} from '@angular/material/datepicker'; +import {MatInputHarness} from '@angular/material/input/testing'; +import {MatSelectHarness} from '@angular/material/select/testing'; import { - MatDatepickerInputHarness, MatDateRangeInputHarness, + MatDatepickerInputHarness, } from '@angular/material/datepicker/testing'; import {MatFormFieldHarness} from './form-field-harness'; +import {MatErrorHarness} from './error-harness'; + +describe('MatFormFieldHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + NoopAnimationsModule, + ReactiveFormsModule, + MatFormFieldModule, + MatAutocompleteModule, + MatInputModule, + MatSelectModule, + MatNativeDateModule, + MatDatepickerModule, + ], + declarations: [FormFieldHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(FormFieldHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should be able to load harnesses', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(formFields.length).toBe(7); + }); + + it('should be able to load form-field that matches specific selector', async () => { + const formFieldMatches = await loader.getAllHarnesses( + MatFormFieldHarness.with({ + selector: '#first-form-field', + }), + ); + expect(formFieldMatches.length).toBe(1); + }); + + it('should be able to get appearance of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].getAppearance()).toBe('fill'); + expect(await formFields[1].getAppearance()).toBe('fill'); + expect(await formFields[2].getAppearance()).toBe('fill'); + expect(await formFields[3].getAppearance()).toBe('outline'); + expect(await formFields[4].getAppearance()).toBe('fill'); + }); + + it('should be able to get control of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect((await formFields[0].getControl()) instanceof MatInputHarness).toBe(true); + expect((await formFields[1].getControl()) instanceof MatInputHarness).toBe(true); + expect((await formFields[2].getControl()) instanceof MatSelectHarness).toBe(true); + expect((await formFields[3].getControl()) instanceof MatInputHarness).toBe(true); + expect((await formFields[4].getControl()) instanceof MatInputHarness).toBe(true); + expect((await formFields[5].getControl()) instanceof MatDatepickerInputHarness).toBe(true); + expect((await formFields[6].getControl()) instanceof MatDateRangeInputHarness).toBe(true); + }); + + it('should be able to get custom control of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].getControl(CustomControlHarness)).toBe(null); + expect( + (await formFields[1].getControl(CustomControlHarness)) instanceof CustomControlHarness, + ).toBe(true); + expect(await formFields[2].getControl(CustomControlHarness)).toBe(null); + expect(await formFields[3].getControl(CustomControlHarness)).toBe(null); + expect(await formFields[4].getControl(CustomControlHarness)).toBe(null); + }); + + it('should be able to get custom control of form-field using a predicate', async () => { + const predicate = new HarnessPredicate(CustomControlHarness, {}); + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].getControl(predicate)).toBe(null); + expect((await formFields[1].getControl(predicate)) instanceof CustomControlHarness).toBe(true); + expect(await formFields[2].getControl(predicate)).toBe(null); + expect(await formFields[3].getControl(predicate)).toBe(null); + expect(await formFields[4].getControl(predicate)).toBe(null); + }); + + it('should be able to check whether form-field has label', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].hasLabel()).toBe(false); + expect(await formFields[1].hasLabel()).toBe(false); + expect(await formFields[2].hasLabel()).toBe(true); + expect(await formFields[3].hasLabel()).toBe(true); + expect(await formFields[4].hasLabel()).toBe(true); + }); + + it('should be able to check whether label is floating', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isLabelFloating()).toBe(false); + expect(await formFields[1].isLabelFloating()).toBe(false); + expect(await formFields[2].isLabelFloating()).toBe(false); + expect(await formFields[3].isLabelFloating()).toBe(true); + expect(await formFields[4].isLabelFloating()).toBe(false); + + fixture.componentInstance.shouldLabelFloat = 'always'; + expect(await formFields[4].isLabelFloating()).toBe(true); + }); + + it('should be able to check whether form-field is disabled', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isDisabled()).toBe(false); + expect(await formFields[1].isDisabled()).toBe(false); + expect(await formFields[2].isDisabled()).toBe(false); + expect(await formFields[3].isDisabled()).toBe(false); + expect(await formFields[4].isDisabled()).toBe(false); + + fixture.componentInstance.isDisabled = true; + expect(await formFields[0].isDisabled()).toBe(true); + expect(await formFields[1].isDisabled()).toBe(false); + expect(await formFields[2].isDisabled()).toBe(true); + expect(await formFields[3].isDisabled()).toBe(false); + expect(await formFields[4].isDisabled()).toBe(false); + }); + + it('should be able to check whether form-field is auto-filled', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isAutofilled()).toBe(false); + expect(await formFields[1].isAutofilled()).toBe(false); + expect(await formFields[2].isAutofilled()).toBe(false); + expect(await formFields[3].isAutofilled()).toBe(false); + expect(await formFields[4].isAutofilled()).toBe(false); + + const autofillTriggerEvent: any = createFakeEvent('animationstart'); + autofillTriggerEvent.animationName = 'cdk-text-field-autofill-start'; + + // Dispatch an "animationstart" event on the input to trigger the + // autofill monitor. + fixture.nativeElement + .querySelector('#first-form-field input') + .dispatchEvent(autofillTriggerEvent); + + expect(await formFields[0].isAutofilled()).toBe(true); + expect(await formFields[1].isAutofilled()).toBe(false); + expect(await formFields[2].isAutofilled()).toBe(false); + expect(await formFields[3].isAutofilled()).toBe(false); + expect(await formFields[4].isAutofilled()).toBe(false); + }); + + it('should be able to get theme color of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].getThemeColor()).toBe('primary'); + expect(await formFields[1].getThemeColor()).toBe('warn'); + expect(await formFields[2].getThemeColor()).toBe('accent'); + expect(await formFields[3].getThemeColor()).toBe('primary'); + expect(await formFields[4].getThemeColor()).toBe('primary'); + }); + + it('should be able to get label of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].getLabel()).toBe(null); + expect(await formFields[1].getLabel()).toBe(null); + expect(await formFields[2].getLabel()).toBe('Label'); + expect(await formFields[3].getLabel()).toBe('autocomplete_label'); + expect(await formFields[4].getLabel()).toBe('Label'); + }); + + it('should be able to get error messages of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[1].getTextErrors()).toEqual([]); -describe('MDC-based MatFormFieldHarness', () => { - runHarnessTests( - [ - MatFormFieldModule, - MatAutocompleteModule, - MatInputModule, - MatSelectModule, - MatNativeDateModule, - MatDatepickerModule, - ], - { - formFieldHarness: MatFormFieldHarness, - inputHarness: MatInputHarness, - selectHarness: MatSelectHarness, - datepickerInputHarness: MatDatepickerInputHarness, - dateRangeInputHarness: MatDateRangeInputHarness, - isMdcImplementation: true, - errorHarness: MatErrorHarness, - }, - ); + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + expect(await formFields[1].getTextErrors()).toEqual(['Error 1', 'Error 2']); + }); + + it('should be able to get form-field by validity', async () => { + let invalid = await loader.getAllHarnesses(MatFormFieldHarness.with({isValid: false})); + expect(invalid.length).toBe(0); + + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + + invalid = await loader.getAllHarnesses(MatFormFieldHarness.with({isValid: false})); + expect(invalid.length).toBe(1); + }); + + it('should be able to get error harnesses from the form-field harness', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[1].getErrors()).toEqual([]); + + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + + const formFieldErrorHarnesses = await formFields[1].getErrors(); + expect(formFieldErrorHarnesses.length).toBe(2); + expect(await formFieldErrorHarnesses[0].getText()).toBe('Error 1'); + expect(await formFieldErrorHarnesses[1].getText()).toBe('Error 2'); + const error1Harnesses = await formFields[1].getErrors({text: 'Error 1'}); + expect(error1Harnesses.length).toBe(1); + expect(await error1Harnesses[0].getText()).toBe('Error 1'); + }); + + it('should be able to directly load error harnesses', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[1].getErrors()).toEqual([]); + + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + + const errorHarnesses = await loader.getAllHarnesses(MatErrorHarness); + expect(errorHarnesses.length).toBe(2); + expect(await errorHarnesses[0].getText()).toBe('Error 1'); + expect(await errorHarnesses[1].getText()).toBe('Error 2'); + const error1Harnesses = await loader.getAllHarnesses(MatErrorHarness.with({text: 'Error 1'})); + expect(error1Harnesses.length).toBe(1); + expect(await error1Harnesses[0].getText()).toBe('Error 1'); + }); + + it('should be able to get hint messages of form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[1].getTextHints()).toEqual(['Hint 1', 'Hint 2']); + + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + expect(await formFields[1].getTextHints()).toEqual([]); + }); + + it('should be able to get the prefix text of a form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + const prefixTexts = await parallel(() => formFields.map(f => f.getPrefixText())); + expect(prefixTexts).toEqual(['prefix_textprefix_text_2', '', '', '', '', '', '']); + }); + + it('should be able to get the suffix text of a form-field', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + const suffixTexts = await parallel(() => formFields.map(f => f.getSuffixText())); + expect(suffixTexts).toEqual(['suffix_text', '', '', '', '', '', '']); + }); + + it('should be able to check if form field has been touched', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isControlTouched()).toBe(null); + expect(await formFields[1].isControlTouched()).toBe(false); + + fixture.componentInstance.requiredControl.setValue(''); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); + expect(await formFields[1].isControlTouched()).toBe(true); + }); + + it('should be able to check if form field is invalid', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isControlValid()).toBe(null); + expect(await formFields[1].isControlValid()).toBe(true); + + fixture.componentInstance.requiredControl.setValue(''); + expect(await formFields[1].isControlValid()).toBe(false); + }); + + it('should be able to check if form field is dirty', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isControlDirty()).toBe(null); + expect(await formFields[1].isControlDirty()).toBe(false); + + fixture.componentInstance.requiredControl.setValue('new value'); + dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'input'); + expect(await formFields[1].isControlDirty()).toBe(true); + }); + + it('should be able to check if form field is pending async validation', async () => { + const formFields = await loader.getAllHarnesses(MatFormFieldHarness); + expect(await formFields[0].isControlPending()).toBe(null); + expect(await formFields[1].isControlPending()).toBe(false); + + fixture.componentInstance.setupAsyncValidator(); + fixture.componentInstance.requiredControl.setValue(''); + expect(await formFields[1].isControlPending()).toBe(true); + }); }); + +@Component({ + template: ` + + prefix_text + prefix_text_2 + + suffix_text + + + + Custom control harness + + + Error 1 +
Error 2
+ Hint 1 + Hint 2 +
+ + + Label + + First + + + + + autocomplete_label + + + + + autocomplete_option + + + + Label + + + + + Date + + + + + + Date range + + + + + + + `, +}) +class FormFieldHarnessTest { + requiredControl = new FormControl('Initial value', [Validators.required]); + shouldLabelFloat: 'always' | 'auto' = 'auto'; + hasLabel = false; + isDisabled = false; + + setupAsyncValidator() { + this.requiredControl.setValidators(() => null); + this.requiredControl.setAsyncValidators(() => new Promise(res => setTimeout(res, 10000))); + } +} + +class CustomControlHarness extends ComponentHarness { + static hostSelector = '.custom-control'; +} diff --git a/src/material/form-field/testing/shared.spec.ts b/src/material/form-field/testing/shared.spec.ts deleted file mode 100644 index b4e5e0a786f9..000000000000 --- a/src/material/form-field/testing/shared.spec.ts +++ /dev/null @@ -1,391 +0,0 @@ -import {ComponentHarness, HarnessLoader, HarnessPredicate, parallel} from '@angular/cdk/testing'; -import {MatErrorHarness} from './error-harness'; -import {createFakeEvent, dispatchFakeEvent} from '../../../cdk/testing/private'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, Type} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatFormFieldHarness} from './form-field-harness'; - -/** Shared tests to run on both the original and MDC-based form-field's. */ -export function runHarnessTests( - modules: Type[], - { - formFieldHarness, - inputHarness, - selectHarness, - datepickerInputHarness, - dateRangeInputHarness, - isMdcImplementation, - errorHarness, - }: { - formFieldHarness: typeof MatFormFieldHarness; - inputHarness: Type; - selectHarness: Type; - datepickerInputHarness: Type; - dateRangeInputHarness: Type; - isMdcImplementation: boolean; - errorHarness: typeof MatErrorHarness; - }, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, ReactiveFormsModule, ...modules], - declarations: [FormFieldHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(FormFieldHarnessTest); - fixture.componentInstance.isMdc = isMdcImplementation; - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should be able to load harnesses', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(formFields.length).toBe(7); - }); - - it('should be able to load form-field that matches specific selector', async () => { - const formFieldMatches = await loader.getAllHarnesses( - formFieldHarness.with({ - selector: '#first-form-field', - }), - ); - expect(formFieldMatches.length).toBe(1); - }); - - it('should be able to get appearance of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].getAppearance()).toBe(isMdcImplementation ? 'fill' : 'legacy'); - expect(await formFields[1].getAppearance()).toBe(isMdcImplementation ? 'fill' : 'standard'); - expect(await formFields[2].getAppearance()).toBe('fill'); - expect(await formFields[3].getAppearance()).toBe('outline'); - expect(await formFields[4].getAppearance()).toBe(isMdcImplementation ? 'fill' : 'legacy'); - }); - - it('should be able to get control of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect((await formFields[0].getControl()) instanceof inputHarness).toBe(true); - expect((await formFields[1].getControl()) instanceof inputHarness).toBe(true); - expect((await formFields[2].getControl()) instanceof selectHarness).toBe(true); - expect((await formFields[3].getControl()) instanceof inputHarness).toBe(true); - expect((await formFields[4].getControl()) instanceof inputHarness).toBe(true); - expect((await formFields[5].getControl()) instanceof datepickerInputHarness).toBe(true); - expect((await formFields[6].getControl()) instanceof dateRangeInputHarness).toBe(true); - }); - - it('should be able to get custom control of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].getControl(CustomControlHarness)).toBe(null); - expect( - (await formFields[1].getControl(CustomControlHarness)) instanceof CustomControlHarness, - ).toBe(true); - expect(await formFields[2].getControl(CustomControlHarness)).toBe(null); - expect(await formFields[3].getControl(CustomControlHarness)).toBe(null); - expect(await formFields[4].getControl(CustomControlHarness)).toBe(null); - }); - - it('should be able to get custom control of form-field using a predicate', async () => { - const predicate = new HarnessPredicate(CustomControlHarness, {}); - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].getControl(predicate)).toBe(null); - expect((await formFields[1].getControl(predicate)) instanceof CustomControlHarness).toBe(true); - expect(await formFields[2].getControl(predicate)).toBe(null); - expect(await formFields[3].getControl(predicate)).toBe(null); - expect(await formFields[4].getControl(predicate)).toBe(null); - }); - - it('should be able to check whether form-field has label', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - // The non MDC-based form-field elevates the placeholder to a floating - // label. This is not the case in the MDC-based implementation. - expect(await formFields[0].hasLabel()).toBe(!isMdcImplementation); - expect(await formFields[1].hasLabel()).toBe(false); - expect(await formFields[2].hasLabel()).toBe(true); - expect(await formFields[3].hasLabel()).toBe(true); - expect(await formFields[4].hasLabel()).toBe(true); - }); - - it('should be able to check whether label is floating', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - // The first form-field uses the legacy appearance. This means that the - // placeholder will be elevated to a label. Also since there is a static - // value, the label will float initially. The MDC implementation does not - // elevate placeholders to floating labels. - expect(await formFields[0].isLabelFloating()).toBe(!isMdcImplementation); - expect(await formFields[1].isLabelFloating()).toBe(false); - expect(await formFields[2].isLabelFloating()).toBe(false); - expect(await formFields[3].isLabelFloating()).toBe(true); - expect(await formFields[4].isLabelFloating()).toBe(false); - - fixture.componentInstance.shouldLabelFloat = 'always'; - expect(await formFields[4].isLabelFloating()).toBe(true); - }); - - it('should be able to check whether form-field is disabled', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isDisabled()).toBe(false); - expect(await formFields[1].isDisabled()).toBe(false); - expect(await formFields[2].isDisabled()).toBe(false); - expect(await formFields[3].isDisabled()).toBe(false); - expect(await formFields[4].isDisabled()).toBe(false); - - fixture.componentInstance.isDisabled = true; - expect(await formFields[0].isDisabled()).toBe(true); - expect(await formFields[1].isDisabled()).toBe(false); - expect(await formFields[2].isDisabled()).toBe(true); - expect(await formFields[3].isDisabled()).toBe(false); - expect(await formFields[4].isDisabled()).toBe(false); - }); - - it('should be able to check whether form-field is auto-filled', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isAutofilled()).toBe(false); - expect(await formFields[1].isAutofilled()).toBe(false); - expect(await formFields[2].isAutofilled()).toBe(false); - expect(await formFields[3].isAutofilled()).toBe(false); - expect(await formFields[4].isAutofilled()).toBe(false); - - const autofillTriggerEvent: any = createFakeEvent('animationstart'); - autofillTriggerEvent.animationName = 'cdk-text-field-autofill-start'; - - // Dispatch an "animationstart" event on the input to trigger the - // autofill monitor. - fixture.nativeElement - .querySelector('#first-form-field input') - .dispatchEvent(autofillTriggerEvent); - - expect(await formFields[0].isAutofilled()).toBe(true); - expect(await formFields[1].isAutofilled()).toBe(false); - expect(await formFields[2].isAutofilled()).toBe(false); - expect(await formFields[3].isAutofilled()).toBe(false); - expect(await formFields[4].isAutofilled()).toBe(false); - }); - - it('should be able to get theme color of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].getThemeColor()).toBe('primary'); - expect(await formFields[1].getThemeColor()).toBe('warn'); - expect(await formFields[2].getThemeColor()).toBe('accent'); - expect(await formFields[3].getThemeColor()).toBe('primary'); - expect(await formFields[4].getThemeColor()).toBe('primary'); - }); - - it('should be able to get label of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - // In the MDC based implementation, the placeholder will not be elevated - // to a label, and the harness will return `null`. - expect(await formFields[0].getLabel()).toBe(isMdcImplementation ? null : 'With placeholder'); - expect(await formFields[1].getLabel()).toBe(null); - expect(await formFields[2].getLabel()).toBe('Label'); - expect(await formFields[3].getLabel()).toBe('autocomplete_label'); - expect(await formFields[4].getLabel()).toBe('Label'); - }); - - it('should be able to get error messages of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[1].getTextErrors()).toEqual([]); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - expect(await formFields[1].getTextErrors()).toEqual( - isMdcImplementation ? ['Error 1', 'Error 2'] : ['Error 1'], - ); - }); - - it('should be able to get form-field by validity', async () => { - let invalid = await loader.getAllHarnesses(formFieldHarness.with({isValid: false})); - expect(invalid.length).toBe(0); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - - invalid = await loader.getAllHarnesses(formFieldHarness.with({isValid: false})); - expect(invalid.length).toBe(1); - }); - - it('should be able to get error harnesses from the form-field harness', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[1].getErrors()).toEqual([]); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - - const formFieldErrorHarnesses = await formFields[1].getErrors(); - if (isMdcImplementation) { - expect(formFieldErrorHarnesses.length).toBe(2); - expect(await formFieldErrorHarnesses[0].getText()).toBe('Error 1'); - expect(await formFieldErrorHarnesses[1].getText()).toBe('Error 2'); - } else { - expect(formFieldErrorHarnesses.length).toBe(1); - expect(await formFieldErrorHarnesses[0].getText()).toBe('Error 1'); - } - - const error1Harnesses = await formFields[1].getErrors({text: 'Error 1'}); - expect(error1Harnesses.length).toBe(1); - expect(await error1Harnesses[0].getText()).toBe('Error 1'); - }); - - it('should be able to directly load error harnesses', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[1].getErrors()).toEqual([]); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - - const errorHarnesses = await loader.getAllHarnesses(errorHarness); - if (isMdcImplementation) { - expect(errorHarnesses.length).toBe(2); - expect(await errorHarnesses[0].getText()).toBe('Error 1'); - expect(await errorHarnesses[1].getText()).toBe('Error 2'); - } else { - expect(errorHarnesses.length).toBe(1); - expect(await errorHarnesses[0].getText()).toBe('Error 1'); - } - - const error1Harnesses = await loader.getAllHarnesses(errorHarness.with({text: 'Error 1'})); - expect(error1Harnesses.length).toBe(1); - expect(await error1Harnesses[0].getText()).toBe('Error 1'); - }); - - it('should be able to get hint messages of form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[1].getTextHints()).toEqual(['Hint 1', 'Hint 2']); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - expect(await formFields[1].getTextHints()).toEqual([]); - }); - - it('should be able to get the prefix text of a form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - const prefixTexts = await parallel(() => formFields.map(f => f.getPrefixText())); - expect(prefixTexts).toEqual(['prefix_textprefix_text_2', '', '', '', '', '', '']); - }); - - it('should be able to get the suffix text of a form-field', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - const suffixTexts = await parallel(() => formFields.map(f => f.getSuffixText())); - expect(suffixTexts).toEqual(['suffix_text', '', '', '', '', '', '']); - }); - - it('should be able to check if form field has been touched', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isControlTouched()).toBe(null); - expect(await formFields[1].isControlTouched()).toBe(false); - - fixture.componentInstance.requiredControl.setValue(''); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'blur'); - expect(await formFields[1].isControlTouched()).toBe(true); - }); - - it('should be able to check if form field is invalid', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isControlValid()).toBe(null); - expect(await formFields[1].isControlValid()).toBe(true); - - fixture.componentInstance.requiredControl.setValue(''); - expect(await formFields[1].isControlValid()).toBe(false); - }); - - it('should be able to check if form field is dirty', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isControlDirty()).toBe(null); - expect(await formFields[1].isControlDirty()).toBe(false); - - fixture.componentInstance.requiredControl.setValue('new value'); - dispatchFakeEvent(fixture.nativeElement.querySelector('#with-errors input'), 'input'); - expect(await formFields[1].isControlDirty()).toBe(true); - }); - - it('should be able to check if form field is pending async validation', async () => { - const formFields = await loader.getAllHarnesses(formFieldHarness); - expect(await formFields[0].isControlPending()).toBe(null); - expect(await formFields[1].isControlPending()).toBe(false); - - fixture.componentInstance.setupAsyncValidator(); - fixture.componentInstance.requiredControl.setValue(''); - expect(await formFields[1].isControlPending()).toBe(true); - }); -} - -@Component({ - template: ` - - prefix_text - prefix_text_2 - prefix_text - prefix_text_2 - - suffix_text - suffix_text - - - - Custom control harness - - - Error 1 -
Error 2
- Hint 1 - Hint 2 -
- - - Label - - First - - - - - autocomplete_label - - - - - autocomplete_option - - - - Label - - - - - Date - - - - - - Date range - - - - - - - `, -}) -class FormFieldHarnessTest { - requiredControl = new FormControl('Initial value', [Validators.required]); - shouldLabelFloat: 'always' | 'auto' = 'auto'; - hasLabel = false; - isDisabled = false; - isMdc = false; - - setupAsyncValidator() { - this.requiredControl.setValidators(() => null); - this.requiredControl.setAsyncValidators(() => new Promise(res => setTimeout(res, 10000))); - } -} - -class CustomControlHarness extends ComponentHarness { - static hostSelector = '.custom-control'; -} diff --git a/src/material/grid-list/_grid-list-theme.scss b/src/material/grid-list/_grid-list-theme.scss index 1a3b0a18c342..03c54567b926 100644 --- a/src/material/grid-list/_grid-list-theme.scss +++ b/src/material/grid-list/_grid-list-theme.scss @@ -1,4 +1,5 @@ @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/m2/mat/grid-list' as tokens-mat-grid-list; @use '../core/style/sass-utils'; @@ -6,35 +7,27 @@ // Include this empty mixin for consistency with the other components. -@mixin color($config-or-theme) {} - -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); +@mixin color($theme) {} +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-grid-list.$prefix, - tokens-mat-grid-list.get-typography-tokens($config)); + tokens-mat-grid-list.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-grid-list') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/grid-list/testing/BUILD.bazel b/src/material/grid-list/testing/BUILD.bazel index 7d800dddced1..c116bb84e835 100644 --- a/src/material/grid-list/testing/BUILD.bazel +++ b/src/material/grid-list/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -32,19 +32,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/grid-list", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/grid-list/testing/grid-list-harness.spec.ts b/src/material/grid-list/testing/grid-list-harness.spec.ts index 7631e80a54ad..2faf72ab5986 100644 --- a/src/material/grid-list/testing/grid-list-harness.spec.ts +++ b/src/material/grid-list/testing/grid-list-harness.spec.ts @@ -1,8 +1,190 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatGridListModule} from '@angular/material/grid-list'; import {MatGridListHarness} from './grid-list-harness'; import {MatGridTileHarness} from './grid-tile-harness'; -import {runHarnessTests} from './shared.spec'; -describe('Non-MDC-based MatGridListHarness', () => { - runHarnessTests(MatGridListModule, MatGridListHarness, MatGridTileHarness); +describe('MatGridListHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatGridListModule, NoopAnimationsModule], + declarations: [GridListHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(GridListHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.documentRootLoader(fixture); + }); + + it('should be able to load grid-list harnesses', async () => { + const harnesses = await loader.getAllHarnesses(MatGridListHarness); + expect(harnesses.length).toBe(2); + }); + + it('should be able to load grid-tile harnesses', async () => { + const harnesses = await loader.getAllHarnesses(MatGridTileHarness); + expect(harnesses.length).toBe(8); + }); + + it('should be able to load grid-tile harness by header text', async () => { + const harnesses = await loader.getAllHarnesses(MatGridTileHarness.with({headerText: /Tile 3/})); + expect(harnesses.length).toBe(1); + expect(await harnesses[0].getFooterText()).toBe('Tile 3 footer'); + }); + + it('should be able to load grid-tile harness by footer text', async () => { + const harnesses = await loader.getAllHarnesses( + MatGridTileHarness.with({footerText: 'Tile 3 footer'}), + ); + expect(harnesses.length).toBe(1); + expect(await harnesses[0].getHeaderText()).toBe('Tile 3'); + }); + + it('should be able to get all tiles of a grid-list', async () => { + const gridList = await loader.getHarness(MatGridListHarness.with({selector: '#second'})); + const tiles = await gridList.getTiles(); + expect(tiles.length).toBe(4); + }); + + it('should be able to get tiles of grid-list with filters', async () => { + const gridList = await loader.getHarness(MatGridListHarness.with({selector: '#second'})); + const tiles = await gridList.getTiles({headerText: /Tile [34]/}); + expect(tiles.length).toBe(2); + }); + + it('should be able to get amount of columns of grid-list', async () => { + const gridLists = await loader.getAllHarnesses(MatGridListHarness); + expect(await gridLists[0].getColumns()).toBe(4); + expect(await gridLists[1].getColumns()).toBe(2); + fixture.componentInstance.columns = 3; + expect(await gridLists[0].getColumns()).toBe(3); + }); + + it('should be able to get tile by position', async () => { + const gridList = await loader.getHarness(MatGridListHarness); + const tiles = await parallel(() => [ + gridList.getTileAtPosition({row: 0, column: 0}), + gridList.getTileAtPosition({row: 0, column: 1}), + gridList.getTileAtPosition({row: 1, column: 0}), + ]); + expect(await tiles[0].getHeaderText()).toBe('One'); + expect(await tiles[1].getHeaderText()).toBe('Two'); + expect(await tiles[2].getHeaderText()).toBe('Four (second row)'); + }); + + it('should be able to get tile by position with respect to tile span', async () => { + const gridList = await loader.getHarness(MatGridListHarness); + const tiles = await parallel(() => [ + gridList.getTileAtPosition({row: 0, column: 2}), + gridList.getTileAtPosition({row: 0, column: 3}), + ]); + expect(await tiles[0].getHeaderText()).toBe('Three'); + expect(await tiles[1].getHeaderText()).toBe('Three'); + await expectAsync(gridList.getTileAtPosition({row: 2, column: 0})).toBeRejectedWithError( + /Could not find tile/, + ); + + // Update the fourth tile to span over two rows. The previous position + // should now be valid and the fourth tile should be returned. + fixture.componentInstance.tile4Rowspan = 2; + const foundTile = await gridList.getTileAtPosition({row: 2, column: 0}); + expect(await foundTile.getHeaderText()).toBe('Four (second and third row)'); + }); + + it('should be able to check whether tile has header', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].hasHeader()).toBe(true); + expect(await tiles[4].hasHeader()).toBe(false); + expect(await (await tiles[4].host()).text()).toBe('Tile 1 (no header, no footer)'); + }); + + it('should be able to check whether tile has footer', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].hasFooter()).toBe(false); + expect(await tiles[6].hasFooter()).toBe(true); + expect(await tiles[6].getFooterText()).toBe('Tile 3 footer'); + }); + + it('should be able to check whether tile has avatar', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].hasAvatar()).toBe(false); + expect(await tiles[1].hasAvatar()).toBe(true); + }); + + it('should be able to get rowspan of tile', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].getRowspan()).toBe(1); + expect(await tiles[3].getRowspan()).toBe(1); + fixture.componentInstance.tile4Rowspan = 10; + expect(await tiles[3].getRowspan()).toBe(10); + }); + + it('should be able to get colspan of tile', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].getColspan()).toBe(1); + expect(await tiles[2].getColspan()).toBe(2); + }); + + it('should be able to get header text of tile', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].getHeaderText()).toBe('One'); + fixture.componentInstance.firstTileText = 'updated'; + expect(await tiles[0].getHeaderText()).toBe('updated'); + }); + + it('should be able to get footer text of tile', async () => { + const tiles = await loader.getAllHarnesses(MatGridTileHarness); + expect(await tiles[0].getFooterText()).toBe(null); + fixture.componentInstance.showFooter = true; + expect(await tiles[0].getFooterText()).toBe('Footer'); + }); }); + +@Component({ + template: ` + + + {{firstTileText}} + Footer + + + Two +
+
+ + Three + + + + Four (second {{tile4Rowspan === 2 ? 'and third ' : ''}}row) + + +
+ + + Tile 1 (no header, no footer) + + Tile 2 + + + Tile 3 + Tile 3 footer + + + Tile 4 + + + `, +}) +class GridListHarnessTest { + firstTileText = 'One'; + showFooter = false; + columns = 4; + tile4Rowspan = 1; +} diff --git a/src/material/grid-list/testing/shared.spec.ts b/src/material/grid-list/testing/shared.spec.ts deleted file mode 100644 index c7759b55ccc3..000000000000 --- a/src/material/grid-list/testing/shared.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatGridListModule} from '@angular/material/grid-list'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatGridListHarness} from './grid-list-harness'; -import {MatGridTileHarness} from './grid-tile-harness'; - -/** Shared tests to run on both the original and MDC-based grid-list. */ -export function runHarnessTests( - gridListModule: typeof MatGridListModule, - gridListHarness: typeof MatGridListHarness, - gridTileHarness: typeof MatGridTileHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [gridListModule, NoopAnimationsModule], - declarations: [GridListHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(GridListHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.documentRootLoader(fixture); - }); - - it('should be able to load grid-list harnesses', async () => { - const harnesses = await loader.getAllHarnesses(gridListHarness); - expect(harnesses.length).toBe(2); - }); - - it('should be able to load grid-tile harnesses', async () => { - const harnesses = await loader.getAllHarnesses(gridTileHarness); - expect(harnesses.length).toBe(8); - }); - - it('should be able to load grid-tile harness by header text', async () => { - const harnesses = await loader.getAllHarnesses(gridTileHarness.with({headerText: /Tile 3/})); - expect(harnesses.length).toBe(1); - expect(await harnesses[0].getFooterText()).toBe('Tile 3 footer'); - }); - - it('should be able to load grid-tile harness by footer text', async () => { - const harnesses = await loader.getAllHarnesses( - gridTileHarness.with({footerText: 'Tile 3 footer'}), - ); - expect(harnesses.length).toBe(1); - expect(await harnesses[0].getHeaderText()).toBe('Tile 3'); - }); - - it('should be able to get all tiles of a grid-list', async () => { - const gridList = await loader.getHarness(gridListHarness.with({selector: '#second'})); - const tiles = await gridList.getTiles(); - expect(tiles.length).toBe(4); - }); - - it('should be able to get tiles of grid-list with filters', async () => { - const gridList = await loader.getHarness(gridListHarness.with({selector: '#second'})); - const tiles = await gridList.getTiles({headerText: /Tile [34]/}); - expect(tiles.length).toBe(2); - }); - - it('should be able to get amount of columns of grid-list', async () => { - const gridLists = await loader.getAllHarnesses(gridListHarness); - expect(await gridLists[0].getColumns()).toBe(4); - expect(await gridLists[1].getColumns()).toBe(2); - fixture.componentInstance.columns = 3; - expect(await gridLists[0].getColumns()).toBe(3); - }); - - it('should be able to get tile by position', async () => { - const gridList = await loader.getHarness(gridListHarness); - const tiles = await parallel(() => [ - gridList.getTileAtPosition({row: 0, column: 0}), - gridList.getTileAtPosition({row: 0, column: 1}), - gridList.getTileAtPosition({row: 1, column: 0}), - ]); - expect(await tiles[0].getHeaderText()).toBe('One'); - expect(await tiles[1].getHeaderText()).toBe('Two'); - expect(await tiles[2].getHeaderText()).toBe('Four (second row)'); - }); - - it('should be able to get tile by position with respect to tile span', async () => { - const gridList = await loader.getHarness(gridListHarness); - const tiles = await parallel(() => [ - gridList.getTileAtPosition({row: 0, column: 2}), - gridList.getTileAtPosition({row: 0, column: 3}), - ]); - expect(await tiles[0].getHeaderText()).toBe('Three'); - expect(await tiles[1].getHeaderText()).toBe('Three'); - await expectAsync(gridList.getTileAtPosition({row: 2, column: 0})).toBeRejectedWithError( - /Could not find tile/, - ); - - // Update the fourth tile to span over two rows. The previous position - // should now be valid and the fourth tile should be returned. - fixture.componentInstance.tile4Rowspan = 2; - const foundTile = await gridList.getTileAtPosition({row: 2, column: 0}); - expect(await foundTile.getHeaderText()).toBe('Four (second and third row)'); - }); - - it('should be able to check whether tile has header', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].hasHeader()).toBe(true); - expect(await tiles[4].hasHeader()).toBe(false); - expect(await (await tiles[4].host()).text()).toBe('Tile 1 (no header, no footer)'); - }); - - it('should be able to check whether tile has footer', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].hasFooter()).toBe(false); - expect(await tiles[6].hasFooter()).toBe(true); - expect(await tiles[6].getFooterText()).toBe('Tile 3 footer'); - }); - - it('should be able to check whether tile has avatar', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].hasAvatar()).toBe(false); - expect(await tiles[1].hasAvatar()).toBe(true); - }); - - it('should be able to get rowspan of tile', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].getRowspan()).toBe(1); - expect(await tiles[3].getRowspan()).toBe(1); - fixture.componentInstance.tile4Rowspan = 10; - expect(await tiles[3].getRowspan()).toBe(10); - }); - - it('should be able to get colspan of tile', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].getColspan()).toBe(1); - expect(await tiles[2].getColspan()).toBe(2); - }); - - it('should be able to get header text of tile', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].getHeaderText()).toBe('One'); - fixture.componentInstance.firstTileText = 'updated'; - expect(await tiles[0].getHeaderText()).toBe('updated'); - }); - - it('should be able to get footer text of tile', async () => { - const tiles = await loader.getAllHarnesses(gridTileHarness); - expect(await tiles[0].getFooterText()).toBe(null); - fixture.componentInstance.showFooter = true; - expect(await tiles[0].getFooterText()).toBe('Footer'); - }); -} - -@Component({ - template: ` - - - {{firstTileText}} - Footer - - - Two -
-
- - Three - - - - Four (second {{tile4Rowspan === 2 ? 'and third ' : ''}}row) - - -
- - - Tile 1 (no header, no footer) - - Tile 2 - - - Tile 3 - Tile 3 footer - - - Tile 4 - - - `, -}) -class GridListHarnessTest { - firstTileText = 'One'; - showFooter = false; - columns = 4; - tile4Rowspan = 1; -} diff --git a/src/material/icon/_icon-theme.scss b/src/material/icon/_icon-theme.scss index 1daac623b3fc..ccbcd1ba9659 100644 --- a/src/material/icon/_icon-theme.scss +++ b/src/material/icon/_icon-theme.scss @@ -1,58 +1,50 @@ -@use 'sass:map'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/tokens/m2/mat/icon' as tokens-mat-icon; @use '../core/tokens/token-utils'; @use '../core/style/sass-utils'; -@mixin _palette-colors($config, $palette-name) { - $palette: map.get($config, $palette-name); - $color: theming.get-color-from-palette($palette, text); +@mixin _palette-colors($theme, $palette-name) { + $color: inspection.get-theme-color($theme, $palette-name, text); $tokens: tokens-mat-icon.private-get-icon-color-tokens($color); @include token-utils.create-token-values(tokens-mat-icon.$prefix, $tokens); } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-icon.$prefix, - tokens-mat-icon.get-color-tokens($config)); + tokens-mat-icon.get-color-tokens($theme)); } .mat-icon { &.mat-primary { - @include _palette-colors($config, primary); + @include _palette-colors($theme, primary); } &.mat-accent { - @include _palette-colors($config, accent); + @include _palette-colors($theme, accent); } &.mat-warn { - @include _palette-colors($config, warn); + @include _palette-colors($theme, warn); } } } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-icon') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/icon/testing/BUILD.bazel b/src/material/icon/testing/BUILD.bazel index db67b5115418..66b4e3d100a9 100644 --- a/src/material/icon/testing/BUILD.bazel +++ b/src/material/icon/testing/BUILD.bazel @@ -24,8 +24,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/platform", @@ -36,22 +36,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "**/*.e2e.spec.ts", - "shared.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/icon", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/icon/testing/icon-harness.spec.ts b/src/material/icon/testing/icon-harness.spec.ts index 0780f91dee52..79f52e4ac9f0 100644 --- a/src/material/icon/testing/icon-harness.spec.ts +++ b/src/material/icon/testing/icon-harness.spec.ts @@ -1,7 +1,119 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatIconModule, MatIconRegistry} from '@angular/material/icon'; -import {runHarnessTests} from '@angular/material/icon/testing/shared.spec'; +import {DomSanitizer} from '@angular/platform-browser'; import {MatIconHarness} from './icon-harness'; +import {IconType} from './icon-harness-filters'; -describe('Non-MDC-based MatIconHarness', () => { - runHarnessTests(MatIconModule, MatIconRegistry, MatIconHarness); +describe('MatIconHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatIconModule], + declarations: [IconHarnessTest], + }).compileComponents(); + + const registry = TestBed.inject(MatIconRegistry); + const sanitizer = TestBed.inject(DomSanitizer); + + registry.addSvgIconLiteralInNamespace( + 'svgIcons', + 'svgIcon', + sanitizer.bypassSecurityTrustHtml(''), + ); + fixture = TestBed.createComponent(IconHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all icon harnesses', async () => { + const icons = await loader.getAllHarnesses(MatIconHarness); + expect(icons.length).toBe(6); + }); + + it('should filter icon harnesses based on their type', async () => { + const [svgIcons, fontIcons] = await parallel(() => [ + loader.getAllHarnesses(MatIconHarness.with({type: IconType.SVG})), + loader.getAllHarnesses(MatIconHarness.with({type: IconType.FONT})), + ]); + + expect(svgIcons.length).toBe(1); + expect(fontIcons.length).toBe(5); + }); + + it('should filter icon harnesses based on their name', async () => { + const [regexFilterResults, stringFilterResults] = await parallel(() => [ + loader.getAllHarnesses(MatIconHarness.with({name: /^font/})), + loader.getAllHarnesses(MatIconHarness.with({name: 'fontIcon'})), + ]); + + expect(regexFilterResults.length).toBe(1); + expect(stringFilterResults.length).toBe(1); + }); + + it('should filter icon harnesses based on their namespace', async () => { + const [regexFilterResults, stringFilterResults, nullFilterResults] = await parallel(() => [ + loader.getAllHarnesses(MatIconHarness.with({namespace: /^font/})), + loader.getAllHarnesses(MatIconHarness.with({namespace: 'svgIcons'})), + loader.getAllHarnesses(MatIconHarness.with({namespace: null})), + ]); + + expect(regexFilterResults.length).toBe(1); + expect(stringFilterResults.length).toBe(1); + expect(nullFilterResults.length).toBe(4); + }); + + it('should get the type of each icon', async () => { + const icons = await loader.getAllHarnesses(MatIconHarness); + const types = await parallel(() => icons.map(icon => icon.getType())); + expect(types).toEqual([ + IconType.FONT, + IconType.SVG, + IconType.FONT, + IconType.FONT, + IconType.FONT, + IconType.FONT, + ]); + }); + + it('should get the name of an icon', async () => { + const icons = await loader.getAllHarnesses(MatIconHarness); + const names = await parallel(() => icons.map(icon => icon.getName())); + expect(names).toEqual([ + 'fontIcon', + 'svgIcon', + 'ligature_icon', + 'ligature_icon_by_attribute', + 'ligature_icon_with_additional_content', + 'ligature_icon_with_indirect_name', + ]); + }); + + it('should get the namespace of an icon', async () => { + const icons = await loader.getAllHarnesses(MatIconHarness); + const namespaces = await parallel(() => icons.map(icon => icon.getNamespace())); + expect(namespaces).toEqual(['fontIcons', 'svgIcons', null, null, null, null]); + }); + + it('should get whether an icon is inline', async () => { + const icons = await loader.getAllHarnesses(MatIconHarness); + const inlineStates = await parallel(() => icons.map(icon => icon.isInline())); + expect(inlineStates).toEqual([false, false, true, false, false, false]); + }); }); + +@Component({ + template: ` + + + ligature_icon + + ligature_icon_with_additional_content Hello + ligature_icon_with_indirect_name + `, +}) +class IconHarnessTest {} diff --git a/src/material/icon/testing/shared.spec.ts b/src/material/icon/testing/shared.spec.ts deleted file mode 100644 index e2b299a0c772..000000000000 --- a/src/material/icon/testing/shared.spec.ts +++ /dev/null @@ -1,124 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatIconModule, MatIconRegistry} from '@angular/material/icon'; -import {MatIconHarness} from '@angular/material/icon/testing/icon-harness'; -import {DomSanitizer} from '@angular/platform-browser'; -import {IconType} from './icon-harness-filters'; - -/** Shared tests to run on both the original and MDC-based icons. */ -export function runHarnessTests( - iconModule: typeof MatIconModule, - iconRegistry: typeof MatIconRegistry, - iconHarness: typeof MatIconHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [iconModule], - declarations: [IconHarnessTest], - }).compileComponents(); - - const registry = TestBed.inject(iconRegistry); - const sanitizer = TestBed.inject(DomSanitizer); - - registry.addSvgIconLiteralInNamespace( - 'svgIcons', - 'svgIcon', - sanitizer.bypassSecurityTrustHtml(''), - ); - fixture = TestBed.createComponent(IconHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all icon harnesses', async () => { - const icons = await loader.getAllHarnesses(iconHarness); - expect(icons.length).toBe(6); - }); - - it('should filter icon harnesses based on their type', async () => { - const [svgIcons, fontIcons] = await parallel(() => [ - loader.getAllHarnesses(iconHarness.with({type: IconType.SVG})), - loader.getAllHarnesses(iconHarness.with({type: IconType.FONT})), - ]); - - expect(svgIcons.length).toBe(1); - expect(fontIcons.length).toBe(5); - }); - - it('should filter icon harnesses based on their name', async () => { - const [regexFilterResults, stringFilterResults] = await parallel(() => [ - loader.getAllHarnesses(iconHarness.with({name: /^font/})), - loader.getAllHarnesses(iconHarness.with({name: 'fontIcon'})), - ]); - - expect(regexFilterResults.length).toBe(1); - expect(stringFilterResults.length).toBe(1); - }); - - it('should filter icon harnesses based on their namespace', async () => { - const [regexFilterResults, stringFilterResults, nullFilterResults] = await parallel(() => [ - loader.getAllHarnesses(iconHarness.with({namespace: /^font/})), - loader.getAllHarnesses(iconHarness.with({namespace: 'svgIcons'})), - loader.getAllHarnesses(iconHarness.with({namespace: null})), - ]); - - expect(regexFilterResults.length).toBe(1); - expect(stringFilterResults.length).toBe(1); - expect(nullFilterResults.length).toBe(4); - }); - - it('should get the type of each icon', async () => { - const icons = await loader.getAllHarnesses(iconHarness); - const types = await parallel(() => icons.map(icon => icon.getType())); - expect(types).toEqual([ - IconType.FONT, - IconType.SVG, - IconType.FONT, - IconType.FONT, - IconType.FONT, - IconType.FONT, - ]); - }); - - it('should get the name of an icon', async () => { - const icons = await loader.getAllHarnesses(iconHarness); - const names = await parallel(() => icons.map(icon => icon.getName())); - expect(names).toEqual([ - 'fontIcon', - 'svgIcon', - 'ligature_icon', - 'ligature_icon_by_attribute', - 'ligature_icon_with_additional_content', - 'ligature_icon_with_indirect_name', - ]); - }); - - it('should get the namespace of an icon', async () => { - const icons = await loader.getAllHarnesses(iconHarness); - const namespaces = await parallel(() => icons.map(icon => icon.getNamespace())); - expect(namespaces).toEqual(['fontIcons', 'svgIcons', null, null, null, null]); - }); - - it('should get whether an icon is inline', async () => { - const icons = await loader.getAllHarnesses(iconHarness); - const inlineStates = await parallel(() => icons.map(icon => icon.isInline())); - expect(inlineStates).toEqual([false, false, true, false, false, false]); - }); -} - -@Component({ - template: ` - - - ligature_icon - - ligature_icon_with_additional_content Hello - ligature_icon_with_indirect_name - `, -}) -class IconHarnessTest {} diff --git a/src/material/input/input.md b/src/material/input/input.md index 4529bbe92c47..bde6aa86ea11 100644 --- a/src/material/input/input.md +++ b/src/material/input/input.md @@ -50,7 +50,7 @@ element. In some cases that `` may use the placeholder as the la The `` allows you to [associate error messages](https://material.angular.io/components/form-field/overview#error-messages) with your `matNativeControl`. By default, these error messages are shown when the control is invalid and -either the user has interacted with (touched) the element or the parent form has been submitted. If +the user has interacted with (touched) the element or the parent form has been submitted. If you wish to override this behavior (e.g. to show the error as soon as the invalid control is dirty or when a parent form group is invalid), you can use the `errorStateMatcher` property of the `matNativeControl`. The property takes an instance of an `ErrorStateMatcher` object. An `ErrorStateMatcher` diff --git a/src/material/input/testing/BUILD.bazel b/src/material/input/testing/BUILD.bazel index 6e68f42416b9..e7bf64737e1a 100644 --- a/src/material/input/testing/BUILD.bazel +++ b/src/material/input/testing/BUILD.bazel @@ -21,11 +21,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = [ - "shared-input.spec.ts", - "shared-native-select.spec.ts", - ], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/platform", @@ -37,22 +34,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "shared-input.spec.ts", - "shared-native-select.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/input", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/input/testing/input-harness.spec.ts b/src/material/input/testing/input-harness.spec.ts index 48969fcd9147..a300e21bf323 100644 --- a/src/material/input/testing/input-harness.spec.ts +++ b/src/material/input/testing/input-harness.spec.ts @@ -1,7 +1,277 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormsModule} from '@angular/forms'; import {MatInputModule} from '@angular/material/input'; -import {runInputHarnessTests} from './shared-input.spec'; +import {getSupportedInputTypes} from '@angular/cdk/platform'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatInputHarness} from './input-harness'; -describe('MDC-based MatInputHarness', () => { - runInputHarnessTests(MatInputModule, MatInputHarness); +describe('MatInputHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatInputModule, FormsModule], + declarations: [InputHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(InputHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all input harnesses', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + }); + + it('should load input with specific id', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness.with({selector: '#myTextarea'})); + expect(inputs.length).toBe(1); + }); + + it('should load input with specific name', async () => { + const inputs = await loader.getAllHarnesses( + MatInputHarness.with({selector: '[name="favorite-food"]'}), + ); + expect(inputs.length).toBe(1); + }); + + it('should load input with a specific value', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness.with({value: 'Sushi'})); + expect(inputs.length).toBe(1); + }); + + it('should load input with a value that matches a regex', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness.with({value: /shi$/})); + expect(inputs.length).toBe(1); + expect(await inputs[0].getValue()).toBe('Sushi'); + }); + + it('should load input with a specific placeholder', async () => { + const inputs = await loader.getAllHarnesses( + MatInputHarness.with({placeholder: 'Favorite food'}), + ); + expect(inputs.length).toBe(1); + }); + + it('should load input with a placeholder that matches a regex', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness.with({placeholder: / food$/})); + expect(inputs.length).toBe(1); + expect(await inputs[0].getPlaceholder()).toBe('Favorite food'); + }); + + it('should be able to get id of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getId()).toMatch(/mat-input-\d+/); + expect(await inputs[1].getId()).toMatch(/mat-input-\d+/); + expect(await inputs[2].getId()).toBe('myTextarea'); + expect(await inputs[3].getId()).toBe('nativeControl'); + expect(await inputs[4].getId()).toMatch(/mat-input-\d+/); + expect(await inputs[5].getId()).toBe('has-ng-model'); + }); + + it('should be able to get name of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getName()).toBe('favorite-food'); + expect(await inputs[1].getName()).toBe(''); + expect(await inputs[2].getName()).toBe(''); + expect(await inputs[3].getName()).toBe(''); + expect(await inputs[4].getName()).toBe(''); + expect(await inputs[5].getName()).toBe('has-ng-model'); + }); + + it('should be able to get value of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getValue()).toBe('Sushi'); + expect(await inputs[1].getValue()).toBe(''); + expect(await inputs[2].getValue()).toBe(''); + expect(await inputs[3].getValue()).toBe(''); + expect(await inputs[4].getValue()).toBe(''); + expect(await inputs[5].getValue()).toBe(''); + }); + + it('should be able to set value of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getValue()).toBe('Sushi'); + expect(await inputs[1].getValue()).toBe(''); + expect(await inputs[3].getValue()).toBe(''); + expect(await inputs[4].getValue()).toBe(''); + + await inputs[0].setValue(''); + await inputs[2].setValue('new-value'); + await inputs[3].setValue('new-value'); + await inputs[4].setValue('new-value'); + + expect(await inputs[0].getValue()).toBe(''); + expect(await inputs[2].getValue()).toBe('new-value'); + expect(await inputs[3].getValue()).toBe('new-value'); + expect(await inputs[4].getValue()).toBe('new-value'); + }); + + it('should be able to get disabled state', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + + expect(await inputs[0].isDisabled()).toBe(false); + expect(await inputs[1].isDisabled()).toBe(false); + expect(await inputs[2].isDisabled()).toBe(false); + expect(await inputs[3].isDisabled()).toBe(false); + expect(await inputs[4].isDisabled()).toBe(false); + expect(await inputs[5].isDisabled()).toBe(false); + + fixture.componentInstance.disabled = true; + + expect(await inputs[1].isDisabled()).toBe(true); + }); + + it('should be able to get readonly state', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + + expect(await inputs[0].isReadonly()).toBe(false); + expect(await inputs[1].isReadonly()).toBe(false); + expect(await inputs[2].isReadonly()).toBe(false); + expect(await inputs[3].isReadonly()).toBe(false); + expect(await inputs[4].isReadonly()).toBe(false); + expect(await inputs[5].isReadonly()).toBe(false); + + fixture.componentInstance.readonly = true; + + expect(await inputs[1].isReadonly()).toBe(true); + }); + + it('should be able to get required state', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + + expect(await inputs[0].isRequired()).toBe(false); + expect(await inputs[1].isRequired()).toBe(false); + expect(await inputs[2].isRequired()).toBe(false); + expect(await inputs[3].isRequired()).toBe(false); + expect(await inputs[4].isRequired()).toBe(false); + expect(await inputs[5].isRequired()).toBe(false); + + fixture.componentInstance.required = true; + + expect(await inputs[1].isRequired()).toBe(true); + }); + + it('should be able to get placeholder of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getPlaceholder()).toBe('Favorite food'); + expect(await inputs[1].getPlaceholder()).toBe(''); + expect(await inputs[2].getPlaceholder()).toBe('Leave a comment'); + expect(await inputs[3].getPlaceholder()).toBe('Native control'); + expect(await inputs[4].getPlaceholder()).toBe(''); + expect(await inputs[5].getPlaceholder()).toBe(''); + }); + + it('should be able to get type of input', async () => { + const inputs = await loader.getAllHarnesses(MatInputHarness); + expect(inputs.length).toBe(7); + expect(await inputs[0].getType()).toBe('text'); + expect(await inputs[1].getType()).toBe('number'); + expect(await inputs[2].getType()).toBe('textarea'); + expect(await inputs[3].getType()).toBe('text'); + expect(await inputs[4].getType()).toBe('textarea'); + expect(await inputs[5].getType()).toBe('text'); + + fixture.componentInstance.inputType = 'text'; + + expect(await inputs[1].getType()).toBe('text'); + }); + + it('should be able to focus input', async () => { + const input = await loader.getHarness( + MatInputHarness.with({selector: '[name="favorite-food"]'}), + ); + expect(await input.isFocused()).toBe(false); + await input.focus(); + expect(await input.isFocused()).toBe(true); + }); + + it('should be able to blur input', async () => { + const input = await loader.getHarness( + MatInputHarness.with({selector: '[name="favorite-food"]'}), + ); + expect(await input.isFocused()).toBe(false); + await input.focus(); + expect(await input.isFocused()).toBe(true); + await input.blur(); + expect(await input.isFocused()).toBe(false); + }); + + it('should be able to set the value of a control that cannot be typed in', async () => { + // We can't test this against browsers that don't support color inputs. + if (!getSupportedInputTypes().has('color')) { + return; + } + + const input = await loader.getHarness(MatInputHarness.with({selector: '#colorControl'})); + expect(await input.getValue()).toBe('#000000'); // Color inputs default to black. + await input.setValue('#00ff00'); + expect((await input.getValue()).toLowerCase()).toBe('#00ff00'); + }); }); + +@Component({ + template: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `, +}) +class InputHarnessTest { + inputType = 'number'; + readonly = false; + disabled = false; + required = false; + ngModelValue = ''; + ngModelName = 'has-ng-model'; +} diff --git a/src/material/input/testing/native-select-harness.spec.ts b/src/material/input/testing/native-select-harness.spec.ts index 3ea1c2881365..1684cf6ad9b5 100644 --- a/src/material/input/testing/native-select-harness.spec.ts +++ b/src/material/input/testing/native-select-harness.spec.ts @@ -1,7 +1,230 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormsModule} from '@angular/forms'; import {MatInputModule} from '@angular/material/input'; -import {runNativeSelectHarnessTests} from './shared-native-select.spec'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatNativeSelectHarness} from './native-select-harness'; -describe('MDC-based MatNativeSelectHarness', () => { - runNativeSelectHarnessTests(MatInputModule, MatNativeSelectHarness); +describe('MatNativeSelectHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [NoopAnimationsModule, MatInputModule, FormsModule], + declarations: [SelectHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(SelectHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all select harnesses', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + expect(selects.length).toBe(2); + }); + + it('should get the id of a select', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + expect(await parallel(() => selects.map(select => select.getId()))).toEqual(['food', 'drink']); + }); + + it('should get the name of a select', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + + expect(await parallel(() => selects.map(select => select.getName()))).toEqual([ + 'favorite-food', + 'favorite-drink', + ]); + }); + + it('should get whether a select is disabled', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + expect( + await parallel(() => { + return selects.map(select => select.isDisabled()); + }), + ).toEqual([false, false]); + + fixture.componentInstance.favoriteDrinkDisabled = true; + expect(await parallel(() => selects.map(select => select.isDisabled()))).toEqual([false, true]); + }); + + it('should get whether the select is in multi-selection mode', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + expect(await parallel(() => selects.map(select => select.isMultiple()))).toEqual([false, true]); + }); + + it('should get whether a select is required', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + expect( + await parallel(() => { + return selects.map(select => select.isRequired()); + }), + ).toEqual([false, false]); + + fixture.componentInstance.favoriteFoodRequired = true; + expect(await parallel(() => selects.map(select => select.isRequired()))).toEqual([true, false]); + }); + + it('should be able to focus a select', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + expect(await select.isFocused()).toBe(false); + await select.focus(); + expect(await select.isFocused()).toBe(true); + }); + + it('should be able to blur a select', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + expect(await select.isFocused()).toBe(false); + await select.focus(); + expect(await select.isFocused()).toBe(true); + await select.blur(); + expect(await select.isFocused()).toBe(false); + }); + + it('should get the options of a select', async () => { + const selects = await loader.getAllHarnesses(MatNativeSelectHarness); + const options = await parallel(() => selects.map(select => select.getOptions())); + + expect(options.length).toBe(2); + expect(options[0].length).toBe(3); + expect(options[1].length).toBe(4); + }); + + it('should select an option inside of a single-selection select', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + expect(fixture.componentInstance.favoriteFood).toBeFalsy(); + + await select.selectOptions({text: 'Ramen'}); + expect(fixture.componentInstance.favoriteFood).toBe('ramen'); + }); + + it('should select an option inside of a multi-selection select', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); + expect(fixture.componentInstance.favoriteDrink).toEqual([]); + + await select.selectOptions({text: /Water|Juice/}); + expect(fixture.componentInstance.favoriteDrink).toEqual(['water', 'juice']); + }); + + it('should get the text of select options', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); + const options = await select.getOptions(); + + expect(await parallel(() => options.map(option => option.getText()))).toEqual([ + 'Water', + 'Soda', + 'Coffee', + 'Juice', + ]); + }); + + it('should get the index of select options', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + const options = await select.getOptions(); + + expect(await parallel(() => options.map(option => option.getIndex()))).toEqual([0, 1, 2]); + }); + + it('should get the disabled state of select options', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + const options = await select.getOptions(); + + expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ + false, + false, + false, + ]); + + fixture.componentInstance.pastaDisabled = true; + + expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ + false, + true, + false, + ]); + }); + + it('should get the selected state of an option in a single-selection list', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#food'})); + const options = await select.getOptions(); + + expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ + false, + false, + false, + ]); + + await select.selectOptions({index: 2}); + + expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ + false, + false, + true, + ]); + }); + + it('should get the selected state of an option in a multi-selection list', async () => { + const select = await loader.getHarness(MatNativeSelectHarness.with({selector: '#drink'})); + const options = await select.getOptions(); + + expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ + false, + false, + false, + false, + ]); + + await select.selectOptions({text: /Water|Coffee/}); + + expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ + true, + false, + true, + false, + ]); + }); }); + +@Component({ + template: ` + + + + + + + + `, +}) +class SelectHarnessTest { + favoriteFood: string; + favoriteDrink: string[] = []; + favoriteFoodRequired = false; + favoriteDrinkDisabled = false; + pastaDisabled = false; +} diff --git a/src/material/input/testing/shared-input.spec.ts b/src/material/input/testing/shared-input.spec.ts deleted file mode 100644 index e51383ed0ffa..000000000000 --- a/src/material/input/testing/shared-input.spec.ts +++ /dev/null @@ -1,275 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormsModule} from '@angular/forms'; -import {MatInputModule} from '@angular/material/input'; -import {getSupportedInputTypes} from '@angular/cdk/platform'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatInputHarness} from './input-harness'; - -/** Shared tests to run on both the original and MDC-based input's. */ -export function runInputHarnessTests( - inputModule: typeof MatInputModule, - inputHarness: typeof MatInputHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, inputModule, FormsModule], - declarations: [InputHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(InputHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all input harnesses', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - }); - - it('should load input with specific id', async () => { - const inputs = await loader.getAllHarnesses(inputHarness.with({selector: '#myTextarea'})); - expect(inputs.length).toBe(1); - }); - - it('should load input with specific name', async () => { - const inputs = await loader.getAllHarnesses( - inputHarness.with({selector: '[name="favorite-food"]'}), - ); - expect(inputs.length).toBe(1); - }); - - it('should load input with a specific value', async () => { - const inputs = await loader.getAllHarnesses(inputHarness.with({value: 'Sushi'})); - expect(inputs.length).toBe(1); - }); - - it('should load input with a value that matches a regex', async () => { - const inputs = await loader.getAllHarnesses(inputHarness.with({value: /shi$/})); - expect(inputs.length).toBe(1); - expect(await inputs[0].getValue()).toBe('Sushi'); - }); - - it('should load input with a specific placeholder', async () => { - const inputs = await loader.getAllHarnesses(inputHarness.with({placeholder: 'Favorite food'})); - expect(inputs.length).toBe(1); - }); - - it('should load input with a placeholder that matches a regex', async () => { - const inputs = await loader.getAllHarnesses(inputHarness.with({placeholder: / food$/})); - expect(inputs.length).toBe(1); - expect(await inputs[0].getPlaceholder()).toBe('Favorite food'); - }); - - it('should be able to get id of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getId()).toMatch(/mat-input-\d+/); - expect(await inputs[1].getId()).toMatch(/mat-input-\d+/); - expect(await inputs[2].getId()).toBe('myTextarea'); - expect(await inputs[3].getId()).toBe('nativeControl'); - expect(await inputs[4].getId()).toMatch(/mat-input-\d+/); - expect(await inputs[5].getId()).toBe('has-ng-model'); - }); - - it('should be able to get name of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getName()).toBe('favorite-food'); - expect(await inputs[1].getName()).toBe(''); - expect(await inputs[2].getName()).toBe(''); - expect(await inputs[3].getName()).toBe(''); - expect(await inputs[4].getName()).toBe(''); - expect(await inputs[5].getName()).toBe('has-ng-model'); - }); - - it('should be able to get value of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getValue()).toBe('Sushi'); - expect(await inputs[1].getValue()).toBe(''); - expect(await inputs[2].getValue()).toBe(''); - expect(await inputs[3].getValue()).toBe(''); - expect(await inputs[4].getValue()).toBe(''); - expect(await inputs[5].getValue()).toBe(''); - }); - - it('should be able to set value of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getValue()).toBe('Sushi'); - expect(await inputs[1].getValue()).toBe(''); - expect(await inputs[3].getValue()).toBe(''); - expect(await inputs[4].getValue()).toBe(''); - - await inputs[0].setValue(''); - await inputs[2].setValue('new-value'); - await inputs[3].setValue('new-value'); - await inputs[4].setValue('new-value'); - - expect(await inputs[0].getValue()).toBe(''); - expect(await inputs[2].getValue()).toBe('new-value'); - expect(await inputs[3].getValue()).toBe('new-value'); - expect(await inputs[4].getValue()).toBe('new-value'); - }); - - it('should be able to get disabled state', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - - expect(await inputs[0].isDisabled()).toBe(false); - expect(await inputs[1].isDisabled()).toBe(false); - expect(await inputs[2].isDisabled()).toBe(false); - expect(await inputs[3].isDisabled()).toBe(false); - expect(await inputs[4].isDisabled()).toBe(false); - expect(await inputs[5].isDisabled()).toBe(false); - - fixture.componentInstance.disabled = true; - - expect(await inputs[1].isDisabled()).toBe(true); - }); - - it('should be able to get readonly state', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - - expect(await inputs[0].isReadonly()).toBe(false); - expect(await inputs[1].isReadonly()).toBe(false); - expect(await inputs[2].isReadonly()).toBe(false); - expect(await inputs[3].isReadonly()).toBe(false); - expect(await inputs[4].isReadonly()).toBe(false); - expect(await inputs[5].isReadonly()).toBe(false); - - fixture.componentInstance.readonly = true; - - expect(await inputs[1].isReadonly()).toBe(true); - }); - - it('should be able to get required state', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - - expect(await inputs[0].isRequired()).toBe(false); - expect(await inputs[1].isRequired()).toBe(false); - expect(await inputs[2].isRequired()).toBe(false); - expect(await inputs[3].isRequired()).toBe(false); - expect(await inputs[4].isRequired()).toBe(false); - expect(await inputs[5].isRequired()).toBe(false); - - fixture.componentInstance.required = true; - - expect(await inputs[1].isRequired()).toBe(true); - }); - - it('should be able to get placeholder of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getPlaceholder()).toBe('Favorite food'); - expect(await inputs[1].getPlaceholder()).toBe(''); - expect(await inputs[2].getPlaceholder()).toBe('Leave a comment'); - expect(await inputs[3].getPlaceholder()).toBe('Native control'); - expect(await inputs[4].getPlaceholder()).toBe(''); - expect(await inputs[5].getPlaceholder()).toBe(''); - }); - - it('should be able to get type of input', async () => { - const inputs = await loader.getAllHarnesses(inputHarness); - expect(inputs.length).toBe(7); - expect(await inputs[0].getType()).toBe('text'); - expect(await inputs[1].getType()).toBe('number'); - expect(await inputs[2].getType()).toBe('textarea'); - expect(await inputs[3].getType()).toBe('text'); - expect(await inputs[4].getType()).toBe('textarea'); - expect(await inputs[5].getType()).toBe('text'); - - fixture.componentInstance.inputType = 'text'; - - expect(await inputs[1].getType()).toBe('text'); - }); - - it('should be able to focus input', async () => { - const input = await loader.getHarness(inputHarness.with({selector: '[name="favorite-food"]'})); - expect(await input.isFocused()).toBe(false); - await input.focus(); - expect(await input.isFocused()).toBe(true); - }); - - it('should be able to blur input', async () => { - const input = await loader.getHarness(inputHarness.with({selector: '[name="favorite-food"]'})); - expect(await input.isFocused()).toBe(false); - await input.focus(); - expect(await input.isFocused()).toBe(true); - await input.blur(); - expect(await input.isFocused()).toBe(false); - }); - - it('should be able to set the value of a control that cannot be typed in', async () => { - // We can't test this against browsers that don't support color inputs. - if (!getSupportedInputTypes().has('color')) { - return; - } - - const input = await loader.getHarness(inputHarness.with({selector: '#colorControl'})); - expect(await input.getValue()).toBe('#000000'); // Color inputs default to black. - await input.setValue('#00ff00'); - expect((await input.getValue()).toLowerCase()).toBe('#00ff00'); - }); -} - -@Component({ - template: ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - `, -}) -class InputHarnessTest { - inputType = 'number'; - readonly = false; - disabled = false; - required = false; - ngModelValue = ''; - ngModelName = 'has-ng-model'; -} diff --git a/src/material/input/testing/shared-native-select.spec.ts b/src/material/input/testing/shared-native-select.spec.ts deleted file mode 100644 index 75f5287680fe..000000000000 --- a/src/material/input/testing/shared-native-select.spec.ts +++ /dev/null @@ -1,234 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormsModule} from '@angular/forms'; -import {MatInputModule} from '@angular/material/input'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatNativeSelectHarness} from './native-select-harness'; - -/** Shared tests to run on both the original and MDC-based native selects. */ -export function runNativeSelectHarnessTests( - inputModule: typeof MatInputModule, - selectHarness: typeof MatNativeSelectHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, inputModule, FormsModule], - declarations: [SelectHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SelectHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all select harnesses', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect(selects.length).toBe(2); - }); - - it('should get the id of a select', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect(await parallel(() => selects.map(select => select.getId()))).toEqual(['food', 'drink']); - }); - - it('should get the name of a select', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - - expect(await parallel(() => selects.map(select => select.getName()))).toEqual([ - 'favorite-food', - 'favorite-drink', - ]); - }); - - it('should get whether a select is disabled', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect( - await parallel(() => { - return selects.map(select => select.isDisabled()); - }), - ).toEqual([false, false]); - - fixture.componentInstance.favoriteDrinkDisabled = true; - expect(await parallel(() => selects.map(select => select.isDisabled()))).toEqual([false, true]); - }); - - it('should get whether the select is in multi-selection mode', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect(await parallel(() => selects.map(select => select.isMultiple()))).toEqual([false, true]); - }); - - it('should get whether a select is required', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect( - await parallel(() => { - return selects.map(select => select.isRequired()); - }), - ).toEqual([false, false]); - - fixture.componentInstance.favoriteFoodRequired = true; - expect(await parallel(() => selects.map(select => select.isRequired()))).toEqual([true, false]); - }); - - it('should be able to focus a select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - expect(await select.isFocused()).toBe(false); - await select.focus(); - expect(await select.isFocused()).toBe(true); - }); - - it('should be able to blur a select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - expect(await select.isFocused()).toBe(false); - await select.focus(); - expect(await select.isFocused()).toBe(true); - await select.blur(); - expect(await select.isFocused()).toBe(false); - }); - - it('should get the options of a select', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - const options = await parallel(() => selects.map(select => select.getOptions())); - - expect(options.length).toBe(2); - expect(options[0].length).toBe(3); - expect(options[1].length).toBe(4); - }); - - it('should select an option inside of a single-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - expect(fixture.componentInstance.favoriteFood).toBeFalsy(); - - await select.selectOptions({text: 'Ramen'}); - expect(fixture.componentInstance.favoriteFood).toBe('ramen'); - }); - - it('should select an option inside of a multi-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#drink'})); - expect(fixture.componentInstance.favoriteDrink).toEqual([]); - - await select.selectOptions({text: /Water|Juice/}); - expect(fixture.componentInstance.favoriteDrink).toEqual(['water', 'juice']); - }); - - it('should get the text of select options', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#drink'})); - const options = await select.getOptions(); - - expect(await parallel(() => options.map(option => option.getText()))).toEqual([ - 'Water', - 'Soda', - 'Coffee', - 'Juice', - ]); - }); - - it('should get the index of select options', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - const options = await select.getOptions(); - - expect(await parallel(() => options.map(option => option.getIndex()))).toEqual([0, 1, 2]); - }); - - it('should get the disabled state of select options', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - const options = await select.getOptions(); - - expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ - false, - false, - false, - ]); - - fixture.componentInstance.pastaDisabled = true; - - expect(await parallel(() => options.map(option => option.isDisabled()))).toEqual([ - false, - true, - false, - ]); - }); - - it('should get the selected state of an option in a single-selection list', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#food'})); - const options = await select.getOptions(); - - expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ - false, - false, - false, - ]); - - await select.selectOptions({index: 2}); - - expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ - false, - false, - true, - ]); - }); - - it('should get the selected state of an option in a multi-selection list', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#drink'})); - const options = await select.getOptions(); - - expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ - false, - false, - false, - false, - ]); - - await select.selectOptions({text: /Water|Coffee/}); - - expect(await parallel(() => options.map(option => option.isSelected()))).toEqual([ - true, - false, - true, - false, - ]); - }); -} - -@Component({ - template: ` - - - - - - - - `, -}) -class SelectHarnessTest { - favoriteFood: string; - favoriteDrink: string[] = []; - favoriteFoodRequired = false; - favoriteDrinkDisabled = false; - pastaDisabled = false; -} diff --git a/src/material/list/_list-theme.scss b/src/material/list/_list-theme.scss index 2335395f21c5..b8778dd8c706 100644 --- a/src/material/list/_list-theme.scss +++ b/src/material/list/_list-theme.scss @@ -12,7 +12,7 @@ @use '../core/tokens/m2/mdc/list' as tokens-mdc-list; @use '../core/typography/typography'; -@mixin base($config-or-theme) { +@mixin base($theme) { // Add default values for tokens not related to color, typography, or density. @include sass-utils.current-selector-or-root() { @include mdc-list-theme.theme(tokens-mdc-list.get-unthemable-tokens()); @@ -23,7 +23,7 @@ $mdc-list-color-tokens: tokens-mdc-list.get-color-tokens($theme); // Add values for MDC list tokens. - .mat-mdc-list-base { + @include sass-utils.current-selector-or-root() { @include mdc-list-theme.theme($mdc-list-color-tokens); } @@ -79,7 +79,7 @@ $mdc-list-density-tokens: tokens-mdc-list.get-density-tokens($theme); // Add values for MDC list tokens. - .mat-mdc-list-base { + @include sass-utils.current-selector-or-root() { @include mdc-list-theme.theme($mdc-list-density-tokens); } @@ -119,7 +119,7 @@ $mdc-list-typography-tokens: tokens-mdc-list.get-typography-tokens($theme); // Add values for MDC list tokens. - .mat-mdc-list-base { + @include sass-utils.current-selector-or-root() { @include mdc-list-theme.theme($mdc-list-typography-tokens); } diff --git a/src/material/list/testing/BUILD.bazel b/src/material/list/testing/BUILD.bazel index 3722a05485eb..4785b41e2bbe 100644 --- a/src/material/list/testing/BUILD.bazel +++ b/src/material/list/testing/BUILD.bazel @@ -23,10 +23,7 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", diff --git a/src/material/menu/_menu-theme.scss b/src/material/menu/_menu-theme.scss index bc0d4fe382f5..7d1213f1e4dc 100644 --- a/src/material/menu/_menu-theme.scss +++ b/src/material/menu/_menu-theme.scss @@ -2,44 +2,35 @@ @use '../core/style/sass-utils'; @use '../core/tokens/token-utils'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; - -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-menu.$prefix, - tokens-mat-menu.get-color-tokens($config)); + tokens-mat-menu.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-menu.$prefix, - tokens-mat-menu.get-typography-tokens($config)); + tokens-mat-menu.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-menu') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/menu/testing/BUILD.bazel b/src/material/menu/testing/BUILD.bazel index a23177ef37d1..9e14545e5dcd 100644 --- a/src/material/menu/testing/BUILD.bazel +++ b/src/material/menu/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/overlay", @@ -33,19 +33,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/menu", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [ diff --git a/src/material/menu/testing/menu-harness.spec.ts b/src/material/menu/testing/menu-harness.spec.ts index df3d4f2f578d..8b56bc98506d 100644 --- a/src/material/menu/testing/menu-harness.spec.ts +++ b/src/material/menu/testing/menu-harness.spec.ts @@ -1,7 +1,196 @@ -import {runHarnessTests} from '@angular/material/menu/testing/shared.spec'; -import {MatMenuModule} from '../index'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatMenuModule} from '@angular/material/menu'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatMenuHarness} from './menu-harness'; -describe('MDC-based MatMenuHarness', () => { - runHarnessTests(MatMenuModule, MatMenuHarness); +describe('MatMenuHarness', () => { + describe('single-level menu', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatMenuModule, NoopAnimationsModule], + declarations: [MenuHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(MenuHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all menu harnesses', async () => { + const menues = await loader.getAllHarnesses(MatMenuHarness); + expect(menues.length).toBe(2); + }); + + it('should load menu with exact text', async () => { + const menus = await loader.getAllHarnesses(MatMenuHarness.with({triggerText: 'Settings'})); + expect(menus.length).toBe(1); + expect(await menus[0].getTriggerText()).toBe('Settings'); + }); + + it('should load menu with regex label match', async () => { + const menus = await loader.getAllHarnesses(MatMenuHarness.with({triggerText: /settings/i})); + expect(menus.length).toBe(1); + expect(await menus[0].getTriggerText()).toBe('Settings'); + }); + + it('should get disabled state', async () => { + const [enabledMenu, disabledMenu] = await loader.getAllHarnesses(MatMenuHarness); + expect(await enabledMenu.isDisabled()).toBe(false); + expect(await disabledMenu.isDisabled()).toBe(true); + }); + + it('should get menu text', async () => { + const [firstMenu, secondMenu] = await loader.getAllHarnesses(MatMenuHarness); + expect(await firstMenu.getTriggerText()).toBe('Settings'); + expect(await secondMenu.getTriggerText()).toBe('Disabled menu'); + }); + + it('should focus and blur a menu', async () => { + const menu = await loader.getHarness(MatMenuHarness.with({triggerText: 'Settings'})); + expect(await menu.isFocused()).toBe(false); + await menu.focus(); + expect(await menu.isFocused()).toBe(true); + await menu.blur(); + expect(await menu.isFocused()).toBe(false); + }); + + it('should open and close', async () => { + const menu = await loader.getHarness(MatMenuHarness.with({triggerText: 'Settings'})); + expect(await menu.isOpen()).toBe(false); + await menu.open(); + expect(await menu.isOpen()).toBe(true); + await menu.open(); + expect(await menu.isOpen()).toBe(true); + await menu.close(); + expect(await menu.isOpen()).toBe(false); + await menu.close(); + expect(await menu.isOpen()).toBe(false); + }); + + it('should get all items', async () => { + const menu = await loader.getHarness(MatMenuHarness.with({triggerText: 'Settings'})); + await menu.open(); + expect((await menu.getItems()).length).toBe(2); + }); + + it('should get filtered items', async () => { + const menu = await loader.getHarness(MatMenuHarness.with({triggerText: 'Settings'})); + await menu.open(); + const items = await menu.getItems({text: 'Account'}); + expect(items.length).toBe(1); + expect(await items[0].getText()).toBe('Account'); + }); + }); + + describe('multi-level menu', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatMenuModule, NoopAnimationsModule], + declarations: [NestedMenuHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(NestedMenuHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should get submenus', async () => { + const menu1 = await loader.getHarness(MatMenuHarness.with({triggerText: 'Menu 1'})); + + await menu1.open(); + let submenus = await menu1.getItems({hasSubmenu: true}); + expect(submenus.length).toBe(2); + const menu2 = (await submenus[0].getSubmenu())!; + const menu3 = (await submenus[1].getSubmenu())!; + expect(await menu2.getTriggerText()).toBe('Menu 2'); + expect(await menu3.getTriggerText()).toBe('Menu 3'); + + await menu2.open(); + expect((await menu2.getItems({hasSubmenu: true})).length).toBe(0); + + await menu3.open(); + submenus = await menu3.getItems({hasSubmenu: true}); + expect(submenus.length).toBe(1); + const menu4 = (await submenus[0].getSubmenu())!; + expect(await menu4.getTriggerText()).toBe('Menu 4'); + + await menu4.open(); + expect((await menu4.getItems({hasSubmenu: true})).length).toBe(0); + }); + + it('should select item in top-level menu', async () => { + const menu1 = await loader.getHarness(MatMenuHarness.with({triggerText: 'Menu 1'})); + await menu1.clickItem({text: /Leaf/}); + expect(fixture.componentInstance.lastClickedLeaf).toBe(1); + }); + + it('should throw when item is not found', async () => { + const menu1 = await loader.getHarness(MatMenuHarness.with({triggerText: 'Menu 1'})); + await expectAsync(menu1.clickItem({text: 'Fake Item'})).toBeRejectedWithError( + /Could not find item matching {"text":"Fake Item"}/, + ); + }); + + it('should select item in nested menu', async () => { + const menu1 = await loader.getHarness(MatMenuHarness.with({triggerText: 'Menu 1'})); + await menu1.clickItem({text: 'Menu 3'}, {text: 'Menu 4'}, {text: /Leaf/}); + expect(fixture.componentInstance.lastClickedLeaf).toBe(3); + }); + + it('should throw when intermediate item does not have submenu', async () => { + const menu1 = await loader.getHarness(MatMenuHarness.with({triggerText: 'Menu 1'})); + await expectAsync(menu1.clickItem({text: 'Leaf Item 1'}, {})).toBeRejectedWithError( + /Item matching {"text":"Leaf Item 1"} does not have a submenu/, + ); + }); + }); }); + +@Component({ + template: ` + + + + + Profile + Account + + `, +}) +class MenuHarnessTest {} + +@Component({ + template: ` + + + + + + + + + + + + + + + + + + + + `, +}) +class NestedMenuHarnessTest { + lastClickedLeaf = 0; +} diff --git a/src/material/menu/testing/shared.spec.ts b/src/material/menu/testing/shared.spec.ts deleted file mode 100644 index 366b02feae89..000000000000 --- a/src/material/menu/testing/shared.spec.ts +++ /dev/null @@ -1,200 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatMenuModule} from '@angular/material/menu'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatMenuHarness} from './menu-harness'; - -/** Shared tests to run on both the original and MDC-based menues. */ -export function runHarnessTests( - menuModule: typeof MatMenuModule, - menuHarness: typeof MatMenuHarness, -) { - describe('single-level menu', () => { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [menuModule, NoopAnimationsModule], - declarations: [MenuHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(MenuHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all menu harnesses', async () => { - const menues = await loader.getAllHarnesses(menuHarness); - expect(menues.length).toBe(2); - }); - - it('should load menu with exact text', async () => { - const menus = await loader.getAllHarnesses(menuHarness.with({triggerText: 'Settings'})); - expect(menus.length).toBe(1); - expect(await menus[0].getTriggerText()).toBe('Settings'); - }); - - it('should load menu with regex label match', async () => { - const menus = await loader.getAllHarnesses(menuHarness.with({triggerText: /settings/i})); - expect(menus.length).toBe(1); - expect(await menus[0].getTriggerText()).toBe('Settings'); - }); - - it('should get disabled state', async () => { - const [enabledMenu, disabledMenu] = await loader.getAllHarnesses(menuHarness); - expect(await enabledMenu.isDisabled()).toBe(false); - expect(await disabledMenu.isDisabled()).toBe(true); - }); - - it('should get menu text', async () => { - const [firstMenu, secondMenu] = await loader.getAllHarnesses(menuHarness); - expect(await firstMenu.getTriggerText()).toBe('Settings'); - expect(await secondMenu.getTriggerText()).toBe('Disabled menu'); - }); - - it('should focus and blur a menu', async () => { - const menu = await loader.getHarness(menuHarness.with({triggerText: 'Settings'})); - expect(await menu.isFocused()).toBe(false); - await menu.focus(); - expect(await menu.isFocused()).toBe(true); - await menu.blur(); - expect(await menu.isFocused()).toBe(false); - }); - - it('should open and close', async () => { - const menu = await loader.getHarness(menuHarness.with({triggerText: 'Settings'})); - expect(await menu.isOpen()).toBe(false); - await menu.open(); - expect(await menu.isOpen()).toBe(true); - await menu.open(); - expect(await menu.isOpen()).toBe(true); - await menu.close(); - expect(await menu.isOpen()).toBe(false); - await menu.close(); - expect(await menu.isOpen()).toBe(false); - }); - - it('should get all items', async () => { - const menu = await loader.getHarness(menuHarness.with({triggerText: 'Settings'})); - await menu.open(); - expect((await menu.getItems()).length).toBe(2); - }); - - it('should get filtered items', async () => { - const menu = await loader.getHarness(menuHarness.with({triggerText: 'Settings'})); - await menu.open(); - const items = await menu.getItems({text: 'Account'}); - expect(items.length).toBe(1); - expect(await items[0].getText()).toBe('Account'); - }); - }); - - describe('multi-level menu', () => { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [menuModule, NoopAnimationsModule], - declarations: [NestedMenuHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(NestedMenuHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should get submenus', async () => { - const menu1 = await loader.getHarness(menuHarness.with({triggerText: 'Menu 1'})); - - await menu1.open(); - let submenus = await menu1.getItems({hasSubmenu: true}); - expect(submenus.length).toBe(2); - const menu2 = (await submenus[0].getSubmenu())!; - const menu3 = (await submenus[1].getSubmenu())!; - expect(await menu2.getTriggerText()).toBe('Menu 2'); - expect(await menu3.getTriggerText()).toBe('Menu 3'); - - await menu2.open(); - expect((await menu2.getItems({hasSubmenu: true})).length).toBe(0); - - await menu3.open(); - submenus = await menu3.getItems({hasSubmenu: true}); - expect(submenus.length).toBe(1); - const menu4 = (await submenus[0].getSubmenu())!; - expect(await menu4.getTriggerText()).toBe('Menu 4'); - - await menu4.open(); - expect((await menu4.getItems({hasSubmenu: true})).length).toBe(0); - }); - - it('should select item in top-level menu', async () => { - const menu1 = await loader.getHarness(menuHarness.with({triggerText: 'Menu 1'})); - await menu1.clickItem({text: /Leaf/}); - expect(fixture.componentInstance.lastClickedLeaf).toBe(1); - }); - - it('should throw when item is not found', async () => { - const menu1 = await loader.getHarness(menuHarness.with({triggerText: 'Menu 1'})); - await expectAsync(menu1.clickItem({text: 'Fake Item'})).toBeRejectedWithError( - /Could not find item matching {"text":"Fake Item"}/, - ); - }); - - it('should select item in nested menu', async () => { - const menu1 = await loader.getHarness(menuHarness.with({triggerText: 'Menu 1'})); - await menu1.clickItem({text: 'Menu 3'}, {text: 'Menu 4'}, {text: /Leaf/}); - expect(fixture.componentInstance.lastClickedLeaf).toBe(3); - }); - - it('should throw when intermediate item does not have submenu', async () => { - const menu1 = await loader.getHarness(menuHarness.with({triggerText: 'Menu 1'})); - await expectAsync(menu1.clickItem({text: 'Leaf Item 1'}, {})).toBeRejectedWithError( - /Item matching {"text":"Leaf Item 1"} does not have a submenu/, - ); - }); - }); -} - -@Component({ - template: ` - - - - - Profile - Account - - `, -}) -class MenuHarnessTest {} - -@Component({ - template: ` - - - - - - - - - - - - - - - - - - - - `, -}) -class NestedMenuHarnessTest { - lastClickedLeaf = 0; -} diff --git a/src/material/paginator/testing/BUILD.bazel b/src/material/paginator/testing/BUILD.bazel index fd6e06d93552..02cf24b62d46 100644 --- a/src/material/paginator/testing/BUILD.bazel +++ b/src/material/paginator/testing/BUILD.bazel @@ -17,20 +17,7 @@ ts_library( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/paginator", - ], -) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", diff --git a/src/material/paginator/testing/paginator-harness.spec.ts b/src/material/paginator/testing/paginator-harness.spec.ts index 3784eb1d0a2b..fa5c25959402 100644 --- a/src/material/paginator/testing/paginator-harness.spec.ts +++ b/src/material/paginator/testing/paginator-harness.spec.ts @@ -1,7 +1,154 @@ -import {MatPaginatorModule} from '@angular/material/paginator'; -import {runHarnessTests} from './shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {MatPaginatorModule, PageEvent} from '@angular/material/paginator'; import {MatPaginatorHarness} from './paginator-harness'; -describe('MDC-based MatPaginatorHarness', () => { - runHarnessTests(MatPaginatorModule, MatPaginatorHarness as any); +describe('MatPaginatorHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + let instance: PaginatorHarnessTest; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatPaginatorModule, NoopAnimationsModule], + declarations: [PaginatorHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(PaginatorHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + instance = fixture.componentInstance; + }); + + it('should load all paginator harnesses', async () => { + const paginators = await loader.getAllHarnesses(MatPaginatorHarness); + expect(paginators.length).toBe(1); + }); + + it('should be able to go to the next page', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + expect(instance.pageIndex).toBe(0); + await paginator.goToNextPage(); + expect(instance.pageIndex).toBe(1); + }); + + it('should be able to go to the previous page', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + instance.pageIndex = 5; + fixture.detectChanges(); + + await paginator.goToPreviousPage(); + expect(instance.pageIndex).toBe(4); + }); + + it('should be able to go to the first page', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + instance.pageIndex = 5; + fixture.detectChanges(); + + await paginator.goToFirstPage(); + expect(instance.pageIndex).toBe(0); + }); + + it('should be able to go to the last page', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + expect(instance.pageIndex).toBe(0); + await paginator.goToLastPage(); + expect(instance.pageIndex).toBe(49); + }); + + it('should be able to set the page size', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + expect(instance.pageSize).toBe(10); + await paginator.setPageSize(25); + expect(instance.pageSize).toBe(25); + }); + + it('should be able to get the page size', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + expect(await paginator.getPageSize()).toBe(10); + }); + + it('should be able to get the range label', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + expect(await paginator.getRangeLabel()).toBe('1 – 10 of 500'); + }); + + it('should throw an error if the first page button is not available', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + instance.showFirstLastButtons = false; + fixture.detectChanges(); + + await expectAsync(paginator.goToFirstPage()).toBeRejectedWithError( + /Could not find first page button inside paginator/, + ); + }); + + it('should return whether or not the previous page is disabled', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + expect(await paginator.isPreviousPageDisabled()).toBe(true); + }); + + it('should return whether or not the next page is disabled', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + await paginator.goToLastPage(); + expect(await paginator.isNextPageDisabled()).toBe(true); + }); + + it('should throw an error if the last page button is not available', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + instance.showFirstLastButtons = false; + fixture.detectChanges(); + + await expectAsync(paginator.goToLastPage()).toBeRejectedWithError( + /Could not find last page button inside paginator/, + ); + }); + + it('should throw an error if the page size selector is not available', async () => { + const paginator = await loader.getHarness(MatPaginatorHarness); + + instance.pageSizeOptions = []; + fixture.detectChanges(); + + await expectAsync(paginator.setPageSize(10)).toBeRejectedWithError( + /Cannot find page size selector in paginator/, + ); + }); }); + +@Component({ + template: ` + + + `, +}) +class PaginatorHarnessTest { + length = 500; + pageSize = 10; + pageIndex = 0; + pageSizeOptions = [5, 10, 25]; + showFirstLastButtons = true; + + handlePageEvent(event: PageEvent) { + this.length = event.length; + this.pageSize = event.pageSize; + this.pageIndex = event.pageIndex; + } +} diff --git a/src/material/paginator/testing/shared.spec.ts b/src/material/paginator/testing/shared.spec.ts deleted file mode 100644 index 1d30165eb144..000000000000 --- a/src/material/paginator/testing/shared.spec.ts +++ /dev/null @@ -1,158 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatPaginatorModule, PageEvent} from '@angular/material/paginator'; -import {MatPaginatorHarness} from './paginator-harness'; - -/** Shared tests to run on both the original and MDC-based paginator. */ -export function runHarnessTests( - paginatorModule: typeof MatPaginatorModule, - paginatorHarness: typeof MatPaginatorHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - let instance: PaginatorHarnessTest; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [paginatorModule, NoopAnimationsModule], - declarations: [PaginatorHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(PaginatorHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - instance = fixture.componentInstance; - }); - - it('should load all paginator harnesses', async () => { - const paginators = await loader.getAllHarnesses(paginatorHarness); - expect(paginators.length).toBe(1); - }); - - it('should be able to go to the next page', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - expect(instance.pageIndex).toBe(0); - await paginator.goToNextPage(); - expect(instance.pageIndex).toBe(1); - }); - - it('should be able to go to the previous page', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - instance.pageIndex = 5; - fixture.detectChanges(); - - await paginator.goToPreviousPage(); - expect(instance.pageIndex).toBe(4); - }); - - it('should be able to go to the first page', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - instance.pageIndex = 5; - fixture.detectChanges(); - - await paginator.goToFirstPage(); - expect(instance.pageIndex).toBe(0); - }); - - it('should be able to go to the last page', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - expect(instance.pageIndex).toBe(0); - await paginator.goToLastPage(); - expect(instance.pageIndex).toBe(49); - }); - - it('should be able to set the page size', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - expect(instance.pageSize).toBe(10); - await paginator.setPageSize(25); - expect(instance.pageSize).toBe(25); - }); - - it('should be able to get the page size', async () => { - const paginator = await loader.getHarness(paginatorHarness); - expect(await paginator.getPageSize()).toBe(10); - }); - - it('should be able to get the range label', async () => { - const paginator = await loader.getHarness(paginatorHarness); - expect(await paginator.getRangeLabel()).toBe('1 – 10 of 500'); - }); - - it('should throw an error if the first page button is not available', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - instance.showFirstLastButtons = false; - fixture.detectChanges(); - - await expectAsync(paginator.goToFirstPage()).toBeRejectedWithError( - /Could not find first page button inside paginator/, - ); - }); - - it('should return whether or not the previous page is disabled', async () => { - const paginator = await loader.getHarness(paginatorHarness); - expect(await paginator.isPreviousPageDisabled()).toBe(true); - }); - - it('should return whether or not the next page is disabled', async () => { - const paginator = await loader.getHarness(paginatorHarness); - await paginator.goToLastPage(); - expect(await paginator.isNextPageDisabled()).toBe(true); - }); - - it('should throw an error if the last page button is not available', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - instance.showFirstLastButtons = false; - fixture.detectChanges(); - - await expectAsync(paginator.goToLastPage()).toBeRejectedWithError( - /Could not find last page button inside paginator/, - ); - }); - - it('should throw an error if the page size selector is not available', async () => { - const paginator = await loader.getHarness(paginatorHarness); - - instance.pageSizeOptions = []; - fixture.detectChanges(); - - await expectAsync(paginator.setPageSize(10)).toBeRejectedWithError( - /Cannot find page size selector in paginator/, - ); - }); -} - -@Component({ - template: ` - - - `, -}) -class PaginatorHarnessTest { - length = 500; - pageSize = 10; - pageIndex = 0; - pageSizeOptions = [5, 10, 25]; - showFirstLastButtons = true; - - handlePageEvent(event: PageEvent) { - this.length = event.length; - this.pageSize = event.pageSize; - this.pageIndex = event.pageIndex; - } -} diff --git a/src/material/progress-bar/testing/BUILD.bazel b/src/material/progress-bar/testing/BUILD.bazel index 50be99c5925c..344c9a954598 100644 --- a/src/material/progress-bar/testing/BUILD.bazel +++ b/src/material/progress-bar/testing/BUILD.bazel @@ -15,8 +15,8 @@ ng_module( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -26,19 +26,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/progress-bar", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [ diff --git a/src/material/progress-bar/testing/progress-bar-harness.spec.ts b/src/material/progress-bar/testing/progress-bar-harness.spec.ts index fa6b489f8f73..32b60030ee11 100644 --- a/src/material/progress-bar/testing/progress-bar-harness.spec.ts +++ b/src/material/progress-bar/testing/progress-bar-harness.spec.ts @@ -1,7 +1,51 @@ -import {MatProgressBarModule} from '../index'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatProgressBarModule} from '@angular/material/progress-bar'; import {MatProgressBarHarness} from './progress-bar-harness'; -import {runHarnessTests} from '@angular/material/progress-bar/testing/shared.spec'; -describe('MDC-based MatProgressBarHarness', () => { - runHarnessTests(MatProgressBarModule, MatProgressBarHarness); +describe('MatProgressBarHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatProgressBarModule], + declarations: [ProgressBarHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ProgressBarHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all progress bar harnesses', async () => { + const progressBars = await loader.getAllHarnesses(MatProgressBarHarness); + expect(progressBars.length).toBe(2); + }); + + it('should get the value', async () => { + fixture.componentInstance.value = 50; + const [determinate, indeterminate] = await loader.getAllHarnesses(MatProgressBarHarness); + expect(await determinate.getValue()).toBe(50); + expect(await indeterminate.getValue()).toBe(null); + }); + + it('should get the mode', async () => { + const [determinate, indeterminate] = await loader.getAllHarnesses(MatProgressBarHarness); + expect(await determinate.getMode()).toBe('determinate'); + expect(await indeterminate.getMode()).toBe('indeterminate'); + }); }); + +// TODO: Add and test progress bars with modes `buffer` and `query`. +@Component({ + template: ` + + + `, +}) +class ProgressBarHarnessTest { + value: number; +} diff --git a/src/material/progress-bar/testing/shared.spec.ts b/src/material/progress-bar/testing/shared.spec.ts deleted file mode 100644 index 052285d503bc..000000000000 --- a/src/material/progress-bar/testing/shared.spec.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatProgressBarModule} from '@angular/material/progress-bar'; -import {MatProgressBarHarness} from './progress-bar-harness'; - -export function runHarnessTests( - progressBarModule: typeof MatProgressBarModule, - progressBarHarness: typeof MatProgressBarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [progressBarModule], - declarations: [ProgressBarHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ProgressBarHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all progress bar harnesses', async () => { - const progressBars = await loader.getAllHarnesses(progressBarHarness); - expect(progressBars.length).toBe(2); - }); - - it('should get the value', async () => { - fixture.componentInstance.value = 50; - const [determinate, indeterminate] = await loader.getAllHarnesses(progressBarHarness); - expect(await determinate.getValue()).toBe(50); - expect(await indeterminate.getValue()).toBe(null); - }); - - it('should get the mode', async () => { - const [determinate, indeterminate] = await loader.getAllHarnesses(progressBarHarness); - expect(await determinate.getMode()).toBe('determinate'); - expect(await indeterminate.getMode()).toBe('indeterminate'); - }); -} - -// TODO: Add and test progress bars with modes `buffer` and `query`. -@Component({ - template: ` - - - `, -}) -class ProgressBarHarnessTest { - value: number; -} diff --git a/src/material/progress-spinner/_progress-spinner-theme.scss b/src/material/progress-spinner/_progress-spinner-theme.scss index 9e229dd0708f..71edbce7de68 100644 --- a/src/material/progress-spinner/_progress-spinner-theme.scss +++ b/src/material/progress-spinner/_progress-spinner-theme.scss @@ -1,10 +1,10 @@ -@use 'sass:map'; @use '../core/style/sass-utils'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/tokens/m2/mdc/circular-progress' as tokens-mdc-circular-progress; @use '@material/circular-progress/circular-progress-theme' as mdc-circular-progress-theme; -@mixin base($config-or-theme) { +@mixin base($theme) { // Add default values for tokens not related to color, typography, or density. @include sass-utils.current-selector-or-root() { @include mdc-circular-progress-theme.theme( @@ -13,45 +13,39 @@ } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - $mdc-circular-progress-color-tokens: tokens-mdc-circular-progress.get-color-tokens($config); - @include sass-utils.current-selector-or-root() { +@mixin color($theme) { + $mdc-circular-progress-color-tokens: tokens-mdc-circular-progress.get-color-tokens($theme); + @include sass-utils.current-selector-or-root() { @include mdc-circular-progress-theme.theme($mdc-circular-progress-color-tokens); .mat-accent { - $color: theming.get-color-from-palette(map.get($config, accent)); + $color: inspection.get-theme-color($theme, accent); @include mdc-circular-progress-theme.theme((active-indicator-color: $color)); } .mat-warn { - $color: theming.get-color-from-palette(map.get($config, warn)); + $color: inspection.get-theme-color($theme, warn); @include mdc-circular-progress-theme.theme((active-indicator-color: $color)); } } } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-progress-spinner') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - @include base($theme); - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/progress-spinner/testing/BUILD.bazel b/src/material/progress-spinner/testing/BUILD.bazel index 9922b347c4f9..210f2f380c90 100644 --- a/src/material/progress-spinner/testing/BUILD.bazel +++ b/src/material/progress-spinner/testing/BUILD.bazel @@ -21,8 +21,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -32,19 +32,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/progress-spinner", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [ diff --git a/src/material/progress-spinner/testing/progress-spinner-harness.spec.ts b/src/material/progress-spinner/testing/progress-spinner-harness.spec.ts index ea15d90dadbc..13f3e72c4fcf 100644 --- a/src/material/progress-spinner/testing/progress-spinner-harness.spec.ts +++ b/src/material/progress-spinner/testing/progress-spinner-harness.spec.ts @@ -1,7 +1,57 @@ -import {runHarnessTests} from '@angular/material/progress-spinner/testing/shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; import {MatProgressSpinnerHarness} from './progress-spinner-harness'; -import {MatProgressSpinnerModule} from '../index'; -describe('MDC-based MatProgressSpinnerHarness', () => { - runHarnessTests(MatProgressSpinnerModule, MatProgressSpinnerHarness); +describe('MatProgressSpinnerHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatProgressSpinnerModule], + declarations: [ProgressSpinnerHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ProgressSpinnerHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all progress spinner harnesses', async () => { + const progressSpinners = await loader.getAllHarnesses(MatProgressSpinnerHarness); + expect(progressSpinners.length).toBe(3); + }); + + it('should get the value', async () => { + fixture.componentInstance.value = 50; + const [determinate, indeterminate, impliedIndeterminate] = await loader.getAllHarnesses( + MatProgressSpinnerHarness, + ); + expect(await determinate.getValue()).toBe(50); + expect(await indeterminate.getValue()).toBe(null); + expect(await impliedIndeterminate.getValue()).toBe(null); + }); + + it('should get the mode', async () => { + const [determinate, indeterminate, impliedIndeterminate] = await loader.getAllHarnesses( + MatProgressSpinnerHarness, + ); + expect(await determinate.getMode()).toBe('determinate'); + expect(await indeterminate.getMode()).toBe('indeterminate'); + expect(await impliedIndeterminate.getMode()).toBe('indeterminate'); + }); }); + +@Component({ + template: ` + + + + `, +}) +class ProgressSpinnerHarnessTest { + value: number; +} diff --git a/src/material/progress-spinner/testing/shared.spec.ts b/src/material/progress-spinner/testing/shared.spec.ts deleted file mode 100644 index 73aeb8aab987..000000000000 --- a/src/material/progress-spinner/testing/shared.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {MatProgressSpinnerHarness} from './progress-spinner-harness'; - -/** Runs the shared unit tests for the progress spinner test harness. */ -export function runHarnessTests( - progressSpinnerModule: typeof MatProgressSpinnerModule, - progressSpinnerHarness: typeof MatProgressSpinnerHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [progressSpinnerModule], - declarations: [ProgressSpinnerHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ProgressSpinnerHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all progress spinner harnesses', async () => { - const progressSpinners = await loader.getAllHarnesses(progressSpinnerHarness); - expect(progressSpinners.length).toBe(3); - }); - - it('should get the value', async () => { - fixture.componentInstance.value = 50; - const [determinate, indeterminate, impliedIndeterminate] = await loader.getAllHarnesses( - progressSpinnerHarness, - ); - expect(await determinate.getValue()).toBe(50); - expect(await indeterminate.getValue()).toBe(null); - expect(await impliedIndeterminate.getValue()).toBe(null); - }); - - it('should get the mode', async () => { - const [determinate, indeterminate, impliedIndeterminate] = await loader.getAllHarnesses( - progressSpinnerHarness, - ); - expect(await determinate.getMode()).toBe('determinate'); - expect(await indeterminate.getMode()).toBe('indeterminate'); - expect(await impliedIndeterminate.getMode()).toBe('indeterminate'); - }); -} - -@Component({ - template: ` - - - - `, -}) -class ProgressSpinnerHarnessTest { - value: number; -} diff --git a/src/material/radio/_radio-theme.scss b/src/material/radio/_radio-theme.scss index 36a16110a871..53cac04002e4 100644 --- a/src/material/radio/_radio-theme.scss +++ b/src/material/radio/_radio-theme.scss @@ -9,6 +9,14 @@ @use '../core/tokens/m2/mdc/radio' as tokens-mdc-radio; @use '../core/tokens/m2/mat/radio' as tokens-mat-radio; +@mixin base($theme) { + .mat-mdc-radio-button { + @include mdc-radio-theme.theme(tokens-mdc-radio.get-unthemable-tokens()); + @include token-utils.create-token-values( + tokens-mat-radio.$prefix, tokens-mat-radio.get-unthemable-tokens()); + } +} + @mixin color($theme) { @include mdc-helpers.using-mdc-theme($theme) { .mat-mdc-radio-button { @@ -62,6 +70,7 @@ @mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-radio') { + @include base($theme); @if inspection.theme-has($theme, color) { @include color($theme); } diff --git a/src/material/radio/radio.scss b/src/material/radio/radio.scss index 45ddfd680a1a..454cde988bef 100644 --- a/src/material/radio/radio.scss +++ b/src/material/radio/radio.scss @@ -17,9 +17,6 @@ @include mdc-form-field.core-styles($query: mdc-helpers.$mdc-base-styles-query); .mat-mdc-radio-button { - @include token-utils.create-token-values( - tokens-mat-radio.$prefix, tokens-mat-radio.get-unthemable-tokens()); - @include mdc-radio-theme.theme(tokens-mdc-radio.get-unthemable-tokens()); -webkit-tap-highlight-color: transparent; .mdc-radio { diff --git a/src/material/radio/testing/BUILD.bazel b/src/material/radio/testing/BUILD.bazel index c5737a28054b..858d2a668970 100644 --- a/src/material/radio/testing/BUILD.bazel +++ b/src/material/radio/testing/BUILD.bazel @@ -16,20 +16,7 @@ ts_library( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/radio", - ], -) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", diff --git a/src/material/radio/testing/radio-harness.spec.ts b/src/material/radio/testing/radio-harness.spec.ts index 363bda75b353..fc933aa27787 100644 --- a/src/material/radio/testing/radio-harness.spec.ts +++ b/src/material/radio/testing/radio-harness.spec.ts @@ -1,7 +1,305 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {ReactiveFormsModule} from '@angular/forms'; import {MatRadioModule} from '@angular/material/radio'; -import {runHarnessTests} from '@angular/material/radio/testing/shared.spec'; import {MatRadioButtonHarness, MatRadioGroupHarness} from './radio-harness'; -describe('MDC-based radio harness', () => { - runHarnessTests(MatRadioModule, MatRadioGroupHarness, MatRadioButtonHarness); +describe('radio harness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatRadioModule, ReactiveFormsModule], + declarations: [MultipleRadioButtonsHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(MultipleRadioButtonsHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + describe('MatRadioGroupHarness', () => { + it('should load all radio-group harnesses', async () => { + const groups = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(groups.length).toBe(3); + }); + + it('should load radio-group with exact id', async () => { + const groups = await loader.getAllHarnesses( + MatRadioGroupHarness.with({selector: '#my-group-2'}), + ); + expect(groups.length).toBe(1); + }); + + it('should load radio-group by name', async () => { + let groups = await loader.getAllHarnesses( + MatRadioGroupHarness.with({name: 'my-group-2-name'}), + ); + expect(groups.length).toBe(1); + expect(await groups[0].getId()).toBe('my-group-2'); + + groups = await loader.getAllHarnesses(MatRadioGroupHarness.with({name: 'my-group-1-name'})); + expect(groups.length).toBe(1); + expect(await groups[0].getId()).toBe('my-group-1'); + }); + + it( + 'should throw when finding radio-group with specific name that has mismatched ' + + 'radio-button names', + async () => { + fixture.componentInstance.thirdGroupButtonName = 'other-name'; + fixture.detectChanges(); + + await expectAsync( + loader.getAllHarnesses(MatRadioGroupHarness.with({name: 'third-group-name'})), + ).toBeRejectedWithError( + /locator found a radio-group with name "third-group-name".*have mismatching names/, + ); + }, + ); + + it('should get name of radio-group', async () => { + const groups = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(groups.length).toBe(3); + expect(await groups[0].getName()).toBe('my-group-1-name'); + expect(await groups[1].getName()).toBe('my-group-2-name'); + expect(await groups[2].getName()).toBe('third-group-name'); + + fixture.componentInstance.secondGroupId = 'new-group'; + fixture.detectChanges(); + + expect(await groups[1].getName()).toBe('new-group-name'); + + fixture.componentInstance.thirdGroupButtonName = 'other-button-name'; + fixture.detectChanges(); + + await expectAsync(groups[2].getName()).toBeRejectedWithError( + /Radio buttons in radio-group have mismatching names./, + ); + }); + + it('should get id of radio-group', async () => { + const groups = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(groups.length).toBe(3); + expect(await groups[0].getId()).toBe('my-group-1'); + expect(await groups[1].getId()).toBe('my-group-2'); + expect(await groups[2].getId()).toBe(''); + + fixture.componentInstance.secondGroupId = 'new-group-name'; + fixture.detectChanges(); + + expect(await groups[1].getId()).toBe('new-group-name'); + }); + + it('should get checked value of radio-group', async () => { + const [firstGroup, secondGroup] = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(await firstGroup.getCheckedValue()).toBe('opt2'); + expect(await secondGroup.getCheckedValue()).toBe(null); + }); + + it('should get radio-button harnesses of radio-group', async () => { + const groups = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(groups.length).toBe(3); + + expect((await groups[0].getRadioButtons()).length).toBe(3); + expect((await groups[1].getRadioButtons()).length).toBe(1); + expect((await groups[2].getRadioButtons()).length).toBe(2); + }); + + it('should get radio buttons from group with filter', async () => { + const group = await loader.getHarness(MatRadioGroupHarness.with({name: 'my-group-1-name'})); + expect((await group.getRadioButtons({label: 'opt2'})).length).toBe(1); + }); + + it('should get checked radio-button harnesses of radio-group', async () => { + const groups = await loader.getAllHarnesses(MatRadioGroupHarness); + expect(groups.length).toBe(3); + + const groupOneChecked = await groups[0].getCheckedRadioButton(); + const groupTwoChecked = await groups[1].getCheckedRadioButton(); + const groupThreeChecked = await groups[2].getCheckedRadioButton(); + + expect(groupOneChecked).not.toBeNull(); + expect(groupTwoChecked).toBeNull(); + expect(groupThreeChecked).toBeNull(); + expect(await groupOneChecked!.getId()).toBe('opt2-group-one'); + }); + + it('should check radio button in group', async () => { + const group = await loader.getHarness(MatRadioGroupHarness.with({name: 'my-group-1-name'})); + expect(await group.getCheckedValue()).toBe('opt2'); + await group.checkRadioButton({label: 'opt3'}); + expect(await group.getCheckedValue()).toBe('opt3'); + }); + + it('should throw error when checking invalid radio button', async () => { + const group = await loader.getHarness(MatRadioGroupHarness.with({name: 'my-group-1-name'})); + await expectAsync(group.checkRadioButton({label: 'opt4'})).toBeRejectedWithError( + /Could not find radio button matching {"label":"opt4"}/, + ); + }); + }); + + describe('MatRadioButtonHarness', () => { + it('should load all radio-button harnesses', async () => { + const radios = await loader.getAllHarnesses(MatRadioButtonHarness); + expect(radios.length).toBe(9); + }); + + it('should load radio-button with exact label', async () => { + const radios = await loader.getAllHarnesses(MatRadioButtonHarness.with({label: 'Option #2'})); + expect(radios.length).toBe(1); + expect(await radios[0].getId()).toBe('opt2'); + expect(await radios[0].getLabelText()).toBe('Option #2'); + }); + + it('should load radio-button with regex label match', async () => { + const radios = await loader.getAllHarnesses(MatRadioButtonHarness.with({label: /#3$/i})); + expect(radios.length).toBe(1); + expect(await radios[0].getId()).toBe('opt3'); + expect(await radios[0].getLabelText()).toBe('Option #3'); + }); + + it('should load radio-button with id', async () => { + const radios = await loader.getAllHarnesses(MatRadioButtonHarness.with({selector: '#opt3'})); + expect(radios.length).toBe(1); + expect(await radios[0].getId()).toBe('opt3'); + expect(await radios[0].getLabelText()).toBe('Option #3'); + }); + + it('should load radio-buttons with same name', async () => { + const radios = await loader.getAllHarnesses(MatRadioButtonHarness.with({name: 'group1'})); + expect(radios.length).toBe(2); + + expect(await radios[0].getId()).toBe('opt1'); + expect(await radios[1].getId()).toBe('opt2'); + }); + + it('should get checked state', async () => { + const [uncheckedRadio, checkedRadio] = await loader.getAllHarnesses(MatRadioButtonHarness); + expect(await uncheckedRadio.isChecked()).toBe(false); + expect(await checkedRadio.isChecked()).toBe(true); + }); + + it('should get label text', async () => { + const [firstRadio, secondRadio, thirdRadio] = await loader.getAllHarnesses( + MatRadioButtonHarness, + ); + expect(await firstRadio.getLabelText()).toBe('Option #1'); + expect(await secondRadio.getLabelText()).toBe('Option #2'); + expect(await thirdRadio.getLabelText()).toBe('Option #3'); + }); + + it('should get value', async () => { + const [firstRadio, secondRadio, thirdRadio] = await loader.getAllHarnesses( + MatRadioButtonHarness, + ); + expect(await firstRadio.getValue()).toBe('opt1'); + expect(await secondRadio.getValue()).toBe('opt2'); + expect(await thirdRadio.getValue()).toBe('opt3'); + }); + + it('should get disabled state', async () => { + const [firstRadio] = await loader.getAllHarnesses(MatRadioButtonHarness); + expect(await firstRadio.isDisabled()).toBe(false); + + fixture.componentInstance.disableAll = true; + fixture.detectChanges(); + + expect(await firstRadio.isDisabled()).toBe(true); + }); + + it('should focus radio-button', async () => { + const radioButton = await loader.getHarness(MatRadioButtonHarness.with({selector: '#opt2'})); + expect(await radioButton.isFocused()).toBe(false); + await radioButton.focus(); + expect(await radioButton.isFocused()).toBe(true); + }); + + it('should blur radio-button', async () => { + const radioButton = await loader.getHarness(MatRadioButtonHarness.with({selector: '#opt2'})); + await radioButton.focus(); + expect(await radioButton.isFocused()).toBe(true); + await radioButton.blur(); + expect(await radioButton.isFocused()).toBe(false); + }); + + it('should check radio-button', async () => { + const [uncheckedRadio, checkedRadio] = await loader.getAllHarnesses(MatRadioButtonHarness); + await uncheckedRadio.check(); + expect(await uncheckedRadio.isChecked()).toBe(true); + // Checked radio state should change since the two radio's + // have the same name and only one can be checked. + expect(await checkedRadio.isChecked()).toBe(false); + }); + + it('should not be able to check disabled radio-button', async () => { + fixture.componentInstance.disableAll = true; + fixture.detectChanges(); + + const radioButton = await loader.getHarness(MatRadioButtonHarness.with({selector: '#opt3'})); + expect(await radioButton.isChecked()).toBe(false); + await radioButton.check(); + expect(await radioButton.isChecked()).toBe(false); + + fixture.componentInstance.disableAll = false; + fixture.detectChanges(); + + expect(await radioButton.isChecked()).toBe(false); + await radioButton.check(); + expect(await radioButton.isChecked()).toBe(true); + }); + + it('should get required state', async () => { + const radioButton = await loader.getHarness( + MatRadioButtonHarness.with({selector: '#required-radio'}), + ); + expect(await radioButton.isRequired()).toBe(true); + }); + }); }); + +@Component({ + template: ` + + Option #{{i + 1}} + + + + + {{value}} + + + + + + + Accept terms of conditions + + + + + First + + + `, +}) +class MultipleRadioButtonsHarnessTest { + values = ['opt1', 'opt2', 'opt3']; + disableAll = false; + secondGroupId = 'my-group-2'; + thirdGroupName: string = 'third-group-name'; + thirdGroupButtonName: string | undefined = undefined; +} diff --git a/src/material/radio/testing/shared.spec.ts b/src/material/radio/testing/shared.spec.ts deleted file mode 100644 index 75be47b9dcf5..000000000000 --- a/src/material/radio/testing/shared.spec.ts +++ /dev/null @@ -1,308 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {ReactiveFormsModule} from '@angular/forms'; -import {MatRadioModule} from '@angular/material/radio'; -import {MatRadioButtonHarness, MatRadioGroupHarness} from './radio-harness'; - -/** Shared tests to run on both the original and MDC-based radio components. */ -export function runHarnessTests( - radioModule: typeof MatRadioModule, - radioGroupHarness: typeof MatRadioGroupHarness, - radioButtonHarness: typeof MatRadioButtonHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [radioModule, ReactiveFormsModule], - declarations: [MultipleRadioButtonsHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(MultipleRadioButtonsHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - describe('MatRadioGroupHarness', () => { - it('should load all radio-group harnesses', async () => { - const groups = await loader.getAllHarnesses(radioGroupHarness); - expect(groups.length).toBe(3); - }); - - it('should load radio-group with exact id', async () => { - const groups = await loader.getAllHarnesses( - radioGroupHarness.with({selector: '#my-group-2'}), - ); - expect(groups.length).toBe(1); - }); - - it('should load radio-group by name', async () => { - let groups = await loader.getAllHarnesses(radioGroupHarness.with({name: 'my-group-2-name'})); - expect(groups.length).toBe(1); - expect(await groups[0].getId()).toBe('my-group-2'); - - groups = await loader.getAllHarnesses(radioGroupHarness.with({name: 'my-group-1-name'})); - expect(groups.length).toBe(1); - expect(await groups[0].getId()).toBe('my-group-1'); - }); - - it( - 'should throw when finding radio-group with specific name that has mismatched ' + - 'radio-button names', - async () => { - fixture.componentInstance.thirdGroupButtonName = 'other-name'; - fixture.detectChanges(); - - await expectAsync( - loader.getAllHarnesses(radioGroupHarness.with({name: 'third-group-name'})), - ).toBeRejectedWithError( - /locator found a radio-group with name "third-group-name".*have mismatching names/, - ); - }, - ); - - it('should get name of radio-group', async () => { - const groups = await loader.getAllHarnesses(radioGroupHarness); - expect(groups.length).toBe(3); - expect(await groups[0].getName()).toBe('my-group-1-name'); - expect(await groups[1].getName()).toBe('my-group-2-name'); - expect(await groups[2].getName()).toBe('third-group-name'); - - fixture.componentInstance.secondGroupId = 'new-group'; - fixture.detectChanges(); - - expect(await groups[1].getName()).toBe('new-group-name'); - - fixture.componentInstance.thirdGroupButtonName = 'other-button-name'; - fixture.detectChanges(); - - await expectAsync(groups[2].getName()).toBeRejectedWithError( - /Radio buttons in radio-group have mismatching names./, - ); - }); - - it('should get id of radio-group', async () => { - const groups = await loader.getAllHarnesses(radioGroupHarness); - expect(groups.length).toBe(3); - expect(await groups[0].getId()).toBe('my-group-1'); - expect(await groups[1].getId()).toBe('my-group-2'); - expect(await groups[2].getId()).toBe(''); - - fixture.componentInstance.secondGroupId = 'new-group-name'; - fixture.detectChanges(); - - expect(await groups[1].getId()).toBe('new-group-name'); - }); - - it('should get checked value of radio-group', async () => { - const [firstGroup, secondGroup] = await loader.getAllHarnesses(radioGroupHarness); - expect(await firstGroup.getCheckedValue()).toBe('opt2'); - expect(await secondGroup.getCheckedValue()).toBe(null); - }); - - it('should get radio-button harnesses of radio-group', async () => { - const groups = await loader.getAllHarnesses(radioGroupHarness); - expect(groups.length).toBe(3); - - expect((await groups[0].getRadioButtons()).length).toBe(3); - expect((await groups[1].getRadioButtons()).length).toBe(1); - expect((await groups[2].getRadioButtons()).length).toBe(2); - }); - - it('should get radio buttons from group with filter', async () => { - const group = await loader.getHarness(radioGroupHarness.with({name: 'my-group-1-name'})); - expect((await group.getRadioButtons({label: 'opt2'})).length).toBe(1); - }); - - it('should get checked radio-button harnesses of radio-group', async () => { - const groups = await loader.getAllHarnesses(radioGroupHarness); - expect(groups.length).toBe(3); - - const groupOneChecked = await groups[0].getCheckedRadioButton(); - const groupTwoChecked = await groups[1].getCheckedRadioButton(); - const groupThreeChecked = await groups[2].getCheckedRadioButton(); - - expect(groupOneChecked).not.toBeNull(); - expect(groupTwoChecked).toBeNull(); - expect(groupThreeChecked).toBeNull(); - expect(await groupOneChecked!.getId()).toBe('opt2-group-one'); - }); - - it('should check radio button in group', async () => { - const group = await loader.getHarness(radioGroupHarness.with({name: 'my-group-1-name'})); - expect(await group.getCheckedValue()).toBe('opt2'); - await group.checkRadioButton({label: 'opt3'}); - expect(await group.getCheckedValue()).toBe('opt3'); - }); - - it('should throw error when checking invalid radio button', async () => { - const group = await loader.getHarness(radioGroupHarness.with({name: 'my-group-1-name'})); - await expectAsync(group.checkRadioButton({label: 'opt4'})).toBeRejectedWithError( - /Could not find radio button matching {"label":"opt4"}/, - ); - }); - }); - - describe('MatRadioButtonHarness', () => { - it('should load all radio-button harnesses', async () => { - const radios = await loader.getAllHarnesses(radioButtonHarness); - expect(radios.length).toBe(9); - }); - - it('should load radio-button with exact label', async () => { - const radios = await loader.getAllHarnesses(radioButtonHarness.with({label: 'Option #2'})); - expect(radios.length).toBe(1); - expect(await radios[0].getId()).toBe('opt2'); - expect(await radios[0].getLabelText()).toBe('Option #2'); - }); - - it('should load radio-button with regex label match', async () => { - const radios = await loader.getAllHarnesses(radioButtonHarness.with({label: /#3$/i})); - expect(radios.length).toBe(1); - expect(await radios[0].getId()).toBe('opt3'); - expect(await radios[0].getLabelText()).toBe('Option #3'); - }); - - it('should load radio-button with id', async () => { - const radios = await loader.getAllHarnesses(radioButtonHarness.with({selector: '#opt3'})); - expect(radios.length).toBe(1); - expect(await radios[0].getId()).toBe('opt3'); - expect(await radios[0].getLabelText()).toBe('Option #3'); - }); - - it('should load radio-buttons with same name', async () => { - const radios = await loader.getAllHarnesses(radioButtonHarness.with({name: 'group1'})); - expect(radios.length).toBe(2); - - expect(await radios[0].getId()).toBe('opt1'); - expect(await radios[1].getId()).toBe('opt2'); - }); - - it('should get checked state', async () => { - const [uncheckedRadio, checkedRadio] = await loader.getAllHarnesses(radioButtonHarness); - expect(await uncheckedRadio.isChecked()).toBe(false); - expect(await checkedRadio.isChecked()).toBe(true); - }); - - it('should get label text', async () => { - const [firstRadio, secondRadio, thirdRadio] = await loader.getAllHarnesses( - radioButtonHarness, - ); - expect(await firstRadio.getLabelText()).toBe('Option #1'); - expect(await secondRadio.getLabelText()).toBe('Option #2'); - expect(await thirdRadio.getLabelText()).toBe('Option #3'); - }); - - it('should get value', async () => { - const [firstRadio, secondRadio, thirdRadio] = await loader.getAllHarnesses( - radioButtonHarness, - ); - expect(await firstRadio.getValue()).toBe('opt1'); - expect(await secondRadio.getValue()).toBe('opt2'); - expect(await thirdRadio.getValue()).toBe('opt3'); - }); - - it('should get disabled state', async () => { - const [firstRadio] = await loader.getAllHarnesses(radioButtonHarness); - expect(await firstRadio.isDisabled()).toBe(false); - - fixture.componentInstance.disableAll = true; - fixture.detectChanges(); - - expect(await firstRadio.isDisabled()).toBe(true); - }); - - it('should focus radio-button', async () => { - const radioButton = await loader.getHarness(radioButtonHarness.with({selector: '#opt2'})); - expect(await radioButton.isFocused()).toBe(false); - await radioButton.focus(); - expect(await radioButton.isFocused()).toBe(true); - }); - - it('should blur radio-button', async () => { - const radioButton = await loader.getHarness(radioButtonHarness.with({selector: '#opt2'})); - await radioButton.focus(); - expect(await radioButton.isFocused()).toBe(true); - await radioButton.blur(); - expect(await radioButton.isFocused()).toBe(false); - }); - - it('should check radio-button', async () => { - const [uncheckedRadio, checkedRadio] = await loader.getAllHarnesses(radioButtonHarness); - await uncheckedRadio.check(); - expect(await uncheckedRadio.isChecked()).toBe(true); - // Checked radio state should change since the two radio's - // have the same name and only one can be checked. - expect(await checkedRadio.isChecked()).toBe(false); - }); - - it('should not be able to check disabled radio-button', async () => { - fixture.componentInstance.disableAll = true; - fixture.detectChanges(); - - const radioButton = await loader.getHarness(radioButtonHarness.with({selector: '#opt3'})); - expect(await radioButton.isChecked()).toBe(false); - await radioButton.check(); - expect(await radioButton.isChecked()).toBe(false); - - fixture.componentInstance.disableAll = false; - fixture.detectChanges(); - - expect(await radioButton.isChecked()).toBe(false); - await radioButton.check(); - expect(await radioButton.isChecked()).toBe(true); - }); - - it('should get required state', async () => { - const radioButton = await loader.getHarness( - radioButtonHarness.with({selector: '#required-radio'}), - ); - expect(await radioButton.isRequired()).toBe(true); - }); - }); -} - -@Component({ - template: ` - - Option #{{i + 1}} - - - - - {{value}} - - - - - - - Accept terms of conditions - - - - - First - - - `, -}) -class MultipleRadioButtonsHarnessTest { - values = ['opt1', 'opt2', 'opt3']; - disableAll = false; - secondGroupId = 'my-group-2'; - thirdGroupName: string = 'third-group-name'; - thirdGroupButtonName: string | undefined = undefined; -} diff --git a/src/material/schematics/ng-add/index.spec.ts b/src/material/schematics/ng-add/index.spec.ts index 9ba0f5a7880f..429005d757ea 100644 --- a/src/material/schematics/ng-add/index.spec.ts +++ b/src/material/schematics/ng-add/index.spec.ts @@ -1,4 +1,4 @@ -import {normalize, workspaces} from '@angular-devkit/core'; +import {normalize, workspaces, logging} from '@angular-devkit/core'; import {Tree} from '@angular-devkit/schematics'; import {SchematicTestRunner} from '@angular-devkit/schematics/testing'; import { @@ -30,7 +30,7 @@ describe('ng-add schematic', () => { errorOutput = []; warnOutput = []; - runner.logger.subscribe(e => { + runner.logger.subscribe((e: logging.LogEntry) => { if (e.level === 'error') { errorOutput.push(e.message); } else if (e.level === 'warn') { @@ -347,11 +347,11 @@ describe('ng-add schematic', () => { prefix: 'app', architect: { build: { - builder: '@angular-devkit/build-angular:browser', + builder: '@angular-devkit/build-angular:application', options: { outputPath: 'dist/material', index: 'projects/material/src/index.html', - main: 'projects/material/src/main.ts', + browser: 'projects/material/src/main.ts', styles: ['projects/material/src/styles.css'], }, }, @@ -360,7 +360,7 @@ describe('ng-add schematic', () => { options: { outputPath: 'dist/material', index: 'projects/material/src/index.html', - main: 'projects/material/src/main.ts', + browser: 'projects/material/src/main.ts', styles: ['projects/material/src/styles.css'], }, }, @@ -411,11 +411,11 @@ describe('ng-add schematic', () => { prefix: 'app', architect: { build: { - builder: '@angular-devkit/build-angular:browser', + builder: '@angular-devkit/build-angular:application', options: { outputPath: 'dist/material', index: 'projects/material/src/index.html', - main: 'projects/material/src/main.ts', + browser: 'projects/material/src/main.ts', styles: ['projects/material/src/styles.css', stylePath], }, }, @@ -613,7 +613,7 @@ describe('ng-add schematic - library project', () => { errorOutput = []; warnOutput = []; - runner.logger.subscribe(e => { + runner.logger.subscribe((e: logging.LogEntry) => { if (e.level === 'error') { errorOutput.push(e.message); } else if (e.level === 'warn') { diff --git a/src/material/schematics/ng-add/theming/theming.ts b/src/material/schematics/ng-add/theming/theming.ts index 2b33372d0f29..85b783e21766 100644 --- a/src/material/schematics/ng-add/theming/theming.ts +++ b/src/material/schematics/ng-add/theming/theming.ts @@ -178,8 +178,8 @@ function validateDefaultTargetBuilder( logger: logging.LoggerApi, ) { const defaultBuilder = defaultTargetBuilders[targetName]; - const targetConfig = project.targets && project.targets.get(targetName); - const isDefaultBuilder = targetConfig && targetConfig['builder'] === defaultBuilder; + const targetConfig = project.targets?.get(targetName); + const isDefaultBuilder = targetConfig?.['builder'] === defaultBuilder; // Because the build setup for the Angular CLI can be customized by developers, we can't know // where to put the theme file in the workspace configuration if custom builders are being diff --git a/src/material/schematics/ng-generate/mdc-migration/rules/ts-migration/runtime-migration.ts b/src/material/schematics/ng-generate/mdc-migration/rules/ts-migration/runtime-migration.ts index 537fda4aa8ad..e22207265aaf 100644 --- a/src/material/schematics/ng-generate/mdc-migration/rules/ts-migration/runtime-migration.ts +++ b/src/material/schematics/ng-generate/mdc-migration/rules/ts-migration/runtime-migration.ts @@ -227,7 +227,7 @@ export class RuntimeCodeMigration extends Migration component.template); - // If no component in the upgrade data has a a template migrator, stop + // If no component in the upgrade data has a template migrator, stop // trying to migrate any templates from now on if (templateUpgradeData.length === 0) { this._hasPossibleTemplateMigrations = false; diff --git a/src/material/select/_select-theme.scss b/src/material/select/_select-theme.scss index 841c8c108022..e0cfbec9473d 100644 --- a/src/material/select/_select-theme.scss +++ b/src/material/select/_select-theme.scss @@ -1,4 +1,3 @@ -@use 'sass:map'; @use '@material/density' as mdc-density; @use '@material/textfield' as mdc-textfield; @use '../core/tokens/m2/mat/select' as tokens-mat-select; @@ -6,43 +5,35 @@ @use '../core/style/sass-utils'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-select.$prefix, - tokens-mat-select.get-color-tokens($config)); + tokens-mat-select.get-color-tokens($theme)); .mat-mdc-form-field.mat-accent { - $accent: map.get($config, accent); - $accent-config: map.merge($config, (primary: $accent)); @include token-utils.create-token-values(tokens-mat-select.$prefix, - tokens-mat-select.get-color-tokens($accent-config)); + tokens-mat-select.get-color-tokens($theme, accent)); } .mat-mdc-form-field.mat-warn { - $warn: map.get($config, warn); - $warn-config: map.merge($config, (primary: $warn)); @include token-utils.create-token-values(tokens-mat-select.$prefix, - tokens-mat-select.get-color-tokens($warn-config)); + tokens-mat-select.get-color-tokens($theme, warn)); } } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-select.$prefix, - tokens-mat-select.get-typography-tokens($config)); + tokens-mat-select.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); +@mixin density($theme) { + $density-scale: inspection.get-theme-density($theme); // Density is clamped at -5 here, because MDC's form field throws an error for anything lower. $form-field-height: mdc-density.prop-value( @@ -61,25 +52,20 @@ @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-select.$prefix, - tokens-mat-select.get-density-tokens($density-scale)); + tokens-mat-select.get-density-tokens($theme)); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-select') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/select/testing/BUILD.bazel b/src/material/select/testing/BUILD.bazel index edf419dacf4d..5f9893096a5c 100644 --- a/src/material/select/testing/BUILD.bazel +++ b/src/material/select/testing/BUILD.bazel @@ -21,8 +21,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/overlay", @@ -35,20 +35,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/form-field", - "//src/material/select", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [ diff --git a/src/material/select/testing/select-harness.spec.ts b/src/material/select/testing/select-harness.spec.ts index bb4a301336c6..454da02187e4 100644 --- a/src/material/select/testing/select-harness.spec.ts +++ b/src/material/select/testing/select-harness.spec.ts @@ -1,8 +1,346 @@ -import {MatSelectModule} from '@angular/material/select'; +import {Component} from '@angular/core'; +import {ComponentFixture, inject, TestBed} from '@angular/core/testing'; +import {OverlayContainer} from '@angular/cdk/overlay'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; import {MatFormFieldModule} from '@angular/material/form-field'; -import {runHarnessTests} from '@angular/material/select/testing/shared.spec'; +import {MatSelectModule} from '@angular/material/select'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatSelectHarness} from './select-harness'; -describe('MDC-based MatSelectHarness', () => { - runHarnessTests(MatFormFieldModule, MatSelectModule, MatSelectHarness); +describe('MatSelectHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + let overlayContainer: OverlayContainer; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatSelectModule, MatFormFieldModule, NoopAnimationsModule, ReactiveFormsModule], + declarations: [SelectHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(SelectHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + inject([OverlayContainer], (oc: OverlayContainer) => { + overlayContainer = oc; + })(); + }); + + afterEach(() => { + // Angular won't call this for us so we need to do it ourselves to avoid leaks. + overlayContainer.ngOnDestroy(); + overlayContainer = null!; + }); + + it('should load all select harnesses', async () => { + const selects = await loader.getAllHarnesses(MatSelectHarness); + expect(selects.length).toBe(4); + }); + + it('should filter by whether a select is disabled', async () => { + let enabledSelects = await loader.getAllHarnesses(MatSelectHarness.with({disabled: false})); + let disabledSelects = await loader.getAllHarnesses(MatSelectHarness.with({disabled: true})); + + expect(enabledSelects.length).toBe(4); + expect(disabledSelects.length).toBe(0); + + fixture.componentInstance.isDisabled = true; + fixture.detectChanges(); + + enabledSelects = await loader.getAllHarnesses(MatSelectHarness.with({disabled: false})); + disabledSelects = await loader.getAllHarnesses(MatSelectHarness.with({disabled: true})); + + expect(enabledSelects.length).toBe(3); + expect(disabledSelects.length).toBe(1); + }); + + it('should be able to check whether a select is in multi-selection mode', async () => { + const singleSelection = await loader.getHarness( + MatSelectHarness.with({ + selector: '#single-selection', + }), + ); + const multipleSelection = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + + expect(await singleSelection.isMultiple()).toBe(false); + expect(await multipleSelection.isMultiple()).toBe(true); + }); + + it('should get disabled state', async () => { + const singleSelection = await loader.getHarness( + MatSelectHarness.with({ + selector: '#single-selection', + }), + ); + const multipleSelection = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + + expect(await singleSelection.isDisabled()).toBe(false); + expect(await multipleSelection.isDisabled()).toBe(false); + + fixture.componentInstance.isDisabled = true; + fixture.detectChanges(); + + expect(await singleSelection.isDisabled()).toBe(true); + expect(await multipleSelection.isDisabled()).toBe(false); + }); + + it('should get required state', async () => { + const singleSelection = await loader.getHarness( + MatSelectHarness.with({ + selector: '#single-selection', + }), + ); + const multipleSelection = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + + expect(await singleSelection.isRequired()).toBe(false); + expect(await multipleSelection.isRequired()).toBe(false); + + fixture.componentInstance.isRequired = true; + fixture.detectChanges(); + + expect(await singleSelection.isRequired()).toBe(true); + expect(await multipleSelection.isRequired()).toBe(false); + }); + + it('should get valid state', async () => { + const singleSelection = await loader.getHarness( + MatSelectHarness.with({ + selector: '#single-selection', + }), + ); + const withFormControl = await loader.getHarness( + MatSelectHarness.with({ + selector: '#with-form-control', + }), + ); + + expect(await singleSelection.isValid()).toBe(true); + expect(await withFormControl.isValid()).toBe(false); + }); + + it('should focus and blur a select', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#single-selection'})); + expect(await select.isFocused()).toBe(false); + await select.focus(); + expect(await select.isFocused()).toBe(true); + await select.blur(); + expect(await select.isFocused()).toBe(false); + }); + + it('should be able to open and close a single-selection select', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#single-selection'})); + + expect(await select.isOpen()).toBe(false); + + await select.open(); + expect(await select.isOpen()).toBe(true); + + await select.close(); + expect(await select.isOpen()).toBe(false); + }); + + it('should be able to open and close a multi-selection select', async () => { + const select = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + + expect(await select.isOpen()).toBe(false); + + await select.open(); + expect(await select.isOpen()).toBe(true); + + await select.close(); + expect(await select.isOpen()).toBe(false); + }); + + it('should be able to get the select options', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#single-selection'})); + await select.open(); + const options = await select.getOptions(); + + expect(options.length).toBe(11); + expect(await options[5].getText()).toBe('New York'); + }); + + it('should be able to get the select panel groups', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#grouped'})); + await select.open(); + const groups = await select.getOptionGroups(); + const options = await select.getOptions(); + + expect(groups.length).toBe(3); + expect(options.length).toBe(14); + }); + + it('should be able to get the select options when there are multiple open selects', async () => { + const singleSelect = await loader.getHarness( + MatSelectHarness.with({ + selector: '#single-selection', + }), + ); + await singleSelect.open(); + + const groupedSelect = await loader.getHarness(MatSelectHarness.with({selector: '#grouped'})); + await groupedSelect.open(); + + const [singleOptions, groupedOptions] = await parallel(() => [ + singleSelect.getOptions(), + groupedSelect.getOptions(), + ]); + + expect(await singleOptions[0].getText()).toBe('Alabama'); + expect(singleOptions.length).toBe(11); + + expect(await groupedOptions[0].getText()).toBe('Iowa'); + expect(groupedOptions.length).toBe(14); + }); + + it('should be able to get the value text from a single-selection select', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#single-selection'})); + await select.open(); + const options = await select.getOptions(); + + await options[3].click(); + + expect(await select.getValueText()).toBe('Kansas'); + }); + + it('should be able to get the value text from a multi-selection select', async () => { + const select = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + await select.open(); + const options = await select.getOptions(); + + await options[3].click(); + await options[5].click(); + + expect(await select.getValueText()).toBe('Kansas, New York'); + }); + + it('should be able to get whether a single-selection select is empty', async () => { + const select = await loader.getHarness(MatSelectHarness.with({selector: '#single-selection'})); + + expect(await select.isEmpty()).toBe(true); + + await select.open(); + const options = await select.getOptions(); + await options[3].click(); + + expect(await select.isEmpty()).toBe(false); + }); + + it('should be able to get whether a multi-selection select is empty', async () => { + const select = await loader.getHarness( + MatSelectHarness.with({selector: '#multiple-selection'}), + ); + + expect(await select.isEmpty()).toBe(true); + + await select.open(); + const options = await select.getOptions(); + await options[3].click(); + await options[5].click(); + + expect(await select.isEmpty()).toBe(false); + }); + + it('should be able to click an option', async () => { + const control = fixture.componentInstance.formControl; + const select = await loader.getHarness(MatSelectHarness.with({selector: '#with-form-control'})); + + expect(control.value).toBeFalsy(); + + await select.open(); + await (await select.getOptions())[1].click(); + + expect(control.value).toBe('CA'); + }); }); + +@Component({ + template: ` + + + {{ state.name }} + + + + + {{ state.name }} + + + + + + {{ state.name }} + + + + + + {{ state.name }} + + + `, +}) +class SelectHarnessTest { + formControl = new FormControl(undefined as string | undefined, [Validators.required]); + isDisabled = false; + isRequired = false; + states = [ + {code: 'AL', name: 'Alabama'}, + {code: 'CA', name: 'California'}, + {code: 'FL', name: 'Florida'}, + {code: 'KS', name: 'Kansas'}, + {code: 'MA', name: 'Massachusetts'}, + {code: 'NY', name: 'New York'}, + {code: 'OR', name: 'Oregon'}, + {code: 'PA', name: 'Pennsylvania'}, + {code: 'TN', name: 'Tennessee'}, + {code: 'VA', name: 'Virginia'}, + {code: 'WY', name: 'Wyoming'}, + ]; + + stateGroups = [ + { + name: 'One', + states: [ + {code: 'IA', name: 'Iowa'}, + {code: 'KS', name: 'Kansas'}, + {code: 'KY', name: 'Kentucky'}, + {code: 'LA', name: 'Louisiana'}, + {code: 'ME', name: 'Maine'}, + ], + }, + { + name: 'Two', + states: [ + {code: 'RI', name: 'Rhode Island'}, + {code: 'SC', name: 'South Carolina'}, + {code: 'SD', name: 'South Dakota'}, + {code: 'TN', name: 'Tennessee'}, + {code: 'TX', name: 'Texas'}, + ], + }, + { + name: 'Three', + states: [ + {code: 'UT', name: 'Utah'}, + {code: 'WA', name: 'Washington'}, + {code: 'WV', name: 'West Virginia'}, + {code: 'WI', name: 'Wisconsin'}, + ], + }, + ]; +} diff --git a/src/material/select/testing/shared.spec.ts b/src/material/select/testing/shared.spec.ts deleted file mode 100644 index 275a1e70557c..000000000000 --- a/src/material/select/testing/shared.spec.ts +++ /dev/null @@ -1,345 +0,0 @@ -import {OverlayContainer} from '@angular/cdk/overlay'; -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, inject, TestBed} from '@angular/core/testing'; -import {FormControl, ReactiveFormsModule, Validators} from '@angular/forms'; -import {MatFormFieldModule} from '@angular/material/form-field'; -import {MatSelectModule} from '@angular/material/select'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatSelectHarness} from './select-harness'; - -/** Shared tests to run on both the original and MDC-based select. */ -export function runHarnessTests( - formFieldModule: typeof MatFormFieldModule, - selectModule: typeof MatSelectModule, - selectHarness: typeof MatSelectHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - let overlayContainer: OverlayContainer; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [selectModule, formFieldModule, NoopAnimationsModule, ReactiveFormsModule], - declarations: [SelectHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SelectHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - inject([OverlayContainer], (oc: OverlayContainer) => { - overlayContainer = oc; - })(); - }); - - afterEach(() => { - // Angular won't call this for us so we need to do it ourselves to avoid leaks. - overlayContainer.ngOnDestroy(); - overlayContainer = null!; - }); - - it('should load all select harnesses', async () => { - const selects = await loader.getAllHarnesses(selectHarness); - expect(selects.length).toBe(4); - }); - - it('should filter by whether a select is disabled', async () => { - let enabledSelects = await loader.getAllHarnesses(selectHarness.with({disabled: false})); - let disabledSelects = await loader.getAllHarnesses(selectHarness.with({disabled: true})); - - expect(enabledSelects.length).toBe(4); - expect(disabledSelects.length).toBe(0); - - fixture.componentInstance.isDisabled = true; - fixture.detectChanges(); - - enabledSelects = await loader.getAllHarnesses(selectHarness.with({disabled: false})); - disabledSelects = await loader.getAllHarnesses(selectHarness.with({disabled: true})); - - expect(enabledSelects.length).toBe(3); - expect(disabledSelects.length).toBe(1); - }); - - it('should be able to check whether a select is in multi-selection mode', async () => { - const singleSelection = await loader.getHarness( - selectHarness.with({ - selector: '#single-selection', - }), - ); - const multipleSelection = await loader.getHarness( - selectHarness.with({selector: '#multiple-selection'}), - ); - - expect(await singleSelection.isMultiple()).toBe(false); - expect(await multipleSelection.isMultiple()).toBe(true); - }); - - it('should get disabled state', async () => { - const singleSelection = await loader.getHarness( - selectHarness.with({ - selector: '#single-selection', - }), - ); - const multipleSelection = await loader.getHarness( - selectHarness.with({selector: '#multiple-selection'}), - ); - - expect(await singleSelection.isDisabled()).toBe(false); - expect(await multipleSelection.isDisabled()).toBe(false); - - fixture.componentInstance.isDisabled = true; - fixture.detectChanges(); - - expect(await singleSelection.isDisabled()).toBe(true); - expect(await multipleSelection.isDisabled()).toBe(false); - }); - - it('should get required state', async () => { - const singleSelection = await loader.getHarness( - selectHarness.with({ - selector: '#single-selection', - }), - ); - const multipleSelection = await loader.getHarness( - selectHarness.with({selector: '#multiple-selection'}), - ); - - expect(await singleSelection.isRequired()).toBe(false); - expect(await multipleSelection.isRequired()).toBe(false); - - fixture.componentInstance.isRequired = true; - fixture.detectChanges(); - - expect(await singleSelection.isRequired()).toBe(true); - expect(await multipleSelection.isRequired()).toBe(false); - }); - - it('should get valid state', async () => { - const singleSelection = await loader.getHarness( - selectHarness.with({ - selector: '#single-selection', - }), - ); - const withFormControl = await loader.getHarness( - selectHarness.with({ - selector: '#with-form-control', - }), - ); - - expect(await singleSelection.isValid()).toBe(true); - expect(await withFormControl.isValid()).toBe(false); - }); - - it('should focus and blur a select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#single-selection'})); - expect(await select.isFocused()).toBe(false); - await select.focus(); - expect(await select.isFocused()).toBe(true); - await select.blur(); - expect(await select.isFocused()).toBe(false); - }); - - it('should be able to open and close a single-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#single-selection'})); - - expect(await select.isOpen()).toBe(false); - - await select.open(); - expect(await select.isOpen()).toBe(true); - - await select.close(); - expect(await select.isOpen()).toBe(false); - }); - - it('should be able to open and close a multi-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#multiple-selection'})); - - expect(await select.isOpen()).toBe(false); - - await select.open(); - expect(await select.isOpen()).toBe(true); - - await select.close(); - expect(await select.isOpen()).toBe(false); - }); - - it('should be able to get the select options', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#single-selection'})); - await select.open(); - const options = await select.getOptions(); - - expect(options.length).toBe(11); - expect(await options[5].getText()).toBe('New York'); - }); - - it('should be able to get the select panel groups', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#grouped'})); - await select.open(); - const groups = await select.getOptionGroups(); - const options = await select.getOptions(); - - expect(groups.length).toBe(3); - expect(options.length).toBe(14); - }); - - it('should be able to get the select options when there are multiple open selects', async () => { - const singleSelect = await loader.getHarness( - selectHarness.with({ - selector: '#single-selection', - }), - ); - await singleSelect.open(); - - const groupedSelect = await loader.getHarness(selectHarness.with({selector: '#grouped'})); - await groupedSelect.open(); - - const [singleOptions, groupedOptions] = await parallel(() => [ - singleSelect.getOptions(), - groupedSelect.getOptions(), - ]); - - expect(await singleOptions[0].getText()).toBe('Alabama'); - expect(singleOptions.length).toBe(11); - - expect(await groupedOptions[0].getText()).toBe('Iowa'); - expect(groupedOptions.length).toBe(14); - }); - - it('should be able to get the value text from a single-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#single-selection'})); - await select.open(); - const options = await select.getOptions(); - - await options[3].click(); - - expect(await select.getValueText()).toBe('Kansas'); - }); - - it('should be able to get the value text from a multi-selection select', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#multiple-selection'})); - await select.open(); - const options = await select.getOptions(); - - await options[3].click(); - await options[5].click(); - - expect(await select.getValueText()).toBe('Kansas, New York'); - }); - - it('should be able to get whether a single-selection select is empty', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#single-selection'})); - - expect(await select.isEmpty()).toBe(true); - - await select.open(); - const options = await select.getOptions(); - await options[3].click(); - - expect(await select.isEmpty()).toBe(false); - }); - - it('should be able to get whether a multi-selection select is empty', async () => { - const select = await loader.getHarness(selectHarness.with({selector: '#multiple-selection'})); - - expect(await select.isEmpty()).toBe(true); - - await select.open(); - const options = await select.getOptions(); - await options[3].click(); - await options[5].click(); - - expect(await select.isEmpty()).toBe(false); - }); - - it('should be able to click an option', async () => { - const control = fixture.componentInstance.formControl; - const select = await loader.getHarness(selectHarness.with({selector: '#with-form-control'})); - - expect(control.value).toBeFalsy(); - - await select.open(); - await (await select.getOptions())[1].click(); - - expect(control.value).toBe('CA'); - }); -} - -@Component({ - template: ` - - - {{ state.name }} - - - - - {{ state.name }} - - - - - - {{ state.name }} - - - - - - {{ state.name }} - - - `, -}) -class SelectHarnessTest { - formControl = new FormControl(undefined as string | undefined, [Validators.required]); - isDisabled = false; - isRequired = false; - states = [ - {code: 'AL', name: 'Alabama'}, - {code: 'CA', name: 'California'}, - {code: 'FL', name: 'Florida'}, - {code: 'KS', name: 'Kansas'}, - {code: 'MA', name: 'Massachusetts'}, - {code: 'NY', name: 'New York'}, - {code: 'OR', name: 'Oregon'}, - {code: 'PA', name: 'Pennsylvania'}, - {code: 'TN', name: 'Tennessee'}, - {code: 'VA', name: 'Virginia'}, - {code: 'WY', name: 'Wyoming'}, - ]; - - stateGroups = [ - { - name: 'One', - states: [ - {code: 'IA', name: 'Iowa'}, - {code: 'KS', name: 'Kansas'}, - {code: 'KY', name: 'Kentucky'}, - {code: 'LA', name: 'Louisiana'}, - {code: 'ME', name: 'Maine'}, - ], - }, - { - name: 'Two', - states: [ - {code: 'RI', name: 'Rhode Island'}, - {code: 'SC', name: 'South Carolina'}, - {code: 'SD', name: 'South Dakota'}, - {code: 'TN', name: 'Tennessee'}, - {code: 'TX', name: 'Texas'}, - ], - }, - { - name: 'Three', - states: [ - {code: 'UT', name: 'Utah'}, - {code: 'WA', name: 'Washington'}, - {code: 'WV', name: 'West Virginia'}, - {code: 'WI', name: 'Wisconsin'}, - ], - }, - ]; -} diff --git a/src/material/sidenav/_sidenav-theme.scss b/src/material/sidenav/_sidenav-theme.scss index 70407e8a8e63..494930ae0ec6 100644 --- a/src/material/sidenav/_sidenav-theme.scss +++ b/src/material/sidenav/_sidenav-theme.scss @@ -1,36 +1,30 @@ @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/tokens/m2/mat/sidenav' as tokens-mat-sidenav; @use '../core/tokens/token-utils'; @use '../core/style/sass-utils'; -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include sass-utils.current-selector-or-root() { @include token-utils.create-token-values(tokens-mat-sidenav.$prefix, - tokens-mat-sidenav.get-color-tokens($config)); + tokens-mat-sidenav.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) {} +@mixin typography($theme) {} -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-sidenav') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/sidenav/testing/BUILD.bazel b/src/material/sidenav/testing/BUILD.bazel index 4067849ac7d9..21b9f71126ff 100644 --- a/src/material/sidenav/testing/BUILD.bazel +++ b/src/material/sidenav/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -31,19 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/sidenav", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/sidenav/testing/shared.spec.ts b/src/material/sidenav/testing/shared.spec.ts deleted file mode 100644 index 95fb39709b08..000000000000 --- a/src/material/sidenav/testing/shared.spec.ts +++ /dev/null @@ -1,209 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatSidenavModule} from '@angular/material/sidenav'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatDrawerContainerHarness} from './drawer-container-harness'; -import {MatDrawerContentHarness} from './drawer-content-harness'; -import {MatDrawerHarness} from './drawer-harness'; -import {MatSidenavContainerHarness} from './sidenav-container-harness'; -import {MatSidenavContentHarness} from './sidenav-content-harness'; -import {MatSidenavHarness} from './sidenav-harness'; - -/** Shared tests to run on both the original and MDC-based drawer & sidenav. */ -export function runHarnessTests( - sidenavModule: typeof MatSidenavModule, - drawerHarness: typeof MatDrawerHarness, - drawerContainerHarness: typeof MatDrawerContainerHarness, - drawerContentHarness: typeof MatDrawerContentHarness, - sidenavHarness: typeof MatSidenavHarness, - sidenavContainerHarness: typeof MatSidenavContainerHarness, - sidenavContentHarness: typeof MatSidenavContentHarness, -) { - describe('drawer', () => { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [sidenavModule, NoopAnimationsModule], - declarations: [DrawerHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(DrawerHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all drawer harnesses', async () => { - const drawers = await loader.getAllHarnesses(drawerHarness); - expect(drawers.length).toBe(3); - }); - - it('should load drawer harness based on position', async () => { - const drawers = await loader.getAllHarnesses(drawerHarness.with({position: 'end'})); - expect(drawers.length).toBe(1); - expect(await (await drawers[0].host()).text()).toBe('Two'); - }); - - it('should be able to get whether the drawer is open', async () => { - const drawers = await loader.getAllHarnesses(drawerHarness); - - expect(await drawers[0].isOpen()).toBe(false); - expect(await drawers[1].isOpen()).toBe(false); - expect(await drawers[2].isOpen()).toBe(true); - - fixture.componentInstance.threeOpened = false; - fixture.detectChanges(); - - expect(await drawers[0].isOpen()).toBe(false); - expect(await drawers[1].isOpen()).toBe(false); - expect(await drawers[2].isOpen()).toBe(false); - }); - - it('should be able to get the position of a drawer', async () => { - const drawers = await loader.getAllHarnesses(drawerHarness); - - expect(await drawers[0].getPosition()).toBe('start'); - expect(await drawers[1].getPosition()).toBe('end'); - expect(await drawers[2].getPosition()).toBe('start'); - }); - - it('should be able to get the mode of a drawer', async () => { - const drawers = await loader.getAllHarnesses(drawerHarness); - - expect(await drawers[0].getMode()).toBe('over'); - expect(await drawers[1].getMode()).toBe('side'); - expect(await drawers[2].getMode()).toBe('push'); - }); - - it('should load all drawer container harnesses', async () => { - const containers = await loader.getAllHarnesses(drawerContainerHarness); - expect(containers.length).toBe(2); - }); - - it('should get the drawers within a container', async () => { - const containers = await loader.getAllHarnesses(drawerContainerHarness); - const [firstContainerDrawers, secondContainerDrawers] = await parallel(() => { - return containers.map(container => container.getDrawers()); - }); - - expect( - await parallel(() => { - return firstContainerDrawers.map(async container => (await container.host()).text()); - }), - ).toEqual(['One', 'Two']); - - expect( - await parallel(() => { - return secondContainerDrawers.map(async container => (await container.host()).text()); - }), - ).toEqual(['Three']); - }); - - it('should get the content of a container', async () => { - const container = await loader.getHarness(drawerContainerHarness); - const content = await container.getContent(); - expect(await (await content.host()).text()).toBe('Content'); - }); - - it('should load all drawer content harnesses', async () => { - const contentElements = await loader.getAllHarnesses(drawerContentHarness); - expect(contentElements.length).toBe(2); - }); - }); - - describe('sidenav', () => { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [sidenavModule, NoopAnimationsModule], - declarations: [SidenavHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SidenavHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should be able to get whether a sidenav is fixed in the viewport', async () => { - const sidenavs = await loader.getAllHarnesses(sidenavHarness); - - expect(await sidenavs[0].isFixedInViewport()).toBe(false); - expect(await sidenavs[1].isFixedInViewport()).toBe(false); - expect(await sidenavs[2].isFixedInViewport()).toBe(true); - }); - - it('should load all sidenav container harnesses', async () => { - const containers = await loader.getAllHarnesses(sidenavContainerHarness); - expect(containers.length).toBe(2); - }); - - it('should get the sidenavs within a container', async () => { - const containers = await loader.getAllHarnesses(sidenavContainerHarness); - const [firstContainerSidenavs, secondContainerSidenavs] = await parallel(() => { - return containers.map(container => container.getSidenavs()); - }); - - expect( - await parallel(() => { - return firstContainerSidenavs.map(async container => (await container.host()).text()); - }), - ).toEqual(['One', 'Two']); - - expect( - await parallel(() => { - return secondContainerSidenavs.map(async container => (await container.host()).text()); - }), - ).toEqual(['Three']); - }); - - it('should get the content of a container', async () => { - const container = await loader.getHarness(sidenavContainerHarness); - const content = await container.getContent(); - expect(await (await content.host()).text()).toBe('Content'); - }); - - it('should load all sidenav content harnesses', async () => { - const contentElements = await loader.getAllHarnesses(sidenavContentHarness); - expect(contentElements.length).toBe(2); - }); - }); -} - -@Component({ - template: ` - - One - Two - Content - - - - Three - Content - - `, -}) -class DrawerHarnessTest { - threeOpened = true; -} - -@Component({ - template: ` - - One - Two - Content - - - - Three - Content - - `, -}) -class SidenavHarnessTest {} diff --git a/src/material/sidenav/testing/sidenav-harness.spec.ts b/src/material/sidenav/testing/sidenav-harness.spec.ts index a0288cc039f4..84e4e5474593 100644 --- a/src/material/sidenav/testing/sidenav-harness.spec.ts +++ b/src/material/sidenav/testing/sidenav-harness.spec.ts @@ -1,5 +1,9 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatSidenavModule} from '@angular/material/sidenav'; -import {runHarnessTests} from '@angular/material/sidenav/testing/shared.spec'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatDrawerContainerHarness} from './drawer-container-harness'; import {MatDrawerContentHarness} from './drawer-content-harness'; import {MatDrawerHarness} from './drawer-harness'; @@ -7,14 +11,190 @@ import {MatSidenavContainerHarness} from './sidenav-container-harness'; import {MatSidenavContentHarness} from './sidenav-content-harness'; import {MatSidenavHarness} from './sidenav-harness'; -describe('Non-MDC-based', () => { - runHarnessTests( - MatSidenavModule, - MatDrawerHarness, - MatDrawerContainerHarness, - MatDrawerContentHarness, - MatSidenavHarness, - MatSidenavContainerHarness, - MatSidenavContentHarness, - ); +describe('MatSidenavHarness', () => { + describe('drawer', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatSidenavModule, NoopAnimationsModule], + declarations: [DrawerHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(DrawerHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all drawer harnesses', async () => { + const drawers = await loader.getAllHarnesses(MatDrawerHarness); + expect(drawers.length).toBe(3); + }); + + it('should load drawer harness based on position', async () => { + const drawers = await loader.getAllHarnesses(MatDrawerHarness.with({position: 'end'})); + expect(drawers.length).toBe(1); + expect(await (await drawers[0].host()).text()).toBe('Two'); + }); + + it('should be able to get whether the drawer is open', async () => { + const drawers = await loader.getAllHarnesses(MatDrawerHarness); + + expect(await drawers[0].isOpen()).toBe(false); + expect(await drawers[1].isOpen()).toBe(false); + expect(await drawers[2].isOpen()).toBe(true); + + fixture.componentInstance.threeOpened = false; + fixture.detectChanges(); + + expect(await drawers[0].isOpen()).toBe(false); + expect(await drawers[1].isOpen()).toBe(false); + expect(await drawers[2].isOpen()).toBe(false); + }); + + it('should be able to get the position of a drawer', async () => { + const drawers = await loader.getAllHarnesses(MatDrawerHarness); + + expect(await drawers[0].getPosition()).toBe('start'); + expect(await drawers[1].getPosition()).toBe('end'); + expect(await drawers[2].getPosition()).toBe('start'); + }); + + it('should be able to get the mode of a drawer', async () => { + const drawers = await loader.getAllHarnesses(MatDrawerHarness); + + expect(await drawers[0].getMode()).toBe('over'); + expect(await drawers[1].getMode()).toBe('side'); + expect(await drawers[2].getMode()).toBe('push'); + }); + + it('should load all drawer container harnesses', async () => { + const containers = await loader.getAllHarnesses(MatDrawerContainerHarness); + expect(containers.length).toBe(2); + }); + + it('should get the drawers within a container', async () => { + const containers = await loader.getAllHarnesses(MatDrawerContainerHarness); + const [firstContainerDrawers, secondContainerDrawers] = await parallel(() => { + return containers.map(container => container.getDrawers()); + }); + + expect( + await parallel(() => { + return firstContainerDrawers.map(async container => (await container.host()).text()); + }), + ).toEqual(['One', 'Two']); + + expect( + await parallel(() => { + return secondContainerDrawers.map(async container => (await container.host()).text()); + }), + ).toEqual(['Three']); + }); + + it('should get the content of a container', async () => { + const container = await loader.getHarness(MatDrawerContainerHarness); + const content = await container.getContent(); + expect(await (await content.host()).text()).toBe('Content'); + }); + + it('should load all drawer content harnesses', async () => { + const contentElements = await loader.getAllHarnesses(MatDrawerContentHarness); + expect(contentElements.length).toBe(2); + }); + }); + + describe('sidenav', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatSidenavModule, NoopAnimationsModule], + declarations: [SidenavHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(SidenavHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should be able to get whether a sidenav is fixed in the viewport', async () => { + const sidenavs = await loader.getAllHarnesses(MatSidenavHarness); + + expect(await sidenavs[0].isFixedInViewport()).toBe(false); + expect(await sidenavs[1].isFixedInViewport()).toBe(false); + expect(await sidenavs[2].isFixedInViewport()).toBe(true); + }); + + it('should load all sidenav container harnesses', async () => { + const containers = await loader.getAllHarnesses(MatSidenavContainerHarness); + expect(containers.length).toBe(2); + }); + + it('should get the sidenavs within a container', async () => { + const containers = await loader.getAllHarnesses(MatSidenavContainerHarness); + const [firstContainerSidenavs, secondContainerSidenavs] = await parallel(() => { + return containers.map(container => container.getSidenavs()); + }); + + expect( + await parallel(() => { + return firstContainerSidenavs.map(async container => (await container.host()).text()); + }), + ).toEqual(['One', 'Two']); + + expect( + await parallel(() => { + return secondContainerSidenavs.map(async container => (await container.host()).text()); + }), + ).toEqual(['Three']); + }); + + it('should get the content of a container', async () => { + const container = await loader.getHarness(MatSidenavContainerHarness); + const content = await container.getContent(); + expect(await (await content.host()).text()).toBe('Content'); + }); + + it('should load all sidenav content harnesses', async () => { + const contentElements = await loader.getAllHarnesses(MatSidenavContentHarness); + expect(contentElements.length).toBe(2); + }); + }); }); + +@Component({ + template: ` + + One + Two + Content + + + + Three + Content + + `, +}) +class DrawerHarnessTest { + threeOpened = true; +} + +@Component({ + template: ` + + One + Two + Content + + + + Three + Content + + `, +}) +class SidenavHarnessTest {} diff --git a/src/material/slide-toggle/testing/BUILD.bazel b/src/material/slide-toggle/testing/BUILD.bazel index df04a81ae89c..845d6bb060ab 100644 --- a/src/material/slide-toggle/testing/BUILD.bazel +++ b/src/material/slide-toggle/testing/BUILD.bazel @@ -21,14 +21,14 @@ ts_library( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/slide-toggle", + "@npm//@angular/forms", + "@npm//@angular/platform-browser", ], ) @@ -38,16 +38,3 @@ ng_web_test_suite( ":unit_tests_lib", ], ) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/slide-toggle", - "@npm//@angular/forms", - "@npm//@angular/platform-browser", - ], -) diff --git a/src/material/slide-toggle/testing/shared.spec.ts b/src/material/slide-toggle/testing/shared.spec.ts deleted file mode 100644 index 34ba1bda59a4..000000000000 --- a/src/material/slide-toggle/testing/shared.spec.ts +++ /dev/null @@ -1,186 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {FormControl, ReactiveFormsModule} from '@angular/forms'; -import {MatSlideToggleModule} from '@angular/material/slide-toggle'; -import {MatSlideToggleHarness} from '@angular/material/slide-toggle/testing'; - -/** Shared tests to run on both the original and MDC-based slide-toggles. */ -export function runHarnessTests( - slideToggleModule: typeof MatSlideToggleModule, - slideToggleHarness: typeof MatSlideToggleHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [slideToggleModule, ReactiveFormsModule], - declarations: [SlideToggleHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SlideToggleHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all slide-toggle harnesses', async () => { - const slideToggles = await loader.getAllHarnesses(slideToggleHarness); - expect(slideToggles.length).toBe(2); - }); - - it('should load slide-toggle with exact label', async () => { - const slideToggles = await loader.getAllHarnesses(slideToggleHarness.with({label: 'First'})); - expect(slideToggles.length).toBe(1); - expect(await slideToggles[0].getLabelText()).toBe('First'); - }); - - it('should load slide-toggle with disabled=true predicate', async () => { - const slideToggles = await loader.getAllHarnesses(slideToggleHarness.with({disabled: true})); - expect(slideToggles.length).toBe(1); - expect(await slideToggles[0].isDisabled()).toBe(true); - }); - - it('should load slide-toggle with disabled=false predicate', async () => { - const slideToggles = await loader.getAllHarnesses(slideToggleHarness.with({disabled: false})); - expect(slideToggles.length).toBe(1); - expect(await slideToggles[0].isDisabled()).toBe(false); - }); - - it('should load slide-toggle with regex label match', async () => { - const slideToggles = await loader.getAllHarnesses(slideToggleHarness.with({label: /^s/i})); - expect(slideToggles.length).toBe(1); - expect(await slideToggles[0].getLabelText()).toBe('Second'); - }); - - it('should load slide-toggle with name', async () => { - const slideToggles = await loader.getAllHarnesses( - slideToggleHarness.with({name: 'first-name'}), - ); - expect(slideToggles.length).toBe(1); - expect(await slideToggles[0].getLabelText()).toBe('First'); - }); - - it('should get checked state', async () => { - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(slideToggleHarness); - expect(await checkedToggle.isChecked()).toBe(true); - expect(await uncheckedToggle.isChecked()).toBe(false); - }); - - it('should get disabled state', async () => { - const [enabledToggle, disabledToggle] = await loader.getAllHarnesses(slideToggleHarness); - expect(await enabledToggle.isDisabled()).toBe(false); - expect(await disabledToggle.isDisabled()).toBe(true); - }); - - it('should get required state', async () => { - const [requiredToggle, optionalToggle] = await loader.getAllHarnesses(slideToggleHarness); - expect(await requiredToggle.isRequired()).toBe(true); - expect(await optionalToggle.isRequired()).toBe(false); - }); - - it('should get valid state', async () => { - const [requiredToggle, optionalToggle] = await loader.getAllHarnesses(slideToggleHarness); - expect(await optionalToggle.isValid()) - .withContext('Expected optional toggle to be valid') - .toBe(true); - expect(await requiredToggle.isValid()) - .withContext('Expected required checked toggle to be valid') - .toBe(true); - await requiredToggle.uncheck(); - expect(await requiredToggle.isValid()) - .withContext('Expected required unchecked toggle to be invalid') - .toBe(false); - }); - - it('should get name', async () => { - const slideToggle = await loader.getHarness(slideToggleHarness.with({label: 'First'})); - expect(await slideToggle.getName()).toBe('first-name'); - }); - - it('should get aria-label', async () => { - const slideToggle = await loader.getHarness(slideToggleHarness.with({label: 'First'})); - expect(await slideToggle.getAriaLabel()).toBe('First slide-toggle'); - }); - - it('should get aria-labelledby', async () => { - const slideToggle = await loader.getHarness(slideToggleHarness.with({label: 'Second'})); - expect(await slideToggle.getAriaLabelledby()).toBe('second-label'); - }); - - it('should get label text', async () => { - const [firstToggle, secondToggle] = await loader.getAllHarnesses(slideToggleHarness); - expect(await firstToggle.getLabelText()).toBe('First'); - expect(await secondToggle.getLabelText()).toBe('Second'); - }); - - it('should focus slide-toggle', async () => { - const slideToggle = await loader.getHarness(slideToggleHarness.with({label: 'First'})); - expect(await slideToggle.isFocused()).toBe(false); - await slideToggle.focus(); - expect(await slideToggle.isFocused()).toBe(true); - }); - - it('should blur slide-toggle', async () => { - const slideToggle = await loader.getHarness(slideToggleHarness.with({label: 'First'})); - await slideToggle.focus(); - expect(await slideToggle.isFocused()).toBe(true); - await slideToggle.blur(); - expect(await slideToggle.isFocused()).toBe(false); - }); - - it('should toggle slide-toggle', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(slideToggleHarness); - await checkedToggle.toggle(); - await uncheckedToggle.toggle(); - expect(await checkedToggle.isChecked()).toBe(false); - expect(await uncheckedToggle.isChecked()).toBe(true); - }); - - it('should check slide-toggle', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(slideToggleHarness); - await checkedToggle.check(); - await uncheckedToggle.check(); - expect(await checkedToggle.isChecked()).toBe(true); - expect(await uncheckedToggle.isChecked()).toBe(true); - }); - - it('should uncheck slide-toggle', async () => { - fixture.componentInstance.disabled = false; - const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(slideToggleHarness); - await checkedToggle.uncheck(); - await uncheckedToggle.uncheck(); - expect(await checkedToggle.isChecked()).toBe(false); - expect(await uncheckedToggle.isChecked()).toBe(false); - }); - - it('should not toggle disabled slide-toggle', async () => { - const disabledToggle = await loader.getHarness(slideToggleHarness.with({label: 'Second'})); - expect(await disabledToggle.isChecked()).toBe(false); - await disabledToggle.toggle(); - expect(await disabledToggle.isChecked()).toBe(false); - }); -} - -@Component({ - template: ` - - First - - - Second - - Second slide-toggle - `, -}) -class SlideToggleHarnessTest { - ctrl = new FormControl(true); - disabled = true; -} diff --git a/src/material/slide-toggle/testing/slide-toggle-harness.spec.ts b/src/material/slide-toggle/testing/slide-toggle-harness.spec.ts index 5665c31a4bae..e9c2b3e94794 100644 --- a/src/material/slide-toggle/testing/slide-toggle-harness.spec.ts +++ b/src/material/slide-toggle/testing/slide-toggle-harness.spec.ts @@ -1,7 +1,184 @@ -import {runHarnessTests} from './shared.spec'; -import {MatSlideToggleModule} from '../index'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {FormControl, ReactiveFormsModule} from '@angular/forms'; +import {MatSlideToggleModule} from '@angular/material/slide-toggle'; import {MatSlideToggleHarness} from './slide-toggle-harness'; -describe('MDC-based MatSlideToggleHarness', () => { - runHarnessTests(MatSlideToggleModule, MatSlideToggleHarness); +describe('MatSlideToggleHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatSlideToggleModule, ReactiveFormsModule], + declarations: [SlideToggleHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(SlideToggleHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all slide-toggle harnesses', async () => { + const slideToggles = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(slideToggles.length).toBe(2); + }); + + it('should load slide-toggle with exact label', async () => { + const slideToggles = await loader.getAllHarnesses(MatSlideToggleHarness.with({label: 'First'})); + expect(slideToggles.length).toBe(1); + expect(await slideToggles[0].getLabelText()).toBe('First'); + }); + + it('should load slide-toggle with disabled=true predicate', async () => { + const slideToggles = await loader.getAllHarnesses(MatSlideToggleHarness.with({disabled: true})); + expect(slideToggles.length).toBe(1); + expect(await slideToggles[0].isDisabled()).toBe(true); + }); + + it('should load slide-toggle with disabled=false predicate', async () => { + const slideToggles = await loader.getAllHarnesses( + MatSlideToggleHarness.with({disabled: false}), + ); + expect(slideToggles.length).toBe(1); + expect(await slideToggles[0].isDisabled()).toBe(false); + }); + + it('should load slide-toggle with regex label match', async () => { + const slideToggles = await loader.getAllHarnesses(MatSlideToggleHarness.with({label: /^s/i})); + expect(slideToggles.length).toBe(1); + expect(await slideToggles[0].getLabelText()).toBe('Second'); + }); + + it('should load slide-toggle with name', async () => { + const slideToggles = await loader.getAllHarnesses( + MatSlideToggleHarness.with({name: 'first-name'}), + ); + expect(slideToggles.length).toBe(1); + expect(await slideToggles[0].getLabelText()).toBe('First'); + }); + + it('should get checked state', async () => { + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(await checkedToggle.isChecked()).toBe(true); + expect(await uncheckedToggle.isChecked()).toBe(false); + }); + + it('should get disabled state', async () => { + const [enabledToggle, disabledToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(await enabledToggle.isDisabled()).toBe(false); + expect(await disabledToggle.isDisabled()).toBe(true); + }); + + it('should get required state', async () => { + const [requiredToggle, optionalToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(await requiredToggle.isRequired()).toBe(true); + expect(await optionalToggle.isRequired()).toBe(false); + }); + + it('should get valid state', async () => { + const [requiredToggle, optionalToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(await optionalToggle.isValid()) + .withContext('Expected optional toggle to be valid') + .toBe(true); + expect(await requiredToggle.isValid()) + .withContext('Expected required checked toggle to be valid') + .toBe(true); + await requiredToggle.uncheck(); + expect(await requiredToggle.isValid()) + .withContext('Expected required unchecked toggle to be invalid') + .toBe(false); + }); + + it('should get name', async () => { + const slideToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'First'})); + expect(await slideToggle.getName()).toBe('first-name'); + }); + + it('should get aria-label', async () => { + const slideToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'First'})); + expect(await slideToggle.getAriaLabel()).toBe('First slide-toggle'); + }); + + it('should get aria-labelledby', async () => { + const slideToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'Second'})); + expect(await slideToggle.getAriaLabelledby()).toBe('second-label'); + }); + + it('should get label text', async () => { + const [firstToggle, secondToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + expect(await firstToggle.getLabelText()).toBe('First'); + expect(await secondToggle.getLabelText()).toBe('Second'); + }); + + it('should focus slide-toggle', async () => { + const slideToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'First'})); + expect(await slideToggle.isFocused()).toBe(false); + await slideToggle.focus(); + expect(await slideToggle.isFocused()).toBe(true); + }); + + it('should blur slide-toggle', async () => { + const slideToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'First'})); + await slideToggle.focus(); + expect(await slideToggle.isFocused()).toBe(true); + await slideToggle.blur(); + expect(await slideToggle.isFocused()).toBe(false); + }); + + it('should toggle slide-toggle', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + await checkedToggle.toggle(); + await uncheckedToggle.toggle(); + expect(await checkedToggle.isChecked()).toBe(false); + expect(await uncheckedToggle.isChecked()).toBe(true); + }); + + it('should check slide-toggle', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + await checkedToggle.check(); + await uncheckedToggle.check(); + expect(await checkedToggle.isChecked()).toBe(true); + expect(await uncheckedToggle.isChecked()).toBe(true); + }); + + it('should uncheck slide-toggle', async () => { + fixture.componentInstance.disabled = false; + const [checkedToggle, uncheckedToggle] = await loader.getAllHarnesses(MatSlideToggleHarness); + await checkedToggle.uncheck(); + await uncheckedToggle.uncheck(); + expect(await checkedToggle.isChecked()).toBe(false); + expect(await uncheckedToggle.isChecked()).toBe(false); + }); + + it('should not toggle disabled slide-toggle', async () => { + const disabledToggle = await loader.getHarness(MatSlideToggleHarness.with({label: 'Second'})); + expect(await disabledToggle.isChecked()).toBe(false); + await disabledToggle.toggle(); + expect(await disabledToggle.isChecked()).toBe(false); + }); }); + +@Component({ + template: ` + + First + + + Second + + Second slide-toggle + `, +}) +class SlideToggleHarnessTest { + ctrl = new FormControl(true); + disabled = true; +} diff --git a/src/material/snack-bar/_snack-bar-theme.scss b/src/material/snack-bar/_snack-bar-theme.scss index dcb40283ffff..61f0c5bb4d11 100644 --- a/src/material/snack-bar/_snack-bar-theme.scss +++ b/src/material/snack-bar/_snack-bar-theme.scss @@ -1,58 +1,77 @@ +@use 'sass:map'; @use '@material/snackbar/snackbar-theme' as mdc-snackbar-theme; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/style/sass-utils'; @use '../core/typography/typography'; @use '../core/tokens/token-utils'; @use '../core/tokens/m2/mdc/snack-bar' as tokens-mdc-snack-bar; @use '../core/tokens/m2/mat/snack-bar' as tokens-mat-snack-bar; -@mixin base($config-or-theme) { +@mixin base($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, base)); + } + @else { // Add default values for tokens not related to color, typography, or density. - @include sass-utils.current-selector-or-root() { - @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-unthemable-tokens()); + @include sass-utils.current-selector-or-root() { + @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-unthemable-tokens()); + } } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - - @include sass-utils.current-selector-or-root() { - @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-color-tokens($config)); - @include token-utils.create-token-values( - tokens-mat-snack-bar.$prefix, - tokens-mat-snack-bar.get-color-tokens($config) - ); +@mixin color($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, color)); + } + @else { + @include sass-utils.current-selector-or-root() { + @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-color-tokens($theme)); + @include token-utils.create-token-values( + tokens-mat-snack-bar.$prefix, + tokens-mat-snack-bar.get-color-tokens($theme) + ); + } } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - - @include sass-utils.current-selector-or-root() { - @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-typography-tokens($config)); +@mixin typography($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, typography)); + } + @else { + @include sass-utils.current-selector-or-root() { + @include mdc-snackbar-theme.theme(tokens-mdc-snack-bar.get-typography-tokens($theme)); + } } } -@mixin density($config-or-theme) {} +@mixin density($theme) {} -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-snack-bar') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @include base($theme); - @if $color != null { - @include color($color); - } - @if $density != null { - @include density($density); + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme)); } - @if $typography != null { - @include typography($typography); + @else { + @include base($theme); + @if inspection.theme-has($theme, color) { + @include color($theme); + } + @if inspection.theme-has($theme, density) { + @include density($theme); + } + @if inspection.theme-has($theme, typography) { + @include typography($theme); + } } } } +@mixin _theme-from-tokens($tokens) { + @if ($tokens != ()) { + @include mdc-snackbar-theme.theme(map.get($tokens, tokens-mdc-snack-bar.$prefix)); + @include token-utils.create-token-values( + tokens-mat-snack-bar.$prefix, map.get($tokens, tokens-mat-snack-bar.$prefix)); + } +} diff --git a/src/material/snack-bar/testing/BUILD.bazel b/src/material/snack-bar/testing/BUILD.bazel index 1d0aa7381d07..85aeb269b87b 100644 --- a/src/material/snack-bar/testing/BUILD.bazel +++ b/src/material/snack-bar/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/overlay", @@ -33,22 +33,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/snack-bar", - "@npm//@angular/platform-browser", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [ diff --git a/src/material/snack-bar/testing/shared.spec.ts b/src/material/snack-bar/testing/shared.spec.ts deleted file mode 100644 index f3367a0ec062..000000000000 --- a/src/material/snack-bar/testing/shared.spec.ts +++ /dev/null @@ -1,155 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, TemplateRef, ViewChild, Injector} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatSnackBar, MatSnackBarConfig, MatSnackBarModule} from '@angular/material/snack-bar'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatSnackBarHarness} from './snack-bar-harness'; - -/** - * Function that can be used to run the shared snack-bar harness tests for either - * the non-MDC or MDC based snack-bar harness. - */ -export function runHarnessTests( - snackBarModule: typeof MatSnackBarModule, - snackBarToken: typeof MatSnackBar, - snackBarHarness: typeof MatSnackBarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [snackBarModule, NoopAnimationsModule], - declarations: [SnackbarHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SnackbarHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.documentRootLoader(fixture); - }); - - it('should load harness for simple snack-bar', async () => { - const snackBarRef = fixture.componentInstance.openSimple('Hello!', ''); - let snackBars = await loader.getAllHarnesses(snackBarHarness); - - expect(snackBars.length).toBe(1); - - snackBarRef.dismiss(); - snackBars = await loader.getAllHarnesses(snackBarHarness); - expect(snackBars.length).toBe(0); - }); - - it('should load harness for custom snack-bar', async () => { - const snackBarRef = fixture.componentInstance.openCustom(); - let snackBars = await loader.getAllHarnesses(snackBarHarness); - - expect(snackBars.length).toBe(1); - - snackBarRef.dismiss(); - snackBars = await loader.getAllHarnesses(snackBarHarness); - expect(snackBars.length).toBe(0); - }); - - it('should load snack-bar harness by selector', async () => { - fixture.componentInstance.openSimple('Hello!', '', {panelClass: 'my-snack-bar'}); - const snackBars = await loader.getAllHarnesses( - snackBarHarness.with({ - selector: '.my-snack-bar', - }), - ); - expect(snackBars.length).toBe(1); - }); - - it('should be able to get role of snack-bar', async () => { - // Get role is now deprecated, so it should always return null. - fixture.componentInstance.openCustom(); - let snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getRole()).toBe(null); - - fixture.componentInstance.openCustom({politeness: 'polite'}); - snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getRole()).toBe(null); - - fixture.componentInstance.openCustom({politeness: 'off'}); - snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getRole()).toBe(null); - }); - - it('should be able to get aria-live of snack-bar', async () => { - fixture.componentInstance.openCustom(); - let snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getAriaLive()).toBe('assertive'); - - fixture.componentInstance.openCustom({politeness: 'polite'}); - snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getAriaLive()).toBe('polite'); - - fixture.componentInstance.openCustom({politeness: 'off'}); - snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getAriaLive()).toBe('off'); - }); - - it('should be able to get message of simple snack-bar', async () => { - fixture.componentInstance.openSimple('Subscribed to newsletter.'); - let snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getMessage()).toBe('Subscribed to newsletter.'); - }); - - it('should be able to get action description of simple snack-bar', async () => { - fixture.componentInstance.openSimple('Hello', 'Unsubscribe'); - let snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.getActionDescription()).toBe('Unsubscribe'); - }); - - it('should be able to check whether simple snack-bar has action', async () => { - fixture.componentInstance.openSimple('With action', 'Unsubscribe'); - let snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.hasAction()).toBe(true); - - fixture.componentInstance.openSimple('No action'); - snackBar = await loader.getHarness(snackBarHarness); - expect(await snackBar.hasAction()).toBe(false); - }); - - it('should be able to dismiss simple snack-bar with action', async () => { - const snackBarRef = fixture.componentInstance.openSimple('With action', 'Unsubscribe'); - let snackBar = await loader.getHarness(snackBarHarness); - let actionCount = 0; - snackBarRef.onAction().subscribe(() => actionCount++); - - expect(await snackBar.isDismissed()) - .withContext('The snackbar should be present in the DOM before dismiss') - .toBe(false); - - await snackBar.dismissWithAction(); - expect(actionCount).toBe(1); - expect(await snackBar.isDismissed()) - .withContext('The snackbar should be absent from the DOM after dismiss') - .toBe(true); - - fixture.componentInstance.openSimple('No action'); - snackBar = await loader.getHarness(snackBarHarness); - await expectAsync(snackBar.dismissWithAction()).toBeRejectedWithError(/without an action/); - }); - - @Component({ - template: `My custom snack-bar.`, - }) - class SnackbarHarnessTest { - @ViewChild(TemplateRef) customTmpl: TemplateRef; - snackBar: MatSnackBar; - - constructor(injector: Injector) { - this.snackBar = injector.get(snackBarToken); - } - - openSimple(message: string, action = '', config?: MatSnackBarConfig) { - return this.snackBar.open(message, action, config); - } - - openCustom(config?: MatSnackBarConfig) { - return this.snackBar.openFromTemplate(this.customTmpl, config); - } - } -} diff --git a/src/material/snack-bar/testing/snack-bar-harness.spec.ts b/src/material/snack-bar/testing/snack-bar-harness.spec.ts index 166a2bee1817..5def8c899606 100644 --- a/src/material/snack-bar/testing/snack-bar-harness.spec.ts +++ b/src/material/snack-bar/testing/snack-bar-harness.spec.ts @@ -1,17 +1,12 @@ -import {MatSnackBar, MatSnackBarConfig, MatSnackBarModule} from '@angular/material/snack-bar'; -import {runHarnessTests} from './shared.spec'; +import {Component, TemplateRef, ViewChild} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {HarnessLoader} from '@angular/cdk/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component, TemplateRef, ViewChild} from '@angular/core'; +import {MatSnackBar, MatSnackBarConfig, MatSnackBarModule} from '@angular/material/snack-bar'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatSnackBarHarness} from './snack-bar-harness'; -describe('MDC-based MatSnackBarHarness', () => { - runHarnessTests(MatSnackBarModule, MatSnackBar, MatSnackBarHarness); -}); - -describe('MDC-based MatSnackBarHarness (MDC only behavior)', () => { +describe('MatSnackBarHarness', () => { let fixture: ComponentFixture; let loader: HarnessLoader; @@ -26,6 +21,110 @@ describe('MDC-based MatSnackBarHarness (MDC only behavior)', () => { loader = TestbedHarnessEnvironment.documentRootLoader(fixture); }); + it('should load harness for simple snack-bar', async () => { + const snackBarRef = fixture.componentInstance.openSimple('Hello!', ''); + let snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + + expect(snackBars.length).toBe(1); + + snackBarRef.dismiss(); + snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + expect(snackBars.length).toBe(0); + }); + + it('should load harness for custom snack-bar', async () => { + const snackBarRef = fixture.componentInstance.openCustom(); + let snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + + expect(snackBars.length).toBe(1); + + snackBarRef.dismiss(); + snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + expect(snackBars.length).toBe(0); + }); + + it('should load snack-bar harness by selector', async () => { + fixture.componentInstance.openSimple('Hello!', '', {panelClass: 'my-snack-bar'}); + const snackBars = await loader.getAllHarnesses( + MatSnackBarHarness.with({ + selector: '.my-snack-bar', + }), + ); + expect(snackBars.length).toBe(1); + }); + + it('should be able to get role of snack-bar', async () => { + // Get role is now deprecated, so it should always return null. + fixture.componentInstance.openCustom(); + let snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getRole()).toBe(null); + + fixture.componentInstance.openCustom({politeness: 'polite'}); + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getRole()).toBe(null); + + fixture.componentInstance.openCustom({politeness: 'off'}); + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getRole()).toBe(null); + }); + + it('should be able to get aria-live of snack-bar', async () => { + fixture.componentInstance.openCustom(); + let snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getAriaLive()).toBe('assertive'); + + fixture.componentInstance.openCustom({politeness: 'polite'}); + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getAriaLive()).toBe('polite'); + + fixture.componentInstance.openCustom({politeness: 'off'}); + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getAriaLive()).toBe('off'); + }); + + it('should be able to get message of simple snack-bar', async () => { + fixture.componentInstance.openSimple('Subscribed to newsletter.'); + let snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getMessage()).toBe('Subscribed to newsletter.'); + }); + + it('should be able to get action description of simple snack-bar', async () => { + fixture.componentInstance.openSimple('Hello', 'Unsubscribe'); + let snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getActionDescription()).toBe('Unsubscribe'); + }); + + it('should be able to check whether simple snack-bar has action', async () => { + fixture.componentInstance.openSimple('With action', 'Unsubscribe'); + let snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.hasAction()).toBe(true); + + fixture.componentInstance.openSimple('No action'); + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.hasAction()).toBe(false); + }); + + it('should be able to dismiss simple snack-bar with action', async () => { + const snackBarRef = fixture.componentInstance.openSimple('With action', 'Unsubscribe'); + let snackBar = await loader.getHarness(MatSnackBarHarness); + let actionCount = 0; + snackBarRef.onAction().subscribe(() => actionCount++); + + expect(await snackBar.isDismissed()) + .withContext('The snackbar should be present in the DOM before dismiss') + .toBe(false); + + await snackBar.dismissWithAction(); + expect(actionCount).toBe(1); + expect(await snackBar.isDismissed()) + .withContext('The snackbar should be absent from the DOM after dismiss') + .toBe(true); + + fixture.componentInstance.openSimple('No action'); + snackBar = await loader.getHarness(MatSnackBarHarness); + await expectAsync(snackBar.dismissWithAction()).toBeRejectedWithError(/without an action/); + }); + it('should be able to get message of a snack-bar with custom content', async () => { fixture.componentInstance.openCustom(); let snackBar = await loader.getHarness(MatSnackBarHarness); @@ -74,6 +173,10 @@ class SnackbarHarnessTest { constructor(public snackBar: MatSnackBar) {} + openSimple(message: string, action = '', config?: MatSnackBarConfig) { + return this.snackBar.open(message, action, config); + } + openCustom(config?: MatSnackBarConfig) { return this.snackBar.openFromTemplate(this.customTmpl, config); } diff --git a/src/material/sort/testing/BUILD.bazel b/src/material/sort/testing/BUILD.bazel index 46a6a4e69f03..f49a71a7072d 100644 --- a/src/material/sort/testing/BUILD.bazel +++ b/src/material/sort/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -31,19 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/sort", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/sort/testing/shared.spec.ts b/src/material/sort/testing/shared.spec.ts deleted file mode 100644 index 680152dc108a..000000000000 --- a/src/material/sort/testing/shared.spec.ts +++ /dev/null @@ -1,169 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatSortModule, Sort} from '@angular/material/sort'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatSortHarness} from './sort-harness'; - -/** Shared tests to run on both the original and MDC-based sort. */ -export function runHarnessTests( - sortModule: typeof MatSortModule, - sortHarness: typeof MatSortHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [sortModule, NoopAnimationsModule], - declarations: [SortHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(SortHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load harness for mat-sort', async () => { - const sorts = await loader.getAllHarnesses(sortHarness); - expect(sorts.length).toBe(1); - }); - - it('should load the harnesses for all the headers in a mat-sort', async () => { - const sort = await loader.getHarness(sortHarness); - const headers = await sort.getSortHeaders(); - expect(headers.length).toBe(5); - }); - - it('should be able to filter headers by their label text', async () => { - const sort = await loader.getHarness(sortHarness); - const headers = await sort.getSortHeaders({label: 'Carbs'}); - expect(headers.length).toBe(1); - expect(await headers[0].getLabel()).toBe('Carbs'); - }); - - it('should be able to filter headers by their labels via a regex', async () => { - const sort = await loader.getHarness(sortHarness); - const headers = await sort.getSortHeaders({label: /^C/}); - const labels = await parallel(() => headers.map(header => header.getLabel())); - expect(headers.length).toBe(2); - expect(labels).toEqual(['Calories', 'Carbs']); - }); - - it('should be able to filter headers by their sorted state', async () => { - const sort = await loader.getHarness(sortHarness); - let headers = await sort.getSortHeaders({sortDirection: ''}); - expect(headers.length).toBe(5); - - await headers[0].click(); - - headers = await sort.getSortHeaders({sortDirection: 'asc'}); - - expect(headers.length).toBe(1); - }); - - it('should be able to get the label of a header', async () => { - const sort = await loader.getHarness(sortHarness); - const headers = await sort.getSortHeaders(); - const labels = await parallel(() => headers.map(header => header.getLabel())); - expect(labels).toEqual(['Dessert', 'Calories', 'Fat', 'Carbs', 'Protein']); - }); - - it('should get the disabled state of a header', async () => { - const sort = await loader.getHarness(sortHarness); - const thirdHeader = (await sort.getSortHeaders())[2]; - - expect(await thirdHeader.isDisabled()).toBe(false); - - fixture.componentInstance.disableThirdHeader = true; - fixture.detectChanges(); - - expect(await thirdHeader.isDisabled()).toBe(true); - }); - - it('should get the active state of a header', async () => { - const sort = await loader.getHarness(sortHarness); - const secondHeader = (await sort.getSortHeaders())[1]; - - expect(await secondHeader.isActive()).toBe(false); - - await secondHeader.click(); - - expect(await secondHeader.isActive()).toBe(true); - }); - - it('should get the sorte direction of a header', async () => { - const sort = await loader.getHarness(sortHarness); - const secondHeader = (await sort.getSortHeaders())[1]; - - expect(await secondHeader.getSortDirection()).toBe(''); - - await secondHeader.click(); - expect(await secondHeader.getSortDirection()).toBe('asc'); - - await secondHeader.click(); - expect(await secondHeader.getSortDirection()).toBe('desc'); - }); - - it('should get the active header', async () => { - const sort = await loader.getHarness(sortHarness); - const fifthHeader = (await sort.getSortHeaders())[4]; - - expect(await sort.getActiveHeader()).toBeNull(); - - await fifthHeader.click(); - - const activeHeader = await sort.getActiveHeader(); - expect(activeHeader).toBeTruthy(); - expect(await activeHeader!.getLabel()).toBe('Protein'); - }); -} - -@Component({ - template: ` -
- - - - - - - - - - - - - - - -
DessertCaloriesFatCarbsProtein
{{dessert.name}}{{dessert.calories}}{{dessert.fat}}{{dessert.carbs}}{{dessert.protein}}
- `, -}) -class SortHarnessTest { - disableThirdHeader = false; - desserts = [ - {name: 'Frozen yogurt', calories: 159, fat: 6, carbs: 24, protein: 4}, - {name: 'Ice cream sandwich', calories: 237, fat: 9, carbs: 37, protein: 4}, - {name: 'Eclair', calories: 262, fat: 16, carbs: 24, protein: 6}, - {name: 'Cupcake', calories: 305, fat: 4, carbs: 67, protein: 4}, - {name: 'Gingerbread', calories: 356, fat: 16, carbs: 49, protein: 4}, - ]; - - sortedData = this.desserts.slice(); - - sortData(sort: Sort) { - const data = this.desserts.slice(); - - if (!sort.active || sort.direction === '') { - this.sortedData = data; - } else { - this.sortedData = data.sort((a, b) => { - const aValue = (a as any)[sort.active]; - const bValue = (b as any)[sort.active]; - return (aValue < bValue ? -1 : 1) * (sort.direction === 'asc' ? 1 : -1); - }); - } - } -} diff --git a/src/material/sort/testing/sort-harness.spec.ts b/src/material/sort/testing/sort-harness.spec.ts index 65e50cd9172b..ee34924a2e26 100644 --- a/src/material/sort/testing/sort-harness.spec.ts +++ b/src/material/sort/testing/sort-harness.spec.ts @@ -1,7 +1,165 @@ -import {MatSortModule} from '@angular/material/sort'; -import {runHarnessTests} from '@angular/material/sort/testing/shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatSortModule, Sort} from '@angular/material/sort'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatSortHarness} from './sort-harness'; -describe('Non-MDC-based MatSortHarness', () => { - runHarnessTests(MatSortModule, MatSortHarness); +describe('MatSortHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatSortModule, NoopAnimationsModule], + declarations: [SortHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(SortHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load harness for mat-sort', async () => { + const sorts = await loader.getAllHarnesses(MatSortHarness); + expect(sorts.length).toBe(1); + }); + + it('should load the harnesses for all the headers in a mat-sort', async () => { + const sort = await loader.getHarness(MatSortHarness); + const headers = await sort.getSortHeaders(); + expect(headers.length).toBe(5); + }); + + it('should be able to filter headers by their label text', async () => { + const sort = await loader.getHarness(MatSortHarness); + const headers = await sort.getSortHeaders({label: 'Carbs'}); + expect(headers.length).toBe(1); + expect(await headers[0].getLabel()).toBe('Carbs'); + }); + + it('should be able to filter headers by their labels via a regex', async () => { + const sort = await loader.getHarness(MatSortHarness); + const headers = await sort.getSortHeaders({label: /^C/}); + const labels = await parallel(() => headers.map(header => header.getLabel())); + expect(headers.length).toBe(2); + expect(labels).toEqual(['Calories', 'Carbs']); + }); + + it('should be able to filter headers by their sorted state', async () => { + const sort = await loader.getHarness(MatSortHarness); + let headers = await sort.getSortHeaders({sortDirection: ''}); + expect(headers.length).toBe(5); + + await headers[0].click(); + + headers = await sort.getSortHeaders({sortDirection: 'asc'}); + + expect(headers.length).toBe(1); + }); + + it('should be able to get the label of a header', async () => { + const sort = await loader.getHarness(MatSortHarness); + const headers = await sort.getSortHeaders(); + const labels = await parallel(() => headers.map(header => header.getLabel())); + expect(labels).toEqual(['Dessert', 'Calories', 'Fat', 'Carbs', 'Protein']); + }); + + it('should get the disabled state of a header', async () => { + const sort = await loader.getHarness(MatSortHarness); + const thirdHeader = (await sort.getSortHeaders())[2]; + + expect(await thirdHeader.isDisabled()).toBe(false); + + fixture.componentInstance.disableThirdHeader = true; + fixture.detectChanges(); + + expect(await thirdHeader.isDisabled()).toBe(true); + }); + + it('should get the active state of a header', async () => { + const sort = await loader.getHarness(MatSortHarness); + const secondHeader = (await sort.getSortHeaders())[1]; + + expect(await secondHeader.isActive()).toBe(false); + + await secondHeader.click(); + + expect(await secondHeader.isActive()).toBe(true); + }); + + it('should get the sorte direction of a header', async () => { + const sort = await loader.getHarness(MatSortHarness); + const secondHeader = (await sort.getSortHeaders())[1]; + + expect(await secondHeader.getSortDirection()).toBe(''); + + await secondHeader.click(); + expect(await secondHeader.getSortDirection()).toBe('asc'); + + await secondHeader.click(); + expect(await secondHeader.getSortDirection()).toBe('desc'); + }); + + it('should get the active header', async () => { + const sort = await loader.getHarness(MatSortHarness); + const fifthHeader = (await sort.getSortHeaders())[4]; + + expect(await sort.getActiveHeader()).toBeNull(); + + await fifthHeader.click(); + + const activeHeader = await sort.getActiveHeader(); + expect(activeHeader).toBeTruthy(); + expect(await activeHeader!.getLabel()).toBe('Protein'); + }); }); + +@Component({ + template: ` + + + + + + + + + + + + + + + + +
DessertCaloriesFatCarbsProtein
{{dessert.name}}{{dessert.calories}}{{dessert.fat}}{{dessert.carbs}}{{dessert.protein}}
+ `, +}) +class SortHarnessTest { + disableThirdHeader = false; + desserts = [ + {name: 'Frozen yogurt', calories: 159, fat: 6, carbs: 24, protein: 4}, + {name: 'Ice cream sandwich', calories: 237, fat: 9, carbs: 37, protein: 4}, + {name: 'Eclair', calories: 262, fat: 16, carbs: 24, protein: 6}, + {name: 'Cupcake', calories: 305, fat: 4, carbs: 67, protein: 4}, + {name: 'Gingerbread', calories: 356, fat: 16, carbs: 49, protein: 4}, + ]; + + sortedData = this.desserts.slice(); + + sortData(sort: Sort) { + const data = this.desserts.slice(); + + if (!sort.active || sort.direction === '') { + this.sortedData = data; + } else { + this.sortedData = data.sort((a, b) => { + const aValue = (a as any)[sort.active]; + const bValue = (b as any)[sort.active]; + return (aValue < bValue ? -1 : 1) * (sort.direction === 'asc' ? 1 : -1); + }); + } + } +} diff --git a/src/material/stepper/testing/BUILD.bazel b/src/material/stepper/testing/BUILD.bazel index 72dd313dcfe4..cfbec52b8fb9 100644 --- a/src/material/stepper/testing/BUILD.bazel +++ b/src/material/stepper/testing/BUILD.bazel @@ -19,8 +19,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/stepper", @@ -33,19 +33,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/stepper", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/stepper/testing/shared.spec.ts b/src/material/stepper/testing/shared.spec.ts deleted file mode 100644 index 8f4b3b19deaf..000000000000 --- a/src/material/stepper/testing/shared.spec.ts +++ /dev/null @@ -1,320 +0,0 @@ -import {Component} from '@angular/core'; -import {ReactiveFormsModule, FormGroup, FormControl, Validators} from '@angular/forms'; -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatStepperModule} from '@angular/material/stepper'; -import {STEPPER_GLOBAL_OPTIONS} from '@angular/cdk/stepper'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatStepperHarness} from './stepper-harness'; -import {MatStepperNextHarness, MatStepperPreviousHarness} from './stepper-button-harnesses'; -import {StepperOrientation} from './step-harness-filters'; - -/** Shared tests to run on both the original and MDC-based steppers. */ -export function runHarnessTests( - stepperModule: typeof MatStepperModule, - stepperHarness: typeof MatStepperHarness, - stepperNextHarness: typeof MatStepperNextHarness, - stepperPreviousHarness: typeof MatStepperPreviousHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [stepperModule, NoopAnimationsModule, ReactiveFormsModule], - declarations: [StepperHarnessTest], - providers: [ - { - provide: STEPPER_GLOBAL_OPTIONS, - useValue: {showError: true}, // Required so the error state shows up in tests. - }, - ], - }).compileComponents(); - - fixture = TestBed.createComponent(StepperHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all stepper harnesses', async () => { - const steppers = await loader.getAllHarnesses(stepperHarness); - expect(steppers.length).toBe(3); - }); - - it('should filter steppers by their orientation', async () => { - const [verticalSteppers, horizontalSteppers] = await parallel(() => [ - loader.getAllHarnesses(stepperHarness.with({orientation: StepperOrientation.VERTICAL})), - loader.getAllHarnesses(stepperHarness.with({orientation: StepperOrientation.HORIZONTAL})), - ]); - - expect(verticalSteppers.length).toBe(2); - expect(horizontalSteppers.length).toBe(1); - }); - - it('should get the orientation of a stepper', async () => { - const steppers = await loader.getAllHarnesses(stepperHarness); - - expect(await parallel(() => steppers.map(stepper => stepper.getOrientation()))).toEqual([ - StepperOrientation.VERTICAL, - StepperOrientation.HORIZONTAL, - StepperOrientation.VERTICAL, - ]); - }); - - it('should get the steps of a stepper', async () => { - const steppers = await loader.getAllHarnesses(stepperHarness); - const steps = await parallel(() => steppers.map(stepper => stepper.getSteps())); - expect(steps.map(current => current.length)).toEqual([4, 3, 2]); - }); - - it('should filter the steps of a stepper', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps({label: /Two|Four/}); - expect(await parallel(() => steps.map(step => step.getLabel()))).toEqual(['Two', 'Four']); - }); - - it('should be able to select a particular step that matches a filter', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - true, - false, - false, - false, - ]); - - await stepper.selectStep({label: 'Three'}); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - false, - false, - true, - false, - ]); - }); - - it('should be able to get the text-based label of a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.getLabel()))).toEqual([ - 'One', - 'Two', - 'Three', - 'Four', - ]); - }); - - it('should be able to get the template-based label of a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#two-stepper'})); - const steps = await stepper.getSteps(); - expect( - await parallel(() => { - return steps.map(step => step.getLabel()); - }), - ).toEqual(['One', 'Two', 'Three']); - }); - - it('should be able to get the aria-label of a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - expect(await parallel(() => steps.map(step => step.getAriaLabel()))).toEqual([ - null, - null, - null, - 'Fourth step', - ]); - }); - - it('should be able to get the aria-labelledby of a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - expect(await parallel(() => steps.map(step => step.getAriaLabelledby()))).toEqual([ - null, - null, - 'some-label', - null, - ]); - }); - - it('should get the selected state of a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - true, - false, - false, - false, - ]); - }); - - it('should be able to select a step', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - true, - false, - false, - false, - ]); - - await steps[2].select(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - false, - false, - true, - false, - ]); - }); - - it('should get whether a step is optional', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#two-stepper'})); - const steps = await stepper.getSteps(); - expect(await parallel(() => steps.map(step => step.isOptional()))).toEqual([false, true, true]); - }); - - it('should be able to get harness loader for an element inside a tab', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const [step] = await stepper.getSteps({label: 'Two'}); - const [nextButton, previousButton] = await parallel(() => [ - step.getHarness(stepperNextHarness), - step.getHarness(stepperPreviousHarness), - ]); - - expect(await nextButton.getText()).toBe('Next'); - expect(await previousButton.getText()).toBe('Previous'); - }); - - it('should go forward when pressing the next button', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - const secondStep = steps[1]; - const nextButton = await secondStep.getHarness(stepperNextHarness); - - await secondStep.select(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - false, - true, - false, - false, - ]); - - await nextButton.click(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - false, - false, - true, - false, - ]); - }); - - it('should go backward when pressing the previous button', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#one-stepper'})); - const steps = await stepper.getSteps(); - const secondStep = steps[1]; - const previousButton = await secondStep.getHarness(stepperPreviousHarness); - - await secondStep.select(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - false, - true, - false, - false, - ]); - - await previousButton.click(); - - expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ - true, - false, - false, - false, - ]); - }); - - it('should get whether a step has errors', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#three-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.hasErrors()))).toEqual([false, false]); - - await steps[1].select(); - - expect(await parallel(() => steps.map(step => step.hasErrors()))).toEqual([true, false]); - }); - - it('should get whether a step has been completed', async () => { - const stepper = await loader.getHarness(stepperHarness.with({selector: '#three-stepper'})); - const steps = await stepper.getSteps(); - - expect(await parallel(() => steps.map(step => step.isCompleted()))).toEqual([false, false]); - - fixture.componentInstance.oneGroup.setValue({oneCtrl: 'done'}); - await steps[1].select(); - - expect(await parallel(() => steps.map(step => step.isCompleted()))).toEqual([true, false]); - }); -} - -@Component({ - template: ` - - - - - - - - - - - - - - - - - - - - One - - - Two - - - Three - - - - - -
- -
-
- -
- -
-
-
- `, -}) -class StepperHarnessTest { - oneGroup = new FormGroup({ - oneCtrl: new FormControl('', Validators.required), - }); - - twoGroup = new FormGroup({ - twoCtrl: new FormControl('', Validators.required), - }); -} diff --git a/src/material/stepper/testing/stepper-harness.spec.ts b/src/material/stepper/testing/stepper-harness.spec.ts index 2216f26ba7bf..d22649602608 100644 --- a/src/material/stepper/testing/stepper-harness.spec.ts +++ b/src/material/stepper/testing/stepper-harness.spec.ts @@ -1,13 +1,314 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ReactiveFormsModule, FormGroup, FormControl, Validators} from '@angular/forms'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatStepperModule} from '@angular/material/stepper'; -import {runHarnessTests} from '@angular/material/stepper/testing/shared.spec'; +import {STEPPER_GLOBAL_OPTIONS} from '@angular/cdk/stepper'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatStepperHarness} from './stepper-harness'; import {MatStepperNextHarness, MatStepperPreviousHarness} from './stepper-button-harnesses'; +import {StepperOrientation} from './step-harness-filters'; -describe('Non-MDC-based MatStepperHarness', () => { - runHarnessTests( - MatStepperModule, - MatStepperHarness, - MatStepperNextHarness, - MatStepperPreviousHarness, - ); +describe('MatStepperHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatStepperModule, NoopAnimationsModule, ReactiveFormsModule], + declarations: [StepperHarnessTest], + providers: [ + { + provide: STEPPER_GLOBAL_OPTIONS, + useValue: {showError: true}, // Required so the error state shows up in tests. + }, + ], + }).compileComponents(); + + fixture = TestBed.createComponent(StepperHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all stepper harnesses', async () => { + const steppers = await loader.getAllHarnesses(MatStepperHarness); + expect(steppers.length).toBe(3); + }); + + it('should filter steppers by their orientation', async () => { + const [verticalSteppers, horizontalSteppers] = await parallel(() => [ + loader.getAllHarnesses(MatStepperHarness.with({orientation: StepperOrientation.VERTICAL})), + loader.getAllHarnesses(MatStepperHarness.with({orientation: StepperOrientation.HORIZONTAL})), + ]); + + expect(verticalSteppers.length).toBe(2); + expect(horizontalSteppers.length).toBe(1); + }); + + it('should get the orientation of a stepper', async () => { + const steppers = await loader.getAllHarnesses(MatStepperHarness); + + expect(await parallel(() => steppers.map(stepper => stepper.getOrientation()))).toEqual([ + StepperOrientation.VERTICAL, + StepperOrientation.HORIZONTAL, + StepperOrientation.VERTICAL, + ]); + }); + + it('should get the steps of a stepper', async () => { + const steppers = await loader.getAllHarnesses(MatStepperHarness); + const steps = await parallel(() => steppers.map(stepper => stepper.getSteps())); + expect(steps.map(current => current.length)).toEqual([4, 3, 2]); + }); + + it('should filter the steps of a stepper', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps({label: /Two|Four/}); + expect(await parallel(() => steps.map(step => step.getLabel()))).toEqual(['Two', 'Four']); + }); + + it('should be able to select a particular step that matches a filter', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + true, + false, + false, + false, + ]); + + await stepper.selectStep({label: 'Three'}); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + false, + false, + true, + false, + ]); + }); + + it('should be able to get the text-based label of a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.getLabel()))).toEqual([ + 'One', + 'Two', + 'Three', + 'Four', + ]); + }); + + it('should be able to get the template-based label of a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#two-stepper'})); + const steps = await stepper.getSteps(); + expect( + await parallel(() => { + return steps.map(step => step.getLabel()); + }), + ).toEqual(['One', 'Two', 'Three']); + }); + + it('should be able to get the aria-label of a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + expect(await parallel(() => steps.map(step => step.getAriaLabel()))).toEqual([ + null, + null, + null, + 'Fourth step', + ]); + }); + + it('should be able to get the aria-labelledby of a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + expect(await parallel(() => steps.map(step => step.getAriaLabelledby()))).toEqual([ + null, + null, + 'some-label', + null, + ]); + }); + + it('should get the selected state of a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + true, + false, + false, + false, + ]); + }); + + it('should be able to select a step', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + true, + false, + false, + false, + ]); + + await steps[2].select(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + false, + false, + true, + false, + ]); + }); + + it('should get whether a step is optional', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#two-stepper'})); + const steps = await stepper.getSteps(); + expect(await parallel(() => steps.map(step => step.isOptional()))).toEqual([false, true, true]); + }); + + it('should be able to get harness loader for an element inside a tab', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const [step] = await stepper.getSteps({label: 'Two'}); + const [nextButton, previousButton] = await parallel(() => [ + step.getHarness(MatStepperNextHarness), + step.getHarness(MatStepperPreviousHarness), + ]); + + expect(await nextButton.getText()).toBe('Next'); + expect(await previousButton.getText()).toBe('Previous'); + }); + + it('should go forward when pressing the next button', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + const secondStep = steps[1]; + const nextButton = await secondStep.getHarness(MatStepperNextHarness); + + await secondStep.select(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + false, + true, + false, + false, + ]); + + await nextButton.click(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + false, + false, + true, + false, + ]); + }); + + it('should go backward when pressing the previous button', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#one-stepper'})); + const steps = await stepper.getSteps(); + const secondStep = steps[1]; + const previousButton = await secondStep.getHarness(MatStepperPreviousHarness); + + await secondStep.select(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + false, + true, + false, + false, + ]); + + await previousButton.click(); + + expect(await parallel(() => steps.map(step => step.isSelected()))).toEqual([ + true, + false, + false, + false, + ]); + }); + + it('should get whether a step has errors', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#three-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.hasErrors()))).toEqual([false, false]); + + await steps[1].select(); + + expect(await parallel(() => steps.map(step => step.hasErrors()))).toEqual([true, false]); + }); + + it('should get whether a step has been completed', async () => { + const stepper = await loader.getHarness(MatStepperHarness.with({selector: '#three-stepper'})); + const steps = await stepper.getSteps(); + + expect(await parallel(() => steps.map(step => step.isCompleted()))).toEqual([false, false]); + + fixture.componentInstance.oneGroup.setValue({oneCtrl: 'done'}); + await steps[1].select(); + + expect(await parallel(() => steps.map(step => step.isCompleted()))).toEqual([true, false]); + }); }); + +@Component({ + template: ` + + + + + + + + + + + + + + + + + + + + One + + + Two + + + Three + + + + + +
+ +
+
+ +
+ +
+
+
+ `, +}) +class StepperHarnessTest { + oneGroup = new FormGroup({ + oneCtrl: new FormControl('', Validators.required), + }); + + twoGroup = new FormGroup({ + twoCtrl: new FormControl('', Validators.required), + }); +} diff --git a/src/material/table/_table-theme.scss b/src/material/table/_table-theme.scss index cc15290349ce..f3b7e609e212 100644 --- a/src/material/table/_table-theme.scss +++ b/src/material/table/_table-theme.scss @@ -1,5 +1,6 @@ @use '../core/tokens/m2/mat/table' as tokens-mat-table; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/token-utils'; @@ -14,49 +15,37 @@ } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { @include _output-tokens { @include token-utils.create-token-values(tokens-mat-table.$prefix, - tokens-mat-table.get-color-tokens($config)); + tokens-mat-table.get-color-tokens($theme)); } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { @include _output-tokens { @include token-utils.create-token-values(tokens-mat-table.$prefix, - tokens-mat-table.get-typography-tokens($config)); + tokens-mat-table.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - +@mixin density($theme) { @include _output-tokens { @include token-utils.create-token-values(tokens-mat-table.$prefix, - tokens-mat-table.get-density-tokens($density-scale)); + tokens-mat-table.get-density-tokens($theme)); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-table') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/table/testing/BUILD.bazel b/src/material/table/testing/BUILD.bazel index 53fdbd216d49..6f074e5aa7d9 100644 --- a/src/material/table/testing/BUILD.bazel +++ b/src/material/table/testing/BUILD.bazel @@ -19,8 +19,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -29,19 +29,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/table", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/table/testing/shared.spec.ts b/src/material/table/testing/shared.spec.ts deleted file mode 100644 index d8ae95d31c37..000000000000 --- a/src/material/table/testing/shared.spec.ts +++ /dev/null @@ -1,237 +0,0 @@ -import {HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatTableModule} from '../module'; -import {MatTableHarness} from './table-harness'; - -/** Shared tests to run on both the original and MDC-based table. */ -export function runHarnessTests( - tableModule: typeof MatTableModule, - tableHarness: typeof MatTableHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [tableModule], - declarations: [TableHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(TableHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load harness for a table', async () => { - const tables = await loader.getAllHarnesses(tableHarness); - expect(tables.length).toBe(1); - }); - - it('should get the different kinds of rows in the table', async () => { - const table = await loader.getHarness(tableHarness); - const headerRows = await table.getHeaderRows(); - const footerRows = await table.getFooterRows(); - const rows = await table.getRows(); - expect(headerRows.length).toBe(1); - expect(footerRows.length).toBe(1); - expect(rows.length).toBe(10); - }); - - it('should get cells inside a row', async () => { - const table = await loader.getHarness(tableHarness); - const headerRows = await table.getHeaderRows(); - const footerRows = await table.getFooterRows(); - const rows = await table.getRows(); - const headerCells = (await parallel(() => headerRows.map(row => row.getCells()))).map( - row => row.length, - ); - const footerCells = (await parallel(() => footerRows.map(row => row.getCells()))).map( - row => row.length, - ); - const cells = (await parallel(() => rows.map(row => row.getCells()))).map(row => row.length); - - expect(headerCells).toEqual([4]); - expect(cells).toEqual([4, 4, 4, 4, 4, 4, 4, 4, 4, 4]); - expect(footerCells).toEqual([4]); - }); - - it('should be able to get the text of a cell', async () => { - const table = await loader.getHarness(tableHarness); - const secondRow = (await table.getRows())[1]; - const cells = await secondRow.getCells(); - const cellTexts = await parallel(() => cells.map(cell => cell.getText())); - expect(cellTexts).toEqual(['2', 'Helium', '4.0026', 'He']); - }); - - it('should be able to get the column name of a cell', async () => { - const table = await loader.getHarness(tableHarness); - const fifthRow = (await table.getRows())[1]; - const cells = await fifthRow.getCells(); - const cellColumnNames = await parallel(() => cells.map(cell => cell.getColumnName())); - expect(cellColumnNames).toEqual(['position', 'name', 'weight', 'symbol']); - }); - - it('should be able to filter cells by text', async () => { - const table = await loader.getHarness(tableHarness); - const firstRow = (await table.getRows())[0]; - const cells = await firstRow.getCells({text: '1.0079'}); - const cellTexts = await parallel(() => cells.map(cell => cell.getText())); - expect(cellTexts).toEqual(['1.0079']); - }); - - it('should be able to filter cells by column name', async () => { - const table = await loader.getHarness(tableHarness); - const firstRow = (await table.getRows())[0]; - const cells = await firstRow.getCells({columnName: 'symbol'}); - const cellTexts = await parallel(() => cells.map(cell => cell.getText())); - expect(cellTexts).toEqual(['H']); - }); - - it('should be able to filter cells by regex', async () => { - const table = await loader.getHarness(tableHarness); - const firstRow = (await table.getRows())[0]; - const cells = await firstRow.getCells({text: /^H/}); - const cellTexts = await parallel(() => cells.map(cell => cell.getText())); - expect(cellTexts).toEqual(['Hydrogen', 'H']); - }); - - it('should be able to get the table text organized by columns', async () => { - const table = await loader.getHarness(tableHarness); - const text = await table.getCellTextByColumnName(); - - expect(text).toEqual({ - position: { - headerText: ['No.'], - footerText: ['Number of the element'], - text: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], - }, - name: { - headerText: ['Name'], - footerText: ['Name of the element'], - text: [ - 'Hydrogen', - 'Helium', - 'Lithium', - 'Beryllium', - 'Boron', - 'Carbon', - 'Nitrogen', - 'Oxygen', - 'Fluorine', - 'Neon', - ], - }, - weight: { - headerText: ['Weight'], - footerText: ['Weight of the element'], - text: [ - '1.0079', - '4.0026', - '6.941', - '9.0122', - '10.811', - '12.0107', - '14.0067', - '15.9994', - '18.9984', - '20.1797', - ], - }, - symbol: { - headerText: ['Symbol'], - footerText: ['Symbol of the element'], - text: ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne'], - }, - }); - }); - - it('should be able to get the table text organized by rows', async () => { - const table = await loader.getHarness(tableHarness); - const text = await table.getCellTextByIndex(); - - expect(text).toEqual([ - ['1', 'Hydrogen', '1.0079', 'H'], - ['2', 'Helium', '4.0026', 'He'], - ['3', 'Lithium', '6.941', 'Li'], - ['4', 'Beryllium', '9.0122', 'Be'], - ['5', 'Boron', '10.811', 'B'], - ['6', 'Carbon', '12.0107', 'C'], - ['7', 'Nitrogen', '14.0067', 'N'], - ['8', 'Oxygen', '15.9994', 'O'], - ['9', 'Fluorine', '18.9984', 'F'], - ['10', 'Neon', '20.1797', 'Ne'], - ]); - }); - - it('should be able to get the cell text in a row organized by index', async () => { - const table = await loader.getHarness(tableHarness); - const rows = await table.getRows(); - - expect(rows.length).toBeGreaterThan(0); - expect(await rows[0].getCellTextByIndex()).toEqual(['1', 'Hydrogen', '1.0079', 'H']); - }); - - it('should be able to get the cell text in a row organized by columns', async () => { - const table = await loader.getHarness(tableHarness); - const rows = await table.getRows(); - - expect(rows.length).toBeGreaterThan(0); - expect(await rows[0].getCellTextByColumnName()).toEqual({ - position: '1', - name: 'Hydrogen', - weight: '1.0079', - symbol: 'H', - }); - }); -} - -@Component({ - template: ` - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
No.{{element.position}}Number of the elementName{{element.name}}Name of the elementWeight{{element.weight}}Weight of the elementSymbol{{element.symbol}}Symbol of the element
- `, -}) -class TableHarnessTest { - displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; - dataSource = [ - {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, - {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, - {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, - {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, - {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, - {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, - {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, - {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, - {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, - {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, - ]; -} diff --git a/src/material/table/testing/table-harness.spec.ts b/src/material/table/testing/table-harness.spec.ts index 88cc788323cf..b659cad6501e 100644 --- a/src/material/table/testing/table-harness.spec.ts +++ b/src/material/table/testing/table-harness.spec.ts @@ -1,7 +1,233 @@ -import {MatTableModule} from '@angular/material/table'; -import {runHarnessTests} from './shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatTableModule} from '../module'; import {MatTableHarness} from './table-harness'; -describe('MDC-based MatTableHarness', () => { - runHarnessTests(MatTableModule, MatTableHarness); +describe('MatTableHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatTableModule], + declarations: [TableHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(TableHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load harness for a table', async () => { + const tables = await loader.getAllHarnesses(MatTableHarness); + expect(tables.length).toBe(1); + }); + + it('should get the different kinds of rows in the table', async () => { + const table = await loader.getHarness(MatTableHarness); + const headerRows = await table.getHeaderRows(); + const footerRows = await table.getFooterRows(); + const rows = await table.getRows(); + expect(headerRows.length).toBe(1); + expect(footerRows.length).toBe(1); + expect(rows.length).toBe(10); + }); + + it('should get cells inside a row', async () => { + const table = await loader.getHarness(MatTableHarness); + const headerRows = await table.getHeaderRows(); + const footerRows = await table.getFooterRows(); + const rows = await table.getRows(); + const headerCells = (await parallel(() => headerRows.map(row => row.getCells()))).map( + row => row.length, + ); + const footerCells = (await parallel(() => footerRows.map(row => row.getCells()))).map( + row => row.length, + ); + const cells = (await parallel(() => rows.map(row => row.getCells()))).map(row => row.length); + + expect(headerCells).toEqual([4]); + expect(cells).toEqual([4, 4, 4, 4, 4, 4, 4, 4, 4, 4]); + expect(footerCells).toEqual([4]); + }); + + it('should be able to get the text of a cell', async () => { + const table = await loader.getHarness(MatTableHarness); + const secondRow = (await table.getRows())[1]; + const cells = await secondRow.getCells(); + const cellTexts = await parallel(() => cells.map(cell => cell.getText())); + expect(cellTexts).toEqual(['2', 'Helium', '4.0026', 'He']); + }); + + it('should be able to get the column name of a cell', async () => { + const table = await loader.getHarness(MatTableHarness); + const fifthRow = (await table.getRows())[1]; + const cells = await fifthRow.getCells(); + const cellColumnNames = await parallel(() => cells.map(cell => cell.getColumnName())); + expect(cellColumnNames).toEqual(['position', 'name', 'weight', 'symbol']); + }); + + it('should be able to filter cells by text', async () => { + const table = await loader.getHarness(MatTableHarness); + const firstRow = (await table.getRows())[0]; + const cells = await firstRow.getCells({text: '1.0079'}); + const cellTexts = await parallel(() => cells.map(cell => cell.getText())); + expect(cellTexts).toEqual(['1.0079']); + }); + + it('should be able to filter cells by column name', async () => { + const table = await loader.getHarness(MatTableHarness); + const firstRow = (await table.getRows())[0]; + const cells = await firstRow.getCells({columnName: 'symbol'}); + const cellTexts = await parallel(() => cells.map(cell => cell.getText())); + expect(cellTexts).toEqual(['H']); + }); + + it('should be able to filter cells by regex', async () => { + const table = await loader.getHarness(MatTableHarness); + const firstRow = (await table.getRows())[0]; + const cells = await firstRow.getCells({text: /^H/}); + const cellTexts = await parallel(() => cells.map(cell => cell.getText())); + expect(cellTexts).toEqual(['Hydrogen', 'H']); + }); + + it('should be able to get the table text organized by columns', async () => { + const table = await loader.getHarness(MatTableHarness); + const text = await table.getCellTextByColumnName(); + + expect(text).toEqual({ + position: { + headerText: ['No.'], + footerText: ['Number of the element'], + text: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10'], + }, + name: { + headerText: ['Name'], + footerText: ['Name of the element'], + text: [ + 'Hydrogen', + 'Helium', + 'Lithium', + 'Beryllium', + 'Boron', + 'Carbon', + 'Nitrogen', + 'Oxygen', + 'Fluorine', + 'Neon', + ], + }, + weight: { + headerText: ['Weight'], + footerText: ['Weight of the element'], + text: [ + '1.0079', + '4.0026', + '6.941', + '9.0122', + '10.811', + '12.0107', + '14.0067', + '15.9994', + '18.9984', + '20.1797', + ], + }, + symbol: { + headerText: ['Symbol'], + footerText: ['Symbol of the element'], + text: ['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne'], + }, + }); + }); + + it('should be able to get the table text organized by rows', async () => { + const table = await loader.getHarness(MatTableHarness); + const text = await table.getCellTextByIndex(); + + expect(text).toEqual([ + ['1', 'Hydrogen', '1.0079', 'H'], + ['2', 'Helium', '4.0026', 'He'], + ['3', 'Lithium', '6.941', 'Li'], + ['4', 'Beryllium', '9.0122', 'Be'], + ['5', 'Boron', '10.811', 'B'], + ['6', 'Carbon', '12.0107', 'C'], + ['7', 'Nitrogen', '14.0067', 'N'], + ['8', 'Oxygen', '15.9994', 'O'], + ['9', 'Fluorine', '18.9984', 'F'], + ['10', 'Neon', '20.1797', 'Ne'], + ]); + }); + + it('should be able to get the cell text in a row organized by index', async () => { + const table = await loader.getHarness(MatTableHarness); + const rows = await table.getRows(); + + expect(rows.length).toBeGreaterThan(0); + expect(await rows[0].getCellTextByIndex()).toEqual(['1', 'Hydrogen', '1.0079', 'H']); + }); + + it('should be able to get the cell text in a row organized by columns', async () => { + const table = await loader.getHarness(MatTableHarness); + const rows = await table.getRows(); + + expect(rows.length).toBeGreaterThan(0); + expect(await rows[0].getCellTextByColumnName()).toEqual({ + position: '1', + name: 'Hydrogen', + weight: '1.0079', + symbol: 'H', + }); + }); }); + +@Component({ + template: ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
No.{{element.position}}Number of the elementName{{element.name}}Name of the elementWeight{{element.weight}}Weight of the elementSymbol{{element.symbol}}Symbol of the element
+ `, +}) +class TableHarnessTest { + displayedColumns: string[] = ['position', 'name', 'weight', 'symbol']; + dataSource = [ + {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'}, + {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'}, + {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'}, + {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}, + {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'}, + {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'}, + {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'}, + {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'}, + {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'}, + {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'}, + ]; +} diff --git a/src/material/tabs/_tabs-theme.scss b/src/material/tabs/_tabs-theme.scss index d4d85fc32382..aea524c2c8e7 100644 --- a/src/material/tabs/_tabs-theme.scss +++ b/src/material/tabs/_tabs-theme.scss @@ -1,4 +1,3 @@ -@use 'sass:map'; @use '@material/tab-indicator/tab-indicator-theme' as mdc-tab-indicator-theme; @use '@material/tab/tab-theme' as mdc-tab-theme; @use '../core/tokens/m2/mdc/tab' as tokens-mdc-tab; @@ -6,99 +5,86 @@ @use '../core/tokens/m2/mat/tab-header' as tokens-mat-tab-header; @use '../core/tokens/m2/mat/tab-header-with-background' as tokens-mat-tab-header-with-background; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/token-utils'; - -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - +@mixin color($theme) { .mat-mdc-tab-group, .mat-mdc-tab-nav-bar { - @include _palette-styles($config, primary); + @include _palette-styles($theme, primary); &.mat-accent { - @include _palette-styles($config, accent); + @include _palette-styles($theme, accent); } &.mat-warn { - @include _palette-styles($config, warn); + @include _palette-styles($theme, warn); } &.mat-background-primary { - @include _background-styles($config, primary); + @include _background-styles($theme, primary); } &.mat-background-accent { - @include _background-styles($config, accent); + @include _background-styles($theme, accent); } &.mat-background-warn { - @include _background-styles($config, warn); + @include _background-styles($theme, warn); } } } -@mixin _background-styles($initial-config, $palette) { - $config: map.merge($initial-config, (primary: map.get($initial-config, $palette))); +@mixin _background-styles($theme, $palette-name) { @include token-utils.create-token-values(tokens-mat-tab-header-with-background.$prefix, - tokens-mat-tab-header-with-background.get-color-tokens($config)); + tokens-mat-tab-header-with-background.get-color-tokens($theme, $palette-name)); } -@mixin _palette-styles($initial-config, $palette) { - $config: map.merge($initial-config, (primary: map.get($initial-config, $palette))); +@mixin _palette-styles($theme, $palette-name) { @include mdc-tab-theme.secondary-navigation-tab-theme( - tokens-mdc-tab.get-color-tokens($config)); + tokens-mdc-tab.get-color-tokens($theme, $palette-name)); @include mdc-tab-indicator-theme.theme( - tokens-mdc-tab-indicator.get-color-tokens($config)); + tokens-mdc-tab-indicator.get-color-tokens($theme, $palette-name)); @include token-utils.create-token-values(tokens-mat-tab-header.$prefix, - tokens-mat-tab-header.get-color-tokens($config)); + tokens-mat-tab-header.get-color-tokens($theme, $palette-name)); } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - +@mixin typography($theme) { .mat-mdc-tab-header { @include mdc-tab-theme.secondary-navigation-tab-theme( - tokens-mdc-tab.get-typography-tokens($config)); + tokens-mdc-tab.get-typography-tokens($theme)); @include mdc-tab-indicator-theme.theme( - tokens-mdc-tab-indicator.get-typography-tokens($config)); + tokens-mdc-tab-indicator.get-typography-tokens($theme)); @include token-utils.create-token-values(tokens-mat-tab-header.$prefix, - tokens-mat-tab-header.get-typography-tokens($config)); + tokens-mat-tab-header.get-typography-tokens($theme)); @include token-utils.create-token-values(tokens-mat-tab-header-with-background.$prefix, - tokens-mat-tab-header-with-background.get-typography-tokens($config)); + tokens-mat-tab-header-with-background.get-typography-tokens($theme)); } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); +@mixin density($theme) { .mat-mdc-tab-header { @include mdc-tab-theme.secondary-navigation-tab-theme( - tokens-mdc-tab.get-density-tokens($density-scale)); + tokens-mdc-tab.get-density-tokens($theme)); @include mdc-tab-indicator-theme.theme( - tokens-mdc-tab-indicator.get-density-tokens($density-scale)); + tokens-mdc-tab-indicator.get-density-tokens($theme)); @include token-utils.create-token-values(tokens-mat-tab-header.$prefix, - tokens-mat-tab-header.get-density-tokens($density-scale)); + tokens-mat-tab-header.get-density-tokens($theme)); @include token-utils.create-token-values(tokens-mat-tab-header-with-background.$prefix, - tokens-mat-tab-header-with-background.get-density-tokens($density-scale)); + tokens-mat-tab-header-with-background.get-density-tokens($theme)); } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-tabs') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); + @if inspection.theme-has($theme, color) { + @include color($theme); } - @if $density != null { - @include density($density); + @if inspection.theme-has($theme, density) { + @include density($theme); } - @if $typography != null { - @include typography($typography); + @if inspection.theme-has($theme, typography) { + @include typography($theme); } } } diff --git a/src/material/tabs/tab-group.html b/src/material/tabs/tab-group.html index 27648e3ae6d8..1d43663f984f 100644 --- a/src/material/tabs/tab-group.html +++ b/src/material/tabs/tab-group.html @@ -58,6 +58,7 @@ [id]="_getTabContentId(i)" [attr.tabindex]="(contentTabIndex != null && selectedIndex === i) ? contentTabIndex : null" [attr.aria-labelledby]="_getTabLabelId(i)" + [attr.aria-hidden]="selectedIndex !== i" [class.mat-mdc-tab-body-active]="selectedIndex === i" [ngClass]="tab.bodyClass" [content]="tab.content!" diff --git a/src/material/tabs/tab-group.spec.ts b/src/material/tabs/tab-group.spec.ts index 0b092d81f4b7..31b468ec456a 100644 --- a/src/material/tabs/tab-group.spec.ts +++ b/src/material/tabs/tab-group.spec.ts @@ -441,6 +441,25 @@ describe('MDC-based MatTabGroup', () => { }); }); + describe('aria labelling of tab panels', () => { + let fixture: ComponentFixture; + let tabPanels: HTMLElement[]; + + beforeEach(fakeAsync(() => { + fixture = TestBed.createComponent(BindedTabsTestApp); + fixture.detectChanges(); + tick(); + tabPanels = Array.from(fixture.nativeElement.querySelectorAll('.mat-mdc-tab-body')); + })); + + it('should set `aria-hidden="true"` on inactive tab panels', () => { + fixture.detectChanges(); + + expect(tabPanels[0].getAttribute('aria-hidden')).not.toBe('true'); + expect(tabPanels[1].getAttribute('aria-hidden')).toBe('true'); + }); + }); + describe('disable tabs', () => { let fixture: ComponentFixture; diff --git a/src/material/tabs/testing/BUILD.bazel b/src/material/tabs/testing/BUILD.bazel index e9e8d08c0fc1..17873ad3f5ab 100644 --- a/src/material/tabs/testing/BUILD.bazel +++ b/src/material/tabs/testing/BUILD.bazel @@ -21,17 +21,15 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "tab-group-shared.spec.ts", - "tab-nav-bar-shared.spec.ts", - ], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/testing", + "//src/cdk/testing/private", + "//src/cdk/testing/testbed", "//src/material/tabs", + "@npm//@angular/forms", + "@npm//@angular/platform-browser", ], ) @@ -41,20 +39,3 @@ ng_web_test_suite( ":unit_tests_lib", ], ) - -ng_test_library( - name = "harness_tests_lib", - srcs = [ - "tab-group-shared.spec.ts", - "tab-nav-bar-shared.spec.ts", - ], - deps = [ - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/private", - "//src/cdk/testing/testbed", - "//src/material/tabs", - "@npm//@angular/forms", - "@npm//@angular/platform-browser", - ], -) diff --git a/src/material/tabs/testing/tab-group-harness.spec.ts b/src/material/tabs/testing/tab-group-harness.spec.ts index b5c7dad6f2cd..2e0df899c5f0 100644 --- a/src/material/tabs/testing/tab-group-harness.spec.ts +++ b/src/material/tabs/testing/tab-group-harness.spec.ts @@ -1,8 +1,185 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatTabsModule} from '@angular/material/tabs'; -import {runTabGroupHarnessTests} from './tab-group-shared.spec'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatTabGroupHarness} from './tab-group-harness'; import {MatTabHarness} from './tab-harness'; -describe('MDC-based MatTabGroupHarness', () => { - runTabGroupHarnessTests(MatTabsModule, MatTabGroupHarness, MatTabHarness); +describe('MatTabGroupHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatTabsModule, NoopAnimationsModule], + declarations: [TabGroupHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(TabGroupHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load harness for tab-group', async () => { + const tabGroups = await loader.getAllHarnesses(MatTabGroupHarness); + expect(tabGroups.length).toBe(1); + }); + + it('should load harness for tab-group with selected tab label', async () => { + const tabGroups = await loader.getAllHarnesses( + MatTabGroupHarness.with({ + selectedTabLabel: 'First', + }), + ); + expect(tabGroups.length).toBe(1); + }); + + it('should load harness for tab-group with matching tab label regex', async () => { + const tabGroups = await loader.getAllHarnesses( + MatTabGroupHarness.with({ + selectedTabLabel: /f.*st/i, + }), + ); + expect(tabGroups.length).toBe(1); + }); + + it('should be able to get tabs of tab-group', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(tabs.length).toBe(3); + }); + + it('should be able to get filtered tabs', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs({label: 'Third'}); + expect(tabs.length).toBe(1); + expect(await tabs[0].getLabel()).toBe('Third'); + }); + + it('should be able to select tab from tab-group', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + expect(await (await tabGroup.getSelectedTab()).getLabel()).toBe('First'); + await tabGroup.selectTab({label: 'Second'}); + expect(await (await tabGroup.getSelectedTab()).getLabel()).toBe('Second'); + }); + + it('should throw error when attempting to select invalid tab', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + await expectAsync(tabGroup.selectTab({label: 'Fake'})).toBeRejectedWithError( + /Cannot find mat-tab matching filter {"label":"Fake"}/, + ); + }); + + it('should be able to get label of tabs', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].getLabel()).toBe('First'); + expect(await tabs[1].getLabel()).toBe('Second'); + expect(await tabs[2].getLabel()).toBe('Third'); + }); + + it('should be able to get aria-label of tabs', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].getAriaLabel()).toBe('First tab'); + expect(await tabs[1].getAriaLabel()).toBe('Second tab'); + expect(await tabs[2].getAriaLabel()).toBe(null); + }); + + it('should be able to get aria-labelledby of tabs', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].getAriaLabelledby()).toBe(null); + expect(await tabs[1].getAriaLabelledby()).toBe(null); + expect(await tabs[2].getAriaLabelledby()).toBe('tabLabelId'); + }); + + it('should be able to get harness for content element of active tab', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].getTextContent()).toBe('Content 1'); + const tabContentHarness = await tabs[0].getHarness(TestTabContentHarness); + expect(await (await tabContentHarness.host()).text()).toBe('Content 1'); + }); + + it('should be able to get disabled state of tab', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].isDisabled()).toBe(false); + expect(await tabs[1].isDisabled()).toBe(false); + expect(await tabs[2].isDisabled()).toBe(false); + + fixture.componentInstance.isDisabled = true; + fixture.detectChanges(); + + expect(await tabs[0].isDisabled()).toBe(false); + expect(await tabs[1].isDisabled()).toBe(false); + expect(await tabs[2].isDisabled()).toBe(true); + }); + + it('should be able to select specific tab', async () => { + const tabGroup = await loader.getHarness(MatTabGroupHarness); + const tabs = await tabGroup.getTabs(); + expect(await tabs[0].isSelected()).toBe(true); + expect(await tabs[1].isSelected()).toBe(false); + expect(await tabs[2].isSelected()).toBe(false); + + await tabs[1].select(); + expect(await tabs[0].isSelected()).toBe(false); + expect(await tabs[1].isSelected()).toBe(true); + expect(await tabs[2].isSelected()).toBe(false); + + // Should not be able to select third tab if disabled. + fixture.componentInstance.isDisabled = true; + fixture.detectChanges(); + + await tabs[2].select(); + expect(await tabs[0].isSelected()).toBe(false); + expect(await tabs[1].isSelected()).toBe(true); + expect(await tabs[2].isSelected()).toBe(false); + + // Should be able to select third tab if not disabled. + fixture.componentInstance.isDisabled = false; + fixture.detectChanges(); + await tabs[2].select(); + expect(await tabs[0].isSelected()).toBe(false); + expect(await tabs[1].isSelected()).toBe(false); + expect(await tabs[2].isSelected()).toBe(true); + }); + + it('should be able to get tabs by selected state', async () => { + const selectedTabs = await loader.getAllHarnesses(MatTabHarness.with({selected: true})); + const unselectedTabs = await loader.getAllHarnesses(MatTabHarness.with({selected: false})); + expect(await parallel(() => selectedTabs.map(t => t.getLabel()))).toEqual(['First']); + expect(await parallel(() => unselectedTabs.map(t => t.getLabel()))).toEqual([ + 'Second', + 'Third', + ]); + }); }); + +@Component({ + template: ` + + + Content 1 + + + Content 2 + + + Third + Content 3 + + + `, +}) +class TabGroupHarnessTest { + isDisabled = false; +} + +class TestTabContentHarness extends ComponentHarness { + static hostSelector = '.test-tab-content'; +} diff --git a/src/material/tabs/testing/tab-group-shared.spec.ts b/src/material/tabs/testing/tab-group-shared.spec.ts deleted file mode 100644 index fd09d6d8621a..000000000000 --- a/src/material/tabs/testing/tab-group-shared.spec.ts +++ /dev/null @@ -1,190 +0,0 @@ -import {ComponentHarness, HarnessLoader, parallel} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatTabsModule} from '@angular/material/tabs'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatTabGroupHarness} from './tab-group-harness'; -import {MatTabHarness} from './tab-harness'; - -/** Shared tests to run on both the original and MDC-based tab-group's. */ -export function runTabGroupHarnessTests( - tabsModule: typeof MatTabsModule, - tabGroupHarness: typeof MatTabGroupHarness, - tabHarness: typeof MatTabHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [tabsModule, NoopAnimationsModule], - declarations: [TabGroupHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(TabGroupHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load harness for tab-group', async () => { - const tabGroups = await loader.getAllHarnesses(tabGroupHarness); - expect(tabGroups.length).toBe(1); - }); - - it('should load harness for tab-group with selected tab label', async () => { - const tabGroups = await loader.getAllHarnesses( - tabGroupHarness.with({ - selectedTabLabel: 'First', - }), - ); - expect(tabGroups.length).toBe(1); - }); - - it('should load harness for tab-group with matching tab label regex', async () => { - const tabGroups = await loader.getAllHarnesses( - tabGroupHarness.with({ - selectedTabLabel: /f.*st/i, - }), - ); - expect(tabGroups.length).toBe(1); - }); - - it('should be able to get tabs of tab-group', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(tabs.length).toBe(3); - }); - - it('should be able to get filtered tabs', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs({label: 'Third'}); - expect(tabs.length).toBe(1); - expect(await tabs[0].getLabel()).toBe('Third'); - }); - - it('should be able to select tab from tab-group', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - expect(await (await tabGroup.getSelectedTab()).getLabel()).toBe('First'); - await tabGroup.selectTab({label: 'Second'}); - expect(await (await tabGroup.getSelectedTab()).getLabel()).toBe('Second'); - }); - - it('should throw error when attempting to select invalid tab', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - await expectAsync(tabGroup.selectTab({label: 'Fake'})).toBeRejectedWithError( - /Cannot find mat-tab matching filter {"label":"Fake"}/, - ); - }); - - it('should be able to get label of tabs', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].getLabel()).toBe('First'); - expect(await tabs[1].getLabel()).toBe('Second'); - expect(await tabs[2].getLabel()).toBe('Third'); - }); - - it('should be able to get aria-label of tabs', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].getAriaLabel()).toBe('First tab'); - expect(await tabs[1].getAriaLabel()).toBe('Second tab'); - expect(await tabs[2].getAriaLabel()).toBe(null); - }); - - it('should be able to get aria-labelledby of tabs', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].getAriaLabelledby()).toBe(null); - expect(await tabs[1].getAriaLabelledby()).toBe(null); - expect(await tabs[2].getAriaLabelledby()).toBe('tabLabelId'); - }); - - it('should be able to get harness for content element of active tab', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].getTextContent()).toBe('Content 1'); - const tabContentHarness = await tabs[0].getHarness(TestTabContentHarness); - expect(await (await tabContentHarness.host()).text()).toBe('Content 1'); - }); - - it('should be able to get disabled state of tab', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].isDisabled()).toBe(false); - expect(await tabs[1].isDisabled()).toBe(false); - expect(await tabs[2].isDisabled()).toBe(false); - - fixture.componentInstance.isDisabled = true; - fixture.detectChanges(); - - expect(await tabs[0].isDisabled()).toBe(false); - expect(await tabs[1].isDisabled()).toBe(false); - expect(await tabs[2].isDisabled()).toBe(true); - }); - - it('should be able to select specific tab', async () => { - const tabGroup = await loader.getHarness(tabGroupHarness); - const tabs = await tabGroup.getTabs(); - expect(await tabs[0].isSelected()).toBe(true); - expect(await tabs[1].isSelected()).toBe(false); - expect(await tabs[2].isSelected()).toBe(false); - - await tabs[1].select(); - expect(await tabs[0].isSelected()).toBe(false); - expect(await tabs[1].isSelected()).toBe(true); - expect(await tabs[2].isSelected()).toBe(false); - - // Should not be able to select third tab if disabled. - fixture.componentInstance.isDisabled = true; - fixture.detectChanges(); - - await tabs[2].select(); - expect(await tabs[0].isSelected()).toBe(false); - expect(await tabs[1].isSelected()).toBe(true); - expect(await tabs[2].isSelected()).toBe(false); - - // Should be able to select third tab if not disabled. - fixture.componentInstance.isDisabled = false; - fixture.detectChanges(); - await tabs[2].select(); - expect(await tabs[0].isSelected()).toBe(false); - expect(await tabs[1].isSelected()).toBe(false); - expect(await tabs[2].isSelected()).toBe(true); - }); - - it('should be able to get tabs by selected state', async () => { - const selectedTabs = await loader.getAllHarnesses(tabHarness.with({selected: true})); - const unselectedTabs = await loader.getAllHarnesses(tabHarness.with({selected: false})); - expect(await parallel(() => selectedTabs.map(t => t.getLabel()))).toEqual(['First']); - expect(await parallel(() => unselectedTabs.map(t => t.getLabel()))).toEqual([ - 'Second', - 'Third', - ]); - }); -} - -@Component({ - template: ` - - - Content 1 - - - Content 2 - - - Third - Content 3 - - - `, -}) -class TabGroupHarnessTest { - isDisabled = false; -} - -class TestTabContentHarness extends ComponentHarness { - static hostSelector = '.test-tab-content'; -} diff --git a/src/material/tabs/testing/tab-nav-bar-harness.spec.ts b/src/material/tabs/testing/tab-nav-bar-harness.spec.ts index 8b6471e91bfb..22943de27680 100644 --- a/src/material/tabs/testing/tab-nav-bar-harness.spec.ts +++ b/src/material/tabs/testing/tab-nav-bar-harness.spec.ts @@ -1,7 +1,124 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatTabsModule} from '@angular/material/tabs'; -import {runTabNavBarHarnessTests} from './tab-nav-bar-shared.spec'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {MatTabNavBarHarness} from './tab-nav-bar-harness'; -describe('MDC-based MatTabNavBarHarness', () => { - runTabNavBarHarnessTests(MatTabsModule, MatTabNavBarHarness); +describe('MatTabNavBarHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatTabsModule, NoopAnimationsModule], + declarations: [TabNavBarHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(TabNavBarHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load harness for tab nav bar', async () => { + const navBars = await loader.getAllHarnesses(MatTabNavBarHarness); + expect(navBars.length).toBe(1); + }); + + it('should be able to get links of nav bar', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const links = await navBar.getLinks(); + expect(links.length).toBe(3); + }); + + it('should be able to get filtered links', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const links = await navBar.getLinks({label: 'Third'}); + expect(links.length).toBe(1); + expect(await links[0].getLabel()).toBe('Third'); + }); + + it('should be able to click tab from nav bar', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + expect(await (await navBar.getActiveLink()).getLabel()).toBe('First'); + await navBar.clickLink({label: 'Second'}); + expect(await (await navBar.getActiveLink()).getLabel()).toBe('Second'); + }); + + it('should throw error when attempting to click invalid link', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + await expectAsync(navBar.clickLink({label: 'Fake'})).toBeRejectedWithError( + /Cannot find mat-tab-link matching filter {"label":"Fake"}/, + ); + }); + + it('should be able to get label of links', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const links = await navBar.getLinks(); + expect(await links[0].getLabel()).toBe('First'); + expect(await links[1].getLabel()).toBe('Second'); + expect(await links[2].getLabel()).toBe('Third'); + }); + + it('should be able to get disabled state of link', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const links = await navBar.getLinks(); + expect(await links[0].isDisabled()).toBe(false); + expect(await links[1].isDisabled()).toBe(false); + expect(await links[2].isDisabled()).toBe(false); + + fixture.componentInstance.isDisabled = true; + fixture.detectChanges(); + + expect(await links[0].isDisabled()).toBe(false); + expect(await links[1].isDisabled()).toBe(false); + expect(await links[2].isDisabled()).toBe(true); + }); + + it('should be able to click specific link', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const links = await navBar.getLinks(); + expect(await links[0].isActive()).toBe(true); + expect(await links[1].isActive()).toBe(false); + expect(await links[2].isActive()).toBe(false); + + await links[1].click(); + expect(await links[0].isActive()).toBe(false); + expect(await links[1].isActive()).toBe(true); + expect(await links[2].isActive()).toBe(false); + }); + + it('should be able to get the associated tab panel', async () => { + const navBar = await loader.getHarness(MatTabNavBarHarness); + const navPanel = await navBar.getPanel(); + expect(await navPanel.getTextContent()).toBe('Tab content'); + }); }); + +@Component({ + template: ` + + + Tab content + + `, +}) +class TabNavBarHarnessTest { + activeLink = 0; + isDisabled = false; + + select(index: number, event: MouseEvent) { + this.activeLink = index; + event.preventDefault(); + } +} diff --git a/src/material/tabs/testing/tab-nav-bar-shared.spec.ts b/src/material/tabs/testing/tab-nav-bar-shared.spec.ts deleted file mode 100644 index c6b5b62cc54c..000000000000 --- a/src/material/tabs/testing/tab-nav-bar-shared.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatTabsModule} from '@angular/material/tabs'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {MatTabNavBarHarness} from './tab-nav-bar-harness'; - -/** Shared tests to run on both the original and MDC-based tab nav bars. */ -export function runTabNavBarHarnessTests( - tabsModule: typeof MatTabsModule, - tabNavBarHarness: typeof MatTabNavBarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [tabsModule, NoopAnimationsModule], - declarations: [TabNavBarHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(TabNavBarHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load harness for tab nav bar', async () => { - const navBars = await loader.getAllHarnesses(tabNavBarHarness); - expect(navBars.length).toBe(1); - }); - - it('should be able to get links of nav bar', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const links = await navBar.getLinks(); - expect(links.length).toBe(3); - }); - - it('should be able to get filtered links', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const links = await navBar.getLinks({label: 'Third'}); - expect(links.length).toBe(1); - expect(await links[0].getLabel()).toBe('Third'); - }); - - it('should be able to click tab from nav bar', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - expect(await (await navBar.getActiveLink()).getLabel()).toBe('First'); - await navBar.clickLink({label: 'Second'}); - expect(await (await navBar.getActiveLink()).getLabel()).toBe('Second'); - }); - - it('should throw error when attempting to click invalid link', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - await expectAsync(navBar.clickLink({label: 'Fake'})).toBeRejectedWithError( - /Cannot find mat-tab-link matching filter {"label":"Fake"}/, - ); - }); - - it('should be able to get label of links', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const links = await navBar.getLinks(); - expect(await links[0].getLabel()).toBe('First'); - expect(await links[1].getLabel()).toBe('Second'); - expect(await links[2].getLabel()).toBe('Third'); - }); - - it('should be able to get disabled state of link', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const links = await navBar.getLinks(); - expect(await links[0].isDisabled()).toBe(false); - expect(await links[1].isDisabled()).toBe(false); - expect(await links[2].isDisabled()).toBe(false); - - fixture.componentInstance.isDisabled = true; - fixture.detectChanges(); - - expect(await links[0].isDisabled()).toBe(false); - expect(await links[1].isDisabled()).toBe(false); - expect(await links[2].isDisabled()).toBe(true); - }); - - it('should be able to click specific link', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const links = await navBar.getLinks(); - expect(await links[0].isActive()).toBe(true); - expect(await links[1].isActive()).toBe(false); - expect(await links[2].isActive()).toBe(false); - - await links[1].click(); - expect(await links[0].isActive()).toBe(false); - expect(await links[1].isActive()).toBe(true); - expect(await links[2].isActive()).toBe(false); - }); - - it('should be able to get the associated tab panel', async () => { - const navBar = await loader.getHarness(tabNavBarHarness); - const navPanel = await navBar.getPanel(); - expect(await navPanel.getTextContent()).toBe('Tab content'); - }); -} - -@Component({ - template: ` - - - Tab content - - `, -}) -class TabNavBarHarnessTest { - activeLink = 0; - isDisabled = false; - - select(index: number, event: MouseEvent) { - this.activeLink = index; - event.preventDefault(); - } -} diff --git a/src/material/toolbar/_toolbar-theme.scss b/src/material/toolbar/_toolbar-theme.scss index f456c176d2be..fd820b8c90d4 100644 --- a/src/material/toolbar/_toolbar-theme.scss +++ b/src/material/toolbar/_toolbar-theme.scss @@ -1,77 +1,96 @@ @use 'sass:map'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; @use '../core/tokens/m2/mat/toolbar' as tokens-mat-toolbar; @use '../core/tokens/token-utils'; @use '../core/style/sass-utils'; -@mixin _palette-styles($palette) { +@mixin _palette-styles($theme, $palette-name) { @include token-utils.create-token-values( tokens-mat-toolbar.$prefix, tokens-mat-toolbar.private-get-color-palette-color-tokens( - $background-color: theming.get-color-from-palette($palette), - $text-color: theming.get-color-from-palette($palette, default-contrast) + $background-color: inspection.get-theme-color($theme, $palette-name), + $text-color: inspection.get-theme-color($theme, $palette-name, default-contrast) ) ); } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - - @include sass-utils.current-selector-or-root() { - @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, - tokens-mat-toolbar.get-color-tokens($config)); +@mixin color($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, color)); } - - .mat-toolbar { - &.mat-primary { - @include _palette-styles(map.get($config, primary)); + @else { + @include sass-utils.current-selector-or-root() { + @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, + tokens-mat-toolbar.get-color-tokens($theme)); } - &.mat-accent { - @include _palette-styles(map.get($config, accent)); - } + .mat-toolbar { + &.mat-primary { + @include _palette-styles($theme, primary); + } + + &.mat-accent { + @include _palette-styles($theme, accent); + } - &.mat-warn { - @include _palette-styles(map.get($config, warn)); + &.mat-warn { + @include _palette-styles($theme, warn); + } } } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2014-config( - theming.get-typography-config($config-or-theme)); +@mixin typography($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, typography)); + } + @else { + // TODO(mmalerba): Stop calling this and resolve resulting screen diffs. + $theme: inspection.private-get-typography-back-compat-theme($theme); - @include sass-utils.current-selector-or-root() { - @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, - tokens-mat-toolbar.get-typography-tokens($config)); + @include sass-utils.current-selector-or-root() { + @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, + tokens-mat-toolbar.get-typography-tokens($theme)); + } } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - - @include sass-utils.current-selector-or-root() { - @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, - tokens-mat-toolbar.get-density-tokens($density-scale)); +@mixin density($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, density)); + } + @else { + @include sass-utils.current-selector-or-root() { + @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, + tokens-mat-toolbar.get-density-tokens($theme)); + } } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-toolbar') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @if $color != null { - @include color($color); - } - @if $density != null { - @include density($density); + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme)); } - @if $typography != null { - @include typography($typography); + @else { + @if inspection.theme-has($theme, color) { + @include color($theme); + } + @if inspection.theme-has($theme, density) { + @include density($theme); + } + @if inspection.theme-has($theme, typography) { + @include typography($theme); + } } } } + +@mixin _theme-from-tokens($tokens) { + @if ($tokens != ()) { + @include token-utils.create-token-values(tokens-mat-toolbar.$prefix, + map.get($tokens, tokens-mat-toolbar.$prefix)); + } +} diff --git a/src/material/toolbar/testing/BUILD.bazel b/src/material/toolbar/testing/BUILD.bazel index 001771a2f451..a09f4eda55fa 100644 --- a/src/material/toolbar/testing/BUILD.bazel +++ b/src/material/toolbar/testing/BUILD.bazel @@ -19,8 +19,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -30,21 +30,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = [ - "shared.spec.ts", - ], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/toolbar", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/toolbar/testing/shared.spec.ts b/src/material/toolbar/testing/shared.spec.ts deleted file mode 100644 index a7643df2d622..000000000000 --- a/src/material/toolbar/testing/shared.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import {Component} from '@angular/core'; -import {ComponentHarness, HarnessLoader} from '@angular/cdk/testing'; -import {MatToolbarModule} from '@angular/material/toolbar'; -import {MatToolbarHarness, MatToolbarSection} from '@angular/material/toolbar/testing'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; - -/** Shared tests to run on both the original and MDC-based toolbars. */ -export function runHarnessTests( - toolbarModule: typeof MatToolbarModule, - toolbarHarness: typeof MatToolbarHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [toolbarModule], - declarations: [ToolbarHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(ToolbarHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should find all toolbars', async () => { - const toolbars = await loader.getAllHarnesses(toolbarHarness); - - expect(toolbars.length).toBe(2); - }); - - it('should find toolbar with text', async () => { - const toolbars = await loader.getAllHarnesses(toolbarHarness.with({text: 'My App'})); - - expect(toolbars.length).toBe(1); - expect(await toolbars[0].hasMultipleRows()).toBeFalse(); - }); - - it('should find toolbar with regex', async () => { - const toolbars = await loader.getAllHarnesses(toolbarHarness.with({text: /Row/})); - - expect(toolbars.length).toBe(1); - expect(await toolbars[0].hasMultipleRows()).toBeTrue(); - }); - - it('should get toolbar text', async () => { - const toolbars = await loader.getAllHarnesses(toolbarHarness); - - expect(await toolbars[0].getRowsAsText()).toEqual(['My App']); - expect(await toolbars[1].getRowsAsText()).toEqual(['Row 1', 'Row 2 Button 1 Button 2']); - }); - - it('should get harness loaders for toolbar row', async () => { - const toolbar = await loader.getHarness(toolbarHarness.with({text: /Button/})); - const rowLoaders = await toolbar.getAllChildLoaders(MatToolbarSection.ROW); - const row1 = rowLoaders[0] as HarnessLoader; - const row1Subcomponents = await row1.getAllHarnesses(DummyHarness); - const row2 = rowLoaders[1] as HarnessLoader; - const row2Subcomponents = await row2.getAllHarnesses(DummyHarness); - - expect(row1Subcomponents.length).toBe(1); - expect(row2Subcomponents.length).toBe(3); - }); -} - -@Component({ - template: ` - My App - - Row 1 - Row 2 - - - - - `, -}) -class ToolbarHarnessTest {} - -export class DummyHarness extends ComponentHarness { - static hostSelector = 'span, button'; -} diff --git a/src/material/toolbar/testing/toolbar-harness.spec.ts b/src/material/toolbar/testing/toolbar-harness.spec.ts index f847003a0f09..622ca1225a59 100644 --- a/src/material/toolbar/testing/toolbar-harness.spec.ts +++ b/src/material/toolbar/testing/toolbar-harness.spec.ts @@ -1,7 +1,83 @@ -import {runHarnessTests} from '@angular/material/toolbar/testing/shared.spec'; +import {Component} from '@angular/core'; +import {ComponentHarness, HarnessLoader} from '@angular/cdk/testing'; import {MatToolbarModule} from '@angular/material/toolbar'; -import {MatToolbarHarness} from '@angular/material/toolbar/testing'; +import {MatToolbarHarness, MatToolbarSection} from '@angular/material/toolbar/testing'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -describe('Non-MDC-based MatToolbarHarness', () => { - runHarnessTests(MatToolbarModule, MatToolbarHarness); +describe('MatToolbarHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatToolbarModule], + declarations: [ToolbarHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(ToolbarHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should find all toolbars', async () => { + const toolbars = await loader.getAllHarnesses(MatToolbarHarness); + + expect(toolbars.length).toBe(2); + }); + + it('should find toolbar with text', async () => { + const toolbars = await loader.getAllHarnesses(MatToolbarHarness.with({text: 'My App'})); + + expect(toolbars.length).toBe(1); + expect(await toolbars[0].hasMultipleRows()).toBeFalse(); + }); + + it('should find toolbar with regex', async () => { + const toolbars = await loader.getAllHarnesses(MatToolbarHarness.with({text: /Row/})); + + expect(toolbars.length).toBe(1); + expect(await toolbars[0].hasMultipleRows()).toBeTrue(); + }); + + it('should get toolbar text', async () => { + const toolbars = await loader.getAllHarnesses(MatToolbarHarness); + + expect(await toolbars[0].getRowsAsText()).toEqual(['My App']); + expect(await toolbars[1].getRowsAsText()).toEqual(['Row 1', 'Row 2 Button 1 Button 2']); + }); + + it('should get harness loaders for toolbar row', async () => { + const toolbar = await loader.getHarness(MatToolbarHarness.with({text: /Button/})); + const rowLoaders = await toolbar.getAllChildLoaders(MatToolbarSection.ROW); + const row1 = rowLoaders[0] as HarnessLoader; + const row1Subcomponents = await row1.getAllHarnesses(DummyHarness); + const row2 = rowLoaders[1] as HarnessLoader; + const row2Subcomponents = await row2.getAllHarnesses(DummyHarness); + + expect(row1Subcomponents.length).toBe(1); + expect(row2Subcomponents.length).toBe(3); + }); }); + +@Component({ + template: ` + My App + + Row 1 + Row 2 + + + + + `, +}) +class ToolbarHarnessTest {} + +class DummyHarness extends ComponentHarness { + static hostSelector = 'span, button'; +} diff --git a/src/material/tooltip/_tooltip-theme.scss b/src/material/tooltip/_tooltip-theme.scss index af2dcfc525cd..7e2ae3195e12 100644 --- a/src/material/tooltip/_tooltip-theme.scss +++ b/src/material/tooltip/_tooltip-theme.scss @@ -1,63 +1,87 @@ +@use 'sass:map'; @use '@material/tooltip/plain-tooltip-theme' as mdc-plain-tooltip-theme; @use '../core/style/sass-utils'; @use '../core/theming/theming'; +@use '../core/theming/inspection'; @use '../core/typography/typography'; -@use '../core/tokens/m2/mdc/plain-tooltip' as m2-mdc-plain-tooltip; +@use '../core/tokens/m2/mdc/plain-tooltip' as tokens-mdc-plain-tooltip; -@mixin base($config-or-theme) { - // Add default values for tokens not related to color, typography, or density. - @include sass-utils.current-selector-or-root() { - @include mdc-plain-tooltip-theme.theme(m2-mdc-plain-tooltip.get-unthemable-tokens()); +@mixin base($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, base)); + } + @else { + // Add default values for tokens not related to color, typography, or density. + @include sass-utils.current-selector-or-root() { + @include mdc-plain-tooltip-theme.theme(tokens-mdc-plain-tooltip.get-unthemable-tokens()); + } } } -@mixin color($config-or-theme) { - $config: theming.get-color-config($config-or-theme); - $mdc-tooltip-color-tokens: m2-mdc-plain-tooltip.get-color-tokens($config); +@mixin color($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, color)); + } + @else { + $mdc-tooltip-color-tokens: tokens-mdc-plain-tooltip.get-color-tokens($theme); - // Add values for MDC tooltip tokens. - @include sass-utils.current-selector-or-root() { - @include mdc-plain-tooltip-theme.theme($mdc-tooltip-color-tokens); + // Add values for MDC tooltip tokens. + @include sass-utils.current-selector-or-root() { + @include mdc-plain-tooltip-theme.theme($mdc-tooltip-color-tokens); + } } } -@mixin typography($config-or-theme) { - $config: typography.private-typography-to-2018-config( - theming.get-typography-config($config-or-theme)); - $mdc-tooltip-typography-tokens: m2-mdc-plain-tooltip.get-typography-tokens($config); +@mixin typography($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, typography)); + } + @else { + $mdc-tooltip-typography-tokens: tokens-mdc-plain-tooltip.get-typography-tokens($theme); - // Add values for MDC tooltip tokens. - @include sass-utils.current-selector-or-root() { - @include mdc-plain-tooltip-theme.theme($mdc-tooltip-typography-tokens); + // Add values for MDC tooltip tokens. + @include sass-utils.current-selector-or-root() { + @include mdc-plain-tooltip-theme.theme($mdc-tooltip-typography-tokens); + } } } -@mixin density($config-or-theme) { - $density-scale: theming.get-density-config($config-or-theme); - $mdc-tooltip-density-tokens: m2-mdc-plain-tooltip.get-density-tokens($density-scale); +@mixin density($theme) { + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme, density)); + } + @else { + $mdc-tooltip-density-tokens: tokens-mdc-plain-tooltip.get-density-tokens($theme); - // Add values for MDC tooltip tokens. - @include sass-utils.current-selector-or-root() { - @include mdc-plain-tooltip-theme.theme($mdc-tooltip-density-tokens); + // Add values for MDC tooltip tokens. + @include sass-utils.current-selector-or-root() { + @include mdc-plain-tooltip-theme.theme($mdc-tooltip-density-tokens); + } } } -@mixin theme($theme-or-color-config) { - $theme: theming.private-legacy-get-theme($theme-or-color-config); +@mixin theme($theme) { @include theming.private-check-duplicate-theme-styles($theme, 'mat-tooltip') { - $color: theming.get-color-config($theme); - $density: theming.get-density-config($theme); - $typography: theming.get-typography-config($theme); - - @include base($theme); - @if $color != null { - @include color($color); - } - @if $density != null { - @include density($density); + @if inspection.get-theme-version($theme) == 1 { + @include _theme-from-tokens(inspection.get-theme-tokens($theme)); } - @if $typography != null { - @include typography($typography); + @else { + @include base($theme); + @if inspection.theme-has($theme, color) { + @include color($theme); + } + @if inspection.theme-has($theme, density) { + @include density($theme); + } + @if inspection.theme-has($theme, typography) { + @include typography($theme); + } } } } + +@mixin _theme-from-tokens($tokens) { + @if $tokens != () { + @include mdc-plain-tooltip-theme.theme(map.get($tokens, tokens-mdc-plain-tooltip.$prefix)); + } +} diff --git a/src/material/tooltip/testing/BUILD.bazel b/src/material/tooltip/testing/BUILD.bazel index e1a7bb5a6336..ffd6ace2b9b0 100644 --- a/src/material/tooltip/testing/BUILD.bazel +++ b/src/material/tooltip/testing/BUILD.bazel @@ -20,14 +20,13 @@ filegroup( ng_test_library( name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), + srcs = glob(["**/*.spec.ts"]), deps = [ - ":harness_tests_lib", ":testing", + "//src/cdk/testing", + "//src/cdk/testing/testbed", "//src/material/tooltip", + "@npm//@angular/platform-browser", ], ) @@ -37,15 +36,3 @@ ng_web_test_suite( ":unit_tests_lib", ], ) - -ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], - deps = [ - ":testing", - "//src/cdk/testing", - "//src/cdk/testing/testbed", - "//src/material/tooltip", - "@npm//@angular/platform-browser", - ], -) diff --git a/src/material/tooltip/testing/shared.spec.ts b/src/material/tooltip/testing/shared.spec.ts deleted file mode 100644 index f12cfedeab74..000000000000 --- a/src/material/tooltip/testing/shared.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; -import {Component} from '@angular/core'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {MatTooltipModule} from '@angular/material/tooltip'; -import {MatTooltipHarness} from '@angular/material/tooltip/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; - -/** Shared tests to run on both the original and MDC-based tooltips. */ -export function runHarnessTests( - tooltipModule: typeof MatTooltipModule, - tooltipHarness: typeof MatTooltipHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [tooltipModule, NoopAnimationsModule], - declarations: [TooltipHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(TooltipHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load all tooltip harnesses', async () => { - const tooltips = await loader.getAllHarnesses(tooltipHarness); - expect(tooltips.length).toBe(3); - }); - - it('should be able to show a tooltip', async () => { - const tooltip = await loader.getHarness(tooltipHarness.with({selector: '#one'})); - expect(await tooltip.isOpen()).toBe(false); - await tooltip.show(); - expect(await tooltip.isOpen()).toBe(true); - }); - - it('should be able to hide a tooltip', async () => { - const tooltip = await loader.getHarness(tooltipHarness.with({selector: '#one'})); - expect(await tooltip.isOpen()).toBe(false); - await tooltip.show(); - expect(await tooltip.isOpen()).toBe(true); - await tooltip.hide(); - expect(await tooltip.isOpen()).toBe(false); - }); - - it('should be able to get the text of a tooltip', async () => { - const tooltip = await loader.getHarness(tooltipHarness.with({selector: '#one'})); - await tooltip.show(); - expect(await tooltip.getTooltipText()).toBe('Tooltip message'); - }); - - it('should return empty when getting the tooltip text while closed', async () => { - const tooltip = await loader.getHarness(tooltipHarness.with({selector: '#one'})); - expect(await tooltip.getTooltipText()).toBe(''); - }); - - it('should get disabled state', async () => { - const enabled = await loader.getHarness(tooltipHarness.with({selector: '#one'})); - const disabled = await loader.getHarness(tooltipHarness.with({selector: '#three'})); - - expect(await enabled.isDisabled()).toBe(false); - expect(await disabled.isDisabled()).toBe(true); - }); -} - -@Component({ - template: ` - - - - `, -}) -class TooltipHarnessTest { - message = 'Tooltip message'; -} diff --git a/src/material/tooltip/testing/tooltip-harness.spec.ts b/src/material/tooltip/testing/tooltip-harness.spec.ts index 339f95135e17..e0f10e03768f 100644 --- a/src/material/tooltip/testing/tooltip-harness.spec.ts +++ b/src/material/tooltip/testing/tooltip-harness.spec.ts @@ -1,7 +1,74 @@ +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; import {MatTooltipModule} from '@angular/material/tooltip'; -import {runHarnessTests} from './shared.spec'; -import {MatTooltipHarness} from './index'; +import {NoopAnimationsModule} from '@angular/platform-browser/animations'; +import {MatTooltipHarness} from './tooltip-harness'; -describe('MDC-based MatTooltipHarness', () => { - runHarnessTests(MatTooltipModule, MatTooltipHarness); +describe('MatTooltipHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatTooltipModule, NoopAnimationsModule], + declarations: [TooltipHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(TooltipHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load all tooltip harnesses', async () => { + const tooltips = await loader.getAllHarnesses(MatTooltipHarness); + expect(tooltips.length).toBe(3); + }); + + it('should be able to show a tooltip', async () => { + const tooltip = await loader.getHarness(MatTooltipHarness.with({selector: '#one'})); + expect(await tooltip.isOpen()).toBe(false); + await tooltip.show(); + expect(await tooltip.isOpen()).toBe(true); + }); + + it('should be able to hide a tooltip', async () => { + const tooltip = await loader.getHarness(MatTooltipHarness.with({selector: '#one'})); + expect(await tooltip.isOpen()).toBe(false); + await tooltip.show(); + expect(await tooltip.isOpen()).toBe(true); + await tooltip.hide(); + expect(await tooltip.isOpen()).toBe(false); + }); + + it('should be able to get the text of a tooltip', async () => { + const tooltip = await loader.getHarness(MatTooltipHarness.with({selector: '#one'})); + await tooltip.show(); + expect(await tooltip.getTooltipText()).toBe('Tooltip message'); + }); + + it('should return empty when getting the tooltip text while closed', async () => { + const tooltip = await loader.getHarness(MatTooltipHarness.with({selector: '#one'})); + expect(await tooltip.getTooltipText()).toBe(''); + }); + + it('should get disabled state', async () => { + const enabled = await loader.getHarness(MatTooltipHarness.with({selector: '#one'})); + const disabled = await loader.getHarness(MatTooltipHarness.with({selector: '#three'})); + + expect(await enabled.isDisabled()).toBe(false); + expect(await disabled.isDisabled()).toBe(true); + }); }); + +@Component({ + template: ` + + + + `, +}) +class TooltipHarnessTest { + message = 'Tooltip message'; +} diff --git a/src/material/tree/_tree-theme.scss b/src/material/tree/_tree-theme.scss index a54cda5fe82f..d699bdd98d86 100644 --- a/src/material/tree/_tree-theme.scss +++ b/src/material/tree/_tree-theme.scss @@ -16,6 +16,9 @@ } @mixin typography($theme) { + // TODO(mmalerba): Stop calling this and resolve resulting screen diffs. + $theme: inspection.private-get-typography-back-compat-theme($theme); + .mat-tree { font-family: inspection.get-theme-typography($theme, body-2, font-family); } diff --git a/src/material/tree/testing/BUILD.bazel b/src/material/tree/testing/BUILD.bazel index 97363fea2027..5b3f26e183cd 100644 --- a/src/material/tree/testing/BUILD.bazel +++ b/src/material/tree/testing/BUILD.bazel @@ -20,8 +20,8 @@ filegroup( ) ng_test_library( - name = "harness_tests_lib", - srcs = ["shared.spec.ts"], + name = "unit_tests_lib", + srcs = glob(["**/*.spec.ts"]), deps = [ ":testing", "//src/cdk/testing", @@ -31,19 +31,6 @@ ng_test_library( ], ) -ng_test_library( - name = "unit_tests_lib", - srcs = glob( - ["**/*.spec.ts"], - exclude = ["shared.spec.ts"], - ), - deps = [ - ":harness_tests_lib", - ":testing", - "//src/material/tree", - ], -) - ng_web_test_suite( name = "unit_tests", deps = [":unit_tests_lib"], diff --git a/src/material/tree/testing/shared.spec.ts b/src/material/tree/testing/shared.spec.ts deleted file mode 100644 index d51872f3fe0f..000000000000 --- a/src/material/tree/testing/shared.spec.ts +++ /dev/null @@ -1,290 +0,0 @@ -import {Component} from '@angular/core'; -import {FlatTreeControl, NestedTreeControl} from '@angular/cdk/tree'; -import { - MatTreeFlatDataSource, - MatTreeFlattener, - MatTreeModule, - MatTreeNestedDataSource, -} from '@angular/material/tree'; -import {MatTreeHarness} from '@angular/material/tree/testing'; -import {ComponentFixture, TestBed} from '@angular/core/testing'; -import {HarnessLoader} from '@angular/cdk/testing'; -import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; - -/** Shared tests to run on both the original and MDC-based trees. */ -export function runHarnessTests( - treeModule: typeof MatTreeModule, - treeHarness: typeof MatTreeHarness, -) { - let fixture: ComponentFixture; - let loader: HarnessLoader; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - imports: [treeModule], - declarations: [TreeHarnessTest], - }).compileComponents(); - - fixture = TestBed.createComponent(TreeHarnessTest); - fixture.detectChanges(); - loader = TestbedHarnessEnvironment.loader(fixture); - }); - - it('should load harness with 2 tress', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - - expect(trees.length).toBe(2); - }); - - it('should get correct number of children and descendants', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const flatTree = trees[0]; - const nestedTree = trees[1]; - const flatTreeDescendants = await flatTree.getNodes(); - const nestedDescendants = await nestedTree.getNodes(); - - // flat nodes are not rendered until expanded - expect(flatTreeDescendants.length).toBe(2); - - await flatTreeDescendants[0].expand(); - - expect((await flatTree.getNodes()).length).toBe(5); - - expect(nestedDescendants.length).toBe(8); - }); - - it('should correctly get correct node with text (flat tree)', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const flatTree = trees[0]; - const flatTreeNodes = await flatTree.getNodes({text: /Flat Group/}); - expect(flatTreeNodes.length).toBe(2); - const secondGroup = flatTreeNodes[0]; - - expect(await secondGroup.getText()).toBe('Flat Group 1'); - expect(await secondGroup.getLevel()).toBe(1); - expect(await secondGroup.isDisabled()).toBe(false); - expect(await secondGroup.isExpanded()).toBe(false); - }); - - it('should correctly get correct node with text (nested tree)', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const nestedTree = trees[1]; - const nestedTreeNodes = await nestedTree.getNodes({text: /2./}); - expect(nestedTreeNodes.length).toBe(3); - const thirdGroup = nestedTreeNodes[1]; - - expect(await thirdGroup.getText()).toBe('Nested Leaf 2.1.1'); - expect(await thirdGroup.getLevel()).toBe(3); - expect(await thirdGroup.isDisabled()).toBe(false); - expect(await thirdGroup.isExpanded()).toBe(false); - }); - - it('should toggle expansion', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const nestedTree = trees[1]; - const nestedTreeNodes = await nestedTree.getNodes(); - const firstGroup = nestedTreeNodes[0]; - - expect(await firstGroup.isExpanded()).toBe(false); - await firstGroup.expand(); - expect(await firstGroup.isExpanded()).toBe(true); - await firstGroup.expand(); - // no-op if already expanded - expect(await firstGroup.isExpanded()).toBe(true); - await firstGroup.collapse(); - expect(await firstGroup.isExpanded()).toBe(false); - await firstGroup.collapse(); - // no-op if already collapsed - expect(await firstGroup.isExpanded()).toBe(false); - }); - - it('should correctly get tree structure', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const flatTree = trees[0]; - - expect(await flatTree.getTreeStructure()).toEqual({ - children: [{text: 'Flat Group 1'}, {text: 'Flat Group 2'}], - }); - - const firstGroup = (await flatTree.getNodes({text: /Flat Group 1/}))[0]; - await firstGroup.expand(); - - expect(await flatTree.getTreeStructure()).toEqual({ - children: [ - { - text: 'Flat Group 1', - children: [{text: 'Flat Leaf 1.1'}, {text: 'Flat Leaf 1.2'}, {text: 'Flat Leaf 1.3'}], - }, - {text: 'Flat Group 2'}, - ], - }); - - const secondGroup = (await flatTree.getNodes({text: /Flat Group 2/}))[0]; - await secondGroup.expand(); - - expect(await flatTree.getTreeStructure()).toEqual({ - children: [ - { - text: 'Flat Group 1', - children: [{text: 'Flat Leaf 1.1'}, {text: 'Flat Leaf 1.2'}, {text: 'Flat Leaf 1.3'}], - }, - { - text: 'Flat Group 2', - children: [{text: 'Flat Group 2.1'}], - }, - ], - }); - }); - - it('should correctly get tree structure', async () => { - const trees = await loader.getAllHarnesses(treeHarness); - const nestedTree = trees[1]; - expect(await nestedTree.getTreeStructure()).toEqual({ - children: [{text: 'Nested Group 1'}, {text: 'Nested Group 2'}], - }); - - const firstGroup = (await nestedTree.getNodes({text: /Nested Group 1/}))[0]; - await firstGroup.expand(); - expect(await nestedTree.getTreeStructure()).toEqual({ - children: [ - { - text: 'Nested Group 1', - children: [ - {text: 'Nested Leaf 1.1'}, - {text: 'Nested Leaf 1.2'}, - {text: 'Nested Leaf 1.3'}, - ], - }, - {text: 'Nested Group 2'}, - ], - }); - - const secondGroup = (await nestedTree.getNodes({text: /Nested Group 2/}))[0]; - await secondGroup.expand(); - expect(await nestedTree.getTreeStructure()).toEqual({ - children: [ - { - text: 'Nested Group 1', - children: [ - {text: 'Nested Leaf 1.1'}, - {text: 'Nested Leaf 1.2'}, - {text: 'Nested Leaf 1.3'}, - ], - }, - { - text: 'Nested Group 2', - children: [{text: 'Nested Group 2.1'}], - }, - ], - }); - }); -} - -interface Node { - name: string; - children?: Node[]; -} - -const FLAT_TREE_DATA: Node[] = [ - { - name: 'Flat Group 1', - children: [{name: 'Flat Leaf 1.1'}, {name: 'Flat Leaf 1.2'}, {name: 'Flat Leaf 1.3'}], - }, - { - name: 'Flat Group 2', - children: [ - { - name: 'Flat Group 2.1', - children: [{name: 'Flat Leaf 2.1.1'}, {name: 'Flat Leaf 2.1.2'}, {name: 'Flat Leaf 2.1.3'}], - }, - ], - }, -]; - -const NESTED_TREE_DATA: Node[] = [ - { - name: 'Nested Group 1', - children: [{name: 'Nested Leaf 1.1'}, {name: 'Nested Leaf 1.2'}, {name: 'Nested Leaf 1.3'}], - }, - { - name: 'Nested Group 2', - children: [ - { - name: 'Nested Group 2.1', - children: [{name: 'Nested Leaf 2.1.1'}, {name: 'Nested Leaf 2.1.2'}], - }, - ], - }, -]; - -interface ExampleFlatNode { - expandable: boolean; - name: string; - level: number; -} - -@Component({ - template: ` - - - - {{node.name}} - - - - - {{node.name}} - - - - - - {{node.name}} - - - - - {{node.name}} -
    - -
-
-
- `, -}) -class TreeHarnessTest { - private _transformer = (node: Node, level: number) => { - return { - expandable: !!node.children && node.children.length > 0, - name: node.name, - level: level, - }; - }; - - treeFlattener = new MatTreeFlattener( - this._transformer, - node => node.level, - node => node.expandable, - node => node.children, - ); - flatTreeControl = new FlatTreeControl( - node => node.level, - node => node.expandable, - ); - flatTreeDataSource = new MatTreeFlatDataSource(this.flatTreeControl, this.treeFlattener); - nestedTreeControl = new NestedTreeControl(node => node.children); - nestedTreeDataSource = new MatTreeNestedDataSource(); - - constructor() { - this.flatTreeDataSource.data = FLAT_TREE_DATA; - this.nestedTreeDataSource.data = NESTED_TREE_DATA; - } - - flatTreeHasChild = (_: number, node: ExampleFlatNode) => node.expandable; - - nestedTreeHasChild = (_: number, node: Node) => !!node.children && node.children.length > 0; -} diff --git a/src/material/tree/testing/tree-harness.spec.ts b/src/material/tree/testing/tree-harness.spec.ts index 0eaa745a8fd3..bbe65e8d2b2e 100644 --- a/src/material/tree/testing/tree-harness.spec.ts +++ b/src/material/tree/testing/tree-harness.spec.ts @@ -1,7 +1,286 @@ -import {MatTreeHarness} from '@angular/material/tree/testing'; -import {MatTreeModule} from '@angular/material/tree'; -import {runHarnessTests} from '@angular/material/tree/testing/shared.spec'; +import {Component} from '@angular/core'; +import {ComponentFixture, TestBed} from '@angular/core/testing'; +import {FlatTreeControl, NestedTreeControl} from '@angular/cdk/tree'; +import { + MatTreeFlatDataSource, + MatTreeFlattener, + MatTreeModule, + MatTreeNestedDataSource, +} from '@angular/material/tree'; +import {HarnessLoader} from '@angular/cdk/testing'; +import {TestbedHarnessEnvironment} from '@angular/cdk/testing/testbed'; +import {MatTreeHarness} from './tree-harness'; -describe('Non-MDC-based MatTreeHarness', () => { - runHarnessTests(MatTreeModule, MatTreeHarness); +describe('MatTreeHarness', () => { + let fixture: ComponentFixture; + let loader: HarnessLoader; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [MatTreeModule], + declarations: [TreeHarnessTest], + }).compileComponents(); + + fixture = TestBed.createComponent(TreeHarnessTest); + fixture.detectChanges(); + loader = TestbedHarnessEnvironment.loader(fixture); + }); + + it('should load harness with 2 tress', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + + expect(trees.length).toBe(2); + }); + + it('should get correct number of children and descendants', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const flatTree = trees[0]; + const nestedTree = trees[1]; + const flatTreeDescendants = await flatTree.getNodes(); + const nestedDescendants = await nestedTree.getNodes(); + + // flat nodes are not rendered until expanded + expect(flatTreeDescendants.length).toBe(2); + + await flatTreeDescendants[0].expand(); + + expect((await flatTree.getNodes()).length).toBe(5); + + expect(nestedDescendants.length).toBe(8); + }); + + it('should correctly get correct node with text (flat tree)', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const flatTree = trees[0]; + const flatTreeNodes = await flatTree.getNodes({text: /Flat Group/}); + expect(flatTreeNodes.length).toBe(2); + const secondGroup = flatTreeNodes[0]; + + expect(await secondGroup.getText()).toBe('Flat Group 1'); + expect(await secondGroup.getLevel()).toBe(1); + expect(await secondGroup.isDisabled()).toBe(false); + expect(await secondGroup.isExpanded()).toBe(false); + }); + + it('should correctly get correct node with text (nested tree)', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const nestedTree = trees[1]; + const nestedTreeNodes = await nestedTree.getNodes({text: /2./}); + expect(nestedTreeNodes.length).toBe(3); + const thirdGroup = nestedTreeNodes[1]; + + expect(await thirdGroup.getText()).toBe('Nested Leaf 2.1.1'); + expect(await thirdGroup.getLevel()).toBe(3); + expect(await thirdGroup.isDisabled()).toBe(false); + expect(await thirdGroup.isExpanded()).toBe(false); + }); + + it('should toggle expansion', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const nestedTree = trees[1]; + const nestedTreeNodes = await nestedTree.getNodes(); + const firstGroup = nestedTreeNodes[0]; + + expect(await firstGroup.isExpanded()).toBe(false); + await firstGroup.expand(); + expect(await firstGroup.isExpanded()).toBe(true); + await firstGroup.expand(); + // no-op if already expanded + expect(await firstGroup.isExpanded()).toBe(true); + await firstGroup.collapse(); + expect(await firstGroup.isExpanded()).toBe(false); + await firstGroup.collapse(); + // no-op if already collapsed + expect(await firstGroup.isExpanded()).toBe(false); + }); + + it('should correctly get tree structure', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const flatTree = trees[0]; + + expect(await flatTree.getTreeStructure()).toEqual({ + children: [{text: 'Flat Group 1'}, {text: 'Flat Group 2'}], + }); + + const firstGroup = (await flatTree.getNodes({text: /Flat Group 1/}))[0]; + await firstGroup.expand(); + + expect(await flatTree.getTreeStructure()).toEqual({ + children: [ + { + text: 'Flat Group 1', + children: [{text: 'Flat Leaf 1.1'}, {text: 'Flat Leaf 1.2'}, {text: 'Flat Leaf 1.3'}], + }, + {text: 'Flat Group 2'}, + ], + }); + + const secondGroup = (await flatTree.getNodes({text: /Flat Group 2/}))[0]; + await secondGroup.expand(); + + expect(await flatTree.getTreeStructure()).toEqual({ + children: [ + { + text: 'Flat Group 1', + children: [{text: 'Flat Leaf 1.1'}, {text: 'Flat Leaf 1.2'}, {text: 'Flat Leaf 1.3'}], + }, + { + text: 'Flat Group 2', + children: [{text: 'Flat Group 2.1'}], + }, + ], + }); + }); + + it('should correctly get tree structure', async () => { + const trees = await loader.getAllHarnesses(MatTreeHarness); + const nestedTree = trees[1]; + expect(await nestedTree.getTreeStructure()).toEqual({ + children: [{text: 'Nested Group 1'}, {text: 'Nested Group 2'}], + }); + + const firstGroup = (await nestedTree.getNodes({text: /Nested Group 1/}))[0]; + await firstGroup.expand(); + expect(await nestedTree.getTreeStructure()).toEqual({ + children: [ + { + text: 'Nested Group 1', + children: [ + {text: 'Nested Leaf 1.1'}, + {text: 'Nested Leaf 1.2'}, + {text: 'Nested Leaf 1.3'}, + ], + }, + {text: 'Nested Group 2'}, + ], + }); + + const secondGroup = (await nestedTree.getNodes({text: /Nested Group 2/}))[0]; + await secondGroup.expand(); + expect(await nestedTree.getTreeStructure()).toEqual({ + children: [ + { + text: 'Nested Group 1', + children: [ + {text: 'Nested Leaf 1.1'}, + {text: 'Nested Leaf 1.2'}, + {text: 'Nested Leaf 1.3'}, + ], + }, + { + text: 'Nested Group 2', + children: [{text: 'Nested Group 2.1'}], + }, + ], + }); + }); }); + +interface Node { + name: string; + children?: Node[]; +} + +const FLAT_TREE_DATA: Node[] = [ + { + name: 'Flat Group 1', + children: [{name: 'Flat Leaf 1.1'}, {name: 'Flat Leaf 1.2'}, {name: 'Flat Leaf 1.3'}], + }, + { + name: 'Flat Group 2', + children: [ + { + name: 'Flat Group 2.1', + children: [{name: 'Flat Leaf 2.1.1'}, {name: 'Flat Leaf 2.1.2'}, {name: 'Flat Leaf 2.1.3'}], + }, + ], + }, +]; + +const NESTED_TREE_DATA: Node[] = [ + { + name: 'Nested Group 1', + children: [{name: 'Nested Leaf 1.1'}, {name: 'Nested Leaf 1.2'}, {name: 'Nested Leaf 1.3'}], + }, + { + name: 'Nested Group 2', + children: [ + { + name: 'Nested Group 2.1', + children: [{name: 'Nested Leaf 2.1.1'}, {name: 'Nested Leaf 2.1.2'}], + }, + ], + }, +]; + +interface ExampleFlatNode { + expandable: boolean; + name: string; + level: number; +} + +@Component({ + template: ` + + + + {{node.name}} + + + + + {{node.name}} + + + + + + {{node.name}} + + + + + {{node.name}} +
    + +
+
+
+ `, +}) +class TreeHarnessTest { + private _transformer = (node: Node, level: number) => { + return { + expandable: !!node.children && node.children.length > 0, + name: node.name, + level: level, + }; + }; + + treeFlattener = new MatTreeFlattener( + this._transformer, + node => node.level, + node => node.expandable, + node => node.children, + ); + flatTreeControl = new FlatTreeControl( + node => node.level, + node => node.expandable, + ); + flatTreeDataSource = new MatTreeFlatDataSource(this.flatTreeControl, this.treeFlattener); + nestedTreeControl = new NestedTreeControl(node => node.children); + nestedTreeDataSource = new MatTreeNestedDataSource(); + + constructor() { + this.flatTreeDataSource.data = FLAT_TREE_DATA; + this.nestedTreeDataSource.data = NESTED_TREE_DATA; + } + + flatTreeHasChild = (_: number, node: ExampleFlatNode) => node.expandable; + + nestedTreeHasChild = (_: number, node: Node) => !!node.children && node.children.length > 0; +} diff --git a/src/universal-app/theme.scss b/src/universal-app/theme.scss index 910e09d01e19..5e44bb588c60 100644 --- a/src/universal-app/theme.scss +++ b/src/universal-app/theme.scss @@ -2,6 +2,9 @@ // Plus imports for other components in your app. +// Disable legacy API compatibility, since universal-app is fully migrated to theme inspection API. +mat.$theme-legacy-inspection-api-compatibility: false; + // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // **Be sure that you only ever include this mixin once!** diff --git a/tools/public_api_guard/cdk/a11y.md b/tools/public_api_guard/cdk/a11y.md index a2b136168ad7..42111b519039 100644 --- a/tools/public_api_guard/cdk/a11y.md +++ b/tools/public_api_guard/cdk/a11y.md @@ -6,7 +6,6 @@ import { AfterContentInit } from '@angular/core'; import { AfterViewInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ContentObserver } from '@angular/cdk/observers'; import { DoCheck } from '@angular/core'; import { ElementRef } from '@angular/core'; @@ -102,12 +101,15 @@ export class CdkMonitorFocus implements AfterViewInit, OnDestroy { export class CdkTrapFocus implements OnDestroy, AfterContentInit, OnChanges, DoCheck { constructor(_elementRef: ElementRef, _focusTrapFactory: FocusTrapFactory, _document: any); - get autoCapture(): boolean; - set autoCapture(value: BooleanInput); + autoCapture: boolean; get enabled(): boolean; - set enabled(value: BooleanInput); + set enabled(value: boolean); focusTrap: FocusTrap; // (undocumented) + static ngAcceptInputType_autoCapture: unknown; + // (undocumented) + static ngAcceptInputType_enabled: unknown; + // (undocumented) ngAfterContentInit(): void; // (undocumented) ngDoCheck(): void; diff --git a/tools/public_api_guard/cdk/accordion.md b/tools/public_api_guard/cdk/accordion.md index ae26ad596351..4d5148decd78 100644 --- a/tools/public_api_guard/cdk/accordion.md +++ b/tools/public_api_guard/cdk/accordion.md @@ -4,7 +4,6 @@ ```ts -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { EventEmitter } from '@angular/core'; import * as i0 from '@angular/core'; @@ -19,8 +18,9 @@ import { UniqueSelectionDispatcher } from '@angular/cdk/collections'; export class CdkAccordion implements OnDestroy, OnChanges { closeAll(): void; readonly id: string; - get multi(): boolean; - set multi(multi: BooleanInput); + multi: boolean; + // (undocumented) + static ngAcceptInputType_multi: unknown; // (undocumented) ngOnChanges(changes: SimpleChanges): void; // (undocumented) @@ -42,14 +42,17 @@ export class CdkAccordionItem implements OnDestroy { close(): void; readonly closed: EventEmitter; readonly destroyed: EventEmitter; - get disabled(): boolean; - set disabled(disabled: BooleanInput); + disabled: boolean; get expanded(): boolean; - set expanded(expanded: BooleanInput); + set expanded(expanded: boolean); readonly expandedChange: EventEmitter; // (undocumented) protected _expansionDispatcher: UniqueSelectionDispatcher; readonly id: string; + // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) + static ngAcceptInputType_expanded: unknown; ngOnDestroy(): void; open(): void; readonly opened: EventEmitter; diff --git a/tools/public_api_guard/cdk/drag-drop.md b/tools/public_api_guard/cdk/drag-drop.md index f33273af733c..ec1680edc5cd 100644 --- a/tools/public_api_guard/cdk/drag-drop.md +++ b/tools/public_api_guard/cdk/drag-drop.md @@ -5,7 +5,6 @@ ```ts import { AfterViewInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { Direction } from '@angular/cdk/bidi'; import { Directionality } from '@angular/cdk/bidi'; @@ -58,7 +57,7 @@ export class CdkDrag implements AfterViewInit, OnChanges, OnDestroy { constrainPosition?: (userPointerPosition: Point, dragRef: DragRef, dimensions: ClientRect, pickupPositionInElement: Point) => Point; data: T; get disabled(): boolean; - set disabled(value: BooleanInput); + set disabled(value: boolean); _dragRef: DragRef>; dragStartDelay: DragStartDelay; dropContainer: CdkDropList; @@ -75,6 +74,8 @@ export class CdkDrag implements AfterViewInit, OnChanges, OnDestroy { lockAxis: DragAxis; readonly moved: Observable>; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngAfterViewInit(): void; // (undocumented) ngOnChanges(changes: SimpleChanges): void; @@ -145,10 +146,12 @@ export interface CdkDragExit { export class CdkDragHandle implements OnDestroy { constructor(element: ElementRef, parentDrag?: any); get disabled(): boolean; - set disabled(value: BooleanInput); + set disabled(value: boolean); // (undocumented) element: ElementRef; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngOnDestroy(): void; _parentDrag: {} | undefined; readonly _stateChanges: Subject; @@ -192,8 +195,9 @@ export class CdkDragPlaceholder { export class CdkDragPreview { constructor(templateRef: TemplateRef); data: T; - get matchSize(): boolean; - set matchSize(value: BooleanInput); + matchSize: boolean; + // (undocumented) + static ngAcceptInputType_matchSize: unknown; // (undocumented) templateRef: TemplateRef; // (undocumented) @@ -227,12 +231,12 @@ export class CdkDropList implements OnDestroy { constructor( element: ElementRef, dragDrop: DragDrop, _changeDetectorRef: ChangeDetectorRef, _scrollDispatcher: ScrollDispatcher, _dir?: Directionality | undefined, _group?: CdkDropListGroup> | undefined, config?: DragDropConfig); addItem(item: CdkDrag): void; - autoScrollDisabled: BooleanInput; + autoScrollDisabled: boolean; autoScrollStep: NumberInput; connectedTo: (CdkDropList | string)[] | CdkDropList | string; data: T; get disabled(): boolean; - set disabled(value: BooleanInput); + set disabled(value: boolean); _dropListRef: DropListRef>; readonly dropped: EventEmitter>; element: ElementRef; @@ -243,11 +247,17 @@ export class CdkDropList implements OnDestroy { id: string; lockAxis: DragAxis; // (undocumented) + static ngAcceptInputType_autoScrollDisabled: unknown; + // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) + static ngAcceptInputType_sortingDisabled: unknown; + // (undocumented) ngOnDestroy(): void; orientation: DropListOrientation; removeItem(item: CdkDrag): void; readonly sorted: EventEmitter>; - sortingDisabled: BooleanInput; + sortingDisabled: boolean; sortPredicate: (index: number, drag: CdkDrag, drop: CdkDropList) => boolean; // (undocumented) static ɵdir: i0.ɵɵDirectiveDeclaration, "[cdkDropList], cdk-drop-list", ["cdkDropList"], { "connectedTo": { "alias": "cdkDropListConnectedTo"; "required": false; }; "data": { "alias": "cdkDropListData"; "required": false; }; "orientation": { "alias": "cdkDropListOrientation"; "required": false; }; "id": { "alias": "id"; "required": false; }; "lockAxis": { "alias": "cdkDropListLockAxis"; "required": false; }; "disabled": { "alias": "cdkDropListDisabled"; "required": false; }; "sortingDisabled": { "alias": "cdkDropListSortingDisabled"; "required": false; }; "enterPredicate": { "alias": "cdkDropListEnterPredicate"; "required": false; }; "sortPredicate": { "alias": "cdkDropListSortPredicate"; "required": false; }; "autoScrollDisabled": { "alias": "cdkDropListAutoScrollDisabled"; "required": false; }; "autoScrollStep": { "alias": "cdkDropListAutoScrollStep"; "required": false; }; }, { "dropped": "cdkDropListDropped"; "entered": "cdkDropListEntered"; "exited": "cdkDropListExited"; "sorted": "cdkDropListSorted"; }, never, never, true, never>; @@ -257,10 +267,11 @@ export class CdkDropList implements OnDestroy { // @public export class CdkDropListGroup implements OnDestroy { - get disabled(): boolean; - set disabled(value: BooleanInput); + disabled: boolean; readonly _items: Set; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngOnDestroy(): void; // (undocumented) static ɵdir: i0.ɵɵDirectiveDeclaration, "[cdkDropListGroup]", ["cdkDropListGroup"], { "disabled": { "alias": "cdkDropListGroupDisabled"; "required": false; }; }, {}, never, never, true, never>; diff --git a/tools/public_api_guard/cdk/listbox.md b/tools/public_api_guard/cdk/listbox.md index 30199c83d654..f4db92475bec 100644 --- a/tools/public_api_guard/cdk/listbox.md +++ b/tools/public_api_guard/cdk/listbox.md @@ -6,7 +6,6 @@ import { ActiveDescendantKeyManager } from '@angular/cdk/a11y'; import { AfterContentInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { ControlValueAccessor } from '@angular/forms'; import { Highlightable } from '@angular/cdk/a11y'; @@ -27,8 +26,7 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con deselect(option: CdkOption): void; deselectValue(value: T): void; protected readonly destroyed: Subject; - get disabled(): boolean; - set disabled(value: BooleanInput); + disabled: boolean; protected readonly element: HTMLElement; get enabledTabIndex(): number | null; set enabledTabIndex(value: number | null); @@ -46,11 +44,21 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con isValueSelected(value: T): boolean; protected listKeyManager: ActiveDescendantKeyManager>; get multiple(): boolean; - set multiple(value: BooleanInput); - get navigateDisabledOptions(): BooleanInput; - set navigateDisabledOptions(skip: BooleanInput); - get navigationWrapDisabled(): BooleanInput; - set navigationWrapDisabled(wrap: BooleanInput); + set multiple(value: boolean); + get navigateDisabledOptions(): boolean; + set navigateDisabledOptions(skip: boolean); + get navigationWrapDisabled(): boolean; + set navigationWrapDisabled(wrap: boolean); + // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) + static ngAcceptInputType_multiple: unknown; + // (undocumented) + static ngAcceptInputType_navigateDisabledOptions: unknown; + // (undocumented) + static ngAcceptInputType_navigationWrapDisabled: unknown; + // (undocumented) + static ngAcceptInputType_useActiveDescendant: unknown; // (undocumented) ngAfterContentInit(): void; // (undocumented) @@ -71,8 +79,7 @@ export class CdkListbox implements AfterContentInit, OnDestroy, Con toggleValue(value: T): void; protected triggerOption(option: CdkOption | null): void; protected triggerRange(trigger: CdkOption | null, from: number, to: number, on: boolean): void; - get useActiveDescendant(): boolean; - set useActiveDescendant(shouldUseActiveDescendant: BooleanInput); + useActiveDescendant: boolean; get value(): readonly T[]; set value(value: readonly T[]); readonly valueChange: Subject>; @@ -99,7 +106,7 @@ export class CdkOption implements ListKeyManagerOption, Highlightab deselect(): void; protected destroyed: Subject; get disabled(): boolean; - set disabled(value: BooleanInput); + set disabled(value: boolean); readonly element: HTMLElement; get enabledTabIndex(): number | null; set enabledTabIndex(value: number | null); @@ -113,6 +120,8 @@ export class CdkOption implements ListKeyManagerOption, Highlightab isSelected(): boolean; protected readonly listbox: CdkListbox; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngOnDestroy(): void; select(): void; setActiveStyles(): void; diff --git a/tools/public_api_guard/cdk/menu.md b/tools/public_api_guard/cdk/menu.md index c9e364de0c9a..d640aca085b6 100644 --- a/tools/public_api_guard/cdk/menu.md +++ b/tools/public_api_guard/cdk/menu.md @@ -5,7 +5,6 @@ ```ts import { AfterContentInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ConnectedPosition } from '@angular/cdk/overlay'; import { Directionality } from '@angular/cdk/bidi'; import { ElementRef } from '@angular/core'; @@ -35,8 +34,9 @@ export const CDK_MENU: InjectionToken; export class CdkContextMenuTrigger extends CdkMenuTriggerBase implements OnDestroy { constructor(); close(): void; - get disabled(): boolean; - set disabled(value: BooleanInput); + disabled: boolean; + // (undocumented) + static ngAcceptInputType_disabled: unknown; open(coordinates: ContextMenuCoordinates): void; _openOnContextMenu(event: MouseEvent): void; // (undocumented) @@ -121,8 +121,7 @@ export class CdkMenuItem implements FocusableOption, FocusableElement, Toggler, protected readonly destroyed: Subject; // (undocumented) protected readonly _dir: Directionality | null; - get disabled(): boolean; - set disabled(value: BooleanInput); + disabled: boolean; // (undocumented) readonly _elementRef: ElementRef; focus(): void; @@ -132,6 +131,8 @@ export class CdkMenuItem implements FocusableOption, FocusableElement, Toggler, get hasMenu(): boolean; isMenuOpen(): boolean; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngOnDestroy(): void; // (undocumented) protected _ngZone: NgZone; @@ -177,10 +178,11 @@ export class CdkMenuItemRadio extends CdkMenuItemSelectable implements OnDestroy // @public export abstract class CdkMenuItemSelectable extends CdkMenuItem { - get checked(): boolean; - set checked(value: BooleanInput); + checked: boolean; protected closeOnSpacebarTrigger: boolean; // (undocumented) + static ngAcceptInputType_checked: unknown; + // (undocumented) static ɵdir: i0.ɵɵDirectiveDeclaration; // (undocumented) static ɵfac: i0.ɵɵFactoryDeclaration; diff --git a/tools/public_api_guard/cdk/observers.md b/tools/public_api_guard/cdk/observers.md index d679ef1efe04..b5b4f645c7fd 100644 --- a/tools/public_api_guard/cdk/observers.md +++ b/tools/public_api_guard/cdk/observers.md @@ -5,7 +5,6 @@ ```ts import { AfterContentInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ElementRef } from '@angular/core'; import { EventEmitter } from '@angular/core'; import * as i0 from '@angular/core'; @@ -20,9 +19,11 @@ export class CdkObserveContent implements AfterContentInit, OnDestroy { get debounce(): number; set debounce(value: NumberInput); get disabled(): boolean; - set disabled(value: BooleanInput); + set disabled(value: boolean); readonly event: EventEmitter; // (undocumented) + static ngAcceptInputType_disabled: unknown; + // (undocumented) ngAfterContentInit(): void; // (undocumented) ngOnDestroy(): void; diff --git a/tools/public_api_guard/cdk/overlay.md b/tools/public_api_guard/cdk/overlay.md index 9c2cb14aa122..6138afdbd384 100644 --- a/tools/public_api_guard/cdk/overlay.md +++ b/tools/public_api_guard/cdk/overlay.md @@ -4,7 +4,6 @@ ```ts -import { BooleanInput } from '@angular/cdk/coercion'; import { CdkScrollable } from '@angular/cdk/scrolling'; import { ComponentFactoryResolver } from '@angular/core'; import { ComponentPortal } from '@angular/cdk/portal'; @@ -55,20 +54,26 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges { disableClose: boolean; get disposeOnNavigation(): boolean; set disposeOnNavigation(value: boolean); - get flexibleDimensions(): boolean; - set flexibleDimensions(value: BooleanInput); - get growAfterOpen(): boolean; - set growAfterOpen(value: BooleanInput); - get hasBackdrop(): boolean; - set hasBackdrop(value: BooleanInput); + flexibleDimensions: boolean; + growAfterOpen: boolean; + hasBackdrop: boolean; height: number | string; - get lockPosition(): boolean; - set lockPosition(value: BooleanInput); + lockPosition: boolean; minHeight: number | string; minWidth: number | string; // (undocumented) static ngAcceptInputType_disposeOnNavigation: unknown; // (undocumented) + static ngAcceptInputType_flexibleDimensions: unknown; + // (undocumented) + static ngAcceptInputType_growAfterOpen: unknown; + // (undocumented) + static ngAcceptInputType_hasBackdrop: unknown; + // (undocumented) + static ngAcceptInputType_lockPosition: unknown; + // (undocumented) + static ngAcceptInputType_push: unknown; + // (undocumented) ngOnChanges(changes: SimpleChanges): void; // (undocumented) ngOnDestroy(): void; @@ -85,8 +90,7 @@ export class CdkConnectedOverlay implements OnDestroy, OnChanges { readonly positionChange: EventEmitter; positions: ConnectedPosition[]; positionStrategy: FlexibleConnectedPositionStrategy; - get push(): boolean; - set push(value: BooleanInput); + push: boolean; scrollStrategy: ScrollStrategy; transformOriginSelector: string; viewportMargin: number; diff --git a/tools/public_api_guard/cdk/scrolling.md b/tools/public_api_guard/cdk/scrolling.md index a535e75661df..ca520ef4b7df 100644 --- a/tools/public_api_guard/cdk/scrolling.md +++ b/tools/public_api_guard/cdk/scrolling.md @@ -4,7 +4,6 @@ ```ts -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { CollectionViewer } from '@angular/cdk/collections'; import { DataSource } from '@angular/cdk/collections'; @@ -186,8 +185,7 @@ export interface CdkVirtualScrollRepeater { // @public export class CdkVirtualScrollViewport extends CdkVirtualScrollable implements OnInit, OnDestroy { constructor(elementRef: ElementRef, _changeDetectorRef: ChangeDetectorRef, ngZone: NgZone, _scrollStrategy: VirtualScrollStrategy, dir: Directionality, scrollDispatcher: ScrollDispatcher, viewportRuler: ViewportRuler, scrollable: CdkVirtualScrollable); - get appendOnly(): boolean; - set appendOnly(value: BooleanInput); + appendOnly: boolean; attach(forOf: CdkVirtualScrollRepeater): void; checkViewportSize(): void; _contentWrapper: ElementRef; @@ -205,6 +203,8 @@ export class CdkVirtualScrollViewport extends CdkVirtualScrollable implements On measureScrollOffset(from?: 'top' | 'left' | 'right' | 'bottom' | 'start' | 'end'): number; measureViewportOffset(from?: 'top' | 'left' | 'right' | 'bottom' | 'start' | 'end'): number; // (undocumented) + static ngAcceptInputType_appendOnly: unknown; + // (undocumented) ngOnDestroy(): void; // (undocumented) ngOnInit(): void; diff --git a/tools/public_api_guard/cdk/stepper.md b/tools/public_api_guard/cdk/stepper.md index 5d80acfd4d43..8206547d2650 100644 --- a/tools/public_api_guard/cdk/stepper.md +++ b/tools/public_api_guard/cdk/stepper.md @@ -6,7 +6,6 @@ import { AfterContentInit } from '@angular/core'; import { AfterViewInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { Directionality } from '@angular/cdk/bidi'; import { ElementRef } from '@angular/core'; @@ -15,7 +14,6 @@ import { FocusableOption } from '@angular/cdk/a11y'; import * as i0 from '@angular/core'; import * as i5 from '@angular/cdk/bidi'; import { InjectionToken } from '@angular/core'; -import { NumberInput } from '@angular/cdk/coercion'; import { Observable } from 'rxjs'; import { OnChanges } from '@angular/core'; import { OnDestroy } from '@angular/core'; @@ -29,26 +27,32 @@ export class CdkStep implements OnChanges { ariaLabel: string; ariaLabelledby: string; get completed(): boolean; - set completed(value: BooleanInput); + set completed(value: boolean); // (undocumented) _completedOverride: boolean | null; content: TemplateRef; // (undocumented) _displayDefaultIndicatorType: boolean; - get editable(): boolean; - set editable(value: BooleanInput); + editable: boolean; errorMessage: string; get hasError(): boolean; - set hasError(value: BooleanInput); + set hasError(value: boolean); interacted: boolean; readonly interactedStream: EventEmitter; label: string; // (undocumented) _markAsInteracted(): void; // (undocumented) + static ngAcceptInputType_completed: unknown; + // (undocumented) + static ngAcceptInputType_editable: unknown; + // (undocumented) + static ngAcceptInputType_hasError: unknown; + // (undocumented) + static ngAcceptInputType_optional: unknown; + // (undocumented) ngOnChanges(): void; - get optional(): boolean; - set optional(value: BooleanInput); + optional: boolean; reset(): void; select(): void; _showError(): boolean; @@ -96,10 +100,13 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { _getStepContentId(i: number): string; _getStepLabelId(i: number): string; _groupId: number; - get linear(): boolean; - set linear(value: BooleanInput); + linear: boolean; next(): void; // (undocumented) + static ngAcceptInputType_linear: unknown; + // (undocumented) + static ngAcceptInputType_selectedIndex: unknown; + // (undocumented) ngAfterContentInit(): void; // (undocumented) ngAfterViewInit(): void; @@ -114,7 +121,7 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { get selected(): CdkStep | undefined; set selected(step: CdkStep | undefined); get selectedIndex(): number; - set selectedIndex(index: NumberInput); + set selectedIndex(index: number); readonly selectedIndexChange: EventEmitter; readonly selectionChange: EventEmitter; _stateChanged(): void; diff --git a/tools/public_api_guard/cdk/table.md b/tools/public_api_guard/cdk/table.md index 29d6de0cecb6..b6d8d6c68d73 100644 --- a/tools/public_api_guard/cdk/table.md +++ b/tools/public_api_guard/cdk/table.md @@ -6,7 +6,6 @@ import { AfterContentChecked } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -import { BooleanInput } from '@angular/cdk/coercion'; import { ChangeDetectorRef } from '@angular/core'; import { CollectionViewer } from '@angular/cdk/collections'; import { DataSource } from '@angular/cdk/collections'; @@ -149,9 +148,11 @@ export class CdkColumnDef extends _CdkColumnDefBase implements CanStick { set name(name: string); // (undocumented) protected _name: string; + // (undocumented) + static ngAcceptInputType_stickyEnd: unknown; protected _setNameInput(value: string): void; get stickyEnd(): boolean; - set stickyEnd(v: BooleanInput); + set stickyEnd(value: boolean); // (undocumented) _stickyEnd: boolean; // (undocumented) @@ -314,7 +315,7 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes // (undocumented) protected readonly _elementRef: ElementRef; get fixedLayout(): boolean; - set fixedLayout(v: BooleanInput); + set fixedLayout(value: boolean); // (undocumented) _footerRowOutlet: FooterRowOutlet; _getRenderedRows(rowOutlet: RowOutlet): HTMLElement[]; @@ -323,11 +324,15 @@ export class CdkTable implements AfterContentChecked, CollectionViewer, OnDes _headerRowOutlet: HeaderRowOutlet; protected _isNativeHtmlTable: boolean; get multiTemplateDataRows(): boolean; - set multiTemplateDataRows(v: BooleanInput); + set multiTemplateDataRows(value: boolean); // (undocumented) _multiTemplateDataRows: boolean; protected needsPositionStickyOnElement: boolean; // (undocumented) + static ngAcceptInputType_fixedLayout: unknown; + // (undocumented) + static ngAcceptInputType_multiTemplateDataRows: unknown; + // (undocumented) ngAfterContentChecked(): void; // (undocumented) ngOnDestroy(): void; diff --git a/tools/public_api_guard/cdk/text-field.md b/tools/public_api_guard/cdk/text-field.md index b190f571ebc8..9afbbd5b9fbe 100644 --- a/tools/public_api_guard/cdk/text-field.md +++ b/tools/public_api_guard/cdk/text-field.md @@ -5,7 +5,6 @@ ```ts import { AfterViewInit } from '@angular/core'; -import { BooleanInput } from '@angular/cdk/coercion'; import { DoCheck } from '@angular/core'; import { ElementRef } from '@angular/core'; import { EventEmitter } from '@angular/core'; @@ -58,12 +57,14 @@ export class CdkTextareaAutosize implements AfterViewInit, DoCheck, OnDestroy { document?: any); protected _document?: Document; get enabled(): boolean; - set enabled(value: BooleanInput); + set enabled(value: boolean); get maxRows(): number; set maxRows(value: NumberInput); get minRows(): number; set minRows(value: NumberInput); // (undocumented) + static ngAcceptInputType_enabled: unknown; + // (undocumented) ngAfterViewInit(): void; // (undocumented) ngDoCheck(): void; diff --git a/tools/public_api_guard/material/core-testing.md b/tools/public_api_guard/material/core-testing.md index 850d9d2a0d61..fb623f6627a3 100644 --- a/tools/public_api_guard/material/core-testing.md +++ b/tools/public_api_guard/material/core-testing.md @@ -7,6 +7,7 @@ import { BaseHarnessFilters } from '@angular/cdk/testing'; import { ComponentHarness } from '@angular/cdk/testing'; import { ComponentHarnessConstructor } from '@angular/cdk/testing'; +import { ContentContainerComponentHarness } from '@angular/cdk/testing'; import { HarnessPredicate } from '@angular/cdk/testing'; // @public @@ -19,7 +20,7 @@ export class MatOptgroupHarness extends ComponentHarness { } // @public -export class MatOptionHarness extends ComponentHarness { +export class MatOptionHarness extends ContentContainerComponentHarness { click(): Promise; getText(): Promise; static hostSelector: string; diff --git a/tools/public_api_guard/material/dialog.md b/tools/public_api_guard/material/dialog.md index c459d3eb63dc..5ca3250aef2c 100644 --- a/tools/public_api_guard/material/dialog.md +++ b/tools/public_api_guard/material/dialog.md @@ -7,6 +7,7 @@ import { AnimationTriggerMetadata } from '@angular/animations'; import { CdkDialogContainer } from '@angular/cdk/dialog'; import { ComponentFactoryResolver } from '@angular/core'; +import { ComponentPortal } from '@angular/cdk/portal'; import { ComponentRef } from '@angular/core'; import { ComponentType } from '@angular/cdk/overlay'; import { DialogRef } from '@angular/cdk/dialog'; @@ -183,6 +184,8 @@ export class MatDialogContainer extends CdkDialogContainer impl _animationsEnabled: boolean; _animationStateChanged: EventEmitter; // (undocumented) + attachComponentPortal(portal: ComponentPortal): ComponentRef; + // (undocumented) protected _captureInitialFocus(): void; // (undocumented) protected _contentAttached(): void; diff --git a/tools/sass/local-sass-importer.ts b/tools/sass/local-sass-importer.ts index 9dff599a3e8f..dff785e17433 100644 --- a/tools/sass/local-sass-importer.ts +++ b/tools/sass/local-sass-importer.ts @@ -15,7 +15,7 @@ export function createLocalAngularPackageImporter(packageDirAbsPath: string) { return { findFileUrl: (url: string) => { if (url.startsWith(angularPrefix)) { - return pathToFileURL(join(packageDirAbsPath, url.substring(angularPrefix.length))); + return pathToFileURL(join(packageDirAbsPath, url.substring(angularPrefix.length))) as URL; } return null; }, diff --git a/tools/stylelint/theme-mixin-api.ts b/tools/stylelint/theme-mixin-api.ts deleted file mode 100644 index 1cba00b35cb0..000000000000 --- a/tools/stylelint/theme-mixin-api.ts +++ /dev/null @@ -1,278 +0,0 @@ -import {createPlugin, utils, PostcssResult, Rule} from 'stylelint'; -import {basename} from 'path'; -import {AtRule, Declaration, Node} from 'postcss'; - -/** Name of this stylelint rule. */ -const ruleName = 'material/theme-mixin-api'; - -/** Regular expression that matches all theme mixins. */ -const themeMixinRegex = /^(density|color|typography|theme)\((.*)\)$/; - -/** - * Stylelint plugin which ensures that theme mixins have a consistent API. Besides - * compilation API tests which are stored in `src/material/core/theming/test`, we test - * the following patterns here: - * - * 1. Checks if theme mixin arguments named consistently e.g. if a mixin accepts both a theme - * or color configuration, the variable should reflect that. - * 2. Checks if the individual theme mixins handle the case where consumers pass a theme object. - * For convenience, we support passing theme object to the scoped mixins. - * 3. Checks if the `-theme` mixins have the duplicate style check set up. We want to - * consistently check for duplicative theme styles so that we can warn consumers. The - * plugin ensures that style-generating statements are nested inside the duplication check. - */ -const ruleFn: Rule = (isEnabled, _options, context) => { - return (root, result) => { - const componentName = getComponentNameFromPath(root.source!.input.file!); - - if (!componentName || !isEnabled) { - return; - } - - root.walkAtRules('mixin', node => { - if (node.params.startsWith('_') || node.params.startsWith('private-')) { - // This is a private mixins that isn't intended to be consumed outside of our own code. - return; - } - - const matches = node.params.match(themeMixinRegex); - if (matches === null) { - return; - } - - // Type of the theme mixin. e.g. `density`, `color`, `theme`. - const type = matches[1]; - // Naively assumes that mixin arguments can be easily retrieved by splitting based on - // a comma. This is not always correct because Sass maps can be constructed in parameters. - // These would contain commas that throw of the argument retrieval. It's acceptable that - // this rule will fail in such edge-cases. There is no AST for `postcss.AtRule` params. - const args = matches[2].split(',').map(arg => arg.trim()); - - if (type === 'theme') { - validateThemeMixin(result, componentName, node, args, !!context.fix); - } else { - validateIndividualSystemMixins(result, node, type, args, !!context.fix); - } - }); - }; -}; - -ruleFn.ruleName = ruleName; -ruleFn.messages = utils.ruleMessages(ruleName, {}); - -/** Validates a `theme` mixin. */ -function validateThemeMixin( - result: PostcssResult, - componentName: string, - node: AtRule, - args: string[], - shouldFix: boolean, -) { - if (args.length !== 1) { - reportError(result, node, 'Expected theme mixin to only declare a single argument.'); - } else if (args[0] !== '$theme-or-color-config') { - if (shouldFix) { - node.params = node.params.replace(args[0], '$theme-or-color-config'); - } else { - reportError( - result, - node, - 'Expected first mixin argument to be called `$theme-or-color-config`.', - ); - } - } - - const themePropName = `$theme`; - const legacyColorExtractExpr = anyPattern( - `<..>.private-legacy-get-theme($theme-or-color-config)`, - ); - const duplicateStylesCheckExpr = anyPattern( - `<..>.private-check-duplicate-theme-styles(${themePropName}, '${componentName}')`, - ); - - let legacyConfigDecl: Declaration | null = null; - let duplicateStylesCheck: AtRule | null = null; - let hasNodesOutsideDuplicationCheck = false; - let isLegacyConfigRetrievalFirstStatement = false; - - if (node.nodes) { - for (let i = 0; i < node.nodes.length; i++) { - const childNode = node.nodes[i]; - if (childNode.type === 'decl' && legacyColorExtractExpr.test(childNode.value)) { - legacyConfigDecl = childNode; - isLegacyConfigRetrievalFirstStatement = i === 0; - } else if ( - childNode.type === 'atrule' && - childNode.name === 'include' && - duplicateStylesCheckExpr.test(childNode.params) - ) { - duplicateStylesCheck = childNode; - } else if (childNode.type !== 'comment') { - hasNodesOutsideDuplicationCheck = true; - } - } - } - - if (!legacyConfigDecl) { - reportError( - result, - node, - `Legacy color API is not handled. Consumers could pass in a ` + - `color configuration directly to the theme mixin. For backwards compatibility, ` + - `use the following declaration to retrieve the theme object: ` + - `${themePropName}: ${legacyColorExtractExpr}`, - ); - } else if (legacyConfigDecl.prop !== themePropName) { - reportError( - result, - legacyConfigDecl, - `For consistency, theme variable should be called: ${themePropName}`, - ); - } - - if (!duplicateStylesCheck) { - reportError( - result, - node, - `Missing check for duplicative theme styles. Please include the ` + - `duplicate styles check mixin: ${duplicateStylesCheckExpr}`, - ); - } - - if (hasNodesOutsideDuplicationCheck) { - reportError( - result, - node, - `Expected nodes other than the "${legacyColorExtractExpr}" ` + - `declaration to be nested inside the duplicate styles check.`, - ); - } - - if (legacyConfigDecl !== null && !isLegacyConfigRetrievalFirstStatement) { - reportError( - result, - legacyConfigDecl, - 'Legacy configuration should be retrieved first in theme mixin.', - ); - } -} - -/** Validates one of the individual theming mixins (`color`, `typography` etc.) */ -function validateIndividualSystemMixins( - result: PostcssResult, - node: AtRule, - type: string, - args: string[], - shouldFix: boolean, -) { - if (args.length !== 1) { - reportError(result, node, 'Expected mixin to only declare a single argument.'); - } else if (args[0] !== '$config-or-theme') { - if (shouldFix) { - node.params = node.params.replace(args[0], '$config-or-theme'); - } else { - reportError(result, node, 'Expected first mixin argument to be called `$config-or-theme`.'); - } - } - - const expectedProperty = type === 'density' ? '$density-scale' : '$config'; - const expectedValues = - type === 'typography' - ? [ - anyPattern( - '<..>.private-typography-to-2014-config(' + - '<..>.get-typography-config($config-or-theme))', - ), - anyPattern( - '<..>.private-typography-to-2018-config(' + - '<..>.get-typography-config($config-or-theme))', - ), - ] - : [anyPattern(`<..>.get-${type}-config($config-or-theme)`)]; - let configExtractionNode: Declaration | null = null; - let nonCommentNodeCount = 0; - - if (node.nodes) { - for (const currentNode of node.nodes) { - if (currentNode.type !== 'comment') { - nonCommentNodeCount++; - } - - if ( - currentNode.type === 'decl' && - expectedValues.some(v => v.test(stripNewlinesAndIndentation(currentNode.value))) - ) { - configExtractionNode = currentNode; - break; - } - } - } - - if (!configExtractionNode && nonCommentNodeCount > 0) { - reportError( - result, - node, - `Config is not extracted. Consumers could pass a theme object. ` + - `Extract the configuration by using one of the following:` + - expectedValues.map(expectedValue => `${expectedProperty}: ${expectedValue}`).join('\n'), - ); - } else if (configExtractionNode && configExtractionNode.prop !== expectedProperty) { - reportError( - result, - configExtractionNode, - `For consistency, variable for configuration should ` + `be called: ${expectedProperty}`, - ); - } -} - -/** Reports a lint error. */ -function reportError(result: PostcssResult, node: Node, message: string) { - utils.report({result, ruleName, node, message}); -} - -/** Figures out the name of the component from a file path. */ -function getComponentNameFromPath(filePath: string): string | null { - const match = basename(filePath).match(/_?(.*)-theme\.scss$/); - - if (!match) { - return null; - } - - let prefix = ''; - - if (filePath.includes('material-experimental') && filePath.includes('mdc-')) { - prefix = 'mat-mdc-'; - } else if (filePath.includes('material')) { - prefix = 'mat-'; - } - - return prefix + match[1]; -} - -/** Strips newlines from a string and any whitespace immediately after it. */ -function stripNewlinesAndIndentation(value: string): string { - return value.replace(/(\r|\n)\s+/g, ''); -} - -/** - * Template string function that converts a pattern to a regular expression - * that can be used for assertions. - * - * The `<..>` character sequency is a placeholder that will allow for arbitrary - * content. - */ -function anyPattern(pattern: string): RegExp { - const regex = new RegExp( - `^${sanitizeForRegularExpression(pattern).replace(/<\\.\\.>/g, '.*?')}$`, - ); - // Preserve the original expression/pattern for better failure messages. - regex.toString = () => pattern; - return regex; -} - -/** Sanitizes a given string so that it can be used as literal in a RegExp. */ -function sanitizeForRegularExpression(value: string): string { - return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); -} - -export default createPlugin(ruleName, ruleFn); diff --git a/tslint.json b/tslint.json index af505484e9d5..1551e38b68bb 100644 --- a/tslint.json +++ b/tslint.json @@ -16,7 +16,7 @@ "no-arg": true, "no-internal-module": true, "no-trailing-whitespace": true, - "no-shadowed-variable": true, + "no-shadowed-variable": false, // Disabled, because it breaks in TS 5.2 "no-unused-expression": true, "no-unused-variable": true, "no-var-keyword": true, diff --git a/yarn.lock b/yarn.lock index 0ac22140d648..7a1d902582b2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,14 +25,6 @@ "@jridgewell/gen-mapping" "^0.1.0" "@jridgewell/trace-mapping" "^0.3.9" -"@angular-devkit/architect@0.1601.0": - version "0.1601.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1601.0.tgz#935278690400d7add65e8b6a81bdab96599842f4" - integrity sha512-lrO++pcB+NFGXLZrFBhRMPbGCMpZuJyJEKSK8zknw9/7ipRz1MSlRaJFWUKEHRlVI/+hsBTWtBRUnR5WcgqvvA== - dependencies: - "@angular-devkit/core" "16.1.0" - rxjs "7.8.1" - "@angular-devkit/architect@0.1602.0-next.4": version "0.1602.0-next.4" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.1602.0-next.4.tgz#ec28d052727e73c46fd748534ee0f5f38995f87b" @@ -41,6 +33,14 @@ "@angular-devkit/core" "16.2.0-next.4" rxjs "7.8.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== + dependencies: + "@angular-devkit/core" "17.0.0-next.4" + rxjs "7.8.1" + "@angular-devkit/build-angular@16.2.0-next.4": version "16.2.0-next.4" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-16.2.0-next.4.tgz#d3459a8f2893d7b149a1fab35a08ac6a01b668bf" @@ -113,85 +113,78 @@ optionalDependencies: esbuild "0.18.17" -"@angular-devkit/build-angular@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-16.1.0.tgz#94a66dddf4d71fafaedb25e573ead7889d9febbd" - integrity sha512-nY/g1L0/BOyYSko3Qsey39Oul93eyBQyOfBtXKlnsarKW6xu5Eq2Q6tz2HLCoq93eeEt0VDEHIPkE9E/tp5CTA== +"@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== dependencies: "@ampproject/remapping" "2.2.1" - "@angular-devkit/architect" "0.1601.0" - "@angular-devkit/build-webpack" "0.1601.0" - "@angular-devkit/core" "16.1.0" - "@babel/core" "7.22.5" - "@babel/generator" "7.22.5" + "@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" + "@babel/core" "7.22.17" + "@babel/generator" "7.22.15" "@babel/helper-annotate-as-pure" "7.22.5" - "@babel/helper-split-export-declaration" "7.22.5" - "@babel/plugin-proposal-async-generator-functions" "7.20.7" + "@babel/helper-split-export-declaration" "7.22.6" + "@babel/plugin-transform-async-generator-functions" "7.22.15" "@babel/plugin-transform-async-to-generator" "7.22.5" - "@babel/plugin-transform-runtime" "7.22.5" - "@babel/preset-env" "7.22.5" - "@babel/runtime" "7.22.5" - "@babel/template" "7.22.5" + "@babel/plugin-transform-runtime" "7.22.15" + "@babel/preset-env" "7.22.15" + "@babel/runtime" "7.22.15" "@discoveryjs/json-ext" "0.5.7" - "@ngtools/webpack" "16.1.0" + "@ngtools/webpack" "17.0.0-next.4" "@vitejs/plugin-basic-ssl" "1.0.1" ansi-colors "4.1.3" - autoprefixer "10.4.14" - babel-loader "9.1.2" + autoprefixer "10.4.15" + babel-loader "9.1.3" babel-plugin-istanbul "6.1.1" - browserslist "4.21.7" - cacache "17.1.3" + browser-sync "2.29.3" + browserslist "^4.21.5" chokidar "3.5.3" copy-webpack-plugin "11.0.0" - critters "0.0.18" + critters "0.0.20" css-loader "6.8.1" - esbuild-wasm "0.17.19" - fast-glob "3.2.12" - https-proxy-agent "5.0.1" - inquirer "8.2.4" + esbuild-wasm "0.19.2" + 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" jsonc-parser "3.2.0" karma-source-map-support "1.4.0" - less "4.1.3" + less "4.2.0" less-loader "11.1.0" license-webpack-plugin "4.0.2" loader-utils "3.2.1" - magic-string "0.30.0" + magic-string "0.30.3" mini-css-extract-plugin "2.7.6" mrmime "1.0.1" open "8.4.2" ora "5.4.1" parse5-html-rewriting-stream "7.0.0" picomatch "2.3.1" - piscina "3.2.0" - postcss "8.4.24" - postcss-loader "7.3.2" + piscina "4.1.0" + postcss "8.4.29" + postcss-loader "7.3.3" resolve-url-loader "5.0.0" rxjs "7.8.1" - sass "1.63.2" - sass-loader "13.3.1" - semver "7.5.1" + sass "1.66.1" + sass-loader "13.3.2" + semver "7.5.4" source-map-loader "4.0.1" source-map-support "0.5.21" - terser "5.17.7" + terser "5.19.4" text-table "0.2.0" tree-kill "1.2.2" - tslib "2.5.3" - vite "4.3.9" - webpack "5.86.0" + tslib "2.6.2" + vite "4.4.9" + webpack "5.88.2" webpack-dev-middleware "6.1.1" - webpack-dev-server "4.15.0" + webpack-dev-server "4.15.1" webpack-merge "5.9.0" webpack-subresource-integrity "5.1.0" optionalDependencies: - esbuild "0.17.19" - -"@angular-devkit/build-webpack@0.1601.0": - version "0.1601.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.1601.0.tgz#747168cdec7c6751cd7c66052ebebd312ee212d8" - integrity sha512-p9OXQU9dxVBPvOpxM5W7kCrQ1lo9izg9AxXVTuc9gT2QJPw8pqRGr78/68NTRrFN8ODoMo6ySPVO0VGTc8qelg== - dependencies: - "@angular-devkit/architect" "0.1601.0" - rxjs "7.8.1" + esbuild "0.19.2" "@angular-devkit/build-webpack@0.1602.0-next.4": version "0.1602.0-next.4" @@ -201,16 +194,13 @@ "@angular-devkit/architect" "0.1602.0-next.4" rxjs "7.8.1" -"@angular-devkit/core@16.1.0", "@angular-devkit/core@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-16.1.0.tgz#cb56b19e88fc936fb0b26c5ae62591f1e8906961" - integrity sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q== +"@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== dependencies: - ajv "8.12.0" - ajv-formats "2.1.1" - jsonc-parser "3.2.0" + "@angular-devkit/architect" "0.1700.0-next.4" rxjs "7.8.1" - source-map "0.7.4" "@angular-devkit/core@16.2.0-next.4": version "16.2.0-next.4" @@ -223,21 +213,33 @@ rxjs "7.8.1" source-map "0.7.4" -"@angular-devkit/schematics@16.1.0", "@angular-devkit/schematics@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-16.1.0.tgz#a0235ba402c9dfb38b7dedbf59bbcda667e8ec2f" - integrity sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A== +"@angular-devkit/core@17.0.0-next.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== + dependencies: + ajv "8.12.0" + ajv-formats "2.1.1" + jsonc-parser "3.2.0" + picomatch "2.3.1" + rxjs "7.8.1" + source-map "0.7.4" + +"@angular-devkit/schematics@17.0.0-next.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== dependencies: - "@angular-devkit/core" "16.1.0" + "@angular-devkit/core" "17.0.0-next.4" jsonc-parser "3.2.0" - magic-string "0.30.0" + magic-string "0.30.3" ora "5.4.1" rxjs "7.8.1" -"@angular/animations@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-16.1.1.tgz#3468e06b6fb3521771caaafd0756ac7ed4d4fdbf" - integrity sha512-Na+eGoLvek3rmIanqXdMJoVAxd00AfYsMoHzhAVuPQpbW1H3EGqMvbzPHf1WhP19yFZ9gXGV0rFZf1qieQPufA== +"@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== dependencies: tslib "^2.3.0" @@ -260,7 +262,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#22a9a75114d5e80907054f01b9fa360972de1c05": version "0.0.0-9931e1a8d1b62fcd2267e89f9993a494856cc1cd" - uid "22a9a75114d5e80907054f01b9fa360972de1c05" resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#22a9a75114d5e80907054f01b9fa360972de1c05" dependencies: "@angular-devkit/build-angular" "16.2.0-next.4" @@ -298,43 +299,43 @@ uuid "^9.0.0" yargs "^17.0.0" -"@angular/cli@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-16.1.0.tgz#1923f65744c93c2ab61f7dd27ce60136b179be1b" - integrity sha512-WgWGpdQI0JCP8gEj2XoSkbuLNtL55hTvpPL+Qx9P+SjcAk/d10sGMqEs/phyLYeYz7wIDPPCKkJu4EcjZXE8SA== +"@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== dependencies: - "@angular-devkit/architect" "0.1601.0" - "@angular-devkit/core" "16.1.0" - "@angular-devkit/schematics" "16.1.0" - "@schematics/angular" "16.1.0" + "@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" "@yarnpkg/lockfile" "1.1.0" ansi-colors "4.1.3" ini "4.1.1" - inquirer "8.2.4" + inquirer "8.2.6" jsonc-parser "3.2.0" - npm-package-arg "10.1.0" - npm-pick-manifest "8.0.1" + npm-package-arg "11.0.1" + npm-pick-manifest "9.0.0" open "8.4.2" ora "5.4.1" - pacote "15.2.0" - resolve "1.22.2" - semver "7.5.1" + pacote "17.0.4" + resolve "1.22.4" + semver "7.5.4" symbol-observable "4.0.0" yargs "17.7.2" -"@angular/common@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-16.1.1.tgz#179e03c64d9527a7215638eb570b59b30bc3f793" - integrity sha512-qsMYqk7U7IcuE8swJ7Sppv0MkYBTfzrsq5jfAaAZYw035Po5FfxkFrh/Pmgp7QZndCsO9H+03JLH03jzuIqfrw== +"@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== dependencies: tslib "^2.3.0" -"@angular/compiler-cli@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-16.1.1.tgz#014bfcf5cb71741e7a7f4eeeb8060db6d4a435a2" - integrity sha512-c6qCXNFxSGHaWRDR+AQziqEmgZX5d5+4T0fGQt0FJxgVDSFk0L++R4hglhbDzi697PA9jSyWLuus/7sNLxrC4A== +"@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== dependencies: - "@babel/core" "7.21.8" + "@babel/core" "7.22.5" "@jridgewell/sourcemap-codec" "^1.4.14" chokidar "^3.0.0" convert-source-map "^1.5.1" @@ -343,10 +344,10 @@ tslib "^2.3.0" yargs "^17.2.1" -"@angular/compiler@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-16.1.1.tgz#2015e833c81a0dc03a7208fe7b34209258c576e1" - integrity sha512-TKLZS4d7dHvFlULvaZLlG+NKX8wIPoz9sUGzxnS+FPqa0GLfeeVY+KCj4bWSTBhESjgdIeDBu7KdT4vakvb8Nw== +"@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== dependencies: tslib "^2.3.0" @@ -357,63 +358,62 @@ dependencies: tslib "^2.3.0" -"@angular/core@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-16.1.1.tgz#2d4041a6cb3c7ba44cf472e935dab95e0bf9d408" - integrity sha512-hi0O2Gc0L4PavczQweC9cxVfdemXj76wfJ3GjtUP+f9I4uKLBQ6/JABExRIoW9eY0rK5fZgYP0IeCYisW4gxnQ== +"@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== dependencies: tslib "^2.3.0" -"@angular/forms@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-16.1.1.tgz#182ae54cc8e96acb6180c707341ec3545adb5939" - integrity sha512-vRpcy68MkudST7eV+pYpHsF0cXEfeAG3xGn1ntdkhydhMFPo+SwuZjzOT0OSq10Wdoerb4KI5eOesDLaLjmeJA== +"@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== dependencies: tslib "^2.3.0" -"@angular/localize@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/localize/-/localize-16.1.1.tgz#6656c23f56bc46e4f0730552a170170a4d3cbd37" - integrity sha512-7TDy4joFVBzRGySvjimKDSGQ9wFvZkXtR3RYquarJl+h4V9udCVv4hOez0yYfM35wKd0pP7UtnOh9VQGm+RVKg== +"@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== dependencies: - "@babel/core" "7.21.8" - fast-glob "3.2.12" + "@babel/core" "7.22.5" + fast-glob "3.3.1" yargs "^17.2.1" "@angular/ng-dev@https://github.com/angular/dev-infra-private-ng-dev-builds.git#2c4d983ef0f1f000a8554b3b7fbf7f1061c877d3": version "0.0.0-9931e1a8d1b62fcd2267e89f9993a494856cc1cd" - uid "2c4d983ef0f1f000a8554b3b7fbf7f1061c877d3" resolved "https://github.com/angular/dev-infra-private-ng-dev-builds.git#2c4d983ef0f1f000a8554b3b7fbf7f1061c877d3" dependencies: "@yarnpkg/lockfile" "^1.1.0" typescript "~4.9.0" -"@angular/platform-browser-dynamic@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.1.1.tgz#68956b831f315bcc2835f5aa08f8e3dda1dd7b53" - integrity sha512-wET0g3N5KbnAFUT0r/LGM039vfNRNdKn+rsVPxchh+EeQ+oJxdQi0dUBqSviabwwNW0oLPU+chnGFFowcKL0Wg== +"@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== dependencies: tslib "^2.3.0" -"@angular/platform-browser@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-16.1.1.tgz#a39fd081943f50017b68c7fadf9d3ad4b3969e9f" - integrity sha512-9zeB64wbAsoun7+rP6G8e1TY+1nC0sEaGdLzBv9ohOrFgkl8XgM+uNDiwkDLsBJkv10d2n6Tw14M9GaCL9AhVw== +"@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== dependencies: tslib "^2.3.0" -"@angular/platform-server@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-16.1.1.tgz#9b61ff7559cbc2f9a9854a8977f87c7e522a746c" - integrity sha512-6HyaSwbdnrDss1jJBNavKk5F0TjRERkjkZi4FfhzMRSetVJV2Cg9gGu11alyLqrl/KV9vgEoZW8rlUnE+SNZ4w== +"@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== dependencies: tslib "^2.3.0" xhr2 "^0.2.0" -"@angular/router@^16.1.1": - version "16.1.1" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-16.1.1.tgz#e7990e5c2f373e4b69cc9d781831cb81141e719b" - integrity sha512-02sTolkyPM/gJ9uJQtZkWujoi1LhH8qsIi2bexSC6cpNTeFnGyr7iFd1lWg+xDtV4PLPgH94Ai/aJN0DNg2I8Q== +"@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== dependencies: tslib "^2.3.0" @@ -446,12 +446,13 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== +"@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== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" "@babel/code-frame@^7.22.5": version "7.22.5" @@ -465,11 +466,6 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== -"@babel/compat-data@^7.21.5": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.21.9.tgz#10a2e7fda4e51742c907938ac3b7229426515514" - integrity sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ== - "@babel/compat-data@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255" @@ -480,26 +476,26 @@ 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/core@7.21.8": - version "7.21.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== +"@babel/core@7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.17.tgz#2f9b0b395985967203514b24ee50f9fd0639c866" + integrity sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.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.17" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.16" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.17" + "@babel/types" "^7.22.17" 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.22.5": version "7.22.5" @@ -564,12 +560,12 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@7.22.5", "@babel/generator@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" - integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== +"@babel/generator@7.22.15", "@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== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.22.15" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -602,12 +598,12 @@ "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/generator@^7.21.5": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.9.tgz#3a1b706e07d836e204aee0650e8ee878d3aaa241" - integrity sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg== +"@babel/generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7" + integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -650,16 +646,16 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== +"@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.21.5" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" lru-cache "^5.1.1" - semver "^6.3.0" + semver "^6.3.1" "@babel/helper-compilation-targets@^7.22.5": version "7.22.5" @@ -683,6 +679,21 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.22.11": + 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.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" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz#2192a1970ece4685fbff85b48da2c32fcb130b7c" @@ -723,18 +734,6 @@ regexpu-core "^5.3.1" semver "^6.3.0" -"@babel/helper-define-polyfill-provider@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz#487053f103110f25b9755c5980e031e93ced24d8" - integrity sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - "@babel/helper-define-polyfill-provider@^0.4.2": version "0.4.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" @@ -758,11 +757,6 @@ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== -"@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== - "@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" @@ -791,14 +785,6 @@ "@babel/template" "^7.18.6" "@babel/types" "^7.18.9" -"@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - "@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" @@ -828,6 +814,13 @@ dependencies: "@babel/types" "^7.22.5" +"@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.15" + "@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" @@ -842,12 +835,12 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== +"@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.21.4" + "@babel/types" "^7.22.15" "@babel/helper-module-imports@^7.22.5": version "7.22.5" @@ -870,19 +863,16 @@ "@babel/traverse" "^7.17.3" "@babel/types" "^7.17.0" -"@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== +"@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.21.5" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@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.5": version "7.22.5" @@ -961,6 +951,15 @@ "@babel/helper-wrap-function" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz#dabaa50622b3b4670bd6546fc8db23eb12d89da0" + integrity sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.17" + "@babel/helper-replace-supers@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz#71bc5fb348856dea9fdc4eafd7e2e49f585145dc" @@ -973,6 +972,15 @@ "@babel/traverse" "^7.22.5" "@babel/types" "^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== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz#aaa473de92b7987c6dfa7ce9a7d9674724823367" @@ -980,13 +988,6 @@ dependencies: "@babel/types" "^7.17.0" -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -1001,13 +1002,6 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-split-export-declaration@7.22.5", "@babel/helper-split-export-declaration@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" - integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== - dependencies: - "@babel/types" "^7.22.5" - "@babel/helper-split-export-declaration@7.22.6", "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -1029,15 +1023,12 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== +"@babel/helper-split-export-declaration@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08" + integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ== + dependencies: + "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.22.5": version "7.22.5" @@ -1054,10 +1045,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== -"@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== +"@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.5": version "7.22.5" @@ -1069,10 +1060,10 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== -"@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== +"@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" @@ -1089,6 +1080,15 @@ "@babel/traverse" "^7.18.9" "@babel/types" "^7.18.9" +"@babel/helper-wrap-function@^7.22.17": + version "7.22.17" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz#222ac3ff9cc8f9b617cc1e5db75c0b538e722801" + integrity sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.17" + "@babel/helper-wrap-function@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz#44d205af19ed8d872b4eefb0d2fa65f45eb34f06" @@ -1108,14 +1108,14 @@ "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" -"@babel/helpers@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== +"@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.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" "@babel/helpers@^7.22.5": version "7.22.5" @@ -1153,6 +1153,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@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== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + "@babel/highlight@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" @@ -1172,15 +1181,10 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== -"@babel/parser@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== - -"@babel/parser@^7.21.5", "@babel/parser@^7.21.8": - version "7.21.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.9.tgz#ab18ea3b85b4bc33ba98a8d4c2032c557d23cf14" - integrity sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g== +"@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.22.5": version "7.22.5" @@ -1192,6 +1196,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== +"@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" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": version "7.22.5" 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.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" @@ -1199,6 +1210,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" @@ -1375,14 +1395,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.5.tgz#7336356d23380eda9a56314974f053a020dab0c3" - integrity sha512-gGOEvFzm3fWoyD5uZq7vVTD57pPJ3PczPUD/xCFGjzBpUosnklmXyKnGQbbbGs1NPNPskFex0j93yKbHt0cHyg== +"@babel/plugin-transform-async-generator-functions@7.22.15", "@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz#3b153af4a6b779f340d5b80d3f634f55820aefa3" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== dependencies: "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-transform-async-generator-functions@^7.22.7": @@ -1411,6 +1431,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz#494eb82b87b5f8b1d8f6f28ea74078ec0a10a841" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-block-scoping@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" @@ -1426,6 +1453,15 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-transform-class-static-block@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" @@ -1435,19 +1471,19 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.5.tgz#635d4e98da741fad814984639f4c0149eb0135e1" - integrity sha512-2edQhLfibpWpsVBx2n/GKOz6JdGQvLruZQfGr9l1qes2KQaWswjBzhQF7UDUZMNaMMQeYnQzxwOMPsbYF7wqPQ== +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-environment-visitor" "^7.22.5" "@babel/helper-function-name" "^7.22.5" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" "@babel/plugin-transform-classes@^7.22.6": @@ -1473,6 +1509,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/template" "^7.22.5" +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz#e7404ea5bb3387073b9754be654eecb578324694" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-destructuring@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" @@ -1503,6 +1546,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-transform-dynamic-import@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" @@ -1519,6 +1570,14 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-transform-export-namespace-from@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" @@ -1527,6 +1586,13 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-for-of@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" @@ -1543,6 +1609,14 @@ "@babel/helper-function-name" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-transform-json-strings@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" @@ -1558,6 +1632,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-transform-logical-assignment-operators@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" @@ -1581,6 +1663,15 @@ "@babel/helper-module-transforms" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz#b11810117ed4ee7691b29bd29fd9f3f98276034f" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== + dependencies: + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/plugin-transform-modules-commonjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" @@ -1590,6 +1681,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz#3386be5875d316493b517207e8f1931d93154bb1" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/plugin-transform-modules-systemjs@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" @@ -1623,6 +1724,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" @@ -1631,6 +1740,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-transform-numeric-separator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" @@ -1639,6 +1756,17 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-object-rest-spread@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" @@ -1658,6 +1786,14 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-replace-supers" "^7.22.5" +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-transform-optional-catch-binding@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" @@ -1666,6 +1802,15 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz#d7a5996c2f7ca4ad2ad16dbb74444e5c4385b1ba" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-transform-optional-chaining@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.5.tgz#1003762b9c14295501beb41be72426736bedd1e0" @@ -1684,6 +1829,13 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-parameters@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" @@ -1699,6 +1851,16 @@ "@babel/helper-create-class-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-transform-private-property-in-object@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" @@ -1716,6 +1878,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + "@babel/plugin-transform-regenerator@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" @@ -1731,17 +1901,17 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.5.tgz#ca975fb5e260044473c8142e1b18b567d33c2a3b" - integrity sha512-bg4Wxd1FWeFx3daHFTWk1pkSWK/AyQuiyAoeZAOkAOUBjnZPH6KT7eMxouV47tQ6hl6ax2zyAWBdWZXbrvXlaw== +"@babel/plugin-transform-runtime@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz#3a625c4c05a39e932d7d34f5d4895cdd0172fdc9" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== dependencies: - "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - semver "^6.3.0" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" "@babel/plugin-transform-runtime@7.22.9": version "7.22.9" @@ -1791,6 +1961,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-transform-unicode-escapes@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" @@ -1822,17 +1999,17 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.5.tgz#3da66078b181f3d62512c51cf7014392c511504e" - integrity sha512-fj06hw89dpiZzGZtxn+QybifF07nNiZjZ7sazs2aVDcysAZVGjW7+7iFYxg6GLNM47R/thYfLdrXc+2f11Vi9A== +"@babel/preset-env@7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.15.tgz#142716f8e00bc030dae5b2ac6a46fbd8b3e18ff8" + integrity sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag== dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^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" @@ -1853,60 +2030,60 @@ "@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.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.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.5" - "@babel/plugin-transform-classes" "^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.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.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.5" - "@babel/plugin-transform-for-of" "^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.5" + "@babel/plugin-transform-json-strings" "^7.22.11" "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^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.5" - "@babel/plugin-transform-modules-systemjs" "^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.5" - "@babel/plugin-transform-numeric-separator" "^7.22.5" - "@babel/plugin-transform-object-rest-spread" "^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.5" - "@babel/plugin-transform-optional-chaining" "^7.22.5" - "@babel/plugin-transform-parameters" "^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.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.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.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.5" - "@babel/types" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.3" - babel-plugin-polyfill-corejs3 "^0.8.1" - babel-plugin-polyfill-regenerator "^0.5.0" - core-js-compat "^3.30.2" - semver "^6.3.0" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.15" + 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-env@7.22.9": version "7.22.9" @@ -1994,6 +2171,15 @@ 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" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + "@babel/preset-modules@^0.1.5": version "0.1.5" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" @@ -2010,12 +2196,12 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.5.tgz#8564dd588182ce0047d55d7a75e93921107b57ec" - integrity sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA== +"@babel/runtime@7.22.15": + 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.13.11" + regenerator-runtime "^0.14.0" "@babel/runtime@7.22.6": version "7.22.6" @@ -2058,14 +2244,14 @@ "@babel/parser" "^7.18.6" "@babel/types" "^7.18.6" -"@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== +"@babel/template@^7.22.15": + 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.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" "@babel/traverse@^7.10.3", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9": version "7.17.9" @@ -2099,19 +2285,19 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== +"@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.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@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" @@ -2160,43 +2346,16 @@ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@babel/types@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" - integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.21.0": - version "7.21.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.2.tgz#92246f6e00f91755893c2876ad653db70c8310d1" - integrity sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@babel/types@^7.21.4": - version "7.21.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.4.tgz#2d5d6bb7908699b3b416409ffd3b5daa25b030d4" - integrity sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-validator-identifier" "^7.18.6" to-fast-properties "^2.0.0" -"@babel/types@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== +"@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== dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" to-fast-properties "^2.0.0" "@babel/types@^7.22.5": @@ -2320,11 +2479,6 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@esbuild/android-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz#bafb75234a5d3d1b690e7c2956a599345e84a2fd" - integrity sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA== - "@esbuild/android-arm64@0.17.5": version "0.17.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.5.tgz#a145f43018e639bed94ed637369e2dcdd6bf9ea2" @@ -2340,10 +2494,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.19.tgz#8735b552b8e0b9a943460d37fbc976b9d9cd4b4e" integrity sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA== -"@esbuild/android-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.17.19.tgz#5898f7832c2298bc7d0ab53701c57beb74d78b4d" - integrity sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A== +"@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-arm@0.17.5": version "0.17.5" @@ -2360,10 +2514,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.19.tgz#efd1f33583a893c0cc57f25b1d081af8cdc6bfd9" integrity sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w== -"@esbuild/android-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.17.19.tgz#658368ef92067866d95fb268719f98f363d13ae1" - integrity sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww== +"@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-x64@0.17.5": version "0.17.5" @@ -2380,10 +2534,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.19.tgz#d9f35722701a97a2ef69c7a84f1ee2aef2a306a7" integrity sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg== -"@esbuild/darwin-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz#584c34c5991b95d4d48d333300b1a4e2ff7be276" - integrity sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg== +"@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/darwin-arm64@0.17.5": version "0.17.5" @@ -2400,10 +2554,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.19.tgz#8cb81b971ee5231acc7de07225f6e18562c359e4" integrity sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg== -"@esbuild/darwin-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz#7751d236dfe6ce136cce343dce69f52d76b7f6cb" - integrity sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw== +"@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-x64@0.17.5": version "0.17.5" @@ -2420,10 +2574,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.19.tgz#81024ab64232dd323f03796d449f018b59f04ca9" integrity sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ== -"@esbuild/freebsd-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz#cacd171665dd1d500f45c167d50c6b7e539d5fd2" - integrity sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ== +"@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/freebsd-arm64@0.17.5": version "0.17.5" @@ -2440,10 +2594,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.19.tgz#9fa91e3b08d10c0adfa71b37372a7627b26e9686" integrity sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ== -"@esbuild/freebsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz#0769456eee2a08b8d925d7c00b79e861cb3162e4" - integrity sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ== +"@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-x64@0.17.5": version "0.17.5" @@ -2460,10 +2614,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.19.tgz#ef6f5a85c1bb029fb0076da5b223e50b353e615c" integrity sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q== -"@esbuild/linux-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz#38e162ecb723862c6be1c27d6389f48960b68edb" - integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg== +"@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/linux-arm64@0.17.5": version "0.17.5" @@ -2480,10 +2634,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.19.tgz#0cef913dcdc1efb1bb04406a8e5f5668b721d89e" integrity sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg== -"@esbuild/linux-arm@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz#1a2cd399c50040184a805174a6d89097d9d1559a" - integrity sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA== +"@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-arm@0.17.5": version "0.17.5" @@ -2500,10 +2654,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.19.tgz#39ea874c8e5177b83903bec1883a43f3c163627a" integrity sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg== -"@esbuild/linux-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz#e28c25266b036ce1cabca3c30155222841dc035a" - integrity sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ== +"@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-ia32@0.17.5": version "0.17.5" @@ -2520,10 +2674,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.19.tgz#283cd3c3d8380e8fab90583fa86ca1fcc9b9ec57" integrity sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw== -"@esbuild/linux-loong64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz#0f887b8bb3f90658d1a0117283e55dbd4c9dcf72" - integrity sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ== +"@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-loong64@0.17.5": version "0.17.5" @@ -2540,10 +2694,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.19.tgz#1c69d7928a55b26326398d31d2ac9c82d2297f1b" integrity sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA== -"@esbuild/linux-mips64el@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz#f5d2a0b8047ea9a5d9f592a178ea054053a70289" - integrity sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A== +"@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-mips64el@0.17.5": version "0.17.5" @@ -2560,10 +2714,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.19.tgz#b25b352e7645885fa1d01182116c506a78fe4733" integrity sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q== -"@esbuild/linux-ppc64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz#876590e3acbd9fa7f57a2c7d86f83717dbbac8c7" - integrity sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg== +"@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-ppc64@0.17.5": version "0.17.5" @@ -2580,10 +2734,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.19.tgz#568b5a051f47af732c4314e697bb559a14b3d811" integrity sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A== -"@esbuild/linux-riscv64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz#7f49373df463cd9f41dc34f9b2262d771688bf09" - integrity sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA== +"@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-riscv64@0.17.5": version "0.17.5" @@ -2600,10 +2754,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.19.tgz#020729b47ca63321667297d1610bab81cd08a65c" integrity sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ== -"@esbuild/linux-s390x@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz#e2afd1afcaf63afe2c7d9ceacd28ec57c77f8829" - integrity sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q== +"@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-s390x@0.17.5": version "0.17.5" @@ -2620,10 +2774,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.19.tgz#ed5cca8dac130d2f736914f9efad5fa15c238c20" integrity sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ== -"@esbuild/linux-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz#8a0e9738b1635f0c53389e515ae83826dec22aa4" - integrity sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw== +"@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-x64@0.17.5": version "0.17.5" @@ -2640,10 +2794,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.19.tgz#f8023a38ae02b46c60a134ccbc7ae377b3bec66f" integrity sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A== -"@esbuild/netbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz#c29fb2453c6b7ddef9a35e2c18b37bda1ae5c462" - integrity sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q== +"@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/netbsd-x64@0.17.5": version "0.17.5" @@ -2660,10 +2814,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.19.tgz#8fd667c535db0a5b346afa2d74ff1fb53477427f" integrity sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw== -"@esbuild/openbsd-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz#95e75a391403cb10297280d524d66ce04c920691" - integrity sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g== +"@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/openbsd-x64@0.17.5": version "0.17.5" @@ -2680,10 +2834,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.19.tgz#354d5b54a6bffa381cb513e878880192e07004be" integrity sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA== -"@esbuild/sunos-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz#722eaf057b83c2575937d3ffe5aeb16540da7273" - integrity sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg== +"@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/sunos-x64@0.17.5": version "0.17.5" @@ -2700,10 +2854,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.19.tgz#e2de98bd961e04f76f6acf5970263efc7051def5" integrity sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ== -"@esbuild/win32-arm64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz#9aa9dc074399288bdcdd283443e9aeb6b9552b6f" - integrity sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag== +"@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/win32-arm64@0.17.5": version "0.17.5" @@ -2720,10 +2874,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.19.tgz#9dca55f0dcbbdb50bf36353d1114f5f71c269275" integrity sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg== -"@esbuild/win32-ia32@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz#95ad43c62ad62485e210f6299c7b2571e48d2b03" - integrity sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw== +"@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-ia32@0.17.5": version "0.17.5" @@ -2740,10 +2894,10 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.19.tgz#db6ea4467e87e6d3fc2177dea35e81f26f7a061d" integrity sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg== -"@esbuild/win32-x64@0.17.19": - version "0.17.19" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz#8cfaf2ff603e9aabb910e9c0558c26cf32744061" - integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA== +"@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-x64@0.17.5": version "0.17.5" @@ -2760,6 +2914,11 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.19.tgz#6105755d7097e0d7e22f893c3e62f143d8137bd0" integrity sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA== +"@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== + "@firebase/app-types@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@firebase/app-types/-/app-types-0.7.0.tgz#c9e16d1b8bed1a991840b8d2a725fb58d0b5899f" @@ -2972,706 +3131,706 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== -"@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.18.0": @@ -3748,16 +3907,16 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== -"@ngtools/webpack@16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.1.0.tgz#54231a29db7b669396d9685ba9d60f7956e6c42b" - integrity sha512-rKPDqzaSsdXIuJAdldiOzDgDvCe4MHPjsBzrRmev+B0UcllIjSOwciREPDks9LyopppsDVTvn7EtUyhjfv1LBg== - "@ngtools/webpack@16.2.0-next.4": version "16.2.0-next.4" resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-16.2.0-next.4.tgz#0e43f1da241bab45a43598f8c586b4e26abb30df" integrity sha512-2tuUsH1bNRifcnprkEd7hVursuh+ZHRIG+dzUF1IDVQaP6gwkjh53tLjdRQ3MpeCuCkU1OufTkD5PttvEbC8Jg== +"@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== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -3779,6 +3938,16 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/agent@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.1.1.tgz#31095663b8feef27ec3eccd5254a35b8fc70353a" + integrity sha512-6RlbiOAi6L6uUYF4/CDEkDZQnKw0XDsFJVrEpnib8rAx2WRMOsUyAdgnvDpX/fdkDWxtqE+NHwF465llI2wR0g== + dependencies: + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.1" + "@npmcli/fs@^1.0.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" @@ -3795,13 +3964,6 @@ "@gar/promisify" "^1.1.3" semver "^7.3.5" -"@npmcli/fs@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.0.0.tgz#00d13fd40d9144fb0ca40faf04f755625856ccd2" - integrity sha512-GdeVD+dnBxzMslTFvnctLX5yIqV4ZNZBWNbo1OejQ++bZpnFNQ1AjOn9Sboi+LzheQbCBU1ts1mhEVduHrcZOQ== - dependencies: - semver "^7.3.5" - "@npmcli/fs@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" @@ -3809,20 +3971,19 @@ dependencies: semver "^7.3.5" -"@npmcli/git@^4.0.0": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.0.2.tgz#bbb16eb057e44bff60aa2bc8443f2f4165aab3ea" - integrity sha512-jBSmCI3F6KTZrWwez6mH6lJPWg3llZlQiHR05/sOw83H1vMc9nnL39ceP8x3SEkDJkaluXG/w4drdYS4FDONgA== +"@npmcli/git@^5.0.0": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-5.0.3.tgz#ad3ede0994bcf716ddb63d361f3ea16cb72d878c" + integrity sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw== dependencies: - "@npmcli/promise-spawn" "^5.0.0" - lru-cache "^7.4.4" - mkdirp "^1.0.4" - npm-pick-manifest "^8.0.0" + "@npmcli/promise-spawn" "^7.0.0" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" proc-log "^3.0.0" promise-inflight "^1.0.1" promise-retry "^2.0.1" semver "^7.3.5" - which "^2.0.2" + which "^4.0.0" "@npmcli/installed-package-contents@^2.0.1": version "2.0.1" @@ -3848,41 +4009,28 @@ mkdirp "^1.0.4" rimraf "^3.0.2" -"@npmcli/move-file@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-3.0.0.tgz#3e1be5c880c9ba2d9c6453709d3ffd2d7a4cf192" - integrity sha512-mOUBUIXsqAQBfn87vGIjBAve6JmD9PkP9Vdq2SayDqQh2Ol60hnXaBSvT4V6IQiho1otw6SipnVV1fulvOiyKQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - "@npmcli/node-gyp@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== -"@npmcli/promise-spawn@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-5.0.0.tgz#8cd47aa85ad206ac0e2ae6005cbfbe5340bd0134" - integrity sha512-q+Le2urM3NdxSFHj+VZXLTHKgmWxqHXUSqM5m9bjnV3EtThtJor64f5inmBkO9uEGZnhpjW0wL67Qf5qcgZkxw== - -"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.1.tgz#2bf718579ad0ca2c5bd364c6a9de3e2fa6be2b00" - integrity sha512-+hcUpxgx0vEpDJI9Cn+lkTdKLoqKBXFCVps5H7FujEU2vLOp6KwqjLlxbnz8Wzgm8oEqW/u5FeNAXSFjLdCD0A== +"@npmcli/promise-spawn@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-7.0.0.tgz#fd1c64ed4ff2341e503e1f390c62640a6540df09" + integrity sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ== dependencies: - which "^3.0.0" + which "^4.0.0" -"@npmcli/run-script@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.0.tgz#f89e322c729e26ae29db6cc8cc76559074aac208" - integrity sha512-ql+AbRur1TeOdl1FY+RAwGW9fcr4ZwiVKabdvm93mujGREVuVLbdkXRJDrkTXSdCjaxYydr1wlA2v67jxWG5BQ== +"@npmcli/run-script@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-7.0.1.tgz#18eebaed96214357f618a82510411319181417bd" + integrity sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g== dependencies: "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^6.0.0" + "@npmcli/promise-spawn" "^7.0.0" node-gyp "^9.0.0" read-package-json-fast "^3.0.0" - which "^3.0.0" + which "^4.0.0" "@octokit/auth-token@^2.4.4": version "2.5.0" @@ -4158,19 +4306,43 @@ colors "~1.2.1" string-argv "~0.3.1" -"@schematics/angular@16.1.0", "@schematics/angular@^16.1.0": - version "16.1.0" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-16.1.0.tgz#92663d379e44e41bd8564b7e311812e6e8115fe3" - integrity sha512-K5ltzjy98POjJks6vOvSUEA5UEtX3xuf/CR3NA9UFjC44mvjcMz/3n69owZbXmt5aEKzW/qgj7tVIIHUR5z9Fg== +"@schematics/angular@17.0.0-next.4", "@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== dependencies: - "@angular-devkit/core" "16.1.0" - "@angular-devkit/schematics" "16.1.0" + "@angular-devkit/core" "17.0.0-next.4" + "@angular-devkit/schematics" "17.0.0-next.4" jsonc-parser "3.2.0" -"@sigstore/protobuf-specs@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" - integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== +"@sigstore/bundle@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.0.tgz#c6140ca97b68815edf7c4fb7bdbf58d656525c39" + integrity sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + +"@sigstore/protobuf-specs@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-2.1.0.tgz#801f4b5f60e13ecd1925117a7d084ab7b2199f01" + integrity sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw== + dependencies: + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + make-fetch-happen "^13.0.0" + +"@sigstore/tuf@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-2.2.0.tgz#ef636239687e41af3f2ce10667ab88f5ca6165b3" + integrity sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA== + dependencies: + "@sigstore/protobuf-specs" "^0.2.1" + tuf-js "^2.1.0" "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -4241,18 +4413,18 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@tufjs/canonical-json@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" - integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz#a52f61a3d7374833fca945b2549bc30a2dd40d0a" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== -"@tufjs/models@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" - integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== +"@tufjs/models@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-2.0.0.tgz#c7ab241cf11dd29deb213d6817dabb8c99ce0863" + integrity sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg== dependencies: - "@tufjs/canonical-json" "1.0.0" - minimatch "^9.0.0" + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.3" "@types/archiver@^5.1.0": version "5.3.1" @@ -4729,13 +4901,6 @@ dependencies: "@types/node" "*" -"@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== - dependencies: - "@types/node" "*" - "@types/yaml@^1.9.7": version "1.9.7" resolved "https://registry.yarnpkg.com/@types/yaml/-/yaml-1.9.7.tgz#2331f36e0aac91311a63d33eb026c21687729679" @@ -5108,6 +5273,13 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: dependencies: debug "4" +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== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.1.3, agentkeepalive@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.1.tgz#a7975cbb9f83b367f06c90cc51ff28fe7d499717" @@ -5461,7 +5633,7 @@ async@1.5.2, async@1.x, async@^1.3.0: resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.6.2: +async@^2.6.0, async@^2.6.2: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== @@ -5505,6 +5677,18 @@ autoprefixer@10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autoprefixer@10.4.15: + version "10.4.15" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.15.tgz#a1230f4aeb3636b89120b34a1f513e2f6834d530" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + autoprefixer@^10.4.2: version "10.4.4" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.4.tgz#3e85a245b32da876a893d3ac2ea19f01e7ea5a1e" @@ -5534,14 +5718,6 @@ axios@0.21.4: dependencies: follow-redirects "^1.14.0" -babel-loader@9.1.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" - integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== - dependencies: - find-cache-dir "^3.3.2" - schema-utils "^4.0.0" - babel-loader@9.1.3: version "9.1.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" @@ -5561,16 +5737,7 @@ babel-plugin-istanbul@6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-polyfill-corejs2@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz#75044d90ba5043a5fb559ac98496f62f3eb668fd" - integrity sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.4.0" - semver "^6.1.1" - -babel-plugin-polyfill-corejs2@^0.4.4: +babel-plugin-polyfill-corejs2@^0.4.4, babel-plugin-polyfill-corejs2@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== @@ -5579,15 +5746,7 @@ babel-plugin-polyfill-corejs2@^0.4.4: "@babel/helper-define-polyfill-provider" "^0.4.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz#39248263c38191f0d226f928d666e6db1b4b3a8a" - integrity sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - core-js-compat "^3.30.1" - -babel-plugin-polyfill-corejs3@^0.8.2: +babel-plugin-polyfill-corejs3@^0.8.2, babel-plugin-polyfill-corejs3@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== @@ -5595,14 +5754,7 @@ babel-plugin-polyfill-corejs3@^0.8.2: "@babel/helper-define-polyfill-provider" "^0.4.2" core-js-compat "^3.31.0" -babel-plugin-polyfill-regenerator@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz#e7344d88d9ef18a3c47ded99362ae4a757609380" - integrity sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.0" - -babel-plugin-polyfill-regenerator@^0.5.1: +babel-plugin-polyfill-regenerator@^0.5.1, babel-plugin-polyfill-regenerator@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== @@ -5907,7 +6059,7 @@ browser-process-hrtime@^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.26.13, browser-sync-client@^2.26.13, browser-sync-client@^2.27.9: +browser-sync-client@2.26.13, browser-sync-client@^2.26.13, browser-sync-client@^2.27.9, browser-sync-client@^2.29.3: version "2.26.13" resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.13.tgz#ee5fa3ec36fe2a03f9887553cac6846751c8232d" integrity sha512-p2VbZoYrpuDhkreq+/Sv1MkToHklh7T1OaIntDwpG6Iy2q/XkBcgwPcWjX+WwRNiZjN8MEehxIjEUh12LweLmQ== @@ -5929,6 +6081,19 @@ browser-sync-ui@^2.26.13, browser-sync-ui@^2.27.9: socket.io-client "^4.4.1" stream-throttle "^0.1.3" +browser-sync-ui@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.29.3.tgz#35e2ce3b470dce6b7219307cac7278bf324a0f16" + integrity sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg== + dependencies: + async-each-series "0.1.1" + chalk "4.1.2" + connect-history-api-fallback "^1" + immutable "^3" + server-destroy "1.0.1" + socket.io-client "^4.4.1" + stream-throttle "^0.1.3" + browser-sync@2.26.13: version "2.26.13" resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.13.tgz#a74541c104aec7eda318a5d8abdb3317ae9eda3d" @@ -5965,6 +6130,41 @@ browser-sync@2.26.13: ua-parser-js "^0.7.18" yargs "^15.4.1" +browser-sync@2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.29.3.tgz#c2a3ff00c659eb87a13cae9d7a427e1b4b580ee1" + integrity sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg== + dependencies: + browser-sync-client "^2.29.3" + browser-sync-ui "^2.29.3" + bs-recipes "1.3.4" + chalk "4.1.2" + chokidar "^3.5.1" + connect "3.6.6" + connect-history-api-fallback "^1" + dev-ip "^1.0.1" + easy-extender "^2.3.4" + eazy-logger "^4.0.1" + etag "^1.8.1" + fresh "^0.5.2" + fs-extra "3.0.1" + http-proxy "^1.18.1" + immutable "^3" + localtunnel "^2.0.1" + micromatch "^4.0.2" + opn "5.3.0" + portscanner "2.2.0" + raw-body "^2.3.2" + resp-modifier "6.0.2" + rx "4.1.0" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" + server-destroy "1.0.1" + socket.io "^4.4.1" + ua-parser-js "^1.0.33" + yargs "^17.3.1" + browser-sync@^2.27.7: version "2.27.9" resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.27.9.tgz#e0555cb44bd5ede00685e70e108b393d2966874a" @@ -6001,16 +6201,6 @@ browser-sync@^2.27.7: ua-parser-js "1.0.2" yargs "^17.3.1" -browserslist@4.21.7: - version "4.21.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551" - integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA== - dependencies: - caniuse-lite "^1.0.30001489" - electron-to-chromium "^1.4.411" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.20.2: version "4.20.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" @@ -6022,6 +6212,16 @@ browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.20.2: node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.21.10, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + browserslist@^4.21.3: version "4.21.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a" @@ -6042,16 +6242,6 @@ browserslist@^4.21.5: node-releases "^2.0.8" update-browserslist-db "^1.0.10" -browserslist@^4.21.9: - version "4.21.10" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.10.tgz#dbbac576628c13d3b2231332cb2ec5a46e015bb0" - integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== - dependencies: - caniuse-lite "^1.0.30001517" - electron-to-chromium "^1.4.477" - node-releases "^2.0.13" - update-browserslist-db "^1.0.11" - browserstack-local@^1.3.7: version "1.4.9" resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.4.9.tgz#5d3e405d425ee5a3ec5cba853c9a078242d944db" @@ -6188,24 +6378,6 @@ c8@~7.5.0: yargs "^16.0.0" yargs-parser "^20.0.0" -cacache@17.1.3: - version "17.1.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.3.tgz#c6ac23bec56516a7c0c52020fd48b4909d7c7044" - integrity sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - cacache@^15.2.0: version "15.3.0" resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" @@ -6254,22 +6426,20 @@ cacache@^16.0.2: tar "^6.1.11" unique-filename "^1.1.1" -cacache@^17.0.0: - version "17.0.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.0.1.tgz#bcba581a1b311b552b21f71d6205c67551a8d6d5" - integrity sha512-HRnDSZUXB5hdCQc2wuB8eBQPe1a9PVU2Ow8zMTi82NGJZmBGNTSjEGzetlndKlqpVYBa4esdaJ2LH6/uOB4sFQ== +cacache@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.0.tgz#17a9ecd6e1be2564ebe6cdca5f7cfed2bfeb6ddc" + integrity sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w== dependencies: - "@npmcli/fs" "^3.0.0" - "@npmcli/move-file" "^3.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" minipass-collect "^1.0.2" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" p-map "^4.0.0" - promise-inflight "^1.0.1" ssri "^10.0.0" tar "^6.1.11" unique-filename "^3.0.0" @@ -6376,7 +6546,7 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001317, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001489: +caniuse-lite@^1.0.30001317, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: version "1.0.30001495" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz" integrity sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg== @@ -6386,6 +6556,11 @@ caniuse-lite@^1.0.30001517: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz#3e7b8b8a7077e78b0eb054d69e6edf5c7df35601" integrity sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg== +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== + canonical-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" @@ -6447,6 +6622,14 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" +chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2, chalk@~4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -6475,14 +6658,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2, chalk@~4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - chalk@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.0.1.tgz#ca57d71e82bb534a296df63bbacc4a1c22b2a4b6" @@ -7029,13 +7204,6 @@ copy-webpack-plugin@11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.30.1, core-js-compat@^3.30.2: - version "3.30.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== - dependencies: - browserslist "^4.21.5" - core-js-compat@^3.31.0: version "3.32.0" resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.32.0.tgz#f41574b6893ab15ddb0ac1693681bd56c8550a90" @@ -7077,16 +7245,6 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - cosmiconfig@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" @@ -7115,10 +7273,10 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -critters@0.0.18: - version "0.0.18" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.18.tgz#37ea730ee3a1f19844e8099c3fd75b526e1bbcc9" - integrity sha512-I7t/da29EIWXgxx2RSW1md1DvenEgEuLlki6nHE5+Nc0e3eib5AuGIGbPVuI8q+erCKkSP9T/NqYfvasAy7x7A== +critters@0.0.19: + version "0.0.19" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.19.tgz#15e3a3a0ed77ae4b69c3b2fe29c8e7e87fc77d1b" + integrity sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw== dependencies: chalk "^4.1.0" css-select "^5.1.0" @@ -7128,10 +7286,10 @@ critters@0.0.18: postcss "^8.4.23" pretty-bytes "^5.3.0" -critters@0.0.19: - version "0.0.19" - resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.19.tgz#15e3a3a0ed77ae4b69c3b2fe29c8e7e87fc77d1b" - integrity sha512-Fm4ZAXsG0VzWy1U30rP4qxbaWGSsqXDgSupJW1OUJGDAs0KWC+j37v7p5a2kZ9BPJvhRzWm3be+Hc9WvQOBUOw== +critters@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/critters/-/critters-0.0.20.tgz#08ddb961550ab7b3a59370537e4f01df208f7646" + integrity sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw== dependencies: chalk "^4.1.0" css-select "^5.1.0" @@ -7940,6 +8098,13 @@ eazy-logger@3.1.0: dependencies: tfunk "^4.0.0" +eazy-logger@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-4.0.1.tgz#2e9fe487fb14ed6ac20d5f01d90dff377d403041" + integrity sha512-2GSFtnnC6U4IEKhEI7+PvdxrmjJ04mdsj3wHZTFiw0tUtG4HCWzTr13ZYTk8XOGnA1xQMaDljoBOYlk3D/MMSw== + dependencies: + chalk "4.1.2" + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -7978,11 +8143,6 @@ electron-to-chromium@^1.4.284: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.295.tgz#911d5df67542bf7554336142eb302c5ec90bba66" integrity sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw== -electron-to-chromium@^1.4.411: - version "1.4.417" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.417.tgz#a0c7eb992e68287fa50c8da5a5238b01f20b9a82" - integrity sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA== - electron-to-chromium@^1.4.477: version "1.4.485" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.485.tgz#fde3ee9ee8112a3414c0dfa545385ad08ec43408" @@ -8110,14 +8270,6 @@ engine.io@~6.1.0: engine.io-parser "~5.0.3" ws "~8.2.3" -enhanced-resolve@^5.14.1: - version "5.14.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz#de684b6803724477a4af5d74ccae5de52c25f6b3" - integrity sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - enhanced-resolve@^5.15.0: version "5.15.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" @@ -8229,43 +8381,15 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" -esbuild-wasm@0.17.19: - version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.17.19.tgz#c528495c5363c34a4671fa55404e2b0ba85566ba" - integrity sha512-X9UQEMJMZXwlGCfqcBmJ1jEa+KrLfd+gCBypO/TSzo5hZvbVwFqpxj1YCuX54ptTF75wxmrgorR4RL40AKtLVg== - esbuild-wasm@0.18.17: version "0.18.17" resolved "https://registry.yarnpkg.com/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz#d3d8827502c7714212a7b2544ee99132f07189cc" integrity sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ== -esbuild@0.17.19: - version "0.17.19" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.19.tgz#087a727e98299f0462a3d0bcdd9cd7ff100bd955" - integrity sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw== - optionalDependencies: - "@esbuild/android-arm" "0.17.19" - "@esbuild/android-arm64" "0.17.19" - "@esbuild/android-x64" "0.17.19" - "@esbuild/darwin-arm64" "0.17.19" - "@esbuild/darwin-x64" "0.17.19" - "@esbuild/freebsd-arm64" "0.17.19" - "@esbuild/freebsd-x64" "0.17.19" - "@esbuild/linux-arm" "0.17.19" - "@esbuild/linux-arm64" "0.17.19" - "@esbuild/linux-ia32" "0.17.19" - "@esbuild/linux-loong64" "0.17.19" - "@esbuild/linux-mips64el" "0.17.19" - "@esbuild/linux-ppc64" "0.17.19" - "@esbuild/linux-riscv64" "0.17.19" - "@esbuild/linux-s390x" "0.17.19" - "@esbuild/linux-x64" "0.17.19" - "@esbuild/netbsd-x64" "0.17.19" - "@esbuild/openbsd-x64" "0.17.19" - "@esbuild/sunos-x64" "0.17.19" - "@esbuild/win32-arm64" "0.17.19" - "@esbuild/win32-ia32" "0.17.19" - "@esbuild/win32-x64" "0.17.19" +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@0.18.17: version "0.18.17" @@ -8295,6 +8419,34 @@ esbuild@0.18.17: "@esbuild/win32-ia32" "0.18.17" "@esbuild/win32-x64" "0.18.17" +esbuild@0.19.2: + version "0.19.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.2.tgz#b1541828a89dfb6f840d38538767c6130dca2aac" + integrity sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg== + 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@^0.17.5: version "0.17.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.17.5.tgz#cd76d75700d49ac050ad9eedfbed777bd6a9d930" @@ -8739,17 +8891,6 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@3.2.12, fast-glob@^3.2.12: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-glob@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" @@ -8772,6 +8913,17 @@ fast-glob@^3.2.11, fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" +fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -8954,15 +9106,6 @@ finalhandler@1.1.2, finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-cache-dir@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - find-cache-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" @@ -9512,18 +9655,6 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, gl once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.1.tgz#00308f5c035aa0b2a447cd37ead267ddff1577d3" - integrity sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-agent@^2.1.12: version "2.2.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.2.0.tgz#566331b0646e6bf79429a16877685c4a1fbf76dc" @@ -10009,12 +10140,12 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" -hosted-git-info@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.0.tgz#68abaf6dfd61af8551ff222155309bf834614287" - integrity sha512-HGLEbnDnxaXOoVjyE4gR+zEzQ/jvdPBVbVvDiRedZsn7pKx45gic0G1HGZBZ94RyJz0e6pBMeInIh349TAvHCQ== +hosted-git-info@^7.0.0: + 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 "^7.5.1" + lru-cache "^10.0.1" hpack.js@^2.1.6: version "2.1.6" @@ -10155,6 +10286,25 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy-middleware@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy-middleware@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" @@ -10192,7 +10342,7 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@5, https-proxy-agent@5.0.0, https-proxy-agent@5.0.1, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0: +https-proxy-agent@5, https-proxy-agent@5.0.0, https-proxy-agent@5.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.1: version "5.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== @@ -10359,10 +10509,31 @@ ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@8.2.4: - version "8.2.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +inquirer@8.2.6: + version "8.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562" + integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== dependencies: ansi-escapes "^4.2.1" chalk "^4.1.1" @@ -10378,7 +10549,7 @@ inquirer@8.2.4: string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - wrap-ansi "^7.0.0" + wrap-ansi "^6.0.1" inquirer@^8.2.0: version "8.2.2" @@ -10447,6 +10618,11 @@ ip@^1.1.5: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" @@ -10506,10 +10682,10 @@ is-core-module@^2.1.0, is-core-module@^2.5.0, is-core-module@^2.8.1: dependencies: has "^1.0.3" -is-core-module@^2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -10818,6 +10994,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" @@ -11105,7 +11286,7 @@ json5@^2.1.2, json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -json5@^2.2.2: +json5@^2.2.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== @@ -11374,11 +11555,6 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - known-css-properties@^0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776" @@ -11435,6 +11611,23 @@ less@4.1.3: needle "^3.1.0" source-map "~0.6.0" +less@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.2.0.tgz#cbefbfaa14a4cd388e2099b2b51f956e1465c450" + integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== + dependencies: + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -11806,6 +11999,11 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -11828,7 +12026,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.7.1: version "7.8.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.8.1.tgz#68ee3f4807a57d2ba185b7fd90827d5c21ce82bb" integrity sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg== @@ -11878,13 +12076,6 @@ madge@^4.0.0: typescript "^3.9.5" walkdir "^0.4.1" -magic-string@0.30.0, magic-string@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" - integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== - dependencies: - "@jridgewell/sourcemap-codec" "^1.4.13" - magic-string@0.30.1: version "0.30.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d" @@ -11892,6 +12083,13 @@ magic-string@0.30.1: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" +magic-string@0.30.3: + version "0.30.3" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.3.tgz#403755dfd9d6b398dfa40635d52e96c5ac095b85" + integrity sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.15" + magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -11899,6 +12097,13 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529" + integrity sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^1.0.0, make-dir@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -11914,7 +12119,7 @@ make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -11948,68 +12153,21 @@ make-fetch-happen@^10.0.3: socks-proxy-agent "^6.1.1" ssri "^9.0.0" -make-fetch-happen@^11.0.0: - version "11.0.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.0.1.tgz#b3c51663d018d9e11d57fdd4393a4c5a1a7d56eb" - integrity sha512-clv3IblugXn2CDUmqFhNzii3rjKa46u5wNeivc+QlLXkGI5FjLX3rGboo+y2kwf1pd8W0iDiC384cemeDtw9kw== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^11.0.1: - version "11.0.3" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.0.3.tgz#ed83dd3685b97f75607156d2721848f6eca561b9" - integrity sha512-oPLh5m10lRNNZDjJ2kP8UpboUx2uFXVaVweVe/lWut4iHWcQEmfqSVJt2ihZsFI8HbpwyyocaXbCAWf0g1ukIA== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^4.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -make-fetch-happen@^11.1.0: - version "11.1.1" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== +make-fetch-happen@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" + integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^5.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" negotiator "^0.6.3" promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" ssri "^10.0.0" make-fetch-happen@^9.1.0: @@ -12252,6 +12410,13 @@ minimatch@^9.0.0: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -12362,6 +12527,11 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +minipass@^7.0.2, minipass@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + minizlib@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" @@ -12634,11 +12804,6 @@ node-gyp@^9.0.0: tar "^6.1.2" which "^2.0.2" -node-releases@^2.0.12: - version "2.0.12" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039" - integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ== - node-releases@^2.0.13: version "2.0.13" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" @@ -12700,12 +12865,12 @@ normalize-package-data@^3.0.0: semver "^7.3.4" validate-npm-package-license "^3.0.1" -normalize-package-data@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" - integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== +normalize-package-data@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-6.0.0.tgz#68a96b3c11edd462af7189c837b6b1064a484196" + integrity sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" is-core-module "^2.8.1" semver "^7.3.5" validate-npm-package-license "^3.0.4" @@ -12766,54 +12931,44 @@ npm-normalize-package-bin@^3.0.0: resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.0.tgz#6097436adb4ef09e2628b59a7882576fe53ce485" integrity sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q== -npm-package-arg@10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" - integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== - dependencies: - hosted-git-info "^6.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-package-arg@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.0.0.tgz#a34f4a4208a937074b1fff0943a684fbacc83977" - integrity sha512-7dkh8mRp7s0KwVHKIVJnFCJQ2B34gOGnzgBjDGyprycmARq/82SX/lhilQ95ZuacP/G/1gsS345iAkKmxWBQ2Q== +npm-package-arg@11.0.1, npm-package-arg@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== dependencies: - hosted-git-info "^6.0.0" + hosted-git-info "^7.0.0" proc-log "^3.0.0" semver "^7.3.5" validate-npm-package-name "^5.0.0" -npm-packlist@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.1.tgz#984455991f12fed40d7018b8d012ed17a37303c0" - integrity sha512-XddbYutimy7hdmP7S1tHMjFwghn64lvgdnhYG0KLGFBWjEvMt1/jg95OR3vPNNCjkakHS+k4a//3XOO8JOGI2A== +npm-packlist@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-8.0.0.tgz#4e7f51fe1d5e69b19508ed8dc6cd3ae2e7b38c17" + integrity sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw== dependencies: ignore-walk "^6.0.0" -npm-pick-manifest@8.0.1, npm-pick-manifest@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" - integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== +npm-pick-manifest@9.0.0, npm-pick-manifest@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-9.0.0.tgz#f87a4c134504a2c7931f2bb8733126e3c3bb7e8f" + integrity sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg== dependencies: npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" semver "^7.3.5" -npm-registry-fetch@^14.0.0: - version "14.0.2" - resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.2.tgz#f637630d9005aeebe4d7411226fb11fa1628c5e8" - integrity sha512-TMenrMagFA9KF81E2bkS5XRyzERK4KXu70vgXt5+i8FcrFeLNgNsc6e5hekTqjDwPDkL3HGn/holWcXDMfnFgw== +npm-registry-fetch@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.0.0.tgz#7529dd7c64c16a1bc8af72f99df73dfe98bb9549" + integrity sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ== dependencies: - make-fetch-happen "^11.0.0" - minipass "^3.1.6" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-json-stream "^1.0.1" minizlib "^2.1.2" - npm-package-arg "^10.0.0" + npm-package-arg "^11.0.0" proc-log "^3.0.0" npm-run-path@^2.0.0: @@ -13196,27 +13351,27 @@ package-json@^6.3.0: registry-url "^5.0.0" semver "^6.2.0" -pacote@15.2.0: - version "15.2.0" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" - integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== +pacote@17.0.4: + version "17.0.4" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-17.0.4.tgz#4bac6c0745967bde96985ec12fbbfc8dea7140e8" + integrity sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg== dependencies: - "@npmcli/git" "^4.0.0" + "@npmcli/git" "^5.0.0" "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^6.0.1" - "@npmcli/run-script" "^6.0.0" - cacache "^17.0.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^7.0.0" + cacache "^18.0.0" fs-minipass "^3.0.0" - minipass "^5.0.0" - npm-package-arg "^10.0.0" - npm-packlist "^7.0.0" - npm-pick-manifest "^8.0.0" - npm-registry-fetch "^14.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^16.0.0" proc-log "^3.0.0" promise-retry "^2.0.1" - read-package-json "^6.0.0" + read-package-json "^7.0.0" read-package-json-fast "^3.0.0" - sigstore "^1.3.0" + sigstore "^2.0.0" ssri "^10.0.0" tar "^6.1.11" @@ -13494,10 +13649,10 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -piscina@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-3.2.0.tgz#f5a1dde0c05567775690cccefe59d9223924d154" - integrity sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA== +piscina@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.0.0.tgz#f8913d52b2000606d51aaa242f0813a0c77ca3b1" + integrity sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -13505,10 +13660,10 @@ piscina@3.2.0: optionalDependencies: nice-napi "^1.0.2" -piscina@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.0.0.tgz#f8913d52b2000606d51aaa242f0813a0c77ca3b1" - integrity sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg== +piscina@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.1.0.tgz#809578ee3ab2ecf4cf71c2a062100b4b95a85b96" + integrity sha512-sjbLMi3sokkie+qmtZpkfMCUJTpbxJm/wvaPzU28vmYSsTSW8xk9JcFUsbqGJdtPpIQ9tuj+iDcTtgZjwnOSig== dependencies: eventemitter-asyncresource "^1.0.0" hdr-histogram-js "^2.0.1" @@ -13516,7 +13671,7 @@ piscina@4.0.0: optionalDependencies: nice-napi "^1.0.2" -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== @@ -13552,15 +13707,13 @@ portscanner@2.1.1: async "1.5.2" is-number-like "^1.0.3" -postcss-loader@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.2.tgz#ac3344ad1f14bb65df135744b7efae4dbdad4301" - integrity sha512-c7qDlXErX6n0VT+LUsW+nwefVtTu3ORtVvK8EXuUIDcxo+b/euYqpuHlJAvePb0Af5e8uMjR/13e0lTuYifaig== +portscanner@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.2.0.tgz#6059189b3efa0965c9d96a56b958eb9508411cf1" + integrity sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw== dependencies: - cosmiconfig "^8.1.3" - jiti "^1.18.2" - klona "^2.0.6" - semver "^7.3.8" + async "^2.6.0" + is-number-like "^1.0.3" postcss-loader@7.3.3: version "7.3.3" @@ -13641,19 +13794,19 @@ postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@8.4.24: - version "8.4.24" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" - integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== +postcss@8.4.27, postcss@^8.4.26: + version "8.4.27" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@8.4.27, postcss@^8.4.26: - version "8.4.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" - integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== +postcss@8.4.29, postcss@^8.4.27: + version "8.4.29" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.29.tgz#33bc121cf3b3688d4ddef50be869b2a54185a1dd" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" @@ -14106,14 +14259,14 @@ read-package-json-fast@^3.0.0: json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" -read-package-json@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.0.tgz#6a741841ad72a40e77a82b9c3c8c10e865bbc519" - integrity sha512-b/9jxWJ8EwogJPpv99ma+QwtqB7FSl3+V6UXS7Aaay8/5VwMY50oIFooY1UKXMWpfNCM6T/PoGqa5GD1g9xf9w== +read-package-json@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-7.0.0.tgz#d605c9dcf6bc5856da24204aa4e9518ee9714be0" + integrity sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg== dependencies: - glob "^8.0.1" + glob "^10.2.2" json-parse-even-better-errors "^3.0.0" - normalize-package-data "^5.0.0" + normalize-package-data "^6.0.0" npm-normalize-package-bin "^3.0.0" read-pkg-up@^7.0.1: @@ -14249,6 +14402,11 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + regenerator-transform@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" @@ -14256,6 +14414,13 @@ regenerator-transform@^0.15.1: dependencies: "@babel/runtime" "^7.8.4" +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" @@ -14456,12 +14621,12 @@ resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.22.2: - version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== +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== dependencies: - is-core-module "^2.11.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -14624,13 +14789,6 @@ rollup@^2.66.1: optionalDependencies: fsevents "~2.3.2" -rollup@^3.21.0: - version "3.23.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.23.0.tgz#b8d6146dac4bf058ee817f92820988e9b358b564" - integrity sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ== - optionalDependencies: - fsevents "~2.3.2" - rollup@^3.25.2: version "3.27.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.27.2.tgz#59adc973504408289be89e5978e938ce852c9520" @@ -14638,6 +14796,13 @@ rollup@^3.25.2: optionalDependencies: fsevents "~2.3.2" +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== + optionalDependencies: + fsevents "~2.3.2" + router@^1.3.1: version "1.3.6" resolved "https://registry.yarnpkg.com/router/-/router-1.3.6.tgz#35302dc8d69f75b00797d618d92d6c9fb35604bf" @@ -14753,14 +14918,6 @@ safevalues@^0.3.4: resolved "https://registry.yarnpkg.com/safevalues/-/safevalues-0.3.4.tgz#82e846a02b6956d7d40bf9f41e92e13fce0186db" integrity sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw== -sass-loader@13.3.1: - version "13.3.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.1.tgz#32ee5791434b9b4dbd1adcce76fcb4cea49cc12c" - integrity sha512-cBTxmgyVA1nXPvIK4brjJMXOMJ2v2YrQEuHqLw3LylGb3gsR6jAvdjHMcy/+JGTmmIF9SauTrLLR7bsWDMWqgg== - dependencies: - klona "^2.0.6" - neo-async "^2.6.2" - sass-loader@13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.3.2.tgz#460022de27aec772480f03de17f5ba88fa7e18c6" @@ -14775,19 +14932,19 @@ sass-lookup@^3.0.0: dependencies: commander "^2.16.0" -sass@1.63.2: - version "1.63.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.63.2.tgz#75f7d9a8e67d1d5b98a989507f4d98b6067b1f75" - integrity sha512-u56TU0AIFqMtauKl/OJ1AeFsXqRHkgO7nCWmHaDwfxDo9GUMSqBA4NEh6GMuh1CYVM7zuROYtZrHzPc2ixK+ww== +sass@1.64.1: + version "1.64.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf" + integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sass@1.64.1: - version "1.64.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.1.tgz#6a46f6d68e0fa5ad90aa59ce025673ddaa8441cf" - integrity sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ== +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== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14843,15 +15000,6 @@ schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" @@ -14943,13 +15091,6 @@ semver@5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" - integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== - dependencies: - lru-cache "^6.0.0" - semver@7.5.4, semver@~7.5.4: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" @@ -14957,7 +15098,7 @@ semver@7.5.4, semver@~7.5.4: dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -15210,14 +15351,15 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.0.1.tgz#96a61033896120ec9335d96851d902cc98f0ba2a" integrity sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw== -sigstore@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.4.0.tgz#2e3a28c08b1b8246744c27cfb179c525c3f164d8" - integrity sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ== +sigstore@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-2.1.0.tgz#c577b596642b3f360dc4135d476466e6edeb2364" + integrity sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw== dependencies: - "@sigstore/protobuf-specs" "^0.1.0" - make-fetch-happen "^11.0.1" - tuf-js "^1.1.3" + "@sigstore/bundle" "^2.1.0" + "@sigstore/protobuf-specs" "^0.2.1" + "@sigstore/sign" "^2.1.0" + "@sigstore/tuf" "^2.1.0" simple-swizzle@^0.2.2: version "0.2.2" @@ -15394,14 +15536,14 @@ socks-proxy-agent@^6.0.0, socks-proxy-agent@^6.1.1: debug "^4.3.3" socks "^2.6.2" -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== +socks-proxy-agent@^8.0.1: + 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 "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" + agent-base "^7.0.2" + debug "^4.3.4" + socks "^2.7.1" socks@^2.3.3, socks@^2.6.2: version "2.6.2" @@ -15411,6 +15553,14 @@ socks@^2.3.3, socks@^2.6.2: ip "^1.1.5" smart-buffer "^4.2.0" +socks@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.0" + sort-keys-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188" @@ -16115,20 +16265,20 @@ terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.5" -terser@5.17.7: - version "5.17.7" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.17.7.tgz#2a8b134826fe179b711969fd9d9a0c2479b2a8c3" - integrity sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ== +terser@5.19.2: + version "5.19.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" + integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" commander "^2.20.0" source-map-support "~0.5.20" -terser@5.19.2: - version "5.19.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" - integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== +terser@5.19.4: + version "5.19.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -16392,16 +16542,16 @@ tsickle@^0.46.3: dependencies: "@types/minimist" "^1.2.1" -tslib@2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" - integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== - tslib@2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== +tslib@2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -16458,13 +16608,14 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tuf-js@^1.1.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.5.tgz#ad82a18c5db42f142d2d2e15d6d25655e30c03c3" - integrity sha512-inqodgxdsmuxrtQVbu6tPNgRKWD1Boy3VB6GO7KczJZpAHiTukwhSzXUSzvDcw5pE2Jo8ua+e1ykpHv7VdPVlQ== +tuf-js@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-2.1.0.tgz#87aa36d5a166e7522f1e2050eb502a3a9b0bde72" + integrity sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA== dependencies: - "@tufjs/models" "1.0.4" - make-fetch-happen "^11.1.0" + "@tufjs/models" "2.0.0" + debug "^4.3.4" + make-fetch-happen "^13.0.0" tunnel-agent@^0.6.0: version "0.6.0" @@ -16563,10 +16714,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@5.1.3, typescript@5.1.6, typescript@~4.5.4, typescript@~4.9.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.3.tgz#8d84219244a6b40b6fb2b33cc1c062f715b9e826" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== +typescript@5.1.6, typescript@5.2.2, typescript@~4.5.4, typescript@~4.9.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== typescript@^3.9.10, typescript@^3.9.5, typescript@^3.9.7: version "3.9.10" @@ -16593,6 +16744,11 @@ ua-parser-js@^0.7.18, ua-parser-js@^0.7.21, ua-parser-js@^0.7.30: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== +ua-parser-js@^1.0.33: + 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== + uglify-js@^3.1.4: version "3.15.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.15.4.tgz#fa95c257e88f85614915b906204b9623d4fa340d" @@ -17001,17 +17157,6 @@ vfile@^3.0.0: unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" -vite@4.3.9: - version "4.3.9" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.3.9.tgz#db896200c0b1aa13b37cdc35c9e99ee2fdd5f96d" - integrity sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg== - dependencies: - esbuild "^0.17.5" - postcss "^8.4.23" - rollup "^3.21.0" - optionalDependencies: - fsevents "~2.3.2" - vite@4.4.7: version "4.4.7" resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.7.tgz#71b8a37abaf8d50561aca084dbb77fa342824154" @@ -17023,6 +17168,17 @@ vite@4.4.7: optionalDependencies: fsevents "~2.3.2" +vite@4.4.9: + version "4.4.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.9.tgz#1402423f1a2f8d66fd8d15e351127c7236d29d3d" + integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + vm2@^3.9.8: version "3.9.9" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.9.tgz#c0507bc5fbb99388fad837d228badaaeb499ddc5" @@ -17195,42 +17351,6 @@ webpack-dev-middleware@^5.3.1: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@4.15.0: - version "4.15.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - webpack-dev-server@4.15.1: version "4.15.1" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" @@ -17287,36 +17407,6 @@ webpack-subresource-integrity@5.1.0: dependencies: typed-assert "^1.0.8" -webpack@5.86.0: - version "5.86.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.86.0.tgz#b0eb81794b62aee0b7e7eb8c5073495217d9fc6d" - integrity sha512-3BOvworZ8SO/D4GVP+GoRC3fVeg5MO4vzmq8TJJEkdmopxyazGDxN8ClqN12uzrZW9Tv8EED8v5VSb6Sqyi0pg== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - webpack@5.88.2: version "5.88.2" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.88.2.tgz#f62b4b842f1c6ff580f3fcb2ed4f0b579f4c210e" @@ -17409,12 +17499,12 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -which@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-3.0.0.tgz#a9efd016db59728758a390d23f1687b6e8f59f8e" - integrity sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ== +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== dependencies: - isexe "^2.0.0" + isexe "^3.1.1" wide-align@^1.1.5: version "1.1.5" @@ -17491,7 +17581,7 @@ wordwrap@^1.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==